mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:33:12 -06:00
Update zmo-rw01.z80
Optimization and driver clean-up
This commit is contained in:
@@ -4,82 +4,16 @@
|
||||
;
|
||||
; Name ZMO-RW01.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
|
||||
; Modified to ZMP v1.5 standard rjm 25/3/89
|
||||
;
|
||||
; ZMO-RW01.Z80 ROMWBW version using HBIOS and https://github.com/mecparts/zmp version of zmodem
|
||||
; ROMWBW version using HBIOS and https://github.com/mecparts/zmp version of zmodem
|
||||
; Databits, stop bit, parity setting not supported.
|
||||
; All i/o is through the hbios.
|
||||
; All modem/serial i/o is through the hbios.
|
||||
; Timing delay calcuations based on hbios reported cpu speed.
|
||||
; Console is assumed to be current hbios CIO console
|
||||
; Only 1 port is supported by this version of zmp.
|
||||
; Only 1 port is supported by the necports version of zmp.
|
||||
; Port setting supports 2 port, port A is CIO 1, port B is CIO 2
|
||||
; This overlay is compatible with Ron Murray's original ZMP15 which support two ports.
|
||||
; Teraterm users may need to change the ZmodemWinSize value to 1024 in teraterm.ini file.
|
||||
;
|
||||
;-----------------------------------------------------------------------------
|
||||
;
|
||||
;
|
||||
; 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.)
|
||||
;
|
||||
;-----------------------------------------------------------------------------
|
||||
;
|
||||
;
|
||||
; Notes on modifying this file:
|
||||
;
|
||||
; 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 the 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. Examples provided are 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
|
||||
;
|
||||
; call print
|
||||
; db '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 contact me for another version. If too many people need
|
||||
; to do it, we haven't allowed enough room.
|
||||
;
|
||||
; Ron Murray 15/8/88
|
||||
;
|
||||
;
|
||||
;
|
||||
;---------------------------------------------------------------------------
|
||||
|
||||
false equ 0
|
||||
true equ not false
|
||||
@@ -88,7 +22,6 @@ true equ not false
|
||||
|
||||
; User-set variables:
|
||||
|
||||
;clkspd equ 10 ; Processor clock speed in MHz
|
||||
debug equ false ; to allow debugging of overlay with Z8E etc.
|
||||
|
||||
;Set the following two equates to the drive and user area which will contain
|
||||
@@ -103,8 +36,7 @@ overuser equ 0 ; User area to find files
|
||||
initbr equ 10 ; Refer to "baudtbl" table below - brate column
|
||||
;
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
|
||||
;
|
||||
; NOT user-set variables
|
||||
|
||||
userdef equ 0145h ; origin of this overlay
|
||||
@@ -181,14 +113,17 @@ port: db 1 ; current cio port.
|
||||
;
|
||||
;Screen print function
|
||||
scrnpr:
|
||||
; <== Insert your own code here
|
||||
call print
|
||||
db 'This function not supported.',cr,lf,0
|
||||
; <== End of your own code
|
||||
spare:
|
||||
ret
|
||||
|
||||
; User-defined entry routine: leave empty if not needed
|
||||
; User-defined entry routine:
|
||||
;
|
||||
; forcing reinit will resend AT command to modem, reset
|
||||
; current line defaults and eat up buffered characters
|
||||
;
|
||||
; Get and set modem/serial ports to use from the command line
|
||||
;
|
||||
; Get the cpu speed reported by romwbw hbios and calculate
|
||||
; the three required loop counter values for timing.
|
||||
@@ -198,8 +133,8 @@ spare:
|
||||
; millisv (msv)
|
||||
|
||||
userin:
|
||||
ld a,-1 ; force re-init ; forcing reinit will resend AT command to modem, reset
|
||||
ld (mspeed),a ; current line defaults and eat up buffered characters
|
||||
ld a,-1 ; force re-init
|
||||
ld (mspeed),a
|
||||
|
||||
ld a,(fcb) ; first character
|
||||
cp ' ' ; of parsed filename
|
||||
@@ -252,7 +187,7 @@ defport1:
|
||||
;
|
||||
pop bc
|
||||
ret
|
||||
|
||||
;
|
||||
outv: ds 1 ; outer value
|
||||
inv: ds 2 ; inner value
|
||||
msv: ds 2 ; millisec value
|
||||
@@ -260,10 +195,10 @@ msv: ds 2 ; millisec value
|
||||
; maths helpers
|
||||
;
|
||||
mult_a_de: ; https://wikiti.brandonw.net/index.php?title=Z80_Routines:Math:Multiplication
|
||||
ld c, 0
|
||||
ld h, c
|
||||
ld l, h
|
||||
add a, a ; optimised 1st iteration
|
||||
ld c,0
|
||||
ld h,c
|
||||
ld l,h
|
||||
add a,a ; optimised 1st iteration
|
||||
jr nc,$+4
|
||||
ld h,d
|
||||
ld l,e
|
||||
@@ -281,7 +216,7 @@ div_hl_c: ; https://wikiti.brandonw.net/index.php?title=Z80_Routines:Math:Divi
|
||||
xor a
|
||||
ld b,16
|
||||
_loop1:
|
||||
add hl, hl
|
||||
add hl,hl
|
||||
rla
|
||||
jr c,$+5
|
||||
cp c
|
||||
@@ -295,22 +230,15 @@ _loop1:
|
||||
userout:
|
||||
call show
|
||||
ret
|
||||
|
||||
|
||||
;
|
||||
;Get a character from the modem: return in HL
|
||||
mchin:
|
||||
push bc
|
||||
; <== Insert your own code here
|
||||
ld b,00h
|
||||
ld hl,port
|
||||
ld c,(hl)
|
||||
rst 08
|
||||
ld l,e
|
||||
; <== End of your own code
|
||||
|
||||
; ld l,a ; put in HL
|
||||
; ld h,0
|
||||
; or a ; set/clear Z
|
||||
pop bc
|
||||
ret
|
||||
|
||||
@@ -319,17 +247,14 @@ mchout:
|
||||
ld hl,2 ; get the character
|
||||
add hl,sp
|
||||
ld e,(hl)
|
||||
; <== Insert your own code here
|
||||
ld b,01h
|
||||
ld hl,port
|
||||
ld c,(hl)
|
||||
rst 08
|
||||
; <== End of your own code
|
||||
ret ; done
|
||||
|
||||
;Test for output ready: return TRUE (1) in HL if ok
|
||||
mordy:
|
||||
; <== Insert your own code here
|
||||
ld b,03h
|
||||
ld hl,port
|
||||
ld c,(hl)
|
||||
@@ -339,9 +264,7 @@ mordy:
|
||||
jr z,modrdy1
|
||||
ld a,1
|
||||
or a
|
||||
modrdy1:
|
||||
ld l,a
|
||||
; <== End of your own code
|
||||
modrdy1:ld l,a
|
||||
ret
|
||||
|
||||
;Test for character at modem: return TRUE (1) in HL if so
|
||||
@@ -356,54 +279,33 @@ mirdy:
|
||||
jr z,mirdy1
|
||||
ld a,1
|
||||
or a
|
||||
mirdy1:
|
||||
ld l,a
|
||||
mirdy1: ld l,a
|
||||
pop bc
|
||||
ret
|
||||
|
||||
;Send a break to the modem: leave empty if your system can't do it
|
||||
sndbrk:
|
||||
; <== Insert your own code here
|
||||
|
||||
ld hl,300 ; wait 300 mS
|
||||
call waithlms
|
||||
|
||||
; <== End of your own code
|
||||
ret
|
||||
;
|
||||
;Test UART flags for error: return TRUE (1) in HL if error.
|
||||
mdmerr:
|
||||
; <== Insert your own code here
|
||||
ld hl,0
|
||||
|
||||
; <== End of your own code
|
||||
ld a,l ; set/clear Z
|
||||
or a
|
||||
xor a ; set/clear Z
|
||||
ld h,a
|
||||
ld l,a
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;
|
||||
;Turn DTR ON
|
||||
dtron:
|
||||
; <== Insert your own code here
|
||||
|
||||
; <== End of your own code
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;
|
||||
;Turn DTR OFF
|
||||
dtroff:
|
||||
; <== Insert your own code here
|
||||
|
||||
|
||||
; <== End of your own code
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;
|
||||
;Initialise the uart
|
||||
|
||||
;
|
||||
init:
|
||||
ld hl,2 ; get parameters
|
||||
add hl,sp
|
||||
@@ -416,10 +318,7 @@ init:
|
||||
ld (data),hl ; data bits (BINARY 7 or 8)
|
||||
call getparm
|
||||
ld (stop),hl ; stop bits (BINARY 1 or 2)
|
||||
|
||||
|
||||
; <== Insert your own code here
|
||||
; using values below
|
||||
;
|
||||
call print
|
||||
db cr,lf,cr,lf,'CIO Initialized ...',cr,lf,0
|
||||
|
||||
@@ -429,7 +328,7 @@ init:
|
||||
rst 08
|
||||
or a ; check if valid
|
||||
jr nz,initerr
|
||||
|
||||
;
|
||||
ld a,(brate) ; get baud rate to set
|
||||
ld c,a
|
||||
ld b,0
|
||||
@@ -438,7 +337,7 @@ init:
|
||||
ld a,(hl) ; convert to encoded hbios
|
||||
cp a,-1
|
||||
jr z,initerr
|
||||
|
||||
;
|
||||
push af
|
||||
ld a,(port) ; get line characteristics
|
||||
ld c,a
|
||||
@@ -450,30 +349,27 @@ init:
|
||||
pop af
|
||||
or d
|
||||
ld d,a
|
||||
|
||||
;
|
||||
ld b,04h ; set new
|
||||
ld a,(port) ; speed
|
||||
ld c,a
|
||||
rst 08
|
||||
or a
|
||||
jr nz,initerr
|
||||
|
||||
;
|
||||
call print
|
||||
db 'Device: ',0
|
||||
call dispport
|
||||
|
||||
;
|
||||
ld a,(brate)
|
||||
ld (mspeed),a ; don't forget to load mspeed with the
|
||||
; current brate value if the new rate is
|
||||
; valid. See table of values below.
|
||||
; <== End of your own code
|
||||
ret
|
||||
initerr:
|
||||
call print
|
||||
db 'Initization failed, CIO device: ',0
|
||||
call dispport
|
||||
|
||||
;ret
|
||||
|
||||
call show ; show cursor, then ...
|
||||
jp 0 ; bail out to avoid system hang!
|
||||
@@ -486,13 +382,14 @@ dispport1:
|
||||
call print
|
||||
db cr,lf,0
|
||||
ret
|
||||
|
||||
;
|
||||
;--------------------------------------------------------------------------
|
||||
stop: dw 1 ; stop bits
|
||||
parity: dw 'N' ; parity
|
||||
data: dw 8 ; data bits
|
||||
brate: dw initbr ; baud rate:
|
||||
;--------------------------------------------------------------------------
|
||||
;
|
||||
;Values of brate for each baud rate
|
||||
;
|
||||
; hb encode baud rate brate
|
||||
@@ -513,15 +410,9 @@ baudtbl:
|
||||
db 10 ; 76800 12
|
||||
|
||||
;
|
||||
; Set the port. ZMP supplies either 0 or 1 as a parameter. You're on your
|
||||
; own here -- your system is bound to be different from any other! You may
|
||||
; implement a software switch on all the modem-dependent routines, or perhaps
|
||||
; you can have one or two centralised routines for accessing the UARTs and
|
||||
; modify the code from this routine to select one or the other. (Who said
|
||||
; there was anything wrong with self-modifying code?). If you have only one
|
||||
; UART port, or if you don't want to go through all the hassles, just have
|
||||
; this routine returning with no changes made. Note that ZMP calls this
|
||||
; routine with both values for the port on initialisation.
|
||||
; Set the port. ZMP supplies either 0 or 1 as a parameter.
|
||||
; Note that ZMP calls this routine with both values
|
||||
; for the port on initialisation.
|
||||
;
|
||||
; Only originl ZMP calls setport. Mecports does not support setting ports
|
||||
;
|
||||
@@ -530,17 +421,14 @@ setport:
|
||||
add hl,sp
|
||||
ex de,hl
|
||||
call getparm ; in HL (values are 0 and 1)
|
||||
|
||||
; <== Insert your own code here
|
||||
|
||||
;
|
||||
ld a,l ; point to which port
|
||||
ld hl,hbport0 ; we want to set
|
||||
or a
|
||||
jr z,isport0
|
||||
inc hl
|
||||
isport0:
|
||||
ld c,(hl) ; get the associated CIO port
|
||||
|
||||
isport0:ld c,(hl) ; get the associated CIO port
|
||||
;
|
||||
push hl
|
||||
ld b,06h ; test if a valid cio
|
||||
rst 08
|
||||
@@ -551,17 +439,14 @@ isport0:
|
||||
ld (port),a ; save the valid port
|
||||
call print
|
||||
db 'Setting CIO device: ',0
|
||||
call dispport
|
||||
ret
|
||||
seterr:
|
||||
push hl
|
||||
jp dispport
|
||||
;
|
||||
seterr: push hl
|
||||
call print
|
||||
db 'Unable to set CIO device: ',0
|
||||
pop hl
|
||||
ld a,(hl) ; get port we wanted to set
|
||||
call dispport1
|
||||
; <== End of your own code
|
||||
ret
|
||||
jp dispport1
|
||||
;
|
||||
;****************************************************************************
|
||||
;Video terminal sequences: these are for VT-100: Modify as you wish
|
||||
@@ -594,8 +479,7 @@ cursadd:
|
||||
cursconv:
|
||||
ld b,a
|
||||
xor a
|
||||
ca1:
|
||||
add a,1
|
||||
ca1: add a,1
|
||||
daa
|
||||
djnz ca1
|
||||
ld (num),a
|
||||
@@ -607,17 +491,16 @@ ca1:
|
||||
srl a
|
||||
or '0'
|
||||
call cout
|
||||
ca2:
|
||||
ld a,(num)
|
||||
ca2: ld a,(num)
|
||||
and 0fh
|
||||
or '0'
|
||||
call cout
|
||||
ret
|
||||
|
||||
;
|
||||
row: ds 2 ; row
|
||||
col: ds 2 ; column
|
||||
num: ds 1
|
||||
|
||||
;
|
||||
;Clear screen:
|
||||
cls:
|
||||
call print
|
||||
@@ -664,11 +547,11 @@ rescu:
|
||||
|
||||
;Service modem interrupt:
|
||||
mint:
|
||||
ret ; my system doesn't need this
|
||||
; ret ; my system doesn't need this
|
||||
|
||||
;Initialise interrupt vectors:
|
||||
invec:
|
||||
ret ; ditto
|
||||
; ret ; ditto
|
||||
|
||||
;De-initialise interrupt vectors:
|
||||
dinvec:
|
||||
@@ -682,8 +565,7 @@ dinvec:
|
||||
mrd:
|
||||
push bc ; save bc
|
||||
ld bc,100 ; set limit
|
||||
mrd1:
|
||||
call mirdy ; char at modem?
|
||||
mrd1: call mirdy ; char at modem?
|
||||
jr nz,mrd2 ; yes, exit
|
||||
ld hl,1 ; else wait 1ms
|
||||
call waithlms
|
||||
@@ -693,30 +575,25 @@ mrd1:
|
||||
jr nz,mrd1
|
||||
ld hl,0 ; none there, result=0
|
||||
xor a
|
||||
mrd2:
|
||||
pop bc
|
||||
mrd2: pop bc
|
||||
ret
|
||||
|
||||
; Inline print routine: destroys A and HL
|
||||
|
||||
print:
|
||||
ex (sp),hl ; get address of string
|
||||
ploop:
|
||||
ld a,(hl) ; get next
|
||||
print: ex (sp),hl ; get address of string
|
||||
ploop: ld a,(hl) ; get next
|
||||
inc hl ; bump pointer
|
||||
or a ; done if zero
|
||||
jr z,pdone
|
||||
call cout ; else print
|
||||
jr ploop ; and loop
|
||||
pdone:
|
||||
ex (sp),hl ; restore return address
|
||||
pdone: ex (sp),hl ; restore return address
|
||||
ret ; and quit
|
||||
|
||||
;
|
||||
;Output a character in A to the console
|
||||
;
|
||||
cout:
|
||||
push bc ; save regs
|
||||
cout: push bc ; save regs
|
||||
push de
|
||||
push hl
|
||||
ld e,a ; character to E
|
||||
@@ -726,36 +603,31 @@ cout:
|
||||
pop de
|
||||
pop bc
|
||||
ret
|
||||
;
|
||||
; Calculate values for loop constants.
|
||||
; Need to have two loops to avoid 16-bit overflow with clock speeds above 9 MHz.
|
||||
|
||||
;Wait(seconds)
|
||||
wait:
|
||||
ld hl,2
|
||||
;outerval equ (clkspd / 10) + 1
|
||||
;innerval equ (6667 / outerval) * clkspd
|
||||
|
||||
;Wait(seconds) - entry point from C
|
||||
wait: ld hl,2
|
||||
add hl,sp
|
||||
ex de,hl ; get delay size
|
||||
call getparm
|
||||
; fall thru to..
|
||||
;Wait seconds in HL
|
||||
waithls:
|
||||
waithls: - entry point for this overlay
|
||||
push bc ; save bc
|
||||
push de ; de
|
||||
push ix ; and ix
|
||||
ld ix,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:
|
||||
ld a,(outv) ; was ld b,outerval
|
||||
;
|
||||
wait10: ld a,(outv) ; was ld b,outerval
|
||||
ld b,a
|
||||
wait11:
|
||||
ld de,(inv) ; was ld de,innerval
|
||||
|
||||
wait12:
|
||||
bit 0,(ix) ; time-wasters
|
||||
wait11: ld de,(inv) ; was ld de,innerval
|
||||
wait12: bit 0,(ix) ; time-wasters
|
||||
bit 0,(ix)
|
||||
bit 0,(ix) ; 20 T-states each
|
||||
bit 0,(ix)
|
||||
@@ -776,21 +648,17 @@ wait12:
|
||||
pop bc ; and bc
|
||||
ret
|
||||
|
||||
;Wait milliseconds
|
||||
mswait:
|
||||
ld hl,2
|
||||
;Wait milliseconds - entry point from C
|
||||
mswait: ld hl,2
|
||||
add hl,sp
|
||||
ex de,hl ; get delay size
|
||||
call getparm
|
||||
; fall thru to..
|
||||
;Wait milliseconds in HL
|
||||
waithlms:
|
||||
waithlms: - entry point for this overlay
|
||||
push de
|
||||
w1ms0:
|
||||
ld de,(msv) ; was ld de,39 * clkspd
|
||||
|
||||
w1ms1:
|
||||
dec de
|
||||
w1ms0: ld de,(msv) ; was ld de,39 * clkspd
|
||||
w1ms1: dec de
|
||||
ld a,d
|
||||
or e
|
||||
jr nz,w1ms1
|
||||
|
||||
Reference in New Issue
Block a user