359 lines
4.8 KiB
Plaintext
359 lines
4.8 KiB
Plaintext
; recvx.z - receive a file via xmodem protocol
|
||
|
||
.incl "c:vars"
|
||
.incl "c:xmodem"
|
||
|
||
.extern xrfile
|
||
xrfile:
|
||
xor a
|
||
ld (batch),a
|
||
ld (ymdmb),a
|
||
ld (fatal),a
|
||
ld (errors),a
|
||
ld (crcerc),a
|
||
ld (errorf),a
|
||
ld (openfl),a
|
||
ld (secip),a
|
||
ld (eotc),a
|
||
ld h,a
|
||
ld l,a
|
||
ld (sectnm),hl
|
||
ld (sntsec),hl
|
||
ld l,128
|
||
ld (bufsiz),hl
|
||
call snint
|
||
jr mainlp
|
||
sndnk1: call flsnak
|
||
mainlp: xor a
|
||
ld (errorf),a
|
||
reget: call gettc3
|
||
ld hl,eotc
|
||
jr c,nmoneh
|
||
cp EOT
|
||
jp z,soheot
|
||
ld (hl),0
|
||
cp CAN
|
||
jr z,sohcan
|
||
cp STX
|
||
jr z,sohsh1
|
||
cp SOH
|
||
sohsh1: jp z,sohsoh
|
||
cp ACK
|
||
jr nz,reget
|
||
sohack: ld hl,(sntsec)
|
||
ld a,h
|
||
or l
|
||
jr nz,reget
|
||
ld (chksum),a
|
||
ld de,auxfcb + 2
|
||
ld b,NAMSIZ
|
||
acknlp: ld a,4
|
||
call gettcp
|
||
jr c,nmonec
|
||
cp CAN
|
||
jr nz,nonmcn
|
||
sohcan: call chkcan
|
||
ret z
|
||
nmonec: jp ckserr
|
||
nmoneh: ld a,(hl)
|
||
or a
|
||
jp nz,ackeot
|
||
jr nmonec
|
||
nonmcn: cp EOT
|
||
jr nz,nonmet
|
||
ld hl,auxfcb + 2
|
||
sbc hl,de
|
||
ld a,l
|
||
ret z
|
||
ld a,BADNAM
|
||
nonmet: cp BADNAM
|
||
jr z,nmonec
|
||
nmsavc: ld (de),a
|
||
inc de
|
||
ld hl,chksum
|
||
add a,(hl)
|
||
ld (hl),a
|
||
ld a,ACK
|
||
push bc
|
||
push de
|
||
call modopc
|
||
pop de
|
||
pop bc
|
||
djnz acknlp
|
||
call gettc3
|
||
cp CTRLZ
|
||
jr nz,nmonec
|
||
ld hl,chksum
|
||
add a,(hl)
|
||
call modopc
|
||
call gettc3
|
||
cp ACK
|
||
jr nz,nmonec
|
||
ld hl,(newusr)
|
||
ld (auxfcb),hl
|
||
ld hl,auxfcb + 13
|
||
ld de,auxfcb + 14
|
||
ld bc,20
|
||
ld (hl),b
|
||
ldir
|
||
call auxopn
|
||
ld (batch),a
|
||
ld (openfl),a
|
||
call pktok
|
||
jp setb
|
||
sohsoh: ld hl,128
|
||
cp SOH
|
||
jr z,gotbsz
|
||
ld hl,1024
|
||
gotbsz: ld (bufsiz),hl
|
||
ld hl,(sntsec)
|
||
ld a,h
|
||
or l
|
||
jr nz,noinit
|
||
ld (errors),a
|
||
noinit: call gettc3
|
||
push af
|
||
call gettc3
|
||
pop bc
|
||
ld c,a
|
||
add a,b
|
||
inc a
|
||
jp nz,snerr
|
||
ld a,(sectnm)
|
||
inc a
|
||
xor b
|
||
jr nz,pnerr
|
||
inc a
|
||
ld (secip),a
|
||
call redsec
|
||
jp c,ckerr
|
||
call pktok
|
||
xor a
|
||
ld (errors),a
|
||
ld a,(bufsiz + 1)
|
||
or a
|
||
ld de,1
|
||
jr z,updrsc
|
||
ld e,8
|
||
updrsc: ld hl,(sntsec)
|
||
add hl,de
|
||
ld (sntsec),hl
|
||
ld hl,sectnm
|
||
inc (hl)
|
||
dec hl ; i.e. ld hl,openfl
|
||
ld a,(hl)
|
||
or a
|
||
jr nz,isopen
|
||
inc (hl)
|
||
ld bc,13
|
||
call xferaz
|
||
ld de,auxfcb + 2
|
||
ld a,(de)
|
||
cp ' '
|
||
jr nz,isaux
|
||
ld hl,genfn
|
||
ld bc,11
|
||
ldir
|
||
isaux: call auxopn
|
||
jr isopen
|
||
opener: call can3
|
||
xor a
|
||
ret
|
||
isopen: ld hl,(bufsiz)
|
||
ld de,xbuff
|
||
wrtlp: ld a,(de)
|
||
push de
|
||
push hl
|
||
call putw2c
|
||
pop hl
|
||
pop de
|
||
inc de
|
||
dec hl
|
||
ld a,h
|
||
or l
|
||
jr nz,wrtlp
|
||
sndack: ld a,ACK
|
||
call modopc
|
||
jp mainlp
|
||
pnerr: ld hl,(sntsec)
|
||
ld a,h
|
||
or l
|
||
or b
|
||
jr z,ymname
|
||
ld a,(sectnm)
|
||
cp b
|
||
jr nz,numbad
|
||
call diag
|
||
db 'Duplicate sector flushed\0'
|
||
flsdup: call gettc3
|
||
jr nc,flsdup
|
||
jr sndack
|
||
numbad: call dnum
|
||
ld a,1
|
||
ld (fatal),a
|
||
call can3
|
||
jr ckserr
|
||
ymname: call redsec
|
||
jr c,ckerr
|
||
call pktok
|
||
ld a,(xbuff)
|
||
or a
|
||
jr nz,isynam
|
||
ld a,ACK
|
||
call modopc
|
||
xor a
|
||
ret
|
||
isynam: ld (ymdmb),a
|
||
ld hl,xbuff
|
||
call cpmaux
|
||
call auxopn
|
||
ld a,ACK
|
||
ld (batch),a
|
||
ld (openfl),a
|
||
call modopc
|
||
ld b,20
|
||
waitjn: push bc
|
||
call tenth
|
||
pop bc
|
||
djnz waitjn
|
||
jr setb
|
||
snerr: call dnum
|
||
ckserr: ld hl,errorf
|
||
inc (hl)
|
||
ckerr: call pkterr
|
||
ld hl,errors
|
||
inc (hl)
|
||
ld hl,(sntsec)
|
||
ld a,(secip)
|
||
or h
|
||
or l
|
||
jr z,setb
|
||
ld a,(errorf)
|
||
or a
|
||
jr z,noerr
|
||
ld a,(fatal)
|
||
or a
|
||
jp nz,killit
|
||
quiet: call gettc3
|
||
jr nc,quiet
|
||
jr sndnak
|
||
setb: ld hl,errors
|
||
ld a,(hl)
|
||
xor CRCSW
|
||
jr nz,crcnak
|
||
ld (hl),a
|
||
inc hl
|
||
inc (hl)
|
||
ld a,(hl)
|
||
xor 4
|
||
jp z,killit
|
||
inc hl
|
||
ld a,(hl)
|
||
or a
|
||
jr z,setcrc
|
||
ld (hl),0
|
||
call diag
|
||
db 'Switching to checksum\0'
|
||
jr crcnak
|
||
setcrc: inc (hl)
|
||
call diag
|
||
db 'Switching to CRC\0'
|
||
crcnak: call snint
|
||
jr noerr
|
||
sndnak: call flsnak
|
||
noerr: ld a,(errors)
|
||
cp ERRMAX
|
||
jp c,mainlp
|
||
killit: call can3
|
||
xor a
|
||
ret
|
||
soheot: ld a,1
|
||
call gettoc
|
||
jr c,eotok
|
||
call diag
|
||
db 'EOT followed by character - ignored\0'
|
||
jp ckserr
|
||
eotok: ld hl,eotc
|
||
ld a,(hl)
|
||
or a
|
||
jr nz,ackeot
|
||
inc (hl)
|
||
ld a,(errors)
|
||
cp ERRMAX
|
||
jr nc,killit
|
||
jp sndnk1
|
||
ackeot: call flshw2
|
||
ld de,auxfcb
|
||
ld c,close
|
||
call usrbds
|
||
ld a,ACK
|
||
call modopc
|
||
ld a,(batch)
|
||
or a
|
||
ret
|
||
|
||
redsec: ld hl,0
|
||
ld (chksum),hl
|
||
ld hl,(bufsiz)
|
||
ld de,xbuff
|
||
rblp: push hl
|
||
push de
|
||
call gettc3
|
||
pop de
|
||
jr nc,nordto
|
||
pop hl
|
||
rdtime: call dtime
|
||
seterr: ld hl,errorf
|
||
inc (hl)
|
||
scf
|
||
ret
|
||
nordto: ld (de),a
|
||
ld a,(crcmod)
|
||
or a
|
||
ld a,(de)
|
||
jr z,updcsm
|
||
push de
|
||
call updcrc
|
||
pop de
|
||
jr mvptr
|
||
updcsm: ld hl,chksum
|
||
add a,(hl)
|
||
ld (hl),a
|
||
mvptr: pop hl
|
||
inc de
|
||
dec hl
|
||
ld a,h
|
||
or l
|
||
jr nz,rblp
|
||
ld a,(crcmod)
|
||
or a
|
||
call nz,gettc3
|
||
jr c,rdtime
|
||
ld d,a
|
||
push af
|
||
call gettc3
|
||
pop de
|
||
jr c,rdtime
|
||
ld e,a
|
||
ld hl,(chksum)
|
||
xor a
|
||
sbc hl,de
|
||
ret z
|
||
ld a,(crcmod)
|
||
or a
|
||
jr nz,badcrc
|
||
call dcheck
|
||
jr seterr
|
||
badcrc: call dcrc
|
||
jr seterr
|
||
|
||
snint: ld a,(crcmod)
|
||
or a
|
||
ld a,CRCCHR
|
||
jr nz,sendnc
|
||
flsnak: ld a,NAK
|
||
push af
|
||
call flsrng
|
||
pop af
|
||
sendnc: jp modopc
|
||
|