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 load_ts: ; load total number of sectors into DX:AX xor dx, dx mov ax, [disk_buffer+0x013] test ax, ax jnz .ret mov ax, [disk_buffer+0x020] mov dx, [disk_buffer+0x022] .ret: ret ; 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 ; copy number of root directory entries mov ax, [disk_buffer+0x011] mov cl, 4 shr ax, cl mov [rootdir_size], ax ; calculate offsets for everything mov ax, [part_offset] mov dx, [part_offset+2] ; add reserved sectors add ax, [disk_buffer+0x0B+bpb_rsc] adc ax, 0 ; save begin of FAT tables mov [fat_offset], ax mov [fat_offset+2], dx ; add FAT size * FAT number mov cx, [fat_num] .floop: add ax, [fat_size] adc dx, [fat_size+2] loop .floop ; save begin of root directories mov [rootdir_offset], ax mov [rootdir_offset+2], dx ; add root directory size (might be zero) add ax, [rootdir_size] adc dx, 0 ; save start of data area mov [clusters_offset], ax mov [clusters_offset+2], dx call load_ts add ax, [part_offset] adc dx, [part_offset+2] sub ax, [clusters_offset] sbb dx, [clusters_offset+2] ; get "sectors per cluster" mov cl, [disk_buffer+0x00D] ; this turns dx:ax from data sectors to number of clus .sloop: shr cl, 1 test cl, cl jz .send clc rcr dx, 1 rcr ax, 1 jmp .sloop .send: mov [clusters_num], ax mov [clusters_num+2], dx int 3 ret .err: stc ret