Files
qterm/source/CATCH.Z
T
2020-10-05 14:03:34 +02:00

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