Files
2020-10-05 14:03:34 +02:00

144 lines
3.0 KiB
Plaintext

; dir.z - print directories for qterm
.incl "c:vars"
.extern dir
dir:
call gauxfc ; get a fcb into auxfcb
ld hl,auxfcb + 2
ld a,(hl) ; get first actual character of filename
cp ' '
jr nz,isfil ; not a space - there was something
ld de,auxfcb + 3
ld bc,10
ld (hl),'?' ; else fill with '?'s to do *.*
ldir
isfil: ld c,26
ld de,auxlin
call bdos
call dim ; set dim mode
call clrpsp ; set up to page output
ld c,17
xor a
ld (nlp),a
push af
dslp: ld de,auxfcb
call usrbds
inc a
jr z,dirxit
push af
ld a,(auxfcb + 1) ; get the drive code
add a,'@' ; convert to a letter
call tabexp ; and print it
ld hl,(auxfcb) ; get the user number
call decob ; print it too
ld a,':'
call tabexp ; and a colon
pop af
rrca
rrca
rrca
ld hl,auxlin - 31
ld e,a
ld d,0
add hl,de
ld b,8 ; 8 chars filename
call pdir ; print filename
ld a,'.'
push hl ; save fcb address
call tabexp ; print a period
pop hl
ld b,3
call pdir ; and print the extension
dec hl
dec hl
ld a,(hl) ; let's see about R/O files
add a,a
dec hl
ld a,(hl)
adc a,a
adc a,a ; get r/o and sys bits to bottom
ld hl,rostr ; look at characters we have
.dseg
rostr: db ' -+*'
.cseg
and 3 ; get just the bits we want
ld e,a
ld d,0
add hl,de ; index into characters
ld a,(hl) ; get one
call tabexp ; and print it
pop af
inc a
push af
and 3
ld hl,sstr
.dseg
sstr: db ' \0' ; 3 spaces to separate
.cseg
jr nz,sepspc
ld hl,crlfm
sepspc: call prtsl1
; for ^X to can a directory, add a 'jr c,dirxit' here
ds18: ld c,18
jr dslp
dirxit: pop af ; restore file count
or a
jr z,nfm
and 3
call nz,crlf ; print newline if needed
jp bright ; otherwise restore bright mode
nfm: call ilprt
db 'No files'
crlfm: db '\r\n\0' ; complain if no files
ret
; pdir - print chars from hl, count in b
pdir: ld a,(hl) ; get next char
inc hl
and 0x7f ; get rid of top bit
push hl ; save regs
push bc
call tabexp ; print it
pop bc
pop hl
djnz pdir ; loop till all done
ret
; nxtnam - get next name from work to fcb, return z if no files left
.extern nxtnam
nxtnam:
ld hl,(fnbspt) ; get last address saved to
ld de,(fnbrpt) ; current read address
or a
sbc hl,de ; test them
ret z ; return z if equal
ex de,hl ; read address to hl
ld de,fcb ; fcb address to de
ld bc,16 ; 16 chars to go
ldir ; move them
ld (fnbrpt),hl ; and save read pointer
ld a,(fcb) ; get lead byte
cp 0xe5 ; check for erasure
jr z,nxtnam ; loop back if gone
ld a,b
ld (fcb + 13),a
ld (fcb + 33),a ; zero out extent and block numbers
ret ; ret with no z flag
; data area
.useg
.extern newusr
newusr: ds 1 ; new user for dir command
.extern newdrv
newdrv: ds 1 ; new drive for dir command
nlp: ds 1 ; number of lines on current page
.extern fnbspt
fnbspt: ds 2 ; fnbuff save pointer
.extern fnbrpt
fnbrpt: ds 2 ; fnbuff read pointer