kernel/src/mbootinfo.asm

122 lines
1.9 KiB
NASM

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]
mov [mbootinfo.fb_bpp], al
inc esi
mov al, [esi]
cmp al, 1
jne mbootunsupportedfbtype
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
rep movsb
.bytesppcalc:
xor eax, eax
mov al, [mbootinfo.fb_bpp]
mov ebx, 8
div bl
mov [mbootinfo.fb_bytespp], al
.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
.fb_bytespp db 0