Multiboot parsing and uitoa impl
This commit is contained in:
parent
ebf9982c07
commit
e16da3adc8
4 changed files with 291 additions and 45 deletions
2
Makefile
2
Makefile
|
@ -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
98
src/itoa.asm
Normal 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
118
src/mbootinfo.asm
Normal 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
|
118
src/start32.asm
118
src/start32.asm
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue