summaryrefslogtreecommitdiff
path: root/drive/drive.ha
diff options
context:
space:
mode:
Diffstat (limited to 'drive/drive.ha')
-rw-r--r--drive/drive.ha20
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;
+};