; User-accessible part of FCB (12 bytes) %define fcb_drv 0 ; 1 byte %define fcb_fn 1 ; 8 bytes %define fcb_ext 9 ; 3 bytes ; Drive & FS data (4 bytes) %define fcb_spt 12 ; byte sectors per track %define fcb_nos 13 ; byte number of sides/heads %define fcb_ss 14 ; byte sector size: 2^ss %define fcb_cs 15 ; byte cluster size: 2^(ss+cs) ; Read/Write pointer (12 bytes): ; Will be overwritten by new filename for CL=17 %define fcb_fsize 16 ; dword file size %define fcb_fptr 20 ; dword handle position %define fcb_clus 24 ; word current cluster fptr points in %define fcb_co 26 ; word start sector for theoretical cluster 0 ; Link to directory item (3 bytes) %define fcb_ds 28 ; word directory sector %define fcb_do 30 ; byte directory offset fcb_open_rootdir: cmp byte [bx], 0 jne .drivedone mov al, default_drive mov [bx], al .drivedone: mov dl, [bx] dec dl xor ax, ax xor dx, dx ; set directory sector to 0 (=rootdir) mov [bx+fcb_ds], ax ; load first sector call drive_read ; transfer sector size mov ax, [diskbuf + 0x0B] call log2 mov byte [bx+fcb_ss], al ; transfer cluster size mov al, [diskbuf + 0x0D] call log2 mov byte [bx+fcb_cs], al ; transfer sectors per track mov al, [diskbuf + 0x18] mov byte [bx+fcb_spt], al ; transfer number of heads/sides mov al, [diskbuf + 0x1A] mov byte [bx+fcb_nos], al ret