section .bss clus resw 1 section .text ; Set cluster for next operations ; IN dx cluster number setclus mov [clus], dx ret ; get ptr to single byte in fat table ; IN dx position byte in fat table ; OUT bx ptr to byte in dskbuf _fat1 push dx mov ax, dx xor dx, dx mov cl, 9 shr ax, cl add ax, [bpb+BPBRSC] adc dx, 0 call map pop dx mov bx, dx and bx, 0x1FF add bx, dskbuf ret ; get ptr to word in fat table _fat2 push dx mov ax, dx xor dx, dx mov cl, 8 shr ax, cl add ax, [bpb+BPBRSC] adc dx, 0 call map pop dx mov bl, dl mov bh, 0 add bx, bx add bx, dskbuf ret ; read value from fat table ; index given with setclus ; OUT bx value ; carry set if EOF marker rdfat mov dx, [clus] mov ax, dx shr ax, 1 add dx, ax call _fat1 push word [bx] inc dx call _fat1 mov si, bx pop bx mov bh, [si] test word [clus], 1 jz l001 mov cl, 4 shr bx, cl l001 and bx, 0xFFF cmp bx, 0xFF0 cmc ret ; set value in FAT table ; IN dx value wrfat and dh, 0x0F push dx ; DX = index * 1.5 mov dx, [clus] mov ax, dx shr dx, 1 add dx, ax call _fat1 pop ax test [clus], 1 jnz l004 ; even, first byte full mov [bx], al push ax call dirty ; DX = index * 1.5 mov dx, [clus] mov ax, dx shr dx, 1 add dx, ax inc dx call _fat1 pop ax mov al, [bx] and al, 0xF0 or al, ah mov [bx], al call dirty jmp l005 ; odd, second byte full l004: mov ch, [bx] ; concat existing and our nib and ch, 0x0F mov cl, 4 shl ax, cl or al, ch ; write back lower 4 bits mov [bx], al call dirty push ax ; re-calculate offset mov ax, dx shr dx, 1 add dx, ax inc dx ; map second byte call _fat1 pop ax ; write higher 8 bits mov [bx], ah call dirty l005: ret ; wrfat from above, FAT16 flavour wf16: ret