Implement reading/writing a DTA full from a cluster without ptr advance
This commit is contained in:
parent
85d0949ec7
commit
39a1ed085c
@ -1,7 +1,95 @@
|
|||||||
; read/write data from FAT clusters
|
; read/write data from FAT clusters
|
||||||
; requires defines from fcb.asm
|
; requires defines from fcb.asm
|
||||||
|
|
||||||
read mov bp, sp
|
section .rodata
|
||||||
call fcbdrv
|
|
||||||
|
|
||||||
|
; sector sizes for fast lookup
|
||||||
|
sstab dw 0x800,0x400,0x200,0x100,0x80
|
||||||
|
|
||||||
|
section .text
|
||||||
|
|
||||||
|
; Map part of cluster into dskbuf
|
||||||
|
; IN DX:AX sector number within cluster area
|
||||||
|
mapclus mov bx, [cs:bpb+BPBRDE]
|
||||||
|
mov cl, 4
|
||||||
|
shr bx, cl ; 32 bytes per entry
|
||||||
|
add ax, bx
|
||||||
|
adc dx, 0
|
||||||
|
; counting from beginning of dir
|
||||||
|
; add fat table sizes
|
||||||
|
maprde xor ch, ch
|
||||||
|
mov cl, byte [cs:bpb+BPBFN]
|
||||||
|
.loop add ax, [cs:bpb+BPBFS]
|
||||||
|
adc dx, 0
|
||||||
|
loop .loop
|
||||||
|
; counting from beginning of FAT
|
||||||
|
; add reserved sector count
|
||||||
|
mapfat add ax, [cs:bpb+BPBRSC]
|
||||||
|
adc dx, 0
|
||||||
|
|
||||||
|
jmp maprel
|
||||||
|
|
||||||
|
; split AX at a bit boundary
|
||||||
|
; basically a DIV 2^CX
|
||||||
|
; IN ax divident
|
||||||
|
; cx integer log2(divisor)
|
||||||
|
; OUT ax quotient
|
||||||
|
; dx remainder (lower CX bits)
|
||||||
|
split mov dx, 1
|
||||||
|
shl dx, cl
|
||||||
|
dec dx
|
||||||
|
and dx, ax
|
||||||
|
shr ax, cl
|
||||||
|
ret
|
||||||
|
|
||||||
|
filesec call fcbdrv
|
||||||
|
mov bx, dx
|
||||||
|
|
||||||
|
; find sector size scale factor
|
||||||
|
mov ax, cs
|
||||||
|
mov es, ax
|
||||||
|
mov ax, [cs:bpb+BPBSS]
|
||||||
|
mov di, sstab
|
||||||
|
mov cx, 5
|
||||||
|
repne scasw
|
||||||
|
; CX is now sector size div 128
|
||||||
|
; same format as in DPT
|
||||||
|
mov ah, 0
|
||||||
|
mov al, [ds:bx+FCBRN]
|
||||||
|
call split
|
||||||
|
; ax = sector within current cluster
|
||||||
|
; dx = record number
|
||||||
|
push dx
|
||||||
|
mov di, ax
|
||||||
|
|
||||||
|
mov ax, [ds:bx+FCBCLUS]
|
||||||
|
sub ax, 2
|
||||||
|
mov ch, 0
|
||||||
|
mov cl, [cs:bpb+BPBSC]
|
||||||
|
mul cx
|
||||||
|
add ax, di
|
||||||
|
call mapclus
|
||||||
|
|
||||||
|
pop bx
|
||||||
|
mov cl, 7
|
||||||
|
shl bx, cl
|
||||||
|
add bx, dskbuf
|
||||||
|
mov dx, bx
|
||||||
|
mov ax, cs
|
||||||
|
mov ds, ax
|
||||||
|
ret
|
||||||
|
|
||||||
|
read mov bp, sp
|
||||||
|
call filesec
|
||||||
|
call getdta
|
||||||
|
mov cx, 0x80
|
||||||
|
call stofar
|
||||||
|
ret
|
||||||
|
|
||||||
|
write mov bp, sp
|
||||||
|
call filesec
|
||||||
|
call getdta
|
||||||
|
mov cx, 0x80
|
||||||
|
call lodfar
|
||||||
|
call dirty
|
||||||
ret
|
ret
|
||||||
|
Loading…
Reference in New Issue
Block a user