Browse Source

Update zmo-rw01.z80

Optimization and driver clean-up
pull/235/head
b1ackmai1er 4 years ago
parent
commit
cbe8ec2aff
  1. 284
      Source/Apps/ZMP/zmo-rw01.z80

284
Source/Apps/ZMP/zmo-rw01.z80

@ -4,82 +4,16 @@
; ;
; Name ZMO-RW01.Z80 ; 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. ; 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. ; 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 ; 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. ; 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. ; 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 false equ 0
true equ not false true equ not false
@ -88,7 +22,6 @@ true equ not false
; User-set variables: ; User-set variables:
;clkspd equ 10 ; Processor clock speed in MHz
debug equ false ; to allow debugging of overlay with Z8E etc. 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 ;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 initbr equ 10 ; Refer to "baudtbl" table below - brate column
; ;
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
;
; NOT user-set variables ; NOT user-set variables
userdef equ 0145h ; origin of this overlay userdef equ 0145h ; origin of this overlay
@ -181,14 +113,17 @@ port: db 1 ; current cio port.
; ;
;Screen print function ;Screen print function
scrnpr: scrnpr:
; <== Insert your own code here
call print call print
db 'This function not supported.',cr,lf,0 db 'This function not supported.',cr,lf,0
; <== End of your own code
spare: spare:
ret 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 ; Get the cpu speed reported by romwbw hbios and calculate
; the three required loop counter values for timing. ; the three required loop counter values for timing.
@ -198,8 +133,8 @@ spare:
; millisv (msv) ; millisv (msv)
userin: 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 ld a,(fcb) ; first character
cp ' ' ; of parsed filename cp ' ' ; of parsed filename
@ -252,7 +187,7 @@ defport1:
; ;
pop bc pop bc
ret ret
;
outv: ds 1 ; outer value outv: ds 1 ; outer value
inv: ds 2 ; inner value inv: ds 2 ; inner value
msv: ds 2 ; millisec value msv: ds 2 ; millisec value
@ -260,10 +195,10 @@ msv: ds 2 ; millisec value
; maths helpers ; maths helpers
; ;
mult_a_de: ; https://wikiti.brandonw.net/index.php?title=Z80_Routines:Math:Multiplication 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 jr nc,$+4
ld h,d ld h,d
ld l,e ld l,e
@ -281,7 +216,7 @@ div_hl_c: ; https://wikiti.brandonw.net/index.php?title=Z80_Routines:Math:Divi
xor a xor a
ld b,16 ld b,16
_loop1: _loop1:
add hl, hl
add hl,hl
rla rla
jr c,$+5 jr c,$+5
cp c cp c
@ -295,22 +230,15 @@ _loop1:
userout: userout:
call show call show
ret ret
;
;Get a character from the modem: return in HL ;Get a character from the modem: return in HL
mchin: mchin:
push bc push bc
; <== Insert your own code here
ld b,00h ld b,00h
ld hl,port ld hl,port
ld c,(hl) ld c,(hl)
rst 08 rst 08
ld l,e ld l,e
; <== End of your own code
; ld l,a ; put in HL
; ld h,0
; or a ; set/clear Z
pop bc pop bc
ret ret
@ -319,17 +247,14 @@ mchout:
ld hl,2 ; get the character ld hl,2 ; get the character
add hl,sp add hl,sp
ld e,(hl) ld e,(hl)
; <== Insert your own code here
ld b,01h ld b,01h
ld hl,port ld hl,port
ld c,(hl) ld c,(hl)
rst 08 rst 08
; <== End of your own code
ret ; done ret ; done
;Test for output ready: return TRUE (1) in HL if ok ;Test for output ready: return TRUE (1) in HL if ok
mordy: mordy:
; <== Insert your own code here
ld b,03h ld b,03h
ld hl,port ld hl,port
ld c,(hl) ld c,(hl)
@ -339,9 +264,7 @@ mordy:
jr z,modrdy1 jr z,modrdy1
ld a,1 ld a,1
or a or a
modrdy1:
ld l,a
; <== End of your own code
modrdy1:ld l,a
ret ret
;Test for character at modem: return TRUE (1) in HL if so ;Test for character at modem: return TRUE (1) in HL if so
@ -356,54 +279,33 @@ mirdy:
jr z,mirdy1 jr z,mirdy1
ld a,1 ld a,1
or a or a
mirdy1:
ld l,a
mirdy1: ld l,a
pop bc pop bc
ret ret
;Send a break to the modem: leave empty if your system can't do it ;Send a break to the modem: leave empty if your system can't do it
sndbrk: sndbrk:
; <== Insert your own code here
ld hl,300 ; wait 300 mS ld hl,300 ; wait 300 mS
call waithlms call waithlms
; <== End of your own code
ret ret
; ;
;Test UART flags for error: return TRUE (1) in HL if error. ;Test UART flags for error: return TRUE (1) in HL if error.
mdmerr: 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 ret
;
;Turn DTR ON ;Turn DTR ON
dtron: dtron:
; <== Insert your own code here
; <== End of your own code
ret ret
;
;Turn DTR OFF ;Turn DTR OFF
dtroff: dtroff:
; <== Insert your own code here
; <== End of your own code
ret ret
;
;Initialise the uart ;Initialise the uart
;
init: init:
ld hl,2 ; get parameters ld hl,2 ; get parameters
add hl,sp add hl,sp
@ -416,10 +318,7 @@ init:
ld (data),hl ; data bits (BINARY 7 or 8) ld (data),hl ; data bits (BINARY 7 or 8)
call getparm call getparm
ld (stop),hl ; stop bits (BINARY 1 or 2) ld (stop),hl ; stop bits (BINARY 1 or 2)
; <== Insert your own code here
; using values below
;
call print call print
db cr,lf,cr,lf,'CIO Initialized ...',cr,lf,0 db cr,lf,cr,lf,'CIO Initialized ...',cr,lf,0
@ -429,7 +328,7 @@ init:
rst 08 rst 08
or a ; check if valid or a ; check if valid
jr nz,initerr jr nz,initerr
;
ld a,(brate) ; get baud rate to set ld a,(brate) ; get baud rate to set
ld c,a ld c,a
ld b,0 ld b,0
@ -438,7 +337,7 @@ init:
ld a,(hl) ; convert to encoded hbios ld a,(hl) ; convert to encoded hbios
cp a,-1 cp a,-1
jr z,initerr jr z,initerr
;
push af push af
ld a,(port) ; get line characteristics ld a,(port) ; get line characteristics
ld c,a ld c,a
@ -450,30 +349,27 @@ init:
pop af pop af
or d or d
ld d,a ld d,a
;
ld b,04h ; set new ld b,04h ; set new
ld a,(port) ; speed ld a,(port) ; speed
ld c,a ld c,a
rst 08 rst 08
or a or a
jr nz,initerr jr nz,initerr
;
call print call print
db 'Device: ',0 db 'Device: ',0
call dispport call dispport
;
ld a,(brate) ld a,(brate)
ld (mspeed),a ; don't forget to load mspeed with the ld (mspeed),a ; don't forget to load mspeed with the
; current brate value if the new rate is ; current brate value if the new rate is
; valid. See table of values below. ; valid. See table of values below.
; <== End of your own code
ret ret
initerr: initerr:
call print call print
db 'Initization failed, CIO device: ',0 db 'Initization failed, CIO device: ',0
call dispport call dispport
;ret
call show ; show cursor, then ... call show ; show cursor, then ...
jp 0 ; bail out to avoid system hang! jp 0 ; bail out to avoid system hang!
@ -486,13 +382,14 @@ dispport1:
call print call print
db cr,lf,0 db cr,lf,0
ret ret
;
;-------------------------------------------------------------------------- ;--------------------------------------------------------------------------
stop: dw 1 ; stop bits stop: dw 1 ; stop bits
parity: dw 'N' ; parity parity: dw 'N' ; parity
data: dw 8 ; data bits data: dw 8 ; data bits
brate: dw initbr ; baud rate: brate: dw initbr ; baud rate:
;-------------------------------------------------------------------------- ;--------------------------------------------------------------------------
;
;Values of brate for each baud rate ;Values of brate for each baud rate
; ;
; hb encode baud rate brate ; hb encode baud rate brate
@ -513,15 +410,9 @@ baudtbl:
db 10 ; 76800 12 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 ; Only originl ZMP calls setport. Mecports does not support setting ports
; ;
@ -530,17 +421,14 @@ setport:
add hl,sp add hl,sp
ex de,hl ex de,hl
call getparm ; in HL (values are 0 and 1) call getparm ; in HL (values are 0 and 1)
; <== Insert your own code here
;
ld a,l ; point to which port ld a,l ; point to which port
ld hl,hbport0 ; we want to set ld hl,hbport0 ; we want to set
or a or a
jr z,isport0 jr z,isport0
inc hl inc hl
isport0:
ld c,(hl) ; get the associated CIO port
isport0:ld c,(hl) ; get the associated CIO port
;
push hl push hl
ld b,06h ; test if a valid cio ld b,06h ; test if a valid cio
rst 08 rst 08
@ -551,17 +439,14 @@ isport0:
ld (port),a ; save the valid port ld (port),a ; save the valid port
call print call print
db 'Setting CIO device: ',0 db 'Setting CIO device: ',0
call dispport
ret
seterr:
push hl
jp dispport
;
seterr: push hl
call print call print
db 'Unable to set CIO device: ',0 db 'Unable to set CIO device: ',0
pop hl pop hl
ld a,(hl) ; get port we wanted to set 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 ;Video terminal sequences: these are for VT-100: Modify as you wish
@ -594,8 +479,7 @@ cursadd:
cursconv: cursconv:
ld b,a ld b,a
xor a xor a
ca1:
add a,1
ca1: add a,1
daa daa
djnz ca1 djnz ca1
ld (num),a ld (num),a
@ -607,17 +491,16 @@ ca1:
srl a srl a
or '0' or '0'
call cout call cout
ca2:
ld a,(num)
ca2: ld a,(num)
and 0fh and 0fh
or '0' or '0'
call cout call cout
ret ret
;
row: ds 2 ; row row: ds 2 ; row
col: ds 2 ; column col: ds 2 ; column
num: ds 1 num: ds 1
;
;Clear screen: ;Clear screen:
cls: cls:
call print call print
@ -664,11 +547,11 @@ rescu:
;Service modem interrupt: ;Service modem interrupt:
mint: mint:
ret ; my system doesn't need this
; ret ; my system doesn't need this
;Initialise interrupt vectors: ;Initialise interrupt vectors:
invec: invec:
ret ; ditto
; ret ; ditto
;De-initialise interrupt vectors: ;De-initialise interrupt vectors:
dinvec: dinvec:
@ -682,8 +565,7 @@ dinvec:
mrd: mrd:
push bc ; save bc push bc ; save bc
ld bc,100 ; set limit ld bc,100 ; set limit
mrd1:
call mirdy ; char at modem?
mrd1: call mirdy ; char at modem?
jr nz,mrd2 ; yes, exit jr nz,mrd2 ; yes, exit
ld hl,1 ; else wait 1ms ld hl,1 ; else wait 1ms
call waithlms call waithlms
@ -693,30 +575,25 @@ mrd1:
jr nz,mrd1 jr nz,mrd1
ld hl,0 ; none there, result=0 ld hl,0 ; none there, result=0
xor a xor a
mrd2:
pop bc
mrd2: pop bc
ret ret
; Inline print routine: destroys A and HL ; 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 inc hl ; bump pointer
or a ; done if zero or a ; done if zero
jr z,pdone jr z,pdone
call cout ; else print call cout ; else print
jr ploop ; and loop jr ploop ; and loop
pdone:
ex (sp),hl ; restore return address
pdone: ex (sp),hl ; restore return address
ret ; and quit ret ; and quit
; ;
;Output a character in A to the console ;Output a character in A to the console
; ;
cout:
push bc ; save regs
cout: push bc ; save regs
push de push de
push hl push hl
ld e,a ; character to E ld e,a ; character to E
@ -726,36 +603,31 @@ cout:
pop de pop de
pop bc pop bc
ret 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 add hl,sp
ex de,hl ; get delay size ex de,hl ; get delay size
call getparm call getparm
; fall thru to.. ; fall thru to..
;Wait seconds in HL ;Wait seconds in HL
waithls:
waithls: - entry point for this overlay
push bc ; save bc push bc ; save bc
push de ; de push de ; de
push ix ; and ix push ix ; and ix
ld ix,0 ; then point ix to 0 ld ix,0 ; then point ix to 0
; so we don't upset memory-mapped i/o ; 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 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)
bit 0,(ix) ; 20 T-states each bit 0,(ix) ; 20 T-states each
bit 0,(ix) bit 0,(ix)
@ -776,21 +648,17 @@ wait12:
pop bc ; and bc pop bc ; and bc
ret ret
;Wait milliseconds
mswait:
ld hl,2
;Wait milliseconds - entry point from C
mswait: ld hl,2
add hl,sp add hl,sp
ex de,hl ; get delay size ex de,hl ; get delay size
call getparm call getparm
; fall thru to.. ; fall thru to..
;Wait milliseconds in HL ;Wait milliseconds in HL
waithlms:
waithlms: - entry point for this overlay
push de 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 ld a,d
or e or e
jr nz,w1ms1 jr nz,w1ms1

Loading…
Cancel
Save