1
0
Files
qterm/source/XUTIL.Z
T
2020-10-05 14:03:34 +02:00

178 lines
3.3 KiB
Plaintext

; xutil.z - xmodem utilities
.incl "c:xmodem"
.extern initx ; set up an xmodem file transfer
initx:
ld hl,xabort
ld (abortf),hl ; set the abort function
ld hl,xmstr
jp initsc ; just set up screen with 'Xmodem' string
.dseg
xmstr: db 'Xmodem\0'
.cseg
.extern xmflgs ; parse flags for an xmodem send
xmflgs:
call clrflg
ld a,1
ld (crcmod),a ; but set crc flag
xmflp: ld a,(hl)
or 0x20
cp 0x20
ret z ; return on end of string or space
inc hl
cp 'b' ; 'b' - modem7 batch
jr nz,noxmb
ld (mdm7b),a ; set modem7 batch flag
xor a
ld (ymdmb),a ; clear ymodem batch (can't have both)
jr xmflp
noxmb: cp 'y' ; 'y' - ymodem batch
jr nz,noxmy
ld (ymdmb),a ; set ymodem batch flag
xor a
ld (mdm7b),a ; clear modem7 batch (can't have both)
jr xmflp
noxmy: cp 'k' ; 'k' - 1K packets
jr nz,noxmk
ld (longpk),a ; set the flag
jr xmflp
noxmk: cp 'q' ; 'q' - quiet value
jr nz,noxmq
ex de,hl
ld hl,qcount
inc (hl) ; bump the count
ex de,hl
jr xmflp
noxmq: cp 'a' ; 'a' - alarm
jr nz,noxma
ld (beep),a ; set flag to beep on completion
jr xmflp
noxma: xor 'c' ; 'c' - checksum mode
jr nz,xmflp
ld (crcmod),a ; set to checksum
jr xmflp
.extern updcrc ; update crc with value in a
updcrc:
ld c,a ; save byte in c
call dou1
dou1: ld hl,chksum
ld a,c
rrca
rrca
rrca
rrca
ld c,a
xor a
rld
inc hl
rld
xor c
and 0x0f
add a,a
push hl
ld l,a
ld h,0
ld de,crctab + 1
add hl,de
ex de,hl
pop hl
ld a,(de)
dec de
xor (hl)
ld (hl),a
dec hl
ld a,(de)
xor (hl)
ld (hl),a
ret
.extern can3 ; send 5 CAN's to far end to force it to stop
can3: ; used to be three, but with Zmodem systems
ld b,5 ; sometimes more are needed
can3lp: push bc
ld a,CAN
call modopc
pop bc
djnz can3lp
ret
.extern chkcan ; called when we get a CAN - checks for a
chkcan: ; second right behind it
call gettc3 ; wait 3 seconds
cp CAN
ret nz ; no - didn't get one
call diag
db 'Cancelled by remote\0'
xor a
ret
.extern rnresp ; beef about failure of far end to respond
rnresp:
call diag
db 'Remote not responding\0'
ret
.extern cvtnib ; convert a nibble at the bottom of a to a
cvtnib: ; character
and 0x0f ; get just the bits we want
add a,'0'
cp '9' + 1 ; check if it's a digit ok
ret c ; yes - return as is
add a,0x27 ; else conver to a letter
ret
xabort: call gettc3
jr nc,xabort ; let the line cool down
call can3
jp dabort
.useg
.extern olp
olp: ds 1
.extern attmps
attmps: ds 1
.extern closeo
closeo: ds 1
.extern fatal
fatal: ds 1
.extern errorf
errorf: ds 1
.extern batch
batch: ds 1
.extern secip
secip: ds 1
.extern eotc
eotc: ds 1
.extern openfl ; \
openfl: ds 1 ; \ Bound
.extern sectnm ; /
sectnm: ds 2 ; /
.extern bufsiz
bufsiz: ds 2
.extern chksum
chksum: ds 2
.extern expsec
expsec: ds 2
.extern sntsec
sntsec: ds 2
.extern xbuff
.extern packet
xbuff:
packet:
ds 1024
.dseg
crctab:
dw 0x0000, 0x1021
dw 0x2042, 0x3063
dw 0x4084, 0x50a5
dw 0x60c6, 0x70e7
dw 0x8108, 0x9129
dw 0xa14a, 0xb16b
dw 0xc18c, 0xd1ad
dw 0xe1ce, 0xf1ef