Follow C calling convention (futureproofing) and utilize macros

This commit is contained in:
Jarkko Toivanen 2024-08-17 00:37:07 +03:00
parent 32ccb3abd1
commit 7a22e4aed7
Signed by: jt
GPG key ID: 9151B109B73ECAD5
4 changed files with 115 additions and 156 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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