diff options
Diffstat (limited to 'src/boot.asm')
-rw-r--r-- | src/boot.asm | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/boot.asm b/src/boot.asm new file mode 100644 index 0000000..f053270 --- /dev/null +++ b/src/boot.asm @@ -0,0 +1,121 @@ +; legacy BIOS PC-boot code, starts in 16-bit real mode + +; BIOS always loads us to this location + [org 0x7c00] + +; 16-bit real-mode + [bits 16] + +; initialize segment registers + mov ax, 0 + mov ds, ax + mov es, ax + mov ss, ax + +; dl contains the boot drive, primarily because that's the last function +; called by the BIOS MBR loader, we remember that for loading additional +; blocks from the boot medium + mov [BOOT_DRIVE], dl + +; make sure we know the location of the stack by setting it on our own + mov bp, 0xFFFF + mov sp, bp + +; print out some information about CPU mode and BIOS boot drive + mov si, MESSAGE_REAL_MODE + call print_string + + mov si, MESSAGE_BOOT_DRIVE + call print_string + mov ax, dx + call print_hex + call print_newline + +; print we are going to load stage 2 of the boot blocks + mov si, MESSAGE_LOADING_STAGE_2 + call print_string + + mov dl, [BOOT_DRIVE] + call read_from_disk + + jmp stage2 + +%include "stage1_functions.asm" + +DISK_ERROR: + db "DISK ERROR ", 0 + +SHORT_READ: + db "DISK SHORT READ", 0 + +MESSAGE_REAL_MODE: + db "Started in 16-bit Real Mode", 13, 10, 0 + +MESSAGE_BOOT_DRIVE: + db "Booting from drive ", 0 + +MESSAGE_LOADING_STAGE_2: + db "Loading stage 2 boot loader", 13, 10, 0 + +BOOT_DRIVE: + db 0 + +; pad rest of sector with zeroes so we get 512 bytes in the end +times 510-($-$$) db 0 + +; magic number of a boot sector +dw 0xaa55 + +stage2: + mov si, MESSAGE_STAGE_2_LOADED + call print_string + +; remember current position on screen + call current_row + mov [CURSOR_Y], dh + + call switch_to_protected_mode + +; we should never get here, but just in case + jmp $ + +MESSAGE_STAGE_2_LOADED: + db "Stage 2 boot sectors loaded", 13, 10, 0 + +%include "switch_mode.asm" + +[bits 32] + +BEGIN_PROTECTED_MODE: + mov si, MESSAGE_PROTECTED_MODE + call pm_print_string + call pm_print_newline + + mov si, MESSAGE_CALL_C_ENTRY + call pm_print_string + call pm_print_newline + +; call our kernel + call c_entry + + mov si, MESSAGE_HALTED + call pm_print_string + call pm_print_newline + + jmp $ + +MESSAGE_PROTECTED_MODE: + db "Switched to 32-bit Protected Mode", 0 + +MESSAGE_CALL_C_ENTRY: + db "Calling C entry function", 0 + +MESSAGE_HALTED: + db "Operating system halted", 0 + +%include "stage2_functions.asm" + +; make sure we have full sectors +times 1024-($-$$) db 0 + +c_entry: |