diff options
Diffstat (limited to 'boot.asm')
| -rw-r--r-- | boot.asm | 162 |
1 files changed, 146 insertions, 16 deletions
@@ -1,28 +1,158 @@ -; yoinked from osdev.org -mov ax, 0x07C0 +; bootler +; legacy bootloader in nasm-flavoured asm +; 2026 Andromeda +; GPL licensed + +[bits 16] +[org 0x7C00] ; address where bootloader is loaded + +xor ax, ax mov ds, ax +mov es, ax +mov ss, ax +mov sp, 0x7C00 + +mov ah, 0x0E +mov al, 'R' +int 0x10 +mov al, 'e' +int 0x10 +mov al, 'a' +int 0x10 +mov al, 'l' +int 0x10 +mov al, 0x0D +int 0x10 +mov al, 0x0A +int 0x10 +mov al, 0x00 ; stops serial and bios output from overlapping in qemu -nographic +int 0x10 ; output + +; activate a20 +mov ax, 0x2401 +int 0x15 +jc error -mov si, msg -cld +; load kernel +; 'docs' from https://www.ctyme.com/intr/rb-0607.htm +mov ah, 0x02 +mov al, 1 ; number of sectors to read (must be nonzero) +mov ch, 0 ; low eight bits of cylinder number +mov cl, 2 ; sector number 1-63 (bits 0-5); high two bits of cylinder (bits 6-7, + ; hard disk only) +mov dh, 0 ; head number +; dl is already set by bios +mov bx, 0x1000 ; data buffer +mov es, bx +xor bx, bx +int 0x13 ; read disk +jc error -ch_loop: - lodsb - ; hang if at null terminator - or al, al - jz hang +; load gdt +lgdt [gdt_descriptor] - ; BIOS interrupt prints al - mov ah, 0x0E - mov bh, 0 +; jump to pm +cli +mov eax, cr0 +or eax, 1 +mov cr0, eax +jmp 0x08:pm_start + +error: + mov al, 'e' + int 0x10 + mov al, 'r' + int 0x10 + mov al, 'r' + int 0x10 + mov al, 'o' int 0x10 + mov al, 'r' + int 0x10 + jmp $ + +gdt_data: + ; null segment + dq 0x0000000000000000 + ; code segment + dw 0xFFFF + dw 0x0000 + + db 0x00 + db 10011010b ; 32-bit code segment, present, ring 0 + db 11001111b ; limit bits 16-19 + db 0x00 + + ; data segment + dw 0xFFFF + dw 0x0000 + + db 0x00 + db 10010010b ; 32-bit data segment, present, ring 0 + db 11001111b ; limit bits 16-19 + db 0x00 + +gdt_descriptor: + dw $ - gdt_data - 1 ; size + dd gdt_data ; start + +[bits 32] - jmp ch_loop +; entry point +pm_start: + ; data segment registers + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + mov esp, 0x80000 -hang: - jmp hang + ; TODO actually configure COM1 + mov dx, 0x3F8 ; COM1 + mov al, 'P' + out dx, al + mov al, 'r' + out dx, al + mov al, 'o' + out dx, al + mov al, 't' + out dx, al + mov al, 'e' + out dx, al + mov al, 'c' + out dx, al + mov al, 't' + out dx, al + mov al, 'e' + out dx, al + mov al, 'd' + out dx, al + mov al, 0x0D + out dx, al + mov al, 0x0A + out dx, al -msg db 'Hello World', 0 + jmp 0x08:0x10000 +pm_error: + mov al, 'p' + out dx, al + mov al, 'm' + out dx, al + mov al, 'e' + out dx, al + mov al, 'r' + out dx, al + mov al, 'r' + out dx, al + mov al, 'o' + out dx, al + mov al, 'r' + out dx, al + jmp $ + times 510-($-$$) db 0 ; 2 bytes less now db 0x55 db 0xAA |
