summaryrefslogtreecommitdiff
path: root/src/boot.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot.asm')
-rw-r--r--src/boot.asm121
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: