From 66289aa8ecfa07b20bad424eb9860b196641ef52 Mon Sep 17 00:00:00 2001 From: Brett Weiland Date: Fri, 19 Mar 2021 10:54:25 -0500 Subject: first commit --- src/bootloader/video.asm | 179 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 src/bootloader/video.asm (limited to 'src/bootloader/video.asm') diff --git a/src/bootloader/video.asm b/src/bootloader/video.asm new file mode 100644 index 0000000..5b292c2 --- /dev/null +++ b/src/bootloader/video.asm @@ -0,0 +1,179 @@ +[extern _vbe_infoblock] +vbe_init: +.init_video: +;getting edid + +mov ax, 0 +mov es, ax +mov di, 0x500 + +mov ax, 0x4f15 +mov bx, 0x1 +mov cx, 0 +mov dx, 0 + +int 0x10 + +cmp al, 0x4f +jne .vbe_unsupported +cmp ah, 0x00 +jne .edid_error + + +mov ah, [0x500+58] +shr ah, 4 +mov al, [0x500+56] +push ax + +mov ah, [0x500+61] +shr ah, 4 +mov al, [0x500+59] +push ax + +mov al, BYTE [0x500+20] +test al, 0x80 +jz .res_unsupported ; uses an analog signal + +shr al, 4 +and al, 7 + +.cdp_6: +cmp al, 0b001 +jne .cdp_8 +mov ax, 18 +jmp .colordepth_found + +.cdp_8: +cmp al, 0b010 +jne .cdp_10 +mov ax, 24 +jmp .colordepth_found + +.cdp_10: +cmp al, 0b011 +jne .cdp_12 +mov ax, 30 +jmp .colordepth_found + +.cdp_12: +cmp al, 0b100 +jne .cdp_14 +mov ax, 36 +jmp .colordepth_found + +.cdp_14: +cmp al, 0b101 +jne .cdp_16 +mov ax, 42 +jmp .colordepth_found + +.cdp_16: +cmp al, 0b110 +jne .cdp_undefined +mov ax, 48 +jmp .colordepth_found + +.cdp_undefined: +mov ax, 24 +; TODO print warning, this only happens when we can't find bitdepth + +.colordepth_found: +push ax + + + + +; _______________________________________________________________________________________________________ + +; When we get things sorted out, some time you should come back here and find a good resolution that isn't +; native as a fallback. +; Maybe redo this part in C? + +;getting available modes +mov ax, 0 +mov es, ax +mov ax, 0x500 +mov di, ax + +;get vbe capabilities +mov ax, 0x4f00 +int 0x10 +cmp ax, 0x4f +jne .vbe_generic_error +cmp DWORD [0x500], "VESA" +jne .vbe_generic_error + +; now we loop through the modes +mov ebx, [0x500+14] ; pointer to modes +mov di, 0x600 +mov ax, 0 +mov es, ax +.mode_loop: +mov ax, 0x4f01 +mov cx, [ebx] +cmp cx, 0xffff +je .res_unsupported + +int 0x10 + +mov ax, [esp] +cmp al, BYTE [0x600+25] ; might be wrong +jne .mode_loop_next + +; width (1920) +mov ax, [esp+4] +cmp ax, [0x600+18] +jne .mode_loop_next + +; height +mov ax, [esp+2] +cmp ax, [0x600+20] +jne .mode_loop_next + + + +jmp .mode_found + +.mode_loop_next: +add ebx, 2 +jmp .mode_loop + +.mode_found: +mov ax, 0x4f02 +mov bx, cx +int 0x10 +;getting rid of stack +pop ax +pop ax +pop ax +ret +; ________________________________________________________________________________________________________ + +.vbe_unsupported: +mov bx, .unsupported_msg +mov cx, 0 +call bios_print +jmp $ + +.vbe_generic_error: +mov bx, .lazyerror_msg +mov cx, 0 +call bios_print +jmp $ + +.edid_error: +mov bx, .ediderror_msg +mov cx, 0 +call bios_print +jmp $ + +.res_unsupported: +mov bx, .res_unsupported_msg +mov cx, 0 +call bios_print +jmp $ + +.unsupported_msg: db "Your BIOS doesn't support VESA. It's probably time to get a new computer!", 0 +.lazyerror_msg: db "A VESA error has occured.", 0 +.ediderror_msg: db "EDID error", 0 +.res_unsupported_msg: db "Native resolution not supported!", 0 -- cgit v1.2.3