1
1
Fork 0

We put R, G and B pixel on top left to see if framebuffer works. Why wouldn't it!

This commit is contained in:
Lauren Toivanen 2025-10-28 22:00:29 +02:00
parent 791c1f6c31
commit 6139ea7875
3 changed files with 224 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
*.bin
mnt/

34
README.md Normal file
View file

@ -0,0 +1,34 @@
# rOSka
- Probably useless hobby OS project
- Targets 32bit legacy systems with graphical framebuffer
- Boots with multiboot compatible bootloader, such as GRUB
- Assembles with FASM
- We'll probably use ext2 filesystem
## GRUB disk creation
1. Format disk. Create ext2 partition
2. Create directory mnt and mount your partition to it
```
mkdir mnt
sudo mount /dev/sdX mnt
```
3. Intall grub using `sudo grub-install --target=i386-pc --removable --boot-dir=mnt/boot /dev/sdX`
4. Create config
``` mnt/boot/grub/grub.cfg
menuentry "rOSka" {
multiboot /boot/roska.bin
boot
}
```
5. Copy assembled kernel to `mnt/boot/roska.bin`
Oh yeah heres a montrosity I currently use.
`fasm roska.fasm && sudo mount /dev/sdd1 mnt/ && sudo cp roska.bin mnt/boot/roska.bin && sudo umount /dev/sdd1 && sudo sync && sudo qemu-system-i386 /dev/sdd`

188
roska.fasm Normal file
View file

@ -0,0 +1,188 @@
format binary
use32
org 0x100000
MB_HEADER_MAGIC equ 0x1BADB002
MB_PAGE_ALIGN equ (1 shl 0)
MB_MEMORY_INFO equ (1 shl 1)
MB_VIDEO_REQUEST equ (1 shl 2)
MB_AOUT_KLUDGE equ (1 shl 16)
MB_HEADER_FLAGS equ MB_PAGE_ALIGN or MB_MEMORY_INFO or MB_VIDEO_REQUEST
MB_HEADER_FLAGS equ MB_PAGE_ALIGN or MB_MEMORY_INFO or MB_VIDEO_REQUEST or MB_AOUT_KLUDGE
MB_CHECKSUM equ -(MB_HEADER_MAGIC + MB_HEADER_FLAGS)
;; safe modes according to https://wiki.osdev.org/VESA_Video_Modes
VWIDTH equ 640 ; 640/720
VHEIGHT equ 480 ; 480
VDEPTH equ 32 ; 24/32
multiboot:
dd MB_HEADER_MAGIC
dd MB_HEADER_FLAGS
dd MB_CHECKSUM
dd multiboot ; header address
dd 0x100000 ; load address
dd bss_start ; load end address
dd bss_end ; bss end address
dd start ; entry address
dd 0 ; video mode_type (0:fb, 1:txt) (set flags[2]!)
dd VWIDTH ; video width
dd VHEIGHT ; video height
dd VDEPTH ; video depth
start:
; Setup stack
mov ebp, stack_top
mov esp, stack_top
;push ebx ; mboot info struct addr
;push eax ; 0x2BADB002
;mov [mbootmagic], eax
;mov [mbootaddr], ebx
; store video info
mov ecx, [ebx+88]
mov [fb.addr], ecx
mov ecx, [ebx+98]
mov [fb.pitch], ecx
mov ecx, [ebx+100]
mov [fb.width], ecx
mov ecx, [ebx+104]
mov [fb.height], ecx
mov cl, [ebx+108]
mov [fb.depth], cl
; calculate bytespp
movzx eax, cl
mov cl, 8
div byte cl
mov [fb.bytespp], al
; color component positions
mov cl, [ebx+110+2]
mov [fb.rpos], cl
;mov cl, [ebx+111]
;mov [fb.rmasksize], cl
mov cl, [ebx+112+2]
mov [fb.gpos], cl
;mov cl, [ebx+113]
;mov [fb.gmasksize], cl
mov cl, [ebx+114+2]
mov [fb.bpos], cl
;mov cl, [ebx+115]
;mov [fb.bmasksize], cl
testpixels:
; construct pixel R
mov al, 0xff ;r
mov ah, 0x00 ;g
mov ch, 0x00 ;b
xor edx, edx ;final pixel
;ebx is temp pixel
movzx ebx, al
mov cl, [fb.rpos]
shl ebx, cl
;and ebx, [fb.rmasksize]
or edx, ebx
movzx ebx, ah
mov cl, [fb.gpos]
shl ebx, cl
;and ebx, [fb.gmasksize]
or edx, ebx
movzx ebx, ch
mov cl, [fb.bpos]
shl ebx, cl
;and ebx, [fb.bmasksize]
or edx, ebx
mov ecx, [fb.addr]
mov [ecx], edx
; construct pixel G
mov al, 0x00 ;r
mov ah, 0xff ;g
mov ch, 0x00 ;b
xor edx, edx ;final pixel
;ebx is temp pixel
movzx ebx, al
mov cl, [fb.rpos]
shl ebx, cl
;and ebx, [fb.rmasksize]
or edx, ebx
movzx ebx, ah
mov cl, [fb.gpos]
shl ebx, cl
;and ebx, [fb.gmasksize]
or edx, ebx
movzx ebx, ch
mov cl, [fb.bpos]
shl ebx, cl
;and ebx, [fb.bmasksize]
or edx, ebx
mov ecx, [fb.addr]
movzx ebx, [fb.bytespp]
add ecx, ebx
mov [ecx], edx
; construct pixel B
mov al, 0x00 ;r
mov ah, 0x00 ;g
mov ch, 0xff ;b
xor edx, edx ;final pixel
;ebx is temp pixel
movzx ebx, al
mov cl, [fb.rpos]
shl ebx, cl
;and ebx, [fb.rmasksize]
or edx, ebx
movzx ebx, ah
mov cl, [fb.gpos]
shl ebx, cl
;and ebx, [fb.gmasksize]
or edx, ebx
movzx ebx, ch
mov cl, [fb.bpos]
shl ebx, cl
;and ebx, [fb.bmasksize]
or edx, ebx
mov ecx, [fb.addr]
movzx ebx, [fb.bytespp]
add ecx, ebx
add ecx, ebx
mov [ecx], edx
;mov dword [edx], 0xff00ff00
testpixels_end:
hang:
;cli
.loop:
;hlt
jmp .loop
error:
mov dword [0xFD000000], 0x00FF0000
jmp hang
mbootaddr: dd 0
mbootmagic: dd 0
fb:
.addr dd 0
.pitch dd 0
.width dd 0
.height dd 0
.depth db 0
.bytespp db 0
.rpos db 0
;.rmasksize db 0
.gpos db 0
;.gmasksize db 0
.bpos db 0
;.bmasksize db 0
align 4096
bss_start:
align 4096
stack_bottom:
rb 16384
stack_top:
bss_end: