summaryrefslogtreecommitdiff
path: root/com32/samples
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2006-09-12 20:50:54 -0700
committerH. Peter Anvin <hpa@zytor.com>2006-09-12 20:50:54 -0700
commit39f4d1b9d435ed1dd033688509f92aeca235a95f (patch)
tree44d0b18c45aa72ccef0276f611e87dd006c1bcb0 /com32/samples
parent945c3ef306e89e08798e99fe800406bf89d16ab8 (diff)
downloadsyslinux-39f4d1b9d435ed1dd033688509f92aeca235a95f.tar.gz
vesainfo: program to dump all VESA modes
Diffstat (limited to 'com32/samples')
-rw-r--r--com32/samples/Makefile2
-rw-r--r--com32/samples/vesainfo.c83
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;
+}