diff options
Diffstat (limited to 'drive/drive.ha')
| -rw-r--r-- | drive/drive.ha | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drive/drive.ha b/drive/drive.ha new file mode 100644 index 0000000..42cef43 --- /dev/null +++ b/drive/drive.ha @@ -0,0 +1,20 @@ +use bios; +use bios::drive; + +fn lba_to_chs(lba: u16) (u16, u16, u16) = { + let temp = lba / bios::drive::drive_spt; + let sector = (lba % bios::drive::drive_spt) + 1; + let head = temp % bios::drive::drive_heads; + let cylinder = temp / bios::drive::drive_heads; + + return (cylinder, head, sector); +}; + +export fn read(sector: u16, dest: uintptr) void = { + let chs = lba_to_chs(sector); + + bios::regs.eax = 1 | 0x2 << 8; + bios::regs.ebx = ws; + bios::regs.ecx = chs.2 | chs.0 << 8; + bios::regs.edx = bios::drive::drive_no | chs.1 << 8; +}; |
