fernlader/boot16.S

76 lines
1.7 KiB
ArmAsm
Raw Normal View History

2025-07-04 03:10:55 +02:00
// vim: et:sw=12:ts=12:sts=12
.global _start
.text
2025-07-04 04:02:05 +02:00
.code16
2025-07-04 03:10:55 +02:00
2025-07-04 15:29:41 +02:00
_start: cli
cld
2025-07-04 04:02:05 +02:00
mov %cs, %ax
mov %ax, %ds
2025-07-04 15:29:41 +02:00
mov $message, %si
call print
call enable_a20
lea message, %si
2025-07-04 04:02:05 +02:00
call print
2025-07-04 15:29:41 +02:00
lgdt gdt_ptr
call enter_prot
2025-07-04 04:02:05 +02:00
1: hlt
jmp 1b
2025-07-04 15:29:41 +02:00
enable_a20: // TODO more thorough implementation
inb $0x92, %al
or $2, %al
outb %al, $0x92
ret
enter_prot: mov %cr0, %eax
or $1, %al
mov %eax, %cr0
ret
print: xor %bx, %bx
2025-07-04 04:02:05 +02:00
1: lodsb
or %al, %al
jz 2f
2025-07-04 03:10:55 +02:00
mov $0x0E, %ah
int $0x10
jmp 1b
2025-07-04 04:02:05 +02:00
2025-07-04 15:29:41 +02:00
2: ret
gdt: // entry 0: null descriptor
.word 0
.word 0
.byte 0
.byte 0
.byte 0
.byte 0
// entry 1: code segment
.word 0xFFFF
.word 0
.byte 0
.byte 0b10011010
.byte 0x8F
.byte 0
// entry 2: data segment
.word 0xFFFF
.word 0
.byte 0
.byte 0b10010010
.byte 0x8F
.byte 0
.set gdt_size, .-gdt
gdt_ptr: .word gdt_size-1
.long gdt
2025-07-04 04:02:05 +02:00
2025-07-04 15:29:41 +02:00
message: .asciz "Hello, World!\r\n"