summaryrefslogtreecommitdiff
path: root/src/boot.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/boot.asm')
-rw-r--r--src/boot.asm55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/boot.asm b/src/boot.asm
new file mode 100644
index 0000000..b476581
--- /dev/null
+++ b/src/boot.asm
@@ -0,0 +1,55 @@
+bits 16
+org 0x7c3e
+
+kernel_sectors equ 16
+kernel_segment equ 0x3000
+
+ in al, 0x92
+ or al, 0x02
+ out 0x92, al
+
+ xor ax, ax
+ mov ss, ax
+ mov sp, 0x7ffc
+
+ mov ax, kernel_segment
+ mov es, ax
+ mov ax, 0x0200 + kernel_sectors
+ xor bx, bx
+ mov cx, 0x0002
+ xor dh, dh
+ int 0x13
+
+ cli
+
+ lgdt [gdt]
+
+ mov eax, cr0
+ or al, 0x01
+ mov cr0, eax
+
+ jmp 0x08:pmode
+
+bits 32
+
+pmode:
+ mov ax, 0x10
+ mov ds, ax
+ mov ax, 0x18
+ mov ss, ax
+ mov sp, 0x7ffc
+
+ jmp kernel_segment * 16
+
+gdt:
+ dw .e - .t
+ dd .t
+.t:
+ dq 0x0000_0000_0000_0000
+ dq 0x00c0_9a00_0000_007f
+ dq 0x00c0_9200_0000_007f
+ dq 0x0040_9203_8000_7fff
+.e:
+
+times $$ + 448 - $ db 0
+dw 0xaa55 \ No newline at end of file