aboutsummaryrefslogtreecommitdiffstats
path: root/boot
diff options
context:
space:
mode:
authorClemens Fries <git-generic@xenoworld.de>2018-12-05 18:19:16 +0100
committerClemens Fries <git-generic@xenoworld.de>2018-12-05 18:26:39 +0100
commitbed5515c8dee2a19c1ba9dbc005e078c613e3cf3 (patch)
tree3d8ccff3af83a326ce2615bc19ddf627c25f53fb /boot
parentce7317daf7c9740bc8595f14f7248fa1b050afcf (diff)
Move 'boot' stuff to boot/
Diffstat (limited to 'boot')
-rw-r--r--boot/Makefile12
-rw-r--r--boot/TODO8
-rw-r--r--boot/print.asm44
-rw-r--r--boot/printb.asm36
4 files changed, 100 insertions, 0 deletions
diff --git a/boot/Makefile b/boot/Makefile
new file mode 100644
index 0000000..c9438a6
--- /dev/null
+++ b/boot/Makefile
@@ -0,0 +1,12 @@
+boot.img: print printb
+ cat print printb > boot.img
+
+print: print.asm
+ nasm -Wall print.asm
+
+printb: printb.asm
+ nasm -Wall printb.asm
+
+.PHONY: run
+run: boot.img
+ qemu-system-i386 -drive file=boot.img,format=raw,index=0,if=floppy
diff --git a/boot/TODO b/boot/TODO
new file mode 100644
index 0000000..34dec0a
--- /dev/null
+++ b/boot/TODO
@@ -0,0 +1,8 @@
+* boot loader, loading a few sectors into memory
+* output from loadable
+* setting up things to transition to protected mode
+ * defining a software interrupt in order to call a print() function
+* setting up things to transition to long mode
+ * defining a syscall on order to call a print() function
+* writing minimal program in C
+* writing a minimal scheduler and running two programs at the same time
diff --git a/boot/print.asm b/boot/print.asm
new file mode 100644
index 0000000..97acd8b
--- /dev/null
+++ b/boot/print.asm
@@ -0,0 +1,44 @@
+org 7C00h
+
+jmp _start
+
+hello: db 'Hello from the first stage!', 0x0A, 0x0D, 0x0
+
+_start:
+
+; print hello message
+
+mov ah, 0x0E
+xor esi, esi
+xor edi, edi
+mov si, hello
+cld
+
+.loop:
+lodsb
+cmp al, 0x00
+je .out
+int 0x10
+jmp .loop
+.out:
+
+; load sectors from disk and jump there
+
+mov ah, 0x02 ; load sectory from disk
+mov al, 0x01 ; load one sector
+xor ch, ch ; cylinder number
+mov cl, 0x02 ; start from sector 2
+xor dh, dh ; head number
+xor dl, dl ; drive number
+
+mov bx, 0x0500 ; start address (see jmp)
+ ; 0x00000500 to 0x00007BFF, from Overview at http://wiki.osdev.org/Memory_Map_%28x86%29
+int 0x13
+
+jmp 0x0500
+
+jmp $
+
+; stolen from: https://en.wikibooks.org/wiki/X86_Assembly/Bootloaders
+times 0200h - 2 - ($ - $$) db 0 ;Zerofill up to 510 bytes
+dw 0AA55h ;Boot Sector signature
diff --git a/boot/printb.asm b/boot/printb.asm
new file mode 100644
index 0000000..a8fa788
--- /dev/null
+++ b/boot/printb.asm
@@ -0,0 +1,36 @@
+org 0x0500
+
+
+SECTION .data
+boot: db 'Welcome to the second stage!', 0x0A, 0x0D, 0x00
+foo: db 'What a nice message this is!', 0x0A, 0x0D, 0x00
+
+SECTION .text
+
+
+jmp start
+
+print:
+ push ax
+ cld
+ mov ah, 0x0E
+
+ .loop:
+ lodsb
+ cmp al, 0x00
+ je .out
+ int 0x10
+ jmp .loop
+ .out:
+ pop ax
+ ret
+
+start:
+ mov si, boot
+ call print
+
+ mov si, foo
+ call print
+
+; maybe to something here...
+; e.g.: how to keep CPU from spinning at 100%