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