2021-01-21 23:28:57 +01:00
|
|
|
; FCB layout
|
|
|
|
; 1 byte drive (0=default, 1=A:, 2=B:, ...)
|
|
|
|
; 8.3 filename
|
|
|
|
; 8.3 filename for rename
|
2021-01-05 00:29:50 +01:00
|
|
|
|
2021-02-25 01:45:56 +01:00
|
|
|
FCBSIZ equ 30
|
|
|
|
|
|
|
|
section .data
|
|
|
|
|
|
|
|
defdrv db 0
|
|
|
|
dta dd 0
|
2021-01-21 23:28:57 +01:00
|
|
|
|
|
|
|
section .text
|
2021-01-05 00:19:14 +01:00
|
|
|
|
2021-01-23 18:32:53 +01:00
|
|
|
; auto-complete drive field in fcb
|
2021-02-25 01:45:56 +01:00
|
|
|
; also logs in the drive
|
|
|
|
; IN ds:dx far ptr FCB
|
|
|
|
fcbdrv push ds
|
|
|
|
push dx
|
|
|
|
mov si, dx
|
|
|
|
; if currently zero, ...
|
|
|
|
mov dl, [si] ; 1-based
|
2021-01-23 18:32:53 +01:00
|
|
|
test dl, dl
|
2021-02-25 01:45:56 +01:00
|
|
|
jnz .log
|
|
|
|
; replace with current drive
|
|
|
|
mov dl, [cs:defdrv] ; 0-based
|
2021-01-23 18:32:53 +01:00
|
|
|
inc dl
|
2021-02-25 01:45:56 +01:00
|
|
|
mov [si], dl ; 1-based
|
|
|
|
.log dec dl
|
|
|
|
call logdrv ; 0-based
|
|
|
|
pop dx
|
|
|
|
pop ds
|
|
|
|
; if carry flag set, resume stack at bp
|
|
|
|
; this instant-returns some higher level procs
|
|
|
|
jnc .ret
|
|
|
|
mov sp, bp
|
|
|
|
; duplicate carry bit into all 8 AL bits
|
|
|
|
; similar to SALC instruction
|
|
|
|
.ret sbb al, al
|
|
|
|
ret
|
|
|
|
|
|
|
|
; set disk transfer address
|
|
|
|
; IN DS:DX dta ptr
|
|
|
|
setdta mov [cs:dta], dx
|
|
|
|
mov [cs:dta+2], ds
|
|
|
|
ret
|
|
|
|
|
|
|
|
; get disk transfer address
|
|
|
|
; OUT ES:BX dta ptr
|
|
|
|
getdta les bx, [cs:dta]
|
2021-01-23 18:32:53 +01:00
|
|
|
ret
|
2021-01-13 19:32:17 +01:00
|
|
|
|
2021-01-23 18:32:53 +01:00
|
|
|
; Load root directory entry
|
|
|
|
; IN ax number of directory entry
|
2021-02-25 01:45:56 +01:00
|
|
|
; OUT cs:di ptr to directory entry
|
|
|
|
lddir push ax
|
|
|
|
push ax
|
|
|
|
call rstseg
|
|
|
|
pop ax
|
2021-01-23 18:32:53 +01:00
|
|
|
mov cl, 4
|
|
|
|
shr ax, cl
|
|
|
|
xor dx, dx
|
2021-02-25 01:45:56 +01:00
|
|
|
; dx:ax = sector number in rootdir
|
|
|
|
; add sizes of FAT tables
|
|
|
|
xor ch, ch
|
|
|
|
mov cl, byte [bpb+BPBFN]
|
|
|
|
.loop: add ax, [bpb+BPBFS]
|
|
|
|
adc dx, 0
|
|
|
|
loop .loop
|
|
|
|
; add reserved sector count
|
|
|
|
add ax, [bpb+BPBRSC]
|
|
|
|
adc dx, 0
|
|
|
|
; fetch sector (relative to partition)
|
|
|
|
call maprel
|
|
|
|
; get di to point to entry
|
|
|
|
pop di
|
2021-01-23 18:32:53 +01:00
|
|
|
mov cl, 5
|
2021-02-25 01:45:56 +01:00
|
|
|
shl di, cl
|
|
|
|
and di, 0x1FF
|
|
|
|
add di, dskbuf
|
2021-01-23 18:32:53 +01:00
|
|
|
ret
|
2021-01-21 23:28:57 +01:00
|
|
|
|
2021-01-23 18:32:53 +01:00
|
|
|
; find first matching file
|
2021-02-25 01:45:56 +01:00
|
|
|
; IN DS:DX input fcb
|
|
|
|
fndfst mov bp, sp
|
2021-01-23 18:32:53 +01:00
|
|
|
call fcbdrv
|
|
|
|
; set search state to zero
|
2021-02-25 01:45:56 +01:00
|
|
|
les di, [cs:dta]
|
2021-01-23 18:32:53 +01:00
|
|
|
xor ax, ax
|
2021-02-25 01:45:56 +01:00
|
|
|
mov [es:di+FCBSIZ], ax
|
2021-01-23 18:32:53 +01:00
|
|
|
; find next matching file
|
|
|
|
; state is kept in DTA
|
2021-02-25 01:45:56 +01:00
|
|
|
fndnxt mov bp, sp
|
|
|
|
call fcbdrv
|
|
|
|
; get next direntry to fetch
|
2021-01-23 18:32:53 +01:00
|
|
|
; get number of current entry from DTA
|
2021-02-25 01:45:56 +01:00
|
|
|
.loop les di, [cs:dta]
|
|
|
|
mov ax, [es:di+FCBSIZ]
|
|
|
|
inc word [es:di+FCBSIZ]
|
2021-01-23 18:32:53 +01:00
|
|
|
; bail out if we are at end of dir
|
|
|
|
cmp ax, [bpb+BPBRDE]
|
|
|
|
jnc .err
|
|
|
|
; load entry and first byte
|
2021-02-25 01:45:56 +01:00
|
|
|
push ds
|
|
|
|
push dx
|
2021-01-23 18:32:53 +01:00
|
|
|
call lddir
|
2021-02-25 01:45:56 +01:00
|
|
|
pop dx
|
|
|
|
pop ds
|
2021-01-23 18:32:53 +01:00
|
|
|
; next if hidden, dir or vol label
|
2021-02-25 01:45:56 +01:00
|
|
|
test byte [cs:di+0x0B], 0xDA
|
|
|
|
jnz .loop
|
2021-01-23 18:32:53 +01:00
|
|
|
; bail out if end of dir
|
2021-02-25 01:45:56 +01:00
|
|
|
mov al, [di]
|
2021-01-23 18:32:53 +01:00
|
|
|
cmp al, 0
|
|
|
|
je .err
|
|
|
|
; next if deleted entry
|
|
|
|
cmp al, 0xE5
|
2021-02-25 01:45:56 +01:00
|
|
|
je .loop
|
|
|
|
; DS:SI := FCB+1
|
|
|
|
; ES:DI := CS:dirent
|
|
|
|
mov si, dx
|
|
|
|
push si
|
|
|
|
inc si
|
|
|
|
mov ax, cs
|
|
|
|
mov es, ax
|
|
|
|
; compare and ; try next if mismatch
|
2021-01-23 18:32:53 +01:00
|
|
|
mov cx, 11
|
2021-02-25 01:45:56 +01:00
|
|
|
push di
|
2021-01-23 18:32:53 +01:00
|
|
|
rep cmpsb
|
2021-02-25 01:45:56 +01:00
|
|
|
pop di
|
|
|
|
pop si
|
|
|
|
jne .loop
|
|
|
|
; create FCB in DTA
|
|
|
|
call getdta
|
|
|
|
xchg bx, di
|
|
|
|
; copy over drive byte
|
|
|
|
movsb
|
|
|
|
; copy filename
|
|
|
|
mov ax, cs
|
|
|
|
mov ds, ax
|
|
|
|
mov si, bx
|
|
|
|
mov cx, 11
|
|
|
|
rep movsb
|
|
|
|
; done!
|
|
|
|
xor ax, ax
|
2021-01-23 18:32:53 +01:00
|
|
|
ret
|
2021-02-25 01:45:56 +01:00
|
|
|
|
2021-01-23 18:32:53 +01:00
|
|
|
.err: stc
|
2021-02-25 01:45:56 +01:00
|
|
|
.ret: sbb al, al
|
2021-01-23 18:32:53 +01:00
|
|
|
ret
|
2021-01-05 00:19:14 +01:00
|
|
|
|
2021-01-21 23:28:57 +01:00
|
|
|
open:
|
2021-01-23 18:32:53 +01:00
|
|
|
ret
|