x86_fat12bs/src/fat12_drv.lib

170 lines
2.4 KiB
Plaintext

w_roodir_remaining dw ROOTDIR_TOT_SECTORS
w_cur_sector_num dw 0
;
; fat12_read_file(u16 segment, u16 offset, uintptr (ds:)filename)
;
fat12_read_file:
push bp
mov bp,sp
push bp
; reset the drive
xor ah, ah
xor dl, dl
int 13h
mov word [w_cur_sector_num], ROOTDIR_SEC_NUM
.loop_rootdir:
cmp word [w_roodir_remaining], 0
jz .not_found
dec word [w_roodir_remaining]
mov ax, [ss:bp+4]
mov es, ax
mov bx, [ss:bp+6]
mov ax, [w_cur_sector_num]
mov cl, 1
call read_sector
mov si, [ss:bp+8]
mov di, [ss:bp+6]
cld
mov dx, 10h
.loop_find_file:
cmp dx, 0
jnz .loop_find_file_ctn
; We traversed all entires in the root dir
add word [w_cur_sector_num], 1
jmp .loop_rootdir
.loop_find_file_ctn:
dec dx
mov cx, 11
.loop_strcmp:
cmp cx, 0
jz .found
dec cx
lodsb
cmp al, byte [es:di]
jnz .loop_strcmp_diff
inc di
jmp .loop_strcmp
.loop_strcmp_diff:
and di, 0FFE0h
add di, 20h
mov si, [ss:bp+8]
jmp .loop_find_file;
.found:
mov ax, ROOTDIR_TOT_SECTORS
and di, 0FFE0h
add di, 01Ah
mov cx, word [es:di]
push cx
add cx, ax
add cx, SECTOR_DELTA
mov ax, [ss:bp+4]
mov es, ax
mov bx, [ss:bp+6]
mov ax, cx
.loop_readfile:
mov cl, 1
call read_sector
pop ax
push word [ss:bp+4]
call read_fat_entry
add sp,2
cmp ax, 0FFFh
jz .end
push ax
mov dx, ROOTDIR_TOT_SECTORS
add ax, dx
add ax, SECTOR_DELTA
add bx, [BPB_BytsPerSec]
jmp .loop_readfile
.not_found:
mov ax, 1
.end:
mov sp,[bp-2]
pop bp
ret
read_sector:
push bp
mov bp, sp
sub esp, 2
mov byte [bp-2], cl
push bx
mov bl, [BPB_SecPerTrk]
div bl
inc ah
mov cl, ah
mov dh, al
shr al, 1
mov ch, al
and dh, 1
pop bx
mov dl, [BS_DrvNum]
.retry:
mov ah, 2
mov al, byte [bp-2]
int 13h
jc .retry
add sp, 2
pop bp
ret
b_is_odd_cluster db 0
read_fat_entry:
push bp
mov bp, sp
push es
push bx
push ax
mov ax, [ss:bp+4]
sub ax, 0100h
mov es, ax
pop ax
mov byte [b_is_odd_cluster], 0
mov bx, 3
mul bx
mov bx, 2
div bx
cmp dx, 0
jz .even
mov byte [b_is_odd_cluster], 1
.even:
xor dx, dx
mov bx, [BPB_BytsPerSec]
div bx
push dx
mov bx, 0
add ax, FAT1_SECTOR_NUM
mov cl, 2
call read_sector
pop dx
add bx, dx
mov ax, [es:bx]
cmp byte [b_is_odd_cluster], 1
jnz .end
shr ax, 4
.end:
and ax, 0FFFh
pop bx
pop es
pop bp
ret