From bed5515c8dee2a19c1ba9dbc005e078c613e3cf3 Mon Sep 17 00:00:00 2001 From: Clemens Fries Date: Wed, 5 Dec 2018 18:19:16 +0100 Subject: Move 'boot' stuff to boot/ --- boot/Makefile | 12 ++++++++++++ boot/TODO | 8 ++++++++ boot/print.asm | 44 ++++++++++++++++++++++++++++++++++++++++++++ boot/printb.asm | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 boot/Makefile create mode 100644 boot/TODO create mode 100644 boot/print.asm create mode 100644 boot/printb.asm (limited to 'boot') 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% -- cgit