61 lines
1.3 KiB
NASM
61 lines
1.3 KiB
NASM
section .text
|
|
|
|
load_bpb: mov bx, [drive_ptr]
|
|
; read word for "sectors per fat"
|
|
mov ax, [diskbuf+0x016]
|
|
xor dx, dx
|
|
; if zero, we need to check dword in BPB 7.1
|
|
test ax, ax
|
|
jnz .short_sf
|
|
; fail if BPB 7.1 signature is not present
|
|
mov cl, [diskbuf+0x042]
|
|
or cl, 1
|
|
cmp cl, 0x29
|
|
jne .err
|
|
; load dword
|
|
mov ax, [diskbuf+0x024]
|
|
mov dx, [diskbuf+0x026]
|
|
.short_sf:
|
|
; store local value
|
|
mov [bx+drive.fat_size], ax
|
|
mov [bx+drive.fat_size+2], dx
|
|
|
|
; copy number of fat's
|
|
xor ah, ah
|
|
mov al, [diskbuf+0x010]
|
|
mov [bx+drive.fat_num], ax
|
|
|
|
; copy number of root directory entries
|
|
mov ax, [diskbuf+0x011]
|
|
mov cl, 4
|
|
shr ax, cl
|
|
mov [bx+drive.dir_size], ax
|
|
|
|
; calculate offsets for everything
|
|
xor ax, ax
|
|
xor dx, dx
|
|
; add reserved sectors
|
|
add ax, [diskbuf+0x0B+bpb_rsc]
|
|
adc ax, 0
|
|
; save begin of FAT tables
|
|
mov [bx+drive.fat_offset], ax
|
|
mov [bx+drive.fat_offset+2], dx
|
|
; add FAT size * FAT number
|
|
mov cx, [bx+drive.fat_num]
|
|
.floop: add ax, [bx+drive.fat_size]
|
|
adc dx, [bx+drive.fat_size+2]
|
|
loop .floop
|
|
; save begin of root directories
|
|
mov [bx+drive.dir_offset], ax
|
|
mov [bx+drive.dir_offset+2], dx
|
|
; add root directory size (might be zero)
|
|
add ax, [bx+drive.dir_size]
|
|
adc dx, 0
|
|
; save start of data area
|
|
mov [bx+drive.clus_offset], ax
|
|
mov [bx+drive.clus_offset+2], dx
|
|
|
|
ret
|
|
.err: stc
|
|
ret
|