diff options
Diffstat (limited to 'ddcprobe/svgamodes.c')
-rw-r--r-- | ddcprobe/svgamodes.c | 79 |
1 files changed, 64 insertions, 15 deletions
diff --git a/ddcprobe/svgamodes.c b/ddcprobe/svgamodes.c index 5902db60d..4fa3f0020 100644 --- a/ddcprobe/svgamodes.c +++ b/ddcprobe/svgamodes.c @@ -18,22 +18,32 @@ #include "bioscall.h" #ident "$Id$" +int compare_16(const void *i1, const void *i2) +{ + const u_int16_t *I1, *I2; + I1 = (const u_int16_t*) i1; + I2 = (const u_int16_t*) i2; + if(*I1 < *I2) return -1; + if(*I1 > *I2) return 1; + return 0; +} + int main(int argc, char **argv) { struct vbe_info *vbe_info = NULL; struct vbe_mode_info *mode_info = NULL; u_int16_t *mode_list = NULL; + int mode_count = 0; float vesa_version; - /* Interpret results. */ + /* Get basic information. */ vbe_info = vbe_get_vbe_info(); - if(vbe_info == NULL) { printf("VESA BIOS Extensions not detected.\n"); exit(0); } - /* Signature. */ + /* Print the signature, should be "VESA <digit>.<digit>". */ printf("%c%c%c%c %d.%d detected.\n", vbe_info->signature[0], vbe_info->signature[1], vbe_info->signature[2], vbe_info->signature[3], @@ -43,27 +53,42 @@ int main(int argc, char **argv) /* List supported standard modes. */ mode_list = vbe_info->mode_list.list; if(*mode_list != 0xffff) { - printf("Supported standard modes:\n"); + printf("Supported modes:\n"); + } + /* Count the number of modes. */ + for(;*mode_list != 0xffff; mode_list++) { + mode_count++; + } + /* Sort the mode list, because my ATI doesn't. Grrr... */ + mode_list = vbe_info->mode_list.list; + if(*mode_list != 0xffff) { + qsort(mode_list, mode_count, sizeof(u_int16_t), compare_16); } + /* Dump info about the video mode. */ for(;*mode_list != 0xffff; mode_list++) { int j; + /* Mode number. */ printf("0x%03x\t", *mode_list); for(j = 0; known_vesa_modes[j].x != 0; j++) { + /* If it's a standard mode, print info about it. */ if(known_vesa_modes[j].number == *mode_list) { - printf("%dx%d, %d colors", + printf("Specs list this as %dx%d, %d colors.", known_vesa_modes[j].x, known_vesa_modes[j].y, known_vesa_modes[j].colors); }} printf("\n"); + /* Get mode information from the BIOS. Should never fail. */ mode_info = vbe_get_mode_info(*mode_list); if(mode_info == NULL) { - printf("Get mode information not supported.\n"); + printf("Get mode information not supported by BIOS.\n"); exit(0); } + /* Report what the BIOS says about the mode, should agree + with VESA on standard modes. */ if(mode_info->w && mode_info->h && mode_info->bpp) { - printf("\tBIOS reports %dx%d, %d bpp", + printf("\tBIOS reports this as %dx%d, %d bpp", mode_info->w, mode_info->h, mode_info->bpp); } @@ -72,20 +97,44 @@ int main(int argc, char **argv) mode_info->bytes_per_scanline); } printf("\n"); - printf("\t%s, ", mode_info->mode_attributes & 0x01 ? + /* Check the 'supported' bit. Should be set, because this is + in the main supported modes list. */ + printf("\t%s, ", mode_info->mode_attributes.supported ? "Supported" : "Not supported"); - printf("%s ", mode_info->mode_attributes & 0x08 ? + /* Color? Graphics? */ + printf("%s ", mode_info->mode_attributes.color ? "Color" : "Monochrome"); - printf("%s.\n", mode_info->mode_attributes & 0x10 ? + printf("%s.\n", mode_info->mode_attributes.graphics ? "Graphics" : "Text"); + /* Check for LFB stuff. Ralf's list says that you need to + query with bit 14 set to check if an LFB version of the mode + is available, but the ATI always returns true. */ if(vesa_version >= 2.0) { - printf("\tLFB mode %s.\n", - mode_info->mode_attributes & 0x80 ? - "supported" : "not supported"); + /* Regular info about the current mode. */ + struct vbe_mode_info *info = NULL; printf("\t%sVGA compatible.\n", - mode_info->mode_attributes & 0x20 ? - "" : "Not "); + mode_info->mode_attributes.not_vga_compatible ? + "Not " : ""); + printf("\tThis is %san LFB mode.\n", + mode_info->mode_attributes.lfb ? + "" : "not "); + /* Info about the LFB variant mode (bit 14 set). */ + info = vbe_get_mode_info(*mode_list | + VBE_LINEAR_FRAMEBUFFER); + if(info) { + if(info->mode_attributes.lfb) { + printf("\tLFB variant available.\n"); + } + free(info); + } + if((mode_info->mode_attributes.lfb) || + (info && (info->mode_attributes.lfb))) { + printf("\tLFB at address 0x%8x.\n", + mode_info->linear_buffer_address); + } } + /* Memory model: EGA = icky bit planes, packed-pixel = palette, + direct color = LFB compatible but needs bank switches. */ printf("\tMemory model: "); switch(mode_info->memory_model) { case memory_model_text: { |