178 lines
2.8 KiB
Plaintext
178 lines
2.8 KiB
Plaintext
; catch.z - open & close catch files, also put them on hold
|
|
|
|
.incl "c:vars"
|
|
|
|
.extern catch
|
|
catch:
|
|
ld a,(cflg)
|
|
or a
|
|
jr z,tfileo
|
|
ld a,2
|
|
ld (cflg),a
|
|
|
|
.extern hold
|
|
hold:
|
|
ld hl,cflg
|
|
ld a,(hl)
|
|
or a ; file open?
|
|
ret z ; no - so do nothing
|
|
xor 3
|
|
ld (hl),a ; toggle hold mode
|
|
push af
|
|
call ilprt
|
|
db '\r\nCatch file \0'
|
|
pop af
|
|
dec a
|
|
jr z,reac
|
|
call ilprt
|
|
db 'on hold\r\n\0'
|
|
ret
|
|
reac: call ilprt
|
|
db 'reactivated\r\n\0'
|
|
ret
|
|
|
|
.extern cclose
|
|
cclose:
|
|
ld a,(cflg)
|
|
or a
|
|
ret z
|
|
call doclos
|
|
call ilprt
|
|
db '\r\nFile closed\r\n\0'
|
|
ret
|
|
|
|
tfileo: call getfcb
|
|
ret c
|
|
jp z,nowc
|
|
ld a,(fcb + 2)
|
|
cp ' '
|
|
scf
|
|
ret z
|
|
call reset
|
|
ld hl,fcb
|
|
ld de,cfcb
|
|
push de
|
|
ld bc,34
|
|
ldir
|
|
pop de
|
|
push de
|
|
ld c,open
|
|
call usrbds
|
|
inc a
|
|
pop de
|
|
jr z,isok
|
|
appndq: ld hl,10
|
|
add hl,de
|
|
bit 7,(hl)
|
|
jr z,appok
|
|
call ilprt
|
|
db 'Can\'t append file\r\n\0'
|
|
ret
|
|
appok: ld c,cfsize
|
|
push de
|
|
call usrbds
|
|
pop de
|
|
ld hl,36
|
|
add hl,de
|
|
ld a,(hl)
|
|
dec hl
|
|
or (hl)
|
|
dec hl
|
|
or (hl)
|
|
jr z,creok
|
|
declp: ld a,(hl)
|
|
dec (hl)
|
|
inc hl
|
|
or a
|
|
jr z,declp
|
|
push de
|
|
ld de,(cbuff)
|
|
ld c,setdma
|
|
call bdos
|
|
call fill1a
|
|
pop de
|
|
ld c,redrnd
|
|
call usrbds
|
|
ld hl,(cbuff)
|
|
dec hl
|
|
eofl: inc hl
|
|
ld a,(hl)
|
|
cp 0x1a
|
|
jr nz,eofl
|
|
ld (cptr),hl
|
|
jr setcfo
|
|
isok: ld c,create
|
|
call usrbds
|
|
inc a
|
|
jr nz,creok
|
|
call ilprt
|
|
db 'Can\'t create file\r\n\0'
|
|
ret
|
|
creok: call fill1a
|
|
setcfo: call ilprt
|
|
db 'File opened\r\n\0'
|
|
xor a
|
|
inc a
|
|
setcfl: ld (cflg),a
|
|
ret
|
|
|
|
doclos: call flushc
|
|
ld de,cfcb
|
|
ld c,close
|
|
call usrbds
|
|
call ctlq
|
|
xor a
|
|
jr setcfl
|
|
|
|
.extern flushc ; enter here to flush any pending write of
|
|
flushc: ; catch buffer
|
|
ld hl,(cptr)
|
|
ld de,(cbuff) ; point at buffer
|
|
or a
|
|
sbc hl,de ; how many chars in buffer
|
|
dec hl
|
|
add hl,hl
|
|
inc h
|
|
ld b,h ; converted to sector count
|
|
ret z ; nothing to write - exit now
|
|
push bc
|
|
push de
|
|
call ctls ; hold up the other end
|
|
pop de
|
|
pop bc
|
|
wrtlp: push bc
|
|
push de ; save registers
|
|
ld c,setdma
|
|
call bdos ; set dma for next 128 bytes
|
|
ld de,cfcb
|
|
ld c,write
|
|
call usrbds ; out they go
|
|
pop de
|
|
ld hl,128
|
|
add hl,de ; move dma
|
|
ex de,hl
|
|
pop bc
|
|
djnz wrtlp ; loop till all done
|
|
|
|
fill1a: ; enter here to fill catch buffer with 0x1a's
|
|
; and reset catch pointer
|
|
ld hl,(cbuff)
|
|
ld (cptr),hl ; adjust catch pointer as well
|
|
ld d,h
|
|
ld e,l
|
|
inc de ; copy to de & add 1
|
|
ld bc,(cbfsiz) ; get buffer size
|
|
ld (hl),0x1a ; first one
|
|
ldir ; and the rest
|
|
ret
|
|
|
|
.dseg
|
|
.extern cflg
|
|
cflg: db 0
|
|
|
|
.useg
|
|
.extern cptr
|
|
cptr: ds 2 ; pointer to next save address
|
|
.extern cfcb
|
|
cfcb: ds 37 ; fcb for catching
|
|
|