Files
bootler/asm/boot.asm
2026-03-03 18:18:57 +01:00

159 lines
2.3 KiB
NASM

; 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
; 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
; load gdt
lgdt [gdt_descriptor]
; 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]
; 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
; 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
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