69 lines
1.1 KiB
NASM
69 lines
1.1 KiB
NASM
|
section .bss
|
||
|
|
||
|
; the sector numbers have the partition offset already included
|
||
|
|
||
|
fat_offset:
|
||
|
resd 1
|
||
|
fat_size:
|
||
|
resd 1
|
||
|
fat_num: ; a byte would be enough, but i want to work with cx
|
||
|
resw 1
|
||
|
|
||
|
rootdir_offset:
|
||
|
resd 1
|
||
|
rootdir_size:
|
||
|
resw 1
|
||
|
|
||
|
clusters_offset:
|
||
|
resd 1
|
||
|
clusters_num:
|
||
|
resd 1
|
||
|
|
||
|
section .text
|
||
|
|
||
|
; invoked after disk select
|
||
|
load_bpb:
|
||
|
; read word for "sectors per fat"
|
||
|
mov ax, [disk_buffer+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, [disk_buffer+0x042]
|
||
|
or cl, 1
|
||
|
cmp cl, 0x29
|
||
|
jne .err
|
||
|
; load dword
|
||
|
mov ax, [disk_buffer+0x024]
|
||
|
mov dx, [disk_buffer+0x026]
|
||
|
.short_sf:
|
||
|
; store local value
|
||
|
mov [fat_size], ax
|
||
|
mov [fat_size+2], dx
|
||
|
|
||
|
; copy number of fat's
|
||
|
xor ah, ah
|
||
|
mov al, [disk_buffer+0x010]
|
||
|
mov [fat_num], ax
|
||
|
|
||
|
mov ax, [part_offset]
|
||
|
mov dx, [part_offset+2]
|
||
|
add ax, [disk_buffer+0x0B+bpb_rsc]
|
||
|
adc ax, 0
|
||
|
mov [fat_offset], ax
|
||
|
mov [fat_offset+2], dx
|
||
|
|
||
|
int 3
|
||
|
|
||
|
; add FAT size * FAT number
|
||
|
mov cx, [fat_num]
|
||
|
.floop: add ax, [fat_size]
|
||
|
adc dx, [fat_size+2]
|
||
|
loop .floop
|
||
|
|
||
|
int 3
|
||
|
ret
|
||
|
.err: stc
|
||
|
ret
|