diff --git a/src/sys.asm b/src/sys.asm index bc565e2..7dcfcbf 100644 --- a/src/sys.asm +++ b/src/sys.asm @@ -15,7 +15,12 @@ main mov di, 0x81 mov cl, [0x80] repe scasb repne scasb - mov si, di + test cx, cx + jnz rddrv + call putsh + db "BIOS drive number not specified", 0x0A, 0x0D, 0 + int 0x20 +rddrv mov si, di call lodnum mov dx, ax test dx, ~0x83 @@ -37,17 +42,23 @@ floppy mov ax, 0x0201 int 0x13 jc drverr + mov ax, [prog+0x016] + cmp ax, 12 + jbe .gok + call putsh + db "Unsupported FAT size", 0x0A, 0x0D, 0 + int 0x20 +.gok nop + ; calculate start of cluster area mov ax, [prog+0x011] ; number of dir entries mov cl, 5 shl ax, cl mov bx, [prog+0x0B] ; bytes per sector div bx - ; TODO: abort if dx is not zero mov cx, ax mov ax, [prog+0x016] ; logical sectors per fat - ; TODO: abort if ax is zero (=large FAT32) - mov bl, [prog+0x010] + mov bl, [prog+0x010] ; number of fats mov bh, 0 mul bx add ax, cx @@ -55,24 +66,36 @@ floppy mov ax, 0x0201 mov si, ax ; calculate sector offset of target track - mov ax, [prog+0x018] - mul word [prog+0x01A] + mov ax, [prog+0x018] ; sectors per track + mul word [prog+0x01A] ; number of heads mul word [track] - ; calculate cluster offset of target track + ; calculate cluster offset of target track -> SI sub ax, si mov bl, [prog+0x00D] ; sectors per cluster mov bh, 0 - call debug + xor dx, dx div bx + mov si, ax + + ; calculate cluster length of target track -> DI + mov ax, [prog+0x018] ; sectors per track + add ax, dx ; remainder + ; add sectors per cluster minus one + add ax, bx + dec ax + ; divide by sectors per cluster and floor + xor dx, dx + div bx + mov di, ax + + ; load fat table call debug ret + ; TODO: -; calculate cluster offset of target track -; calculate cluster length of target track ; calculate offset into fat table -; load part of fat table spanning our track ; check that all relevant clusters are 0 or 0xFFF7 ; set all relevant clusters to 0xFFF7 ; track is now available for direct writing