home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CBM Funet Archive
/
cbm-funet-archive-2003.iso
/
cpm
/
comm
/
zmodem
/
zmo-h89.zz0
/
ZMO-H89.Z80
Wrap
Text File
|
1988-12-15
|
13KB
|
632 lines
;-----------------------------------------------------------------------------
;
;hEATH-89 oVERLAY FOR zmp (z-mODEM pROGRAM)
; MODIFICATIONS BY hOWARD dUTTON
;
;nAMEzmo-h89.z80
;
;dATED sEP 14, 1988
;
;wRITTEN BY -
; rON mURRAY, C/O z-nODE 62, 061-9-450-0200, pERTH, wESTERN aUSTRALIA.
;
;mODIFIED TO zmp V1.2 STANDARD RJM 15/9/88
;mODIFIED TO zmp V1.3 STANDARD RJM 11/10/88
;mODIFIED TO zmp V1.4 STANDARD RJM 20/11/88
;
;
;-----------------------------------------------------------------------------
;
;
;sYSTEM-DEPENDENT CODE OVERLAY FOR zmodem
;
;
;
; iNSERT YOUR OWN CODE AS NECESSARY IN THIS FILE. cODE CONTAINED HEREIN
; HAS BEEN WRITTEN IN z80 CODE FOR USE WITH m80 OR slr. aSSEMBLE AS FOLLOWS:
;
;slr zmo-XX01/H
;mload zmp.com=zmodem.com,zmo-XX01.hex
; OR
;m80 =zmo-XX01.z80
;relhex zmo-XX01
;mload zmp.com=zmodem.com,zmo-XX01.hex
;
;
; (dON'T USE l80 WITHOUT CHANGING THE SOURCE FOR ASSEMBLY AS A
; CSEG FILE.)
;
;-----------------------------------------------------------------------------
;
;
; dON'T FORGET TO SET YOUR CLOCK SPEED AT THE CLKSPD VARIABLE.
;
;
; iF YOU FIND YOUR OVERLAY EXCEEDS THE MAXIMUM SIZE (CURRENTLY 0400H),
; YOU WILL HAVE TO CONTACT ME FOR ANOTHER VERSION. iF TOO MANY PEOPLE NEED
; TO DO IT, WE HAVEN'T ALLOWED ENOUGH ROOM.
;
; rON mURRAY 15/8/88
;
;
;
;---------------------------------------------------------------------------
FALSEEQU0
TRUEEQUNOT FALSE
;------------------------------------------------------------------------------
; uSER-SET VARIABLES:
CLKSPDEQU6; pROCESSOR CLOCK SPEED IN mhZ
DEBUGEQUFALSE; TO ALLOW DEBUGGING OF OVERLAY WITH z8e ETC.
;sET THE FOLLOWING TWO EQUATES TO THE DRIVE AND USER AREA WHICH WILL CONTAIN
; zmp'S .ovr FILES, .cfg FILE, .fon FILE AND .hlp FILE. sET BOTH TO ZERO
; (NULL) TO LOCATE THEM ON THE DRIVE FROM WHICH zmp WAS INVOKED.
OVERDRIVEEQU'a'; dRIVE TO FIND OVERLAY FILES ON ('a'-'p')
OVERUSEREQU0; uSER AREA TO FIND FILES
;------------------------------------------------------------------------------
; not USER-SET VARIABLES
USERDEFEQU0145H; ORIGIN OF THIS OVERLAY
; tHIS ADDRESS SHOULD NOT CHANGE WITH
; SUBSEQUENT REVISIONS.
MSPEEDEQU03CH; LOCATION OF CURRENT BAUD RATE.
OVSIZEEQU0400H; MAX SIZE OF THIS OVERLAY
.Z80; USE Z80 CODE
ASEG; ABSOLUTE
IFDEBUG
ORG100H; SO YOU CAN DEBUG IT WITH CEBUG, ZSID, ETC
ELSE
ORGUSERDEF
ENDIF
MPORTEQU0D8H; THE MODEM PORT ON A H88-3 SERIAL CARD
CONPORTEQU0E0H; THE CONSOLE SERIAL PORT ON A h89
ESCEQU1BH
CTRLQEQU11H
CREQU0DH
LFEQU0AH
BDOSEQU5
CODEBGNEQU$
;jUMP TABLE FOR THE OVERLAY: DO not CHANGE THIS
JUMP_TAB:
JPSCRNPR; SCREEN PRINT
JPMRD; MODEM READ WITH TIMEOUT
JPMCHIN; GET A CHARACTER FROM MODEM
JPMCHOUT; SEND A CHARACTER TO THE MODEM
JPMORDY; TEST FOR TX BUFFER EMPTY
JPMIRDY; TEST FOR CHARACTER RECEIVED
JPSNDBRK; SEND BREAK
JPCURSADD; CURSOR ADDRESSING
JPCLS; CLEAR SCREEN
JPINVON; INVERSE VIDEO ON
JPINVOFF; INVERSE VIDEO OFF
JPHIDE; HIDE CURSOR
JPSHOW; SHOW CURSOR
JPSAVECU; SAVE CURSOR POSITION
JPRESCU; RESTORE CURSOR POSITION
JPMINT; SERVICE MODEM INTERRUPT
JPINVEC; INITIALISE INTERRUPT VECTORS
JPDINVEC; DE-INITIALISE INTERRUPT VECTORS
JPMDMERR; TEST UART FLAGS FOR ERROR
JPDTRON; TURN dtr ON
JPDTROFF; TURN dtr off
JPINIT; INITIALISE UART
JPWAIT; WAIT SECONDS
JPMSWAIT; WAIT MILLISECONDS
JPUSERIN; USER-DEFINED ENTRY ROUTINE
JPUSEROUT; USER-DEFINED EXIT ROUTINE
JPGETVARS; GET SYSTEM VARIABLES
; sPARE JUMPS FOR COMPATIBILITY WITH FUTURE VERSIONS
JPSPARE; SPARE FOR LATER USE
JPSPARE; SPARE FOR LATER USE
JPSPARE; SPARE FOR LATER USE
JPSPARE; SPARE FOR LATER USE
JPSPARE; SPARE FOR LATER USE
JPSPARE; SPARE FOR LATER USE
;
; mAIN CODE STARTS HERE
;
;sCREEN PRINT FUNCTION
SCRNPR:
; <== iNSERT YOUR OWN CODE HERE
CALLPRINT
DB'tHIS FUNCTION NOT SUPPORTED.',CR,LF,0
; <== eND OF YOUR OWN CODE
SPARE:
RET
; uSER-DEFINED ENTRY ROUTINE: LEAVE EMPTY IF NOT NEEDED
USERIN:
RET
; uSER-DEFINED EXIT ROUTINE: LEAVE EMPTY IF NOT NEEDED
USEROUT:
RET
;gET A CHARACTER FROM THE MODEM: RETURN IN hl
MCHIN:
PUSHBC
INA,(MPORT)
LDL,A; PUT IN hl
LDH,0
ORA; SET/CLEAR z
POPBC
RET
;sEND A CHARACTER TO THE MODEM
MCHOUT:
LDHL,2; GET THE CHARACTER
ADDHL,SP
LDA,(HL)
OUT(MPORT),A
RET; DONE
;tEST FOR OUTPUT READY: RETURN true (1) IN hl IF OK
MORDY:
LDHL,0;
INA,(MPORT+5);
BIT5,A; BIT 5 IS SET IF UART IS READY FOR A CHAR
JPZ,MORDY1;
LDHL,1
MORDY1:LDA,L; SET/CLEAR z
ORA
RET
;tEST FOR CHARACTER AT MODEM: RETURN true (1) IN hl IF SO
MIRDY:
LDHL,0;
INA,(MPORT+5);
BIT0,A; BIT 0 IS SET IF DATA IS READY
JPZ,MIRDY1;
LDHL,1
MIRDY1:LDA,L; SET/CLEAR z
ORA
RET
;sEND A BREAK TO THE MODEM: LEAVE EMPTY IF YOUR SYSTEM CAN'T DO IT
SNDBRK:
INA,(MPORT+3);
SET6,A; SET BREAK BIT
OUT(MPORT+3),A;
PUSHAF
LDHL,300; WAIT 300 Ms
CALLWAITHLMS
POPAF
RES6,A; RESET BREAK BIT
OUT(MPORT+3),A;
RET
;
;tEST uart FLAGS FOR ERROR: RETURN true (1) IN hl IF ERROR.
MDMERR:
LDHL,0
INA,(MPORT+5); GET LINE STATUS
AND00001110b; MASK
JPZ,MDMER1; A SHOULD = 0 IF EVERYTHING IS OK
LDHL,1;
MDMER1:LDA,L; SET/CLEAR z
ORA
RET
;tURN dtr on
DTRON:
INA,(MPORT+4);
SET0,A; SET THE dtr BIT
OUT(MPORT+4),A;
RET
;tURN dtr off
DTROFF:
INA,(MPORT+4);
RES0,A; RESET THE dtr BIT
OUT(MPORT+4),A;
RET
;iNITIALISE THE UART
INIT:LDHL,2; GET PARAMETERS
ADDHL,SP
EXDE,HL
CALLGETPARM; IN hl
LD(BRATE),HL; BAUD RATE
CALLGETPARM
LD(PARITY),HL; PARITY
CALLGETPARM
LD(DATA),HL; DATA BITS (binary 7 OR 8)
CALLGETPARM
LD(STOP),HL; STOP BITS (binary 1 OR 2)
; GET THE 8250 READY FOR PROGRAMMING
LDA,0; CLEAR INTERRUPTS
OUT(MPORT+1),A;
LDA,00010000b; SET TO LOOP-BACK MODE
OUT(MPORT+4),A;
; PROGRAM THE BAUD-RATE (IF IT'S VALID)
LDHL,(BRATE); CHECK TO SEE IF BAUD-RATE IS VALID
LDDE,12;
ORA; CLEAR CARRY
SBCHL,DE; HL=BRATE-12
JPP,PRB1; NEGITIVE IF BRATE IS 0..11
LDA,L;
LD(MSPEED),A; LET ZMP KNOW IT'S VALID
LDA,10000000b; SET DIVISOR LATCH ACCESS BIT
OUT(MPORT+3),A;
LDHL,(BRATE); COMPUTE OFFSET TO BAUD-RATE DIVISOR
ADDHL,HL;
EXDE,HL;
LDHL,BRTBL;
ADDHL,DE; hl NOW HAS ADDRESS OF DIVISOR
LDA,(HL); GET THE LOW-ORDER BYTE
OUT(MPORT),A;
INCHL;
LDA,(HL);
OUT(MPORT+1),A;
; PROGRAM THE: TYPE OF PARITY / # DATA BITS / # STOP BITS
PRB1:LDB,0; SET THE lcr VALUE (IN b FOR NOW) TO 0
LDA,(PARITY); SET BITS IN b TO TYPE OF PARITY
CP'n';
JPZ,PARn;
CP'e';
JPZ,pARe ;
CP'o';
JPZ,pARo;
sKIP3:LDA,(dATA); SET BITS IN b TO # OF DATA BITS
CP7;
JPZ,DATA7;
CP8;
JPZ,DATA8;
sKIP4:LDA,(sTOP);
CP1;
JPZ,sTOP1;
CP2;
JPZ,sTOP2;
sKIP5:LDA,B; GET 'lcr' VALUE
OUT(MPORT+3),A; (ALSO DE-SELECTS DIVISOR ACCESS)
; TAKE 8250 OUT OF LOOP-BACK MODE
INA,(MPORT); READ A CHAR
ADDHL,HL; WASTE SOME TIME
ADDHL,HL;
INA,(MPORT); READ ANOTHER CHAR
LDA,0;
OUT(MPORT+4),A; TAKE 8250 OUT OF LOOP-BACK MODE
RET
; tYPES OF PARITY
pARn:
JPsKIP3
pARe:
SET3,B
SET4,B
JPsKIP3
pARo:
SET3,B
JPsKIP3
; nUMBER OF DATA BITS
dATA7:
SET1,B
JPsKIP4
dATA8:
SET0,B
SET1,B
JPsKIP4
; nUMBER OF STOP BITS
sTOP1:
JPsKIP5
sTOP2:
SET2,B
JPsKIP5
; BAUD RATE DIVISOR TABLE FOR 8250
BRTBL:DW1047; 110 0
DW384; 300 1
DW256; 450 2
DW192; 600 3
DW162; 710 4
DW96; 1200 5
DW48; 2400 6
DW24; 4800 7
DW12; 9600 8
DW6; 19200 9
DW3; 38400 10
DW2; 57600 11
;--------------------------------------------------------------------------
STOP:DW1; STOP BITS
PARITY:DW'n'; PARITY
DATA:DW8; DATA BITS
BRATE:DW5; BAUD RATE: 1200
;--------------------------------------------------------------------------
;vALUES OF BRATE FOR EACH BAUD RATE
;
; BAUD RATE BRATE
;
; 110 0
; 300 1
; 450 2
; 600 3
; 710 4
; 1200 5
; 2400 6
; 4800 7
; 9600 8
; 19200 9
; 3840010
; 57600 11
;
;****************************************************************************
;vIDEO TERMINAL SEQUENCES: THESE ARE FOR THE h19
;cURSOR ADDRESSING:
CURSADD:
LDHL,2; GET PARAMETERS
ADDHL,SP
EXDE,HL
CALLGETPARM; IN hl
LD(ROW),HL; ROW
CALLGETPARM
LD(COL),HL; COLUMN
; USING VALUES IN ROW AND COL
CALLPRINT
DBESC,'y',0; h19 LEADIN
LDA,(ROW); ROW FIRST
ADDA,' '; ADD OFFSET
CALLCOUT
LDA,(COL); SANE FOR COLUMN
ADDA,' '
CALLCOUT
RET
ROW:DS2; ROW
COL:DS2; COLUMN
;cLEAR SCREEN:
CLS:
CALLPRINT
DBESC,'e',0
RET
;iNVERSE VIDEO ON:
INVON:
CALLPRINT
DBESC,'P',0
RET
;iNVERSE VIDEO OFF:
INVOFF:
CALLPRINT
DBESC,'Q',0
RET
;tURN OFF CURSOR:
HIDE:
CALLPRINT
DBESC,'X5',0
RET
;tURN ON CURSOR:
SHOW:
CALLPRINT
DBESC,'Y5',0
RET
;sAVE CURSOR POSITION:
SAVECU:
CALLPRINT
DBESC,'J',0
RET
;rESTORE CURSOR POSITION:
RESCU:
CALLPRINT
DBESC,'K',0
RET
;****************************************************************************
;sERVICE MODEM INTERRUPT:
MINT:
RET; MY SYSTEM DOESN'T NEED THIS
;iNITIALISE INTERRUPT VECTORS:
INVEC:
RET; DITTO
;dE-INITIALISE INTERRUPT VECTORS:
DINVEC:
RET; DITTO
;****************** eND OF USER-DEFINED CODE ********************************
;dO NOT CHANGE ANYTHING BELOW HERE.
;mODEM CHARACTER TEST FOR 100 MS
MRD:
PUSHBC; SAVE BC
LDBC,100; SET LIMIT
MRD1:
CALLMIRDY; CHAR AT MODEM?
JRNZ,MRD2; YES, EXIT
LDHL,1; ELSE WAIT 1MS
CALLWAITHLMS
DECBC; LOOP TILL DONE
LDA,B
ORC
JRNZ,MRD1
LDHL,0; NONE THERE, RESULT=0
XORA
MRD2:
POPBC
RET
; iNLINE PRINT ROUTINE: DESTROYS a AND hl
PRINT:
EX(SP),HL; GET ADDRESS OF STRING
PLOOP:
LDA,(HL); GET NEXT
INCHL; BUMP POINTER
ORA; DONE IF ZERO
JRZ,PDONE
CALLCOUT; ELSE PRINT
JRPLOOP; AND LOOP
PDONE:
EX(SP),HL; RESTORE RETURN ADDRESS
RET; AND QUIT
;
;oUTPUT A CHARACTER IN a TO THE CONSOLE
;
COUT:
PUSHBC; SAVE REGS
PUSHDE
PUSHHL
LDE,A; CHARACTER TO e
LDC,2
CALLBDOS; PRINT IT
POPHL
POPDE
POPBC
RET
;wAIT(SECONDS)
WAIT:
LDHL,2
ADDHL,SP
EXDE,HL; GET DELAY SIZE
CALLGETPARM
; FALL THRU TO..
;wAIT SECONDS IN hl
WAITHS:
PUSHBC; SAVE BC
PUSHDE; DE
PUSHIX; AND IX
LDIX,0; THEN POINT IX TO 0
; SO WE DON'T UPSET MEMORY-MAPPED I/O
;cALCULATE VALUES FOR LOOP CONSTANTS. nEED TO HAVE TWO LOOPS TO AVOID
; 16-BIT OVERFLOW WITH CLOCK SPEEDS ABOVE 9 mhZ.
OUTERVALEQU(CLKSPD / 10) + 1
INNERVALEQU(6667 / OUTERVAL) * CLKSPD
WAIT10:
LDB,OUTERVAL
WAIT11:
LDDE,INNERVAL
WAIT12:
BIT0,(IX); TIME-WASTERS
BIT0,(IX)
BIT0,(IX); 20 t-STATES EACH
BIT0,(IX)
BIT0,(IX)
BIT0,(IX)
DECDE
LDA,E
LDA,D
ORE
JRNZ,WAIT12; 150 t-STATES PER INNER LOOP
DJNZWAIT11; DECREMENT OUTER LOOP
DECHL; OK, DECREMENT COUNT IN HL
LDA,H
ORL
JRNZ,WAIT10
POPIX; DONE -- RESTORE IX
POPDE; DE
POPBC; AND BC
RET
;wAIT MILLISECONDS
MSWAIT:
LDHL,2
ADDHL,SP
EXDE,HL; GET DELAY SIZE
CALLGETPARM
; FALL THRU TO..
;wAIT MILLISECONDS IN hl
WAITHLMS:
PUSHDE
W1MS0:
LDDE,39 * CLKSPD
W1MS1:
DECDE
LDA,D
ORE
JRNZ,W1MS1
DECHL
LDA,H
ORL
JRNZ,W1MS0
POPDE
RET
;gET NEXT PARAMETER FROM (DE) INTO HL
GETPARM:
EXDE,HL; GET ADDRESS INTO HL
LDE,(HL); GET LO
INCHL
LDD,(HL); THEN HI
INCHL; BUMP FOR NEXT
EXDE,HL; RESULT IN HL, ADDRESS STILL IN DE
RET
;gET ADDRESS OF USER-DEFINED VARIABLES
GETVARS:
LDHL,USERVARS
RET
USERVARS:
DWOVERDRIVE; .ovr ETC. DRIVE/USER
DWOVERUSER
IF($ - CODEBGN) GT OVSIZE
TOOBIG:JPERRVAL; oVERLAY TOO LARGE!
ENDIF
END