122 lines
1.9 KiB
NASM
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
|