Skip to content
Snippets Groups Projects
vesa.asm 3.57 KiB
Newer Older
Jeremy Soller's avatar
Jeremy Soller committed
%include "vesa.inc"
SECTION .text
USE16
vesa:
.getcardinfo:
    mov ax, 0x4F00
    mov di, VBECardInfo
    int 0x10
    cmp ax, 0x4F
Jeremy Soller's avatar
Jeremy Soller committed
    mov eax, 1
    ret
 .resetlist:
    ;if needed, reset mins/maxes/stuff
    xor cx, cx
    mov [.minx], cx
    mov [.miny], cx
    mov [config.xres], cx
    mov [config.yres], cx
Jeremy Soller's avatar
Jeremy Soller committed
.findmode:
    mov si, [VBECardInfo.videomodeptr]
Jeremy Soller's avatar
Jeremy Soller committed
    mov ax, [VBECardInfo.videomodeptr+2]
    mov fs, ax
    sub si, 2
.searchmodes:
    add si, 2
    mov cx, [fs:si]
    cmp cx, 0xFFFF
    jne .getmodeinfo
    cmp word [.goodmode], 0
    je .resetlist
    jmp .findmode
.getmodeinfo:
    push esi
    mov [.currentmode], cx
    mov ax, 0x4F01
    mov di, VBEModeInfo
    int 0x10
    pop esi
    cmp ax, 0x4F
    je .foundmode
    mov eax, 1
    ret
.foundmode:
    ;check minimum values, really not minimums from an OS perspective but ugly for users
    cmp byte [VBEModeInfo.bitsperpixel], 32
    jb .searchmodes
.testx:
    mov cx, [VBEModeInfo.xresolution]
    cmp word [config.xres], 0
Jeremy Soller's avatar
Jeremy Soller committed
    je .notrequiredx
    cmp cx, [config.xres]
Jeremy Soller's avatar
Jeremy Soller committed
    je .testy
    jmp .searchmodes
.notrequiredx:
    cmp cx, [.minx]
    jb .searchmodes
.testy:
    mov cx, [VBEModeInfo.yresolution]
    cmp word [config.yres], 0
Jeremy Soller's avatar
Jeremy Soller committed
    je .notrequiredy
    cmp cx, [config.yres]
Jeremy Soller's avatar
Jeremy Soller committed
    jne .searchmodes    ;as if there weren't enough warnings, USE WITH CAUTION
    cmp word [config.xres], 0
Jeremy Soller's avatar
Jeremy Soller committed
    jnz .setmode
    jmp .testgood
.notrequiredy:
    cmp cx, [.miny]
    jb .searchmodes
.testgood:
Jeremy Soller's avatar
Jeremy Soller committed
    mov al, 13
Jeremy Soller's avatar
Jeremy Soller committed
    call print_char
Jeremy Soller's avatar
Jeremy Soller committed
    mov cx, [.currentmode]
    mov [.goodmode], cx
    push esi
Jeremy Soller's avatar
Jeremy Soller committed
    ; call print_dec
Jeremy Soller's avatar
Jeremy Soller committed
    ; call print_char
Jeremy Soller's avatar
Jeremy Soller committed
    mov cx, [VBEModeInfo.xresolution]
Jeremy Soller's avatar
Jeremy Soller committed
    call print_dec
Jeremy Soller's avatar
Jeremy Soller committed
    mov al, 'x'
Jeremy Soller's avatar
Jeremy Soller committed
    call print_char
Jeremy Soller's avatar
Jeremy Soller committed
    mov cx, [VBEModeInfo.yresolution]
Jeremy Soller's avatar
Jeremy Soller committed
    call print_dec
Jeremy Soller's avatar
Jeremy Soller committed
    mov al, '@'
Jeremy Soller's avatar
Jeremy Soller committed
    call print_char
Jeremy Soller's avatar
Jeremy Soller committed
    xor ch, ch
    mov cl, [VBEModeInfo.bitsperpixel]
Jeremy Soller's avatar
Jeremy Soller committed
    call print_dec
Jeremy Soller's avatar
Jeremy Soller committed
    mov si, .modeok
Jeremy Soller's avatar
Jeremy Soller committed
    call print
Jeremy Soller's avatar
Jeremy Soller committed
    xor ax, ax
    int 0x16
    pop esi
    cmp al, 'y'
    je .setmode
    cmp al, 's'
    je .savemode
    jmp .searchmodes
.savemode:
    mov cx, [VBEModeInfo.xresolution]
    mov [config.xres], cx
    mov cx, [VBEModeInfo.yresolution]
    mov [config.yres], cx
    call save_config
Jeremy Soller's avatar
Jeremy Soller committed
.setmode:
    mov bx, [.currentmode]
    cmp bx, 0
    je .nomode
    or bx, 0x4000
    mov ax, 0x4F02
    int 0x10
.nomode:
    cmp ax, 0x4F
    je .returngood
    mov eax, 1
    ret
.returngood:
    xor eax, eax
    ret

.minx dw 640
.miny dw 480

Jeremy Soller's avatar
Jeremy Soller committed
.modeok db ": Is this OK? (s)ave/(y)es/(n)o    ",8,8,8,8,0
Jeremy Soller's avatar
Jeremy Soller committed

.goodmode dw 0
.currentmode dw 0
;useful functions

Jeremy Soller's avatar
Jeremy Soller committed
; print a number in decimal
; IN
;   cx: the number
; CLOBBER
;   al, cx, si
print_dec:
Jeremy Soller's avatar
Jeremy Soller committed
    mov si, .number
.clear:
    mov al, "0"
    mov [si], al
    inc si
    cmp si, .numberend
    jb .clear
    dec si
Jeremy Soller's avatar
Jeremy Soller committed
    call convert_dec
Jeremy Soller's avatar
Jeremy Soller committed
    mov si, .number
.lp:
    lodsb
    cmp si, .numberend
    jae .end
    cmp al, "0"
    jbe .lp
.end:
    dec si
Jeremy Soller's avatar
Jeremy Soller committed
    call print
Jeremy Soller's avatar
Jeremy Soller committed
    ret

.number times 7 db 0
.numberend db 0

Jeremy Soller's avatar
Jeremy Soller committed
convert_dec:
Jeremy Soller's avatar
Jeremy Soller committed
    dec si
    mov bx, si        ;place to convert into must be in si, number to convert must be in cx
.cnvrt:
    mov si, bx
    sub si, 4
.ten4:    inc si
    cmp cx, 10000
    jb .ten3
    sub cx, 10000
    inc byte [si]
    jmp .cnvrt
.ten3:    inc si
    cmp cx, 1000
    jb .ten2
    sub cx, 1000
    inc byte [si]
    jmp .cnvrt
.ten2:    inc si
    cmp cx, 100
    jb .ten1
    sub cx, 100
    inc byte [si]
    jmp .cnvrt
.ten1:    inc si
    cmp cx, 10
    jb .ten0
    sub cx, 10
    inc byte [si]
    jmp .cnvrt
.ten0:    inc si
    cmp cx, 1
    jb .return
    sub cx, 1
    inc byte [si]
    jmp .cnvrt
.return:
    ret