summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/boot.asm55
-rw-r--r--src/kernel/link.ld15
-rw-r--r--src/kernel/main.c7
-rw-r--r--src/kernel/vga.c14
-rw-r--r--src/kernel/vga.h3
5 files changed, 94 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
diff --git a/src/kernel/link.ld b/src/kernel/link.ld
new file mode 100644
index 0000000..1fcff40
--- /dev/null
+++ b/src/kernel/link.ld
@@ -0,0 +1,15 @@
+OUTPUT_FORMAT(binary)
+OUTPUT_ARCH(i386)
+
+SECTIONS {
+ . = 0x00030000;
+ .entry : {
+ */main.o(.text)
+ }
+ .bin : {
+ *(.text)
+ *(.rodata)
+ *(.data)
+ *(.bss)
+ }
+} \ No newline at end of file
diff --git a/src/kernel/main.c b/src/kernel/main.c
new file mode 100644
index 0000000..1a8b2f4
--- /dev/null
+++ b/src/kernel/main.c
@@ -0,0 +1,7 @@
+#include <stdint.h>
+#include "vga.h"
+
+void main() {
+ while (1)
+ vga_printsz("Hello! ");
+} \ No newline at end of file
diff --git a/src/kernel/vga.c b/src/kernel/vga.c
new file mode 100644
index 0000000..d0170c0
--- /dev/null
+++ b/src/kernel/vga.c
@@ -0,0 +1,14 @@
+#include <stdint.h>
+
+#define VGA_START (uint16_t *)0x000b8000
+#define VGA_END (VGA_START + 80 * 25)
+uint16_t *cursor = VGA_START;
+uint16_t color = 0x1f00;
+
+void vga_printsz(uint8_t *sz) {
+ while (*sz) {
+ *(cursor++) = color | *(sz++);
+ if (cursor == VGA_END)
+ cursor = VGA_START;
+ }
+} \ No newline at end of file
diff --git a/src/kernel/vga.h b/src/kernel/vga.h
new file mode 100644
index 0000000..47ac1fb
--- /dev/null
+++ b/src/kernel/vga.h
@@ -0,0 +1,3 @@
+#include <stdint.h>
+
+void vga_printsz(uint8_t *sz); \ No newline at end of file