Multiboot parsing and uitoa impl

This commit is contained in:
Jarkko Toivanen 2023-07-24 21:48:21 +03:00
parent ebf9982c07
commit e16da3adc8
Signed by: jt
GPG key ID: 9151B109B73ECAD5
4 changed files with 291 additions and 45 deletions

View file

@ -2,7 +2,7 @@ all: build/kernel-i386.elf
clean: clean:
-@rm *.bin 2> /dev/null || true -@rm *.bin 2> /dev/null || true
start32.bin: src/start32.asm src/serial.asm start32.bin: src/*
fasm src/start32.asm start32.bin fasm src/start32.asm start32.bin
image: start32.bin mount image: start32.bin mount
cp start32.bin mnt/koalemos/ cp start32.bin mnt/koalemos/

98
src/itoa.asm Normal file
View file

@ -0,0 +1,98 @@
;; Modified from: https://gist.github.com/SplittyDev/8e728627012e57ac0deac196660014fb
;
; Routine to convert a 32-bit integer to a string.
; Registers are preserved.
;
; EAX: Source integer
; EBX: Target address
; ECX: Base
;
; Internal register layout:
; start:
; EAX: Source integer
; ECX: Target address
; EDX: Base
; checknegative:
; EAX: Source integer
; EBX: Target address (original)
; ECX: Target address (active)
; divrem:
; EAX: Source integer
; ECX: Target address (active)
; EDX: Base / Result
; reverse:
; EBX: Target address (original)
; ECX: Target address (active)
; EDX: Target address (temporary)
;
__uitoa:
.start:
push ebp
mov ebp, esp
push eax
push ebx
push ecx
push edx
mov eax, [ebp+8]
mov ecx, [ebp+12]
mov ebx, [ebp+16]
mov edx, ecx
mov ecx, ebx
;.checknegative:
; test eax, eax
; jns .divrem
; mov byte [ecx], 0x2D
; inc ecx
; mov ebx, ecx
; neg eax
.divrem:
push edx
push ecx
mov ecx, edx
xor edx, edx
div ecx
mov byte dl, [__itoacvt + edx]
pop ecx
mov byte [ecx], dl
pop edx
inc ecx
cmp eax, 0x00
jne .divrem
mov byte [ecx], 0x00
dec ecx
.reverse:
cmp ebx, ecx
jge .end
mov byte dl, [ebx]
mov byte al, [ecx]
mov byte [ebx], al
mov byte [ecx], dl
inc ebx
dec ecx
jmp .reverse
.end:
pop edx
pop ecx
pop ebx
pop eax
pop ebp
ret
;
; Conversion table for __itoa.
; Works for bases [2 ... 36].
;
__itoacvt:
db '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
;
; Buffer to store the result of __itoa in.
;
align 64
__itoabuf32:
rb 36

118
src/mbootinfo.asm Normal file
View file

@ -0,0 +1,118 @@
mbootgetinfo:
push ebp
mov ebp, esp
push ebx
push esi
push edi
cld
mov eax, [ebp+8]
cmp eax, 0x2badb002
jne mbootnomagic
mov ebx, [ebp+12]
mov eax, [ebx]
mov [mbootinfo.flags], eax
;; Get memoryinformation
test eax, 1b
jz mbootnomeminfo
mov eax, [ebx+4]
mov [mbootinfo.mem_lower], eax
mov eax, [ebx+8]
mov [mbootinfo.mem_upper], eax
;; Get videoinformation
test [mbootinfo.flags], (1 shl 02)
jz mbootnovideoinfo
mov esi, ebx
add esi, 88
mov eax, [esi]
mov [mbootinfo.fb_addr], eax
add esi, 8
mov eax, [esi]
mov [mbootinfo.fb_pitch], eax
add esi, 4
mov eax, [esi]
mov [mbootinfo.fb_width], eax
add esi, 4
mov eax, [esi]
mov [mbootinfo.fb_height], eax
add esi, 4
mov al, [esi]
cmp al, 32
je .bppokay
cmp al, 24
je .bppokay
jmp mbootunsupportedfbbpp
.bppokay:
mov [mbootinfo.fb_bpp], al
inc esi
mov al, [esi]
cmp al, 1
jne mbootunsupportedfbtype
mov [mbootinfo.fb_type], al
inc esi
;; r/g/b positions and masks
mov ecx, 6
mov edi, mbootinfo.fb_rpos
rep movsb
.done:
pop edi
pop esi
pop ebx
pop ebp
ret
mbootnomagic:
push .msg
call serialwrite
jmp hang
.msg db "No multiboot magic!", 10, 0
mbootnomeminfo:
push .msg
call serialwrite
jmp hang
.msg db "No memoryinfo!", 10, 0
mbootnovideoinfo:
push .msg
call serialwrite
jmp hang
.msg db "No videoryinfo!", 10, 0
mbootunsupportedfbtype:
push .msg
call serialwrite
jmp hang
.msg db "Unsupported framebuffer type: only direct RGB is supported!", 10, 0
mbootunsupportedfbbpp:
push .msg
call serialwrite
jmp hang
.msg db "Unsupported bitdepth: only 24 and 32 bpp supported!", 10, 0
mbootinfo:
.flags dd 0
.mem_lower dd 0
.mem_upper dd 0
.fb_addr dd 0
.fb_pitch dd 0
.fb_width dd 0
.fb_height dd 0
.fb_bpp db 0
.fb_type db 0
.fb_rpos db 0
.fb_rmasksize db 0
.fb_gpos db 0
.fb_gmasksize db 0
.fb_bpos db 0
.fb_bmasksize db 0

View file

@ -5,7 +5,7 @@ org 0x100000
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002 MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
MULTIBOOT_PAGE_ALIGN equ (1 shl 0) MULTIBOOT_PAGE_ALIGN equ (1 shl 0)
MULTIBOOT_MEMORY_INFO equ (1 shl 1) MULTIBOOT_MEMORY_INFO equ (1 shl 1)
MULTIBOOT_VIDEO_REQUEST equ (0 shl 2) MULTIBOOT_VIDEO_REQUEST equ (1 shl 2)
MULTIBOOT_AOUT_KLUDGE equ (1 shl 16) MULTIBOOT_AOUT_KLUDGE equ (1 shl 16)
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN or MULTIBOOT_MEMORY_INFO or MULTIBOOT_VIDEO_REQUEST MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN or MULTIBOOT_MEMORY_INFO or MULTIBOOT_VIDEO_REQUEST
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN or MULTIBOOT_MEMORY_INFO or MULTIBOOT_VIDEO_REQUEST or MULTIBOOT_AOUT_KLUDGE MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN or MULTIBOOT_MEMORY_INFO or MULTIBOOT_VIDEO_REQUEST or MULTIBOOT_AOUT_KLUDGE
@ -27,68 +27,98 @@ multiboot:
start: start:
; Setup stack ; Setup stack
mov ebp, stack_bottom mov ebp, stack_top
mov esp, stack_top mov esp, stack_top
push ebx push ebx
push eax push eax
cmp eax, 0x2badb002
jne multibootnomagic
mov byte [0xb8000], '!'
push stuff.bootmsg
call printbootmsg
call serialinit call serialinit
push stuff.bootmsg
call serialwrite call serialwrite
add esp, 4 add esp, 4
call mbootgetinfo
add esp, 2*4
mov eax, [mbootinfo.fb_addr]
mov dword [eax], 0xffffffff
push stuff.fbaddrmsgpfx
call serialwrite
add esp, 4
sub esp, 36 ;Reserve stack for return
push dword esp ;Destination address
push dword 16 ;Base
push dword [mbootinfo.fb_addr] ;source
call __uitoa
add esp, 3*4
push esp
call serialwrite
add esp, 4
push stuff.fbdimensionsmsgpfx
call serialwrite
add esp, 4
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
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
push dword esp ;destination address
push dword 10 ;base
xor eax, eax
mov al, [mbootinfo.fb_bpp]
push dword eax
call __uitoa
add esp, 3*4
push esp
call serialwrite
add esp, 4
add esp, 36 ;Clean reserved uitoa return string from stack
jmp hang jmp hang
hang: hang:
push .msg
call serialwrite
cli cli
.loop:
hlt hlt
jmp hang
multibootnomagic:
mov esi, .msg
mov edi, 0xb8000
mov ah, 64
cld
.loop:
lodsb
or al, al
jz .done
stosw
jmp .loop jmp .loop
.done: .msg db 10, "Halting...", 10, 0
jmp hang
.msg db "No multiboot magic", 0
printbootmsg:
push ebp
mov ebp, esp
pushad
mov esi, [ebp+8]
mov edi, 0xb8000
cld
.loop:
lodsb
or al, al
jz .done
stosb
inc edi
jmp .loop
.done:
popad
pop ebp
ret
include "src/serial.asm" include "src/serial.asm"
include "src/mbootinfo.asm"
include "src/itoa.asm"
stuff: stuff:
.bootmsg db "=== KoalemOS ===", 10, 0 .bootmsg db 10, "=== KoalemOS ===", 10, 0
.fbaddrmsgpfx db 10, "Framebuffer address: 0x", 0
.fbdimensionsmsgpfx db 10, "Framebuffer dimensions: ", 0
.x db "x", 0
stack_bottom: stack_bottom: