/* * 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; struct vesa_info *vesa; vesa = lmalloc(sizeof(*vesa)); if (!vesa) { printf("vesainfo.c32: fail in lmalloc\n"); return; } gi = &vesa->gi; mi = &vesa->mi; memset(&rm, 0, sizeof rm); 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"); goto exit; } 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; } memset(&rm, 0, sizeof rm); 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); } exit: lfree(vesa); return; } int main(int argc __unused, char **argv __unused) { print_modes(); return 0; }