From 7a22e4aed728eb0b5fa0cee700c70bf9928c31d4 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen Date: Sat, 17 Aug 2024 00:37:07 +0300 Subject: [PATCH] Follow C calling convention (futureproofing) and utilize macros --- src/framebuffer.asm | 14 ++- src/mbootinfo.asm | 16 ++-- src/serial.asm | 12 ++- src/start32.asm | 229 ++++++++++++++++++-------------------------- 4 files changed, 115 insertions(+), 156 deletions(-) diff --git a/src/framebuffer.asm b/src/framebuffer.asm index 377ba9a..e7168b0 100644 --- a/src/framebuffer.asm +++ b/src/framebuffer.asm @@ -1,11 +1,19 @@ +macro kputpixel x, y, r, g, b { + push b ;b + push g ;g + push r ;r + push y ;y + push x ;x + call putpixel + add esp, 4*5 +} + ;; x, y, r, g, b putpixel: push ebp mov ebp, esp - push eax push ebx - push ecx push edi ; check pixel is in screen @@ -58,9 +66,7 @@ putpixel: stosb .done: pop edi - pop ecx pop ebx - pop eax pop ebp ret diff --git a/src/mbootinfo.asm b/src/mbootinfo.asm index d7425f0..3c3db73 100644 --- a/src/mbootinfo.asm +++ b/src/mbootinfo.asm @@ -1,7 +1,6 @@ mbootgetinfo: push ebp mov ebp, esp - push ebx push esi push edi cld @@ -10,23 +9,23 @@ mbootgetinfo: cmp eax, 0x2badb002 jne mbootnomagic - mov ebx, [ebp+12] - mov eax, [ebx] + mov edx, [ebp+12] + mov eax, [edx] mov [mbootinfo.flags], eax ;; Get memoryinformation test eax, 1b jz mbootnomeminfo - mov eax, [ebx+4] + mov eax, [edx+4] mov [mbootinfo.mem_lower], eax - mov eax, [ebx+8] + mov eax, [edx+8] mov [mbootinfo.mem_upper], eax ;; Get videoinformation test [mbootinfo.flags], (1 shl 02) jz mbootnovideoinfo - mov esi, ebx + mov esi, edx add esi, 88 mov eax, [esi] mov [mbootinfo.fb_addr], eax @@ -64,13 +63,12 @@ mbootgetinfo: .bytesppcalc: xor eax, eax mov al, [mbootinfo.fb_bpp] - mov ebx, 8 - div bl + mov edx, 8 + div dl mov [mbootinfo.fb_bytespp], al .done: pop edi pop esi - pop ebx pop ebp ret diff --git a/src/serial.asm b/src/serial.asm index b4e3353..c46b511 100644 --- a/src/serial.asm +++ b/src/serial.asm @@ -1,9 +1,14 @@ SERIAL_PORT equ 0x3f8 serialinitialized db 0 -serialinit: - push ax +; Write null terminated string in address str_pointer to serial +macro serw str_pointer { + push str_pointer + call serialwrite + add esp, 4 +} +serialinit: ;Disable ints mov dx, SERIAL_PORT+1 mov al, 0x00 @@ -54,7 +59,6 @@ serialinit: out dx, al mov [serialinitialized], 1 .end: - pop ax ret .errormsg db "Serial init failed", 0 @@ -64,7 +68,6 @@ serialwrite: push ebp mov ebp, esp push esi - push ax cld mov esi, [ebp+8] .loop: @@ -80,7 +83,6 @@ serialwrite: out dx, al jmp .loop .done: - pop ax pop esi pop ebp ret diff --git a/src/start32.asm b/src/start32.asm index 1e3121f..b6cb689 100644 --- a/src/start32.asm +++ b/src/start32.asm @@ -29,6 +29,13 @@ multiboot: dd VHEIGHT ; video height dd VDEPTH ; video depth +; Includes yayyy +include "src/serial.asm" +include "src/mbootinfo.asm" +include "src/itoa.asm" +include "src/framebuffer.asm" +include "src/roskalogoraw.asm" + start: ; Setup stack mov ebp, stack_top @@ -38,16 +45,13 @@ start: push eax call serialinit - push stuff.bootmsg - call serialwrite - add esp, 4 + + serw stuff.bootmsg call mbootgetinfo add esp, 2*4 - push stuff.fbaddrmsgpfx - call serialwrite - add esp, 4 + serw stuff.fbaddrmsgpfx sub esp, 36 ;Reserve stack for return push dword esp ;Destination address @@ -55,36 +59,24 @@ start: push dword [mbootinfo.fb_addr] ;source call __uitoa add esp, 3*4 - push esp - call serialwrite - add esp, 4 + serw esp - push stuff.fbdimensionsmsgpfx - call serialwrite - add esp, 4 + serw stuff.fbdimensionsmsgpfx push dword esp ;destination address push dword 10 ;base push dword [mbootinfo.fb_width] call __uitoa add esp, 3*4 - push esp - call serialwrite - add esp, 4 - push stuff.x - call serialwrite - add esp, 4 + serw esp + serw stuff.x push dword esp ;destination address push dword 10 ;base push dword [mbootinfo.fb_height] call __uitoa add esp, 3*4 - push esp - call serialwrite - add esp, 4 - push stuff.x - call serialwrite - add esp, 4 + serw esp + serw stuff.x push dword esp ;destination address push dword 10 ;base @@ -93,115 +85,87 @@ start: push dword eax call __uitoa add esp, 3*4 - push esp + serw esp + + + serw stuff.rpostxt + + push dword esp + push dword 10 + xor eax, eax + mov al, [mbootinfo.fb_rpos] + push dword eax + call __uitoa + add esp, 3*4 + serw esp + + serw stuff.gpostxt + + push dword esp + push dword 10 + xor eax, eax + mov al, [mbootinfo.fb_gpos] + push dword eax + call __uitoa + add esp, 3*4 + serw esp + + serw stuff.bpostxt + + push dword esp + push dword 10 + xor eax, eax + mov al, [mbootinfo.fb_bpos] + push dword eax + call __uitoa + add esp, 3*4 + serw esp + + + + push stuff.rmasksizetxt call serialwrite add esp, 4 + push dword esp + push dword 10 + xor eax, eax + mov al, [mbootinfo.fb_rmasksize] + push dword eax + call __uitoa + add esp, 3*4 + serw esp -push stuff.rpostxt -call serialwrite -add esp, 4 + push stuff.gmasksizetxt + call serialwrite + add esp, 4 -push dword esp -push dword 10 -xor eax, eax -mov al, [mbootinfo.fb_rpos] -push dword eax -call __uitoa -add esp, 3*4 -push esp -call serialwrite -add esp, 4 + push dword esp + push dword 10 + xor eax, eax + mov al, [mbootinfo.fb_gmasksize] + push dword eax + call __uitoa + add esp, 3*4 + serw esp -push stuff.gpostxt -call serialwrite -add esp, 4 - -push dword esp -push dword 10 -xor eax, eax -mov al, [mbootinfo.fb_gpos] -push dword eax -call __uitoa -add esp, 3*4 -push esp -call serialwrite -add esp, 4 - -push stuff.bpostxt -call serialwrite -add esp, 4 - -push dword esp -push dword 10 -xor eax, eax -mov al, [mbootinfo.fb_bpos] -push dword eax -call __uitoa -add esp, 3*4 -push esp -call serialwrite -add esp, 4 - - - -push stuff.rmasksizetxt -call serialwrite -add esp, 4 - -push dword esp -push dword 10 -xor eax, eax -mov al, [mbootinfo.fb_rmasksize] -push dword eax -call __uitoa -add esp, 3*4 -push esp -call serialwrite -add esp, 4 - -push stuff.gmasksizetxt -call serialwrite -add esp, 4 - -push dword esp -push dword 10 -xor eax, eax -mov al, [mbootinfo.fb_gmasksize] -push dword eax -call __uitoa -add esp, 3*4 -push esp -call serialwrite -add esp, 4 - -push stuff.bmasksizetxt -call serialwrite -add esp, 4 - -push dword esp -push dword 10 -xor eax, eax -mov al, [mbootinfo.fb_bmasksize] -push dword eax -call __uitoa -add esp, 3*4 -push esp -call serialwrite -add esp, 4 + serw stuff.bmasksizetxt + push dword esp + push dword 10 + xor eax, eax + mov al, [mbootinfo.fb_bmasksize] + push dword eax + call __uitoa + add esp, 3*4 + serw esp add esp, 36 ;Clean reserved uitoa return string from stack - ; Draw a test pixel to bottom right corner - push 0xff - push 0xff - push 0xff - push VHEIGHT-1 - push VWIDTH-1 - call putpixel - add esp, 3*4 + ; Draw a green test pixel to bottom-right + kputpixel VWIDTH-1, VHEIGHT-1, 0x00, 0xff, 0x00 +; Draw a predefined logo in magenta to top-left rOSkalogodraw: mov esi, roskalogo mov eax, 0 ;Brightness @@ -209,17 +173,12 @@ rOSkalogodraw: mov ecx, 0 ;x .loop: lodsb - push eax ;b - push eax ;g - push eax ;r - push ebx ;y - push ecx ;x - call putpixel + + push ecx + push eax + kputpixel ecx, ebx, eax, 0x00, eax + pop eax pop ecx - pop ebx - pop eax - pop eax - pop eax inc ecx cmp byte cl, [roskalogo.w] @@ -242,12 +201,6 @@ hang: jmp .loop .msg db 10, "Halting...", 10, 0 -include "src/serial.asm" -include "src/mbootinfo.asm" -include "src/itoa.asm" -include "src/framebuffer.asm" -include "src/roskalogoraw.asm" - stuff: .bootmsg db 10, "=== rOSka ===", 10, 0 .fbaddrmsgpfx db 10, "Framebuffer address: 0x", 0