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] cmp al, 32 je .bppokay cmp al, 24 je .bppokay jmp mbootunsupportedfbbpp .bppokay: mov [mbootinfo.fb_bpp], al inc esi mov al, [esi] cmp al, 1 jne mbootunsupportedfbtype mov [mbootinfo.fb_type], al inc esi ;; 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