From 33e589193180a66da66f27d7a55c280b386e3f32 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Tue, 19 Sep 2023 19:48:30 +0300 Subject: [PATCH 01/15] fasm-putchar-virittelyy --- src/font.asm | 38 ++++++++++++++++++++++++++++++ src/framebuffer.asm | 57 +++++++++++++++++++++++++++++++++++++++++++++ src/start32.asm | 6 +++++ 3 files changed, 101 insertions(+) create mode 100644 src/font.asm diff --git a/src/font.asm b/src/font.asm new file mode 100644 index 0000000..e97def8 --- /dev/null +++ b/src/font.asm @@ -0,0 +1,38 @@ +;; Thank you Terminus for letting us use this font under SIL licence +kfont: +; controlchars +times 31 db 0x00000000000000000000000000000000 +; space +db 11000000b +db 10000000b +db 00000000b +db 00000000b +db 00000000b +db 00000001b +db 00000001b +db 00000001b +db 00000001b +db 00000000b +db 00000000b +db 00000000b +db 00000000b +db 00000000b +db 00000001b +db 00000011b +; ! +db 00000000b +db 00000000b +db 00011000b +db 00011000b +db 00011000b +db 00011000b +db 00011000b +db 00011000b +db 00011000b +db 00000000b +db 00011000b +db 00011000b +db 00000000b +db 00000000b +db 00000000b +db 00000000b diff --git a/src/framebuffer.asm b/src/framebuffer.asm index 5204798..d25ba38 100644 --- a/src/framebuffer.asm +++ b/src/framebuffer.asm @@ -42,3 +42,60 @@ putpixel: pop ebp ret + +; char, x, y +putchar: + push ebp + mov ebp, esp + push eax + push ebx + push ecx + push edx + + ; skip non printable + mov eax, [ebp+8] ;char + cmp eax, 0x20 + jl .unprintable + cmp eax, 0x7e + jg .unprintable + + mov ecx, 16 + mul ecx + mov esi, [kfont+eax] + + mov ebx, [ebp+12] ;x + mov edx, [ebp+16] ;y + + cld + xor eax, eax +.loop: + lodsb ; load font row to al + mov ah, 0 +.loop2: + shl al + jnc .blankpix + ; draw a pixel + push 0xff + push edx ;x + push ecx ;y +.blankpix: + inc ah + cmp ah, 8 + je .loop + + +.done: + pop edx + pop ecx + pop ebx + pop eax + pop ebp + ret +.unprintable: + push .unprintablemsg + call serialwrite + add esp, 4 + jmp .done +.unprintablemsg: db 10,"Err: Unprintable char not handled!", 0 + +include "src/font.asm" diff --git a/src/start32.asm b/src/start32.asm index f8e5d36..25342cb 100644 --- a/src/start32.asm +++ b/src/start32.asm @@ -133,6 +133,12 @@ rOSkalogodraw: jne .loop .done: +push byte 0x21 +push byte 0x21 +push byte 0x21 +call putchar +add esp, 3*4 + jmp hang hang: From e4172c14bb9982895adabc0ea6ac6e832dd3f4d9 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Thu, 21 Sep 2023 21:06:37 +0300 Subject: [PATCH 02/15] Fancy colour loop --- src/start32.asm | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/start32.asm b/src/start32.asm index f8e5d36..5042d9c 100644 --- a/src/start32.asm +++ b/src/start32.asm @@ -133,6 +133,39 @@ rOSkalogodraw: jne .loop .done: + +xor eax, eax +xor ebx, ebx +xor ecx, ecx +cloop: +push eax ;col +push ebx ;y +push ecx ;x +call putpixel +pop ecx +pop ebx +pop eax + +inc ecx +cmp ecx, VWIDTH +jle cloop + +xor ecx, ecx +inc ebx +cmp ebx, VHEIGHT +jle cloop + +xor ebx, ebx +add eax, 5 +cmp ax, 255 +jle cloop + +xor eax, eax +jmp cloop + + + + jmp hang hang: From a0ba839215c2af7805e8419ba7680fc25fe7846c Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Sat, 13 Jan 2024 02:36:35 +0200 Subject: [PATCH 03/15] Get sweet R/G/B positions as numbers for debugging --- src/start32.asm | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/start32.asm b/src/start32.asm index 5042d9c..5feda10 100644 --- a/src/start32.asm +++ b/src/start32.asm @@ -97,6 +97,52 @@ start: call serialwrite add esp, 4 + +push stuff.rpostxt +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 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 + add esp, 36 ;Clean reserved uitoa return string from stack ; Draw a test pixel to bottom right corner @@ -132,6 +178,7 @@ rOSkalogodraw: cmp byte bl, [roskalogo.h] jne .loop .done: +jmp hang xor eax, eax @@ -189,6 +236,11 @@ stuff: .fbdimensionsmsgpfx db 10, "Framebuffer dimensions: ", 0 .x db "x", 0 + + .rpostxt db 10, "rPos: ", 0 + .gpostxt db 10, "gPos: ", 0 + .bpostxt db 10, "bPos: ", 0 + align 4096 bss_start: ;align 4096 From 3dd934bd83ce770a56cf26505d730e6ae47efcc5 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Sat, 13 Jan 2024 03:28:43 +0200 Subject: [PATCH 04/15] Fixed R/G/B field information fetching from Multiboot --- src/mbootinfo.asm | 2 ++ src/start32.asm | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/mbootinfo.asm b/src/mbootinfo.asm index 2ff07e8..d7425f0 100644 --- a/src/mbootinfo.asm +++ b/src/mbootinfo.asm @@ -54,6 +54,8 @@ mbootgetinfo: mov [mbootinfo.fb_type], al inc esi + ;garbage? + add esi, 2 ;; r/g/b positions and masks mov ecx, 6 mov edi, mbootinfo.fb_rpos diff --git a/src/start32.asm b/src/start32.asm index 5feda10..495dde2 100644 --- a/src/start32.asm +++ b/src/start32.asm @@ -143,6 +143,54 @@ 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 + + add esp, 36 ;Clean reserved uitoa return string from stack ; Draw a test pixel to bottom right corner @@ -240,6 +288,9 @@ stuff: .rpostxt db 10, "rPos: ", 0 .gpostxt db 10, "gPos: ", 0 .bpostxt db 10, "bPos: ", 0 + .rmasksizetxt db 10, "rMaskSize: ", 0 + .gmasksizetxt db 10, "gMaskSize: ", 0 + .bmasksizetxt db 10, "bMaskSize: ", 0 align 4096 bss_start: From bbd80c4f78079ee27923ca567eca9247cd48ca88 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Fri, 26 Jan 2024 18:23:51 +0200 Subject: [PATCH 05/15] Cleaning up --- src/start32.asm | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/src/start32.asm b/src/start32.asm index 495dde2..1aa15fc 100644 --- a/src/start32.asm +++ b/src/start32.asm @@ -229,39 +229,6 @@ rOSkalogodraw: jmp hang -xor eax, eax -xor ebx, ebx -xor ecx, ecx -cloop: -push eax ;col -push ebx ;y -push ecx ;x -call putpixel -pop ecx -pop ebx -pop eax - -inc ecx -cmp ecx, VWIDTH -jle cloop - -xor ecx, ecx -inc ebx -cmp ebx, VHEIGHT -jle cloop - -xor ebx, ebx -add eax, 5 -cmp ax, 255 -jle cloop - -xor eax, eax -jmp cloop - - - - - jmp hang hang: push .msg From bcf49f4fefaee820bc2b56e0cc948431057b7fef Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Fri, 26 Jan 2024 18:29:07 +0200 Subject: [PATCH 06/15] Framebuffer supports colour now --- src/framebuffer.asm | 32 +++++++++++++++++++++++++++----- src/start32.asm | 21 ++++++++++++--------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/framebuffer.asm b/src/framebuffer.asm index 5204798..377ba9a 100644 --- a/src/framebuffer.asm +++ b/src/framebuffer.asm @@ -1,4 +1,4 @@ -;; x, y, brightness +;; x, y, r, g, b putpixel: push ebp mov ebp, esp @@ -28,12 +28,34 @@ putpixel: add edi, eax - ; Brightness - mov eax, [ebp + 16] ; Poke videomemory - cld - rep stosb + xor eax, eax + mov ebx, [ebp+16] + mov cl, [mbootinfo.fb_rpos] + shl ebx, cl + or eax, ebx + + mov ebx, [ebp+20] + mov cl, [mbootinfo.fb_gpos] + shl ebx, cl + or eax, ebx + + mov ebx, [ebp+24] + mov cl, [mbootinfo.fb_bpos] + shl ebx, cl + or eax, ebx + + cmp [mbootinfo.fb_bpp], 32 + jne .bpp24 + stosd + jmp .done +.bpp24: + stosb + shr eax, 8 + stosb + shr eax, 8 + stosb .done: pop edi pop ecx diff --git a/src/start32.asm b/src/start32.asm index 1aa15fc..1e3121f 100644 --- a/src/start32.asm +++ b/src/start32.asm @@ -13,7 +13,7 @@ MB_CHECKSUM equ -(MB_HEADER_MAGIC + MB_HEADER_FLAGS) VWIDTH equ 640 VHEIGHT equ 480 -VDEPTH equ 24 +VDEPTH equ 32 multiboot: dd MB_HEADER_MAGIC @@ -194,12 +194,11 @@ add esp, 4 add esp, 36 ;Clean reserved uitoa return string from stack ; Draw a test pixel to bottom right corner - mov eax, 0xff - mov ebx, 767 - mov ecx, 1023 push 0xff - push 479 - push 639 + push 0xff + push 0xff + push VHEIGHT-1 + push VWIDTH-1 call putpixel add esp, 3*4 @@ -210,13 +209,17 @@ rOSkalogodraw: mov ecx, 0 ;x .loop: lodsb - push eax - push ebx - push ecx + push eax ;b + push eax ;g + push eax ;r + push ebx ;y + push ecx ;x call putpixel pop ecx pop ebx pop eax + pop eax + pop eax inc ecx cmp byte cl, [roskalogo.w] From 32ccb3abd176002669a8f6e9e719b1887b7adf92 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Fri, 16 Aug 2024 18:22:30 +0300 Subject: [PATCH 07/15] Automating image-file creation --- Makefile | 29 +++++++++++++++++++++++++---- grub.cfg | 3 +++ 2 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 grub.cfg diff --git a/Makefile b/Makefile index 7864526..72c8af7 100644 --- a/Makefile +++ b/Makefile @@ -4,13 +4,13 @@ clean: start32.bin: src/* fasm src/start32.asm start32.bin -image: start32.bin mount +image: start32.bin mount grub-cfg roska.img mnt/roska/ cp start32.bin mnt/roska/ sync qemu-multiboot: start32.bin qemu-system-i386 -kernel start32.bin -serial stdio -qemu-image: image +qemu-image: image roska.img qemu-system-i386 roska.img -serial stdio mount: roska.img mnt/ @@ -18,8 +18,29 @@ mount: roska.img mnt/ sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) roska.img mnt/; \ fi; umount: - @sudo umount mnt + @if mountpoint -q "mnt/"; then \ + sudo umount mnt/; \ + fi; mnt/: - @mkdir mnt + @mkdir -p mnt +mnt/roska/: mount roska.img + @mkdir -p mnt/roska build/: @mkdir build + +roska.img: mnt/ + dd if=/dev/zero of=roska.img bs=16M count=1 + echo 'type=83' | sudo sfdisk roska.img + sudo losetup /dev/loop0 roska.img + sudo losetup /dev/loop1 roska.img -o1048576 + sudo mkdosfs -F32 -f 2 /dev/loop1 + sudo mount /dev/loop1 mnt/ + sudo grub-install --target=i386-pc --root-directory=mnt --boot-directory=mnt/boot --no-floppy --modules="normal part_msdos multiboot" /dev/loop0 + sudo umount mnt/ + sudo losetup -d /dev/loop1 + sudo losetup -d /dev/loop0 +grub-cfg: grub.cfg mount + cp grub.cfg mnt/boot/grub/grub.cfg +lo-unsetup: umount + sudo losetup -d /dev/loop1 + sudo losetup -d /dev/loop0 diff --git a/grub.cfg b/grub.cfg new file mode 100644 index 0000000..30eab69 --- /dev/null +++ b/grub.cfg @@ -0,0 +1,3 @@ +menuentry "rOSka" { + multiboot /roska/start32.bin +} From 7a22e4aed728eb0b5fa0cee700c70bf9928c31d4 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Sat, 17 Aug 2024 00:37:07 +0300 Subject: [PATCH 08/15] 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 From c2e69b6f7f320e8457274d2d935bb4536162e6bb Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Sat, 17 Aug 2024 06:21:47 +0300 Subject: [PATCH 09/15] More and advanceder macros --- src/framebuffer.asm | 2 +- src/itoa.asm | 8 +++ src/serial.asm | 2 +- src/start32.asm | 123 ++++++++++---------------------------------- 4 files changed, 37 insertions(+), 98 deletions(-) diff --git a/src/framebuffer.asm b/src/framebuffer.asm index e7168b0..e58e16e 100644 --- a/src/framebuffer.asm +++ b/src/framebuffer.asm @@ -1,4 +1,4 @@ -macro kputpixel x, y, r, g, b { +macro kputpixel x*, y*, r*, g*, b* { push b ;b push g ;g push r ;r diff --git a/src/itoa.asm b/src/itoa.asm index 914b214..429f9cf 100644 --- a/src/itoa.asm +++ b/src/itoa.asm @@ -26,6 +26,14 @@ ; ECX: Target address (active) ; EDX: Target address (temporary) ; +macro kuitoa src*, dest*, base* { + push dest + push base + push src + call __uitoa + add esp, 3*4 +} + __uitoa: .start: push ebp diff --git a/src/serial.asm b/src/serial.asm index c46b511..2699f01 100644 --- a/src/serial.asm +++ b/src/serial.asm @@ -2,7 +2,7 @@ SERIAL_PORT equ 0x3f8 serialinitialized db 0 ; Write null terminated string in address str_pointer to serial -macro serw str_pointer { +macro serw [str_pointer*] { push str_pointer call serialwrite add esp, 4 diff --git a/src/start32.asm b/src/start32.asm index b6cb689..b72db5e 100644 --- a/src/start32.asm +++ b/src/start32.asm @@ -51,114 +51,46 @@ start: call mbootgetinfo add esp, 2*4 - serw stuff.fbaddrmsgpfx - 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 - serw esp + kuitoa [mbootinfo.fb_addr], esp, 16 + serw stuff.fbaddrmsgpfx, esp - serw stuff.fbdimensionsmsgpfx - push dword esp ;destination address - push dword 10 ;base - push dword [mbootinfo.fb_width] - call __uitoa - add esp, 3*4 - serw esp - serw stuff.x + kuitoa [mbootinfo.fb_width], esp, 10 + serw stuff.fbdimensionsmsgpfx, esp, stuff.x - push dword esp ;destination address - push dword 10 ;base - push dword [mbootinfo.fb_height] - call __uitoa - add esp, 3*4 - serw esp - serw stuff.x + kuitoa [mbootinfo.fb_height], esp, 10 + serw esp, stuff.x - 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 + movzx eax, byte [mbootinfo.fb_bpp] + kuitoa eax, esp, 10 serw esp - serw stuff.rpostxt + movzx eax, byte [mbootinfo.fb_rpos] + kuitoa eax, esp, 10 + serw stuff.rpostxt, esp - 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 + movzx eax, byte [mbootinfo.fb_gpos] + kuitoa eax, esp, 10 + serw stuff.gpostxt, 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 + movzx eax, byte [mbootinfo.fb_bpos] + kuitoa eax, esp, 10 + serw stuff.bpostxt, esp - push stuff.rmasksizetxt - call serialwrite - add esp, 4 + movzx eax, byte [mbootinfo.fb_rmasksize] + kuitoa eax, esp, 10 + serw stuff.rmasksizetxt, esp - 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 + movzx eax, byte [mbootinfo.fb_gmasksize] + kuitoa eax, esp, 10 + serw stuff.gmasksizetxt, esp - 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 - serw esp - - 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 + movzx eax, byte [mbootinfo.fb_bmasksize] + kuitoa eax, esp, 10 + serw stuff.bmasksizetxt, esp add esp, 36 ;Clean reserved uitoa return string from stack @@ -193,8 +125,7 @@ jmp hang hang: - push .msg - call serialwrite + serw .msg cli .loop: hlt From 0d9fcf5ae4bf3b1a2a1f25dc2391a13ee28d89c5 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Sat, 17 Aug 2024 19:16:53 +0300 Subject: [PATCH 10/15] BOCHS debugging stuff --- .gitignore | 1 + Makefile | 9 ++++----- bochsrc.txt | 13 +++++++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 bochsrc.txt diff --git a/.gitignore b/.gitignore index 770baf3..e9c4c3e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ *.bin mnt/ build/ +bx_enh_dbg.ini diff --git a/Makefile b/Makefile index 72c8af7..0826a2a 100644 --- a/Makefile +++ b/Makefile @@ -8,11 +8,10 @@ image: start32.bin mount grub-cfg roska.img mnt/roska/ cp start32.bin mnt/roska/ sync -qemu-multiboot: start32.bin - qemu-system-i386 -kernel start32.bin -serial stdio -qemu-image: image roska.img +qemu-run: image roska.img qemu-system-i386 roska.img -serial stdio - +bochs-run: image roska.img + bochs -qf bochsrc.txt mount: roska.img mnt/ @if ! mountpoint -q "mnt/"; then \ sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) roska.img mnt/; \ @@ -29,7 +28,7 @@ build/: @mkdir build roska.img: mnt/ - dd if=/dev/zero of=roska.img bs=16M count=1 + dd if=/dev/zero of=roska.img bs=1k count=16128 echo 'type=83' | sudo sfdisk roska.img sudo losetup /dev/loop0 roska.img sudo losetup /dev/loop1 roska.img -o1048576 diff --git a/bochsrc.txt b/bochsrc.txt new file mode 100644 index 0000000..f13fbe5 --- /dev/null +++ b/bochsrc.txt @@ -0,0 +1,13 @@ +display_library: x, options="gui_debug" +magic_break: enabled=1 +romimage: file=$BXSHARE/BIOS-bochs-legacy +vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest +clock: sync=realtime +cpu: ips=4294967295, reset_on_triple_fault=false +megs: 128 +ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 +ata0-master: type=disk, mode=flat, path=roska.img, cylinders=32, heads=16, spt=63 +boot: disk + +# Use `bximage` to get disk geometry +# TODO: Figure out how to get sensible TTY serial From f9e2dc33e904fa2cbaac0ab2d08a86335d99b41c Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Sat, 17 Aug 2024 20:21:04 +0300 Subject: [PATCH 11/15] Made __uitoa comply with our calling convention Changed __uitoa order of arguments from src,base,target to src,target,base Also returns target in EAX --- src/itoa.asm | 23 +++++++++++++---------- src/start32.asm | 43 ++++++++++++++++++++++--------------------- 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/itoa.asm b/src/itoa.asm index 429f9cf..3985f9d 100644 --- a/src/itoa.asm +++ b/src/itoa.asm @@ -1,8 +1,12 @@ ;; Modified from: https://gist.github.com/SplittyDev/8e728627012e57ac0deac196660014fb +; __itoa(src int, target addr, base) +;target address returned in EAX +;EBX, EBP, ESP preserved as our calling convention, +;refer to docs or something + ; ; Routine to convert a 32-bit integer to a string. -; Registers are preserved. ; ; EAX: Source integer ; EBX: Target address @@ -26,9 +30,13 @@ ; ECX: Target address (active) ; EDX: Target address (temporary) ; +; return: +; put original target at EAX +; (we trust this blindly) + macro kuitoa src*, dest*, base* { - push dest push base + push dest push src call __uitoa add esp, 3*4 @@ -39,14 +47,11 @@ __uitoa: 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 ebx, [ebp+12] + mov ecx, [ebp+16] mov edx, ecx mov ecx, ebx @@ -83,11 +88,9 @@ __uitoa: dec ecx jmp .reverse .end: - pop edx - pop ecx pop ebx - pop eax + mov eax, [ebp+12] ; Return target address pop ebp ret diff --git a/src/start32.asm b/src/start32.asm index b72db5e..a196470 100644 --- a/src/start32.asm +++ b/src/start32.asm @@ -52,45 +52,46 @@ start: add esp, 2*4 sub esp, 36 ;Reserve stack for return - kuitoa [mbootinfo.fb_addr], esp, 16 - serw stuff.fbaddrmsgpfx, esp + mov ebx, esp ;Store str buff addr - kuitoa [mbootinfo.fb_width], esp, 10 - serw stuff.fbdimensionsmsgpfx, esp, stuff.x + kuitoa [mbootinfo.fb_addr], ebx, 16 + serw stuff.fbaddrmsgpfx, ebx - kuitoa [mbootinfo.fb_height], esp, 10 - serw esp, stuff.x + kuitoa [mbootinfo.fb_width], ebx, 10 + serw stuff.fbdimensionsmsgpfx, ebx, stuff.x + + kuitoa [mbootinfo.fb_height], ebx, 10 + serw ebx, stuff.x movzx eax, byte [mbootinfo.fb_bpp] - kuitoa eax, esp, 10 - serw esp + kuitoa eax, ebx, 10 + serw ebx movzx eax, byte [mbootinfo.fb_rpos] - kuitoa eax, esp, 10 - serw stuff.rpostxt, esp + kuitoa eax, ebx, 10 + serw stuff.rpostxt, ebx movzx eax, byte [mbootinfo.fb_gpos] - kuitoa eax, esp, 10 - serw stuff.gpostxt, esp + kuitoa eax, ebx, 10 + serw stuff.gpostxt, ebx movzx eax, byte [mbootinfo.fb_bpos] - kuitoa eax, esp, 10 - serw stuff.bpostxt, esp - + kuitoa eax, ebx, 10 + serw stuff.bpostxt, ebx movzx eax, byte [mbootinfo.fb_rmasksize] - kuitoa eax, esp, 10 - serw stuff.rmasksizetxt, esp + kuitoa eax, ebx, 10 + serw stuff.rmasksizetxt, ebx movzx eax, byte [mbootinfo.fb_gmasksize] - kuitoa eax, esp, 10 - serw stuff.gmasksizetxt, esp + kuitoa eax, ebx, 10 + serw stuff.gmasksizetxt, ebx movzx eax, byte [mbootinfo.fb_bmasksize] - kuitoa eax, esp, 10 - serw stuff.bmasksizetxt, esp + kuitoa eax, ebx, 10 + serw stuff.bmasksizetxt, ebx add esp, 36 ;Clean reserved uitoa return string from stack From 091f7cb4b842c3296f3c1c590adf1067588ef30a Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Sat, 17 Aug 2024 20:25:42 +0300 Subject: [PATCH 12/15] Bochs: serial to file --- .gitignore | 1 + Makefile | 1 + bochsrc.txt | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e9c4c3e..97fbd68 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ mnt/ build/ bx_enh_dbg.ini +serial.out diff --git a/Makefile b/Makefile index 0826a2a..0ecd477 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,7 @@ image: start32.bin mount grub-cfg roska.img mnt/roska/ qemu-run: image roska.img qemu-system-i386 roska.img -serial stdio bochs-run: image roska.img + touch serial.out bochs -qf bochsrc.txt mount: roska.img mnt/ @if ! mountpoint -q "mnt/"; then \ diff --git a/bochsrc.txt b/bochsrc.txt index f13fbe5..32dc163 100644 --- a/bochsrc.txt +++ b/bochsrc.txt @@ -10,4 +10,5 @@ ata0-master: type=disk, mode=flat, path=roska.img, cylinders=32, heads=16, spt=6 boot: disk # Use `bximage` to get disk geometry -# TODO: Figure out how to get sensible TTY serial +# Serial is piped to serial.out for your `tail`ing sweetness +com1: enabled=1, mode=file, dev=serial.out From 57dd60bcef105ad3354db4f366cf552cab48f6c2 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Sat, 24 Aug 2024 15:56:51 +0300 Subject: [PATCH 13/15] Started making an ASCII font --- src/font.asm | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/font.asm diff --git a/src/font.asm b/src/font.asm new file mode 100644 index 0000000..e8136a4 --- /dev/null +++ b/src/font.asm @@ -0,0 +1,89 @@ +;;; Resolution: 8x16 +kfontbasicascii: + ;; 0 NULL + db 11001100b + db 11001100b + db 00110011b + db 00110011b + db 11001100b + db 11001100b + db 00110011b + db 00110011b + db 11001100b + db 11001100b + db 00110011b + db 00110011b + db 11001100b + db 11001100b + db 00110011b + db 00110011b + ;; 1-31 control characters + rb 30*16 + ;; 32 Space + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + ;; 33 ! + db 00000000b + db 00000000b + db 00000000b + db 00011000b + db 00011000b + db 00011000b + db 00011000b + db 00011000b + db 00011000b + db 00011000b + db 00011000b + db 00000000b + db 00000000b + db 00011000b + db 00011000b + db 00000000b + ;; 34 " + db 00000000b + db 01100110b + db 01100110b + db 01100110b + db 01100110b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b + ;; 35 # + db 00000000b + db 00000000b + db 00000000b + db 01100110b + db 01100110b + db 11111111b + db 11111111b + db 01100110b + db 01100110b + db 11111111b + db 11111111b + db 01100110b + db 01100110b + db 00000000b + db 00000000b + db 00000000b From f344fc52539e3a5ba4ecfb95d1838b586035f77f Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Tue, 14 Jan 2025 20:27:40 +0200 Subject: [PATCH 14/15] Fonting awayy wheeeeee --- Makefile | 4 +++- src/font.asm | 51 ++++++++++--------------------------------------- src/start32.asm | 4 ++++ 3 files changed, 17 insertions(+), 42 deletions(-) diff --git a/Makefile b/Makefile index 0ecd477..695aa47 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,10 @@ all: start32.bin clean: -@rm *.bin 2> /dev/null || true -start32.bin: src/* +start32.bin: src/* font.bin fasm src/start32.asm start32.bin +font.bin: src/font.asm + fasm src/font.asm font.bin image: start32.bin mount grub-cfg roska.img mnt/roska/ cp start32.bin mnt/roska/ sync diff --git a/src/font.asm b/src/font.asm index e8136a4..3df2563 100644 --- a/src/font.asm +++ b/src/font.asm @@ -1,24 +1,16 @@ -;;; Resolution: 8x16 -kfontbasicascii: + format binary +;;; Resolution: 8x8 ;; 0 NULL db 11001100b - db 11001100b - db 00110011b db 00110011b db 11001100b - db 11001100b - db 00110011b db 00110011b db 11001100b - db 11001100b - db 00110011b db 00110011b db 11001100b - db 11001100b - db 00110011b db 00110011b ;; 1-31 control characters - rb 30*16 + rb 30*8 ;; 32 Space db 00000000b db 00000000b @@ -28,43 +20,19 @@ kfontbasicascii: db 00000000b db 00000000b db 00000000b - db 00000000b - db 00000000b - db 00000000b - db 00000000b - db 00000000b - db 00000000b - db 00000000b - db 00000000b ;; 33 ! db 00000000b - db 00000000b - db 00000000b - db 00011000b - db 00011000b - db 00011000b - db 00011000b db 00011000b db 00011000b db 00011000b db 00011000b db 00000000b - db 00000000b db 00011000b db 00011000b - db 00000000b ;; 34 " db 00000000b db 01100110b db 01100110b - db 01100110b - db 01100110b - db 00000000b - db 00000000b - db 00000000b - db 00000000b - db 00000000b - db 00000000b db 00000000b db 00000000b db 00000000b @@ -73,17 +41,18 @@ kfontbasicascii: ;; 35 # db 00000000b db 00000000b - db 00000000b - db 01100110b db 01100110b db 11111111b - db 11111111b - db 01100110b db 01100110b db 11111111b - db 11111111b - db 01100110b db 01100110b db 00000000b + ;; 36 $ db 00000000b + db 00001000b + db 01111110b + db 01010000b + db 01111110b + db 00010010b + db 01111110b db 00000000b diff --git a/src/start32.asm b/src/start32.asm index a196470..e36b4f7 100644 --- a/src/start32.asm +++ b/src/start32.asm @@ -36,6 +36,10 @@ include "src/itoa.asm" include "src/framebuffer.asm" include "src/roskalogoraw.asm" +align 4096 +font FILE "font.bin" +align 4096 + start: ; Setup stack mov ebp, stack_top From 85da5bf55277fa1db088c1fe23335cf69064b553 Mon Sep 17 00:00:00 2001 From: Jarkko Toivanen <jt@jakest.us> Date: Fri, 17 Jan 2025 01:39:11 +0200 Subject: [PATCH 15/15] 8x8 >> 8x12 to make font more spacious --- src/font.asm | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/font.asm b/src/font.asm index 3df2563..42d3fd4 100644 --- a/src/font.asm +++ b/src/font.asm @@ -1,5 +1,5 @@ format binary -;;; Resolution: 8x8 +;;; Resolution: 8x12 ;; 0 NULL db 11001100b db 00110011b @@ -9,8 +9,12 @@ db 00110011b db 11001100b db 00110011b + db 11001100b + db 00110011b + db 11001100b + db 00110011b ;; 1-31 control characters - rb 30*8 + rb 30*12 ;; 32 Space db 00000000b db 00000000b @@ -20,19 +24,31 @@ db 00000000b db 00000000b db 00000000b + db 00000000b + db 00000000b + db 00000000b + db 00000000b ;; 33 ! db 00000000b db 00011000b db 00011000b db 00011000b db 00011000b + db 00011000b + db 00011000b + db 00011000b db 00000000b db 00011000b db 00011000b + db 00000000b ;; 34 " db 00000000b db 01100110b db 01100110b + db 01100110b + db 00000000b + db 00000000b + db 00000000b db 00000000b db 00000000b db 00000000b @@ -40,19 +56,27 @@ db 00000000b ;; 35 # db 00000000b - db 00000000b - db 01100110b - db 11111111b - db 01100110b - db 11111111b - db 01100110b + db 01101100b + db 01101100b + db 11111110b + db 01101100b + db 01101100b + db 01101100b + db 01101100b + db 11111110b + db 01101100b + db 01101100b db 00000000b ;; 36 $ db 00000000b - db 00001000b + db 00011000b db 01111110b - db 01010000b + db 01011000b db 01111110b - db 00010010b + db 01011000b + db 01111110b + db 00011010b + db 00011010b + db 00011010b db 01111110b db 00000000b