188 lines
3.4 KiB
Text
188 lines
3.4 KiB
Text
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:
|