1
0
Fork 0
qterm/source/RECVX.Z

359 lines
4.8 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.

; 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