diff options
Diffstat (limited to 'disk.asm')
-rw-r--r-- | disk.asm | 85 |
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 |