VESA Video Modes: Difference between revisions
Jump to navigation
Jump to search
[unchecked revision] | [unchecked revision] |
Content added Content deleted
(use standered ints) |
(Added 4f00h, 4f01h function usage example in asm) |
||
Line 22: | Line 22: | ||
v86_bios(0x10, {ax:0x4f00, es:SEG(vib), di:OFF(vib)}, &out); |
v86_bios(0x10, {ax:0x4f00, es:SEG(vib), di:OFF(vib)}, &out); |
||
if (out.ax!=0x004f) die("Something wrong with VBE get info"); |
if (out.ax!=0x004f) die("Something wrong with VBE get info"); |
||
</source> |
|||
In assembly(nasm): |
|||
<source lang="asm"> |
|||
struc VesaInfoBlock ; VesaInfoBlock_size = 512 bytes |
|||
.Signature resb 4 ; must be 'VESA' |
|||
.Version resw 1 |
|||
.OEMNamePtr resd 1 |
|||
.Capabilities resd 1 |
|||
.VideoModesOffset resw 1 |
|||
.VideoModesSegment resw 1 |
|||
.CountOf64KBlocks resw 1 |
|||
.OEMSoftwareRevision resw 1 |
|||
.OEMVendorNamePtr resd 1 |
|||
.OEMProductNamePtr resd 1 |
|||
.OEMProductRevisionPtr resd 1 |
|||
.Reserved resb 222 |
|||
.OEMData resb 256 |
|||
endstruc |
|||
Main: |
|||
push ds |
|||
pop es |
|||
mov di, VesaInfoBlockBuffer |
|||
call get_vesa_info |
|||
jmp $ |
|||
; in: |
|||
; es:di - 512-byte buffer |
|||
; out: |
|||
; cf - set on error |
|||
get_vesa_info: |
|||
clc |
|||
mov ax, 0x4f00 |
|||
int 0x10 |
|||
cmp ax, 0x004f |
|||
jne .failed |
|||
ret |
|||
.failed: |
|||
stc |
|||
ret |
|||
ALIGN(4) |
|||
VesaInfoBlockBuffer: istruc VesaInfoBlock |
|||
at VesaInfoBlock.Signature, db "VESA" |
|||
times 508 db 0 |
|||
iend |
|||
</source> |
</source> |
||
Line 65: | Line 115: | ||
uint8_t reserved1[206]; |
uint8_t reserved1[206]; |
||
} __attribute__ ((packed)); |
} __attribute__ ((packed)); |
||
</source> |
|||
In assembly(nasm): |
|||
<source lang="asm"> |
|||
struc VesaModeInfoBlock ; VesaModeInfoBlock_size = 256 bytes |
|||
.ModeAttributes resw 1 |
|||
.FirstWindowAttributes resb 1 |
|||
.SecondWindowAttributes resb 1 |
|||
.WindowGranularity resw 1 ; in KB |
|||
.WindowSize resw 1 ; in KB |
|||
.FirstWindowSegment resw 1 ; 0 if not supported |
|||
.SecondWindowSegment resw 1 ; 0 if not supported |
|||
.WindowFunctionPtr resd 1 |
|||
.BytesPerScanLine resw 1 |
|||
; Added in Revision 1.2 |
|||
.Width resw 1 ; in pixels(graphics)/columns(text) |
|||
.Height resw 1 ; in pixels(graphics)/columns(text) |
|||
.CharWidth resb 1 ; in pixels |
|||
.CharHeight resb 1 ; in pixels |
|||
.PlanesCount resb 1 |
|||
.BitsPerPixel resb 1 |
|||
.BanksCount resb 1 |
|||
.MemoryModel resb 1 ; http://www.ctyme.com/intr/rb-0274.htm#Table82 |
|||
.BankSize resb 1 ; in KB |
|||
.ImagePagesCount resb 1 ; count - 1 |
|||
.Reserved1 resb 1 ; equals 0 in Revision 1.0-2.0, 1 in 3.0 |
|||
.RedMaskSize resb 1 |
|||
.RedFieldPosition resb 1 |
|||
.GreenMaskSize resb 1 |
|||
.GreenFieldPosition resb 1 |
|||
.BlueMaskSize resb 1 |
|||
.BlueFieldPosition resb 1 |
|||
.ReservedMaskSize resb 1 |
|||
.ReservedMaskPosition resb 1 |
|||
.DirectColorModeInfo resb 1 |
|||
; Added in Revision 2.0 |
|||
.LFBAddress resd 1 |
|||
.OffscreenMemoryOffset resd 1 |
|||
.OffscreenMemorySize resw 1 ; in KB |
|||
.Reserved2 resb 206 ; available in Revision 3.0, but useless for now |
|||
endstruc |
|||
Main: |
|||
; after getting VesaInfoBlock: |
|||
push word [VesaInfoBlockBuffer + VesaInfoBlock.VideoModesSegment] |
|||
pop es |
|||
mov di, VesaModeInfoBlockBuffer |
|||
mov bx, [VesaInfoBlockBuffer + VesaInfoBlock.VideoModesOffset] ; get video modes list address |
|||
mov cx, [bx] ; get first video mode number |
|||
cmp cx, 0xffff ; vesa modes list empty |
|||
je .NoModes |
|||
call get_vesa_mode_info |
|||
.NoModes: |
|||
jmp $ |
|||
; in: |
|||
; cx - VESA mode number |
|||
; es:di - 256-byte buffer |
|||
; out: |
|||
; cf - set on error |
|||
get_vesa_mode_info: |
|||
clc |
|||
mov ax, 0x4f01 |
|||
int 0x10 |
|||
cmp ax, 0x004f |
|||
jne .failed |
|||
ret |
|||
.failed: |
|||
stc |
|||
ret |
|||
ALIGN(4) |
|||
VesaModeInfoBlockBuffer: istruc VesaModeInfoBlock |
|||
times VesaModeInfoBlock_size db 0 |
|||
iend |
|||
</source> |
</source> |
||