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