diff options
author | H. Peter Anvin <hpa@zytor.com> | 2006-09-12 20:50:54 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2006-09-12 20:50:54 -0700 |
commit | 39f4d1b9d435ed1dd033688509f92aeca235a95f (patch) | |
tree | 44d0b18c45aa72ccef0276f611e87dd006c1bcb0 /com32/samples | |
parent | 945c3ef306e89e08798e99fe800406bf89d16ab8 (diff) | |
download | syslinux-39f4d1b9d435ed1dd033688509f92aeca235a95f.tar.gz |
vesainfo: program to dump all VESA modes
Diffstat (limited to 'com32/samples')
-rw-r--r-- | com32/samples/Makefile | 2 | ||||
-rw-r--r-- | com32/samples/vesainfo.c | 83 |
2 files changed, 84 insertions, 1 deletions
diff --git a/com32/samples/Makefile b/com32/samples/Makefile index 214c0c71..213ae1a3 100644 --- a/com32/samples/Makefile +++ b/com32/samples/Makefile @@ -38,7 +38,7 @@ LNXLIBS = ../libutil/libutil_lnx.a .SUFFIXES: .lss .c .o .elf .c32 .lnx -all: hello.c32 cat.c32 resolv.c32 \ +all: hello.c32 cat.c32 resolv.c32 vesainfo.c32 \ fancyhello.c32 fancyhello.lnx \ keytest.c32 keytest.lnx \ diff --git a/com32/samples/vesainfo.c b/com32/samples/vesainfo.c new file mode 100644 index 00000000..a1f00299 --- /dev/null +++ b/com32/samples/vesainfo.c @@ -0,0 +1,83 @@ +/* + * vesainfo.c + * + * Dump information about what VESA graphics modes are supported. + */ + +#include <string.h> +#include <stdio.h> +#include <console.h> +#include <com32.h> +#include <inttypes.h> +#include "../lib/sys/vesa/vesa.h" + +/* Wait for a keypress */ +static void wait_key(void) +{ + char ch; + while (fread(&ch, 1, 1, stdin) == 0) + ; +} + +static void print_modes(void) +{ + static com32sys_t rm; + struct vesa_general_info *gi; + struct vesa_mode_info *mi; + uint16_t mode, *mode_ptr; + int lines; + + /* Allocate space in the bounce buffer for these structures */ + gi = &((struct vesa_info *)__com32.cs_bounce)->gi; + mi = &((struct vesa_info *)__com32.cs_bounce)->mi; + + gi->signature = VBE2_MAGIC; /* Get VBE2 extended data */ + rm.eax.w[0] = 0x4F00; /* Get SVGA general information */ + rm.edi.w[0] = OFFS(gi); + rm.es = SEG(gi); + __intcall(0x10, &rm, &rm); + + if ( rm.eax.w[0] != 0x004F ) { + printf("No VESA BIOS detected\n"); + return; + } else if ( gi->signature != VESA_MAGIC ) { + printf("VESA information structure has bad magic, trying anyway...\n"); + } + + printf("VBE version %d.%d\n" + "Mode attrib h_res v_res bpp layout rpos gpos bpos\n", + (gi->version >> 8) & 0xff, gi->version & 0xff); + + lines = 1; + + mode_ptr = GET_PTR(gi->video_mode_ptr); + + while ((mode = *mode_ptr++) != 0xFFFF) { + if (++lines >= 23) { + wait_key(); + lines = 0; + } + + rm.eax.w[0] = 0x4F01; /* Get SVGA mode information */ + rm.ecx.w[0] = mode; + rm.edi.w[0] = OFFS(mi); + rm.es = SEG(mi); + __intcall(0x10, &rm, &rm); + + /* Must be a supported mode */ + if ( rm.eax.w[0] != 0x004f ) + continue; + + printf("0x%04x 0x%04x %5u %5u %3u %6u %4u %4u %4u\n", + mode, mi->mode_attr, mi->h_res, mi->v_res, mi->bpp, + mi->memory_layout, mi->rpos, mi->gpos, mi->bpos); + } +} + +int main(void) +{ + openconsole(&dev_rawcon_r, &dev_stdcon_w); + + print_modes(); + return 0; +} |