178 lines
3.3 KiB
Plaintext
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
|
|
|