diff --git a/Readme.md b/Readme.md index 57ae4ec..60e0a5e 100644 --- a/Readme.md +++ b/Readme.md @@ -6,6 +6,14 @@ Build with Run with qemu-system-x86_64 -boot a -fda mbr +Debug with + qemu-system-x86_64 -boot a -fda mbr -s -S + gdb + target remote localhost:1234 + layout asm + b *0x7c00 + c + == Bios Memory == 0x0 - 0x03FF ;IVT diff --git a/mbr.asm b/mbr.asm index 3103f0d..5a47387 100644 --- a/mbr.asm +++ b/mbr.asm @@ -1,7 +1,74 @@ bits 16 ; mode 16bits org 0x7C00 ; mbr ae loaded at 0x7C00 -mov al, 41h ; put 'A' in al -mov ah, 0eh ; we want to call function 09h (Write Character and Attribute at Cursor) from interupt 10h -int 10h + +jmp boot + +display_enable: + push bp + mov bp, sp + mov ah, 0h ; 00h Set Video Mode + mov al, 07h ; Txt, monochrome, 80x25 + + int 10h + + mov sp, bp + pop bp + ret + +print: + push bp + mov bp, sp + mov si, [bp + 4]; put first function arg in si. sp is stask pointer +.loop: + lodsb ; load si content into al then inc si + cmp al, 0; + je .end + + mov ah, 0eh + mov bx, 0 + int 10h + + jmp .loop + +.end: + mov sp, bp + pop bp + ret + +println: + push bp + mov bp, sp + push word [bp + 4] + call print + add sp, 2 + + mov ah, 03h ; read cursor position + int 10h ; row number in dh. Col in dl + + inc dh ; goto next line + mov dl, 0 + + mov ah, 02h ; Set Cursor Position + int 10h + mov sp, bp + pop bp + ret + +hello db 'Hello world', 0 +name db 'This is a name', 0 + +boot: + sti ; enable virtual interupts + + call display_enable + + push hello + call println + add sp, 2 + + push name + call println + add sp, 2 + times 510 - ($ - $$) db 0 ; fill up to 510 with 0 dw 0xAA55 ; MBR magic number