summaryrefslogtreecommitdiff
path: root/disk.asm
diff options
context:
space:
mode:
Diffstat (limited to 'disk.asm')
-rw-r--r--disk.asm85
1 files changed, 85 insertions, 0 deletions
diff --git a/disk.asm b/disk.asm
new file mode 100644
index 0000000..3e43c48
--- /dev/null
+++ b/disk.asm
@@ -0,0 +1,85 @@
+%ifndef _DISK_ASM
+%define _DISK_ASM
+
+disk_lba_chs:
+ push bp
+ mov bp, sp
+
+ mov ax, word [bp - 2] ; LBA
+
+ mov sp, bp
+ pop bp
+ ret
+
+disk_reset:
+ push bp
+ mov bp, sp
+ pusha
+
+ mov ah, 00h ; reset disk
+ mov dl, [bp + 4] ; disk number
+ int 13h ; BIOS disk service
+ jnc .success
+
+ push error_msg_disk_reset
+ call panic
+
+.success:
+ push msg_disk_reset
+ call puts
+ add sp, 2
+
+ popa
+ mov sp, bp
+ pop bp
+ ret
+
+
+disk_read:
+ push bp
+ mov bp, sp
+
+ push di
+ mov di, 3 ; retry counter
+.readloop:
+ push ax
+ push bx
+ push cx
+
+ mov ah, 02h ; BIOS - read disk sectors
+ int 13h ; BIOS disk service
+
+ jnc .success
+
+ push dx
+ call disk_reset
+ add sp, 2
+
+ pop cx
+ pop bx
+ pop ax
+
+ dec di
+ jnz .readloop
+
+ push error_msg_disk_read
+ call panic
+ add sp, 2
+
+.success:
+ pop di
+ mov sp, bp
+ pop bp
+ ret
+
+
+; data
+drive0: dw 0
+
+msg_disk_reset: db "Drive reset successful.", CR, LF, 0
+msg_disk_read: db "Sector read successful.", CR, LF, 0
+
+error_msg_disk_reset: db "Drive reset failed!", CR, LF, 0
+error_msg_disk_read: db "Drive read failed!", CR, LF, 0
+
+%endif ; _DISK_ASM