1
0
Fork 0
qterm/source/XUTIL.Z

178 lines
3.3 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; 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