diff --git a/src/bios/disk.asm b/src/bios/disk.asm index 22c6e46..0f1b171 100644 --- a/src/bios/disk.asm +++ b/src/bios/disk.asm @@ -1,38 +1,47 @@ disk_read: pusha + push dx ; store dx on stack so that we can compare later - push dx - mov ah, BIOS_DISK_READ - mov al, dh ; sector count - mov cl, 0x02 + mov ah, BIOS_DISK_READ ; specify function - mov ch, 0x00 ; read from first cylinder - mov dh, 0x00 ; head + mov al, dh ; read dh amount of sectors + mov ch, 0x00 ; CYLINDER + mov dh, 0x00 ; HEAD + mov cl, 0x02 ; SECTOR - ; data pointer: es:bx (standard) - int BIOS_DISK_INT ; do the interrupt - jc read_error ; if flag is set then jump to error + int BIOS_DISK_INT ; interrupt + + ; Error checks + jc read_error ; carry flag set -> error pop dx - cmp al, dh + cmp dh, al ; if dh != al then error jne sector_error popa - ret + ret sector_error: mov bx, sector_error_string call println read_error: + ; Inform the user mov bx, read_error_string call println + ; Print the error + mov bx, error_code_string + call print + mov dh, ah call print_hex -disk_loop: + mov bx, [ASCII_END] + call println + jmp $ -read_error_string: db "Disk read error", ASCII_END -sector_error_string: db "Invalid number of sectors read", ASCII_END +read_error_string: db ASCII_CARRIAGE_RETURN, ASCII_LINEBREAK, "ERROR! Disk read failed.", ASCII_END +error_code_string: db "Error code: ", ASCII_END +sector_error_string: db "Invalid number of sectors read!", ASCII_END diff --git a/src/bootloader.asm b/src/bootloader.asm index e8bf21e..036c78b 100644 --- a/src/bootloader.asm +++ b/src/bootloader.asm @@ -1,51 +1,45 @@ [org 0x7c00] ; bootsector + ; Save the boot drive index + mov [BOOT_DRIVE], dl - mov bx, welcome_string ; Print the welcome string - call println + ; Move the stack pointer somewhere safe + mov bp, 0x8000 ; move it to 0x8000 + mov sp, bp - mov bx, info_string ; Print version info + ; Print the welcome string + mov bx, welcome_string call println - ; Read from disk - mov bp, 0x8000 - mov sp, bp ; move the stack away so that it does not get overwritten - - mov bx, 0x9000 - mov dh, 2 ; read 2 sectors - call disk_read ; read + ; Read second sector (outside bootsector) + mov bx, 0x9000 ; LOAD LOCATION + mov dh, 2 ; SECTOR-COUNT + mov dl, [BOOT_DRIVE] ; DISK-INDEX + call disk_read - mov bx, read_test_string - call print + ; Print out whatever bloated data that was read mov dx, [0x9000] call print_hex - mov bx, byte_sep_string - call print + mov bx, [ASCII_END] + call println - mov dx, [0x9000 + 512] + mov dx, [0x9000 + 512] ; read from second sector too call print_hex - mov bx, empty_string - call println - jmp $ ; inf loop -; Constants %include "equ/ASCII.asm" - -; SRs etc %include "bios.asm" -welcome_string: db "e Operating-System (eOS)", ASCII_END -info_string: db "Version 2021 0.0", ASCII_END -read_test_string: db "Disk read: ", ASCII_END -byte_sep_string: db "; ", ASCII_END -empty_string: db ASCII_END +; Data +welcome_string: db "e Operating-System (eOS)", ASCII_CARRIAGE_RETURN, ASCII_LINEBREAK, "Version 2021 0.0", ASCII_END +BOOT_DRIVE: db 0 +; Bootsector times 510-($-$$) db 0 -db 0x55, 0xaa ; magic BIOS numbers +dw 0xaa55 ; magic BIOS numbers -; Bloat bytes to test reading +; After bootsector times 256 dw 0xEEEE times 256 dw 0xAAAA