home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CBM Funet Archive
/
cbm-funet-archive-2003.iso
/
cpm
/
comm
/
zmodem
/
zmo-h805.zz0
/
ZMO-H805.Z80
Wrap
Text File
|
1989-04-26
|
19KB
|
743 lines
titlesYSTEM-DEPENDENT INSTALLATION OVERLAY FOR zmp
subttlaUTHOR: rON mURRAY
; sYSTEM-DEPENDENT INSTALLATION OVERLAY FOR zmp
; aUTHOR: rON mURRAY
;nAMEzmpovh89.z80
;dATED nOV 11, 1988
;wRITTEN BY - rON mURRAY, C/O z-nODE 62, 061-9-450-0200
; pERTH, wESTERN aUSTRALIA.
;mODIFIED BY - tED mAY, 116b lAVAL sT., vANIER, oNT., cANADA
;(613)741-0862
;FOR THE h89-h19 TERMINAL
;WITH A hAYS COMPATABLE 2400 BAUD MODEM
;(us rOBOTICS cOURIER 2400)
; 89/04/12 - mODIFIED TO zmp V1.5- gEORGE cONOVER
;mODIFIED TO zmp V1.4 STANDARD rON mURRAY nOV 11, 88
;mODIFIED TO zmp V1.3 STANDARD rON mURRAY oCT 11, 88
;mODIFIED TO zmp V1.2 STANDARD rON mURRAY sEPT 15, 88
;
;-----------------------------------------------------------------------
;
;sYSTEM-DEPENDENT CODE OVERLAY FOR zmodem
;
; iNSERT YOUR OWN CODE AS NECESSARYIN THIS FILE. cODE CONTAINED
; HEREIN HAS BEEN WRITTEN IN z80 CODE FOR USE WITH m80 OR slr PROGRAMS.
; aSSEMBLE AS FOLLOWS:
;slr zmo-mh01/H
;mload zmp.com=zmodem.com,zmo-mh01.hex
; OR
;m80 =zmo-mh01.z80
;relhex zmo-mh01
;mload zmp.com=zmodem.com,zmo-mh01.hex
; (dON'T USE l80 WITHOUT CHANGING THE SOURCE FOR ASSEMBLY AS A cseg
; FILE.)
;-----------------------------------------------------------------------
; cODE CONTAINED HEREIN HAS BEEN WRITTEN IN z80 CODE FOR USE WITH m80.
; oNCE ASSEMBLED, CONVERT TO HEX WITH relhex AND USE mload TO OVERLAY IT
; OVER THE MAIN zmpx.com FILE TO PRODUCE YOUR VERY OWN zmp.com.
;-----------------------------------------------------------------------
; nOTES ON MODIFYING THIS FILE:
; hI-tECH c REQUIRES THAT FUNCTIONS DO NOT CHANGE EITHER INDEX REGISTER
; (ix OR iy). iF YOUR OVERLAY REQUIRES EITHER OF THESE TO BE CHANGED, ENSURE
; THEY ARE RESTORED TO THEIR ORIGINAL VALUES ON RETURN.
; sINCE COLLECTING PARAMETERS FROM c FUNCTIONS CAN BE TRICKY, ONLY CHANGE
; THE PARTS MARKED 'iNSERT YOUR OWN CODE HERE'. dO not MODIFY THE JUMP
; TABLE AT THE START. dO not MODIFY THE ENTRY/EXIT SECTIONS OF EACH
; FUNCTION. dO not PASS 'go'. dO not COLLECT $200.
; aPART FROM DEFINING MODEM FUNCTIONS, THIS FILE ALSO DEFINES TERMINAL
; CHARACTERISTICS. mOST HAVE BEEN SET UP FOR adm-3a (WITH A FEW OF MY OWN
; ADDITIONS). mODIFY TO SUIT YOUR OWN TERMINAL. aN INLINE PRINT ROUTINE
; IS PROVIDED FOR PRINTING STRINGS IN THE USUAL WAY: USAGE IS
;callprint
;defb'REQUIRED STRING',0
; 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 RE-COMPILE THE WHOLE THING. gOOD LUCK. yOU MIGHT TRY
; INFORMING US IF YOU NEED TO DO THIS: IF TOO MANY PEOPLE NEED TO DO IT, WE
; HAVEN'T ALLOWED ENOUGH ROOM.
; rON mURRAY aUG 15, 88
;-----------------------------------------------------------------------
noequ0
yesequnot no
clkspdequ2; pROCESSOR CLOCK SPEED IN mhZ
debugequno; 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.
overdrive equ0; dRIVE TO FIND OVERLAY FILES ON ('a'-'p')
overuser equ0; uSER AREA TO FIND FILES
;-----------------------------------------------------------------------
; not USER-SET VARIABLES
userdefequ0145h; oRIGIN OF THIS OVERLAY. tHIS ADDRESS
; SHOULD NOT CHANGE WITH SUBSEQUENT
; REVISIONS.
mspeedequ003ch; lOCATION OF CURRENT BAUD RATE.
ovsizeequ0400h; mAXIMUM SIZE OF THIS OVERLAY
.z80; USE Z80 CODE
aseg; ABSOLUTE
ifdebug
org100h; sO YOU CAN DEBUG IT WITH cebug, zsid, ETC.
else
orguserdef
endif
escequ1bh
ctrlqequ11h
crequ0dh
lfequ0ah
bdosequ5
; tHE FOLLOWING DEFINE THE h8/89 sio mODEM pORT ADDRESSES...
dportequ0d8h; dATA PORT (BASE PORT)
lspdivequdport; lsp BAUD RATE DIVISOR IF dlab SET
ienregequdport+1; iNTERUPT eNABLE REGISTER
mspdivequdport+1; msp BAUD RATE DIVISOR IF dlab SET
iidregequdport+2; iNTERRUPT IDENTIFICATION REGISTER (R/O)
lcportequdport+3; lINE cONTROL REGISTER
mcportequdport+4; mODEM cONTROL REGISTER
lsportequdport+5; lINE sTATUS REGISTER
msportequdport+6; mODEM sTATUS REGISTER
; lINE cONTROL (lcport) BITS - - - - - - - - - - - - - - - - -
wls0equ00000001b; wORD LENGTH SELECT 0
wls1equ00000010b; wORD LENGTH SELECT 1
stbequ00000100b; sTOP BIT SELECT
penequ00001000b; pARITY eNABLE (0 FOR DISABLED)
pesequ00010000b; eVEN PARITY SELECT (0 FOR ODD)
speequ00100000b; sTICK PARITY
brksequ01000000b; bREAK SET (SET BREAK)
dlabequ10000000b; dIVISOR lATCH aCCESS bIT
; mODEM cONTROL (mcport) BITS - - - - - - - - - - - - - - - - -
mcbaseequ00000000b; bASIC SETUP: NO dtr OR rts
dtrequ00000001b; dATA tERMINAL rEADY
rtsequ00000010b; rEQUEST tO sENT
out1 equ00000100b; aUX oUTPUT #1
out2 equ00001000b; aUX oUTPUT #2
tstlpequ00010000b; sETS 8250 tEST lOOP CONDITION
; lINE sTATUS (lsport) BITS - - - - - - - - - - - - - - - - - -
davequ00000001b; dATA aVAILABLE (AND BIT TO TEST)
orunequ00000010b; oVERRUN eRROR (REC'D WAS CHAR OVERWRITTEN
rperrequ00000100b; pARITY eRROR
ferrequ00001000b; fRAMING eRROR (CHECKS FOR VALID STOP BIT)
brkdequ00010000b; bREAK dETECT
tbmtequ00100000b; tRANSMIT bUFFER eMPTY (AND BIT TO TEST)
tsreequ01000000b; tRANSMIT sHIFT rEGISTER eMPTY (R/O)
; mODEM sTATUS (msport) BITS - - - - - - - - - - - - - - - - - -
dctsequ00000001b; dELTA cLEAR tO sEND
ddsrequ00000010b; dELTA dATA sET rEADY
teriequ00000100b; tRAILING eDGE rING iNDICATOR
drlsdequ00001000b; dELTA rECEIVE lINE sIGNAL dETECT
ctsequ00010000b; cLEAR tO sEND
dsrequ00100000b; dATA sET rEADY
rdetequ01000000b; rING dETECT
rlsdequ10000000b; cARRIER dETECT
resetequ00000001b; oUTPUT rESET cODE
; bAUD RATE DIVISOR VALUES - - - - - - - - - - - - - - - - - - -
bd110equ1047; 110 BPS
bd300equ384; 300 BPS
bd450equ256; 450 BPS
bd600equ192; 600 BPS
bd710equ162; 710 BPS
bd1200equ96; 1200 BPS
bd2400equ48; 2400 BPS
bd4800equ24; 4800 BPS
bd9600equ12; 9600 BPS
bd19200equ6; 19,200 BPS
bd38400 equ3; 38,400 BPS
bd57600 equ2; 57,600 BPS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;jUMP TABLE FOR THE OVERLAY: DO not CHANGE THIS
jumptab:
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
jpsetport; sET PORT (0 OR 1)
;
; sPARE JUMPS FOR COMPATIBILITY WITH FUTURE VERSIONS
;
jpspare; sPARES FOR LATER USE
jpspare; sPARES FOR LATER USE
jpspare; sPARES FOR LATER USE
jpspare; SPARES FOR LATER USE
jpspare; SPARES FOR LATER USE
jpspare; SPARES FOR LATER USE
; mAIN CODE STARTS HERE
versn:defb'===> vER. 1.5.1520.24.11.88.zmpovl <==='
; 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
; (iT IS NOT NECESSARY TO TEST FOR STATUS)
mchin:
; <== iNSERT YOUR OWN CODE HERE
ina,(dport); TO GET THE CHARACTER IN a
; <== eND OF YOUR OWN CODE
ldl,a; PUT IN hl
ldh,0
ora; SET/CLEAR z
ret
;sEND A CHARACTER TO THE MODEM
mchout:
ldhl,2; GET THE CHARACTER
addhl,sp
lda,(hl); IN a
; <== iNSERT YOUR OWN CODE HERE
out(dport),a
; <== eND OF YOUR OWN CODE
ret; DONE
;tEST FOR OUTPUT READY: RETURN true (1) IN hl IF OK
mordy:
; <== iNSERT YOUR OWN CODE HERE
ldhl,0; aSSUME THAT THE tRANSMIT bUFFER IS FULL
ina,(lsport); gET lINE sTATUS
andtbmt; iS THE tRANSMIT bUFFER eMPTY?
jrz,tb.busy; nO, SKIP
ldl,1; yES, hl = 1 (true)
tb.busy:; <== eND OF YOUR OWN CODE
lda,l; sET/CLEAR z
ora
ret
;tEST FOR CHARACTER AT MODEM: RETURN true (1) IN hl IF SO
mirdy:
; <== iNSERT YOUR OWN CODE HERE
ldhl,0; aSSUME THAT NO DATA IS AVAILABLE
ina,(lsport); gET lINE sTATUS
anddav; iS dATA aVAILABLE?
jrz,no.dav; nO, SKIP
ldl,1; yES, hl = 1 (true)
no.dav:; <== eND OF YOUR OWN CODE
lda,l; SET/CLEAR z
ora
ret
;sEND A BREAK TO THE MODEM: LEAVE EMPTY IF YOUR SYSTEM CAN'T DO IT
sndbrk:
; <== iNSERT YOUR OWN CODE HERE
; tHIS ROUTINE SENDS A 300 MS bREAK tONE AND SETS dtr LOW FOR THE
; SAME LENGTH OF TIME TO DISCONNECT THE MODEM AT BOTH ENDS
xora; cLEAR REG a TO
out(mcport),a; sET dtr AND rts LOW
lda,brks; sET bREAK tONE
out(lcport),a; TO GO TO 'BREAK' LEVEL
ldhl,300; WAIT 300 MS
callwaithlms
dspequ$+1; iNLINE CODE MODIFICATION (DATA, STOP, PARITY)
lda,wls0+wls1; sET 8 DATA BITS, 1 STOP BIT, NO PARITY
out(lcport),a
lda,dtr; sET dtr FOR PROPER mODEM OUTPUT LEVEL
out(mcport),a
; TO RESTORE
; <== eND OF YOUR OWN CODE
ret
;tEST uart FLAGS FOR ERROR: RETURN true (1) IN hl IF ERROR
mdmerr:
; <== iNSERT YOUR OWN CODE HERE
ldhl,0; sET hl = false (0)
; <== eND OF YOUR OWN CODE
lda,l; SET/CLEAR z
ora
ret
;tURN dtr (AND OPTIONALLY rts) on.
dtron:
; <== iNSERT YOUR OWN CODE HERE
lda,dtr; sET dtr
out(mcport),a
; <== eND OF YOUR OWN CODE
ret
;tURN dtr ( AND rts?) off
dtroff:
; <== iNSERT YOUR OWN CODE HERE
xora; cLEAR REG a TO
out(mcport),a; sET dtr AND rts LOW
; <== eND OF YOUR OWN CODE
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
callgetparm
ld(stop),hl; STOP BITS
; <== iNSERT YOUR OWN CODE HERE
di; dISABLE cpu iNTERRUPTS
lda,(brate); a = bAUD RATE NUMBER (SEE TABLE BELOW)
cp11+1; aLLOW SPEEDS TO 57,600 BPS
jrnc,badrate; sKIP IF INVALID BAUD RATE
ld(mspeed),a; ELSE SAVE FOR CURRENT brate
lde,a
ldd,0; de = bAUD RATE NUMBER
ldhl,baud.rates; hl -> sTART OF BAUDRATE DIVISOR TABLE
addhl,de; aDD IT TWICE, EACH
addhl,de; dIVISOR VALUE OCCUPIES TWO BYTES
lda,(hl); hl -> dESIRED DIVISOR VALUE, LOAD hl
inchl; INDIRECT THROUGH hl [(hlihl)]
ldh,(hl)
ldl,a; hl = dIVISOR VALUE
lda,d; a = 0
out(ienreg),a; dISABLE 8250 INTERRUPTS
lda,dlab; sET dlab SO WE CAN USE THE BAUD RATES
out(lcport),a; DIVISORS
lda,l; a = lsp OF DIVISOR
out(lspdiv),a; wRITE DIVISOR'S "lsp"
lda,h; a = msp OF DIVISOR
out(mspdiv),a; wRITE DIVISOR'S "msp"
lda,(data); gET DATA BITS COUNT (7 OR 8)
cp7; iS IT 7 DATA BITS?
lda,10b; aSSUME IT IS
jrz,is7bits; yES, SKIP
lda,11b; nO, IS 8 DATA BITS, a = 11b
is7bits:
ldd,a; sAVE DATA BITS
lda,(stop); gET NUMBER OF DESIRED STOP BITS (1 OR 2)
cp1; wANT ONE STOP BIT?
lda,0; aSSUME SO
jrz,one.stop; yES, SKIP
lda,100b; nO, SET BIT 2 - 2 STOP BITS WANTED
one.stop:
ord; or IN DATA BITS INFO
ldd,a; AND SAVE DATA BITS AND STOP BIT INFO
lda,(parity); gET DESIRED PARITY INDICATOR (n, e OR o)
lde,a; AND SAVE IT FOR POSSIBLE LATER USE
cp'n'; wANT NO PARITY?
lda,d; aSSUME SO, a = DATA, STOP, AND PARITY (d,s,p)
jrz,have.bits; yES, SKIP
lda,e; gET BACK DESIRED PARITY INDICATOR
cp'e'; wANT eVEN PARITY?
lda,pen+pes; aSSUME SO, SET EVEN PARITY
ord; AND or IN DATA BITS AND STOP BIT INFO
jrz,have.bits; yES, SKIP
lda,pen; nO, HAS TO BE oDD PARITY, SET IT
ord; AND or IN DATA BITS AND STOP BIT INFO
have.bits:
ld(dsp),a; sET IT FOR RESETTING AFTER DISCONNECT
out(lcport),a; sET DESIRED WORD, STOP AND PARITY
lda,dtr; sET dtr FOR PROPER modem OPERATION
out(mcport),a
badrate:; sKIPS ABOVE TO HERE IF BAUD RATE BAD
ei; rESTORE cpu INTERRUPTS
; USING VALUES BELOW
; <== eND OF YOUR OWN CODE
ret
stop:defw1; sTOP BITS (WILL BE 1 OR 2)
parity:defw'n'; pARITY (WILL BE 'n', 'e' OR 'o')
data:defw8; dATA BITS (WILL BE 7 OR 8)
brate:defw6; bAUD RATE:
;-----------------------------------------------------------------------
; 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
; 38400 10
; 57600 11
;-----------------------------------------------------------------------
; bAUD RATE DIVISOR TABLE
baud.rates:
defwbd110; 0 - 110 BAUD
defwbd300; 1 - 300
defwbd450; 2 - 450
defwbd600; 3 - 600
defwbd710; 4 - 710
defwbd1200; 5 - 1,200
defwbd2400; 6 - 2,400
defwbd4800; 7 - 4,800
defwbd9600; 8 - 9,600
defwbd19200; 9 - 19,200
defwbd38400; 10 - 38,400
defwbd57600; 11 - 57,600
;
; sET THE PORT. zmp SUPPLIES EITHER 0 OR 1 AS A PARAMETER.
;
SETPORT:
LDHL,2; GET PORT NUMBER
ADDHL,SP
EXDE,HL
CALLGETPARM; IN hl (VALUES ARE 0 AND 1)
; <== iNSERT YOUR OWN CODE HERE
; <== eND OF YOUR OWN CODE
RET
;****************************************************************************
;vIDEO TERMINAL SEQUENCES: THESE ARE FOR adm-3a: mODIFY AS YOU WISH
;cURSOR ADDRESSING: (MODIFIED FOR h19/89)
cursadd:
ldhl,2; GET PARAMETERS
addhl,sp
exde,hl
callgetparm; IN hl
ld(row),hl; ROW
callgetparm
ld(col),hl; COLUMN
; <== iNSERT YOUR OWN CODE HERE
; USING VALUES IN ROW AND COL
callprint
defbesc,'y',0; h19/89 LEADIN
lda,(row); ROW FIRST
adda,' '; ADD OFFSET
callcout
lda,(col); SANE FOR COLUMN
adda,' '
callcout
; <== END OF YOUR OWN CODE
ret
row:defs2; ROW
col:defs2; COLUMN
;cLEAR SCREEN:
cls:
callprint
defbesc,'e',0
ret
;iNVERSE VIDEO ON:
invon:
callprint
defbesc,'P',0
ret
;iNVERSE VIDEO OFF:
invoff:
callprint
defbesc,'Q',0
ret
;tURN OFF CURSOR:
hide:
callprint
defbesc,'X5',0
ret
;tURN ON CURSOR:
show:
callprint
defbesc,'Y5',0
ret
;sAVE CURSOR POSITION:
savecu:
callprint
defbesc,'J',0
ret
;rESTORE CURSOR POSITION:
rescu:
callprint
defbesc,'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 ********************************
; dON'T CHANGE ANYTHING BELOW THIS POINT. wE NEEDED SOME ASSEMBLY LANGUAGE
; STUFF FOR SPEED, AND THIS SEEMED LIKE A GOOD PLACE TO PUT IT.
;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
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
waithls:
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.
;
outerval equ(clkspd/10)+1
innerval equ(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:
defwoverdrive; ovr ETC. DRIVE/USER
defwoveruser
if($ - jumptab) gt ovsize
toobig:jperrval; oVERLAY TOO LARGE!
endif
end