93 lines
1.9 KiB
C
93 lines
1.9 KiB
C
/*
|
|
* 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;
|
|
}
|