vbeinfo

annotate src/main.c @ 2:193757920de9

removed commented qsort, we need stable sorting anyway
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 26 Jul 2017 21:08:55 +0300
parents d2d777a5da95
children d2c44edd8b77
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <stdlib.h>
nuclear@0 3 #include "vbe.h"
nuclear@0 4
nuclear@0 5 #define REALPTR(s, o) (void*)(((uint32_t)(s) << 4) + (uint32_t)(o))
nuclear@0 6 #define VBEPTR(x) REALPTR(((x) & 0xffff0000) >> 16, (x) & 0xffff)
nuclear@0 7 #define VBEPTR_SEG(x) (((x) & 0xffff0000) >> 16)
nuclear@0 8 #define VBEPTR_OFF(x) ((x) & 0xffff)
nuclear@0 9
nuclear@0 10 struct video_mode {
nuclear@0 11 int xres, yres, bpp;
nuclear@0 12 };
nuclear@0 13
nuclear@0 14 void sort_modes(struct video_mode *arr, int sz, int field);
nuclear@0 15
nuclear@0 16 int main(int argc, char **argv)
nuclear@0 17 {
nuclear@0 18 int i, nmodes;
nuclear@0 19 struct vbe_info *vbe;
nuclear@0 20 struct vbe_mode_info *mode;
nuclear@0 21 uint16_t *modes;
nuclear@0 22 struct video_mode *vmodes;
nuclear@1 23 char *vendor, *product, *prod_rev;
nuclear@0 24
nuclear@0 25 if(!(vbe = vbe_get_info())) {
nuclear@0 26 fprintf(stderr, "VBE not found\n");
nuclear@0 27 return 1;
nuclear@0 28 }
nuclear@1 29
nuclear@1 30 if(!(vendor = VBEPTR(vbe->oem_vendor_name_ptr)) || !*vendor) {
nuclear@1 31 vendor = "unknown";
nuclear@1 32 }
nuclear@1 33 if(!(product = VBEPTR(vbe->oem_product_name_ptr)) || !*product) {
nuclear@1 34 product = "unknown";
nuclear@1 35 }
nuclear@1 36 if(!(prod_rev = VBEPTR(vbe->oem_product_rev_ptr)) || !*prod_rev) {
nuclear@1 37 prod_rev = "unknown";
nuclear@1 38 }
nuclear@1 39
nuclear@0 40 printf("VBE version: %x.%x\n", vbe->version >> 8, vbe->version & 0xff);
nuclear@1 41 printf("Graphics adapter: %s, %s (%s)\n", vendor, product, prod_rev);
nuclear@1 42 printf("Video memory: %dkb\n", vbe->total_mem << 6);
nuclear@0 43
nuclear@0 44 modes = VBEPTR(vbe->vid_mode_ptr);
nuclear@0 45 nmodes = 0;
nuclear@0 46 for(i=0; i<1024; i++) {
nuclear@0 47 if(modes[i] == 0xffff) break;
nuclear@0 48 nmodes++;
nuclear@0 49 }
nuclear@0 50 printf("%d video modes found:\n", nmodes);
nuclear@0 51
nuclear@0 52 if(!(vmodes = malloc(nmodes * sizeof *vmodes))) {
nuclear@0 53 fprintf(stderr, "failed to allocate video modes array\n");
nuclear@0 54 return 1;
nuclear@0 55 }
nuclear@0 56
nuclear@0 57 for(i=0; i<nmodes; i++) {
nuclear@0 58 if(!(mode = vbe_get_mode_info(modes[i]))) {
nuclear@0 59 fprintf(stderr, "failed to get mode %d info\n", i);
nuclear@0 60 }
nuclear@0 61 vmodes[i].xres = mode->xres;
nuclear@0 62 vmodes[i].yres = mode->yres;
nuclear@0 63 vmodes[i].bpp = mode->bpp;
nuclear@0 64 }
nuclear@0 65
nuclear@0 66 sort_modes(vmodes, nmodes, 2);
nuclear@0 67 sort_modes(vmodes, nmodes, 1);
nuclear@0 68
nuclear@0 69 for(i=0; i<nmodes; i++) {
nuclear@0 70 if(i == 0 || vmodes[i].xres != vmodes[i - 1].xres ||
nuclear@0 71 vmodes[i].yres != vmodes[i - 1].yres) {
nuclear@0 72 printf("\n%4dx%d - depth:", vmodes[i].xres, vmodes[i].yres);
nuclear@0 73 }
nuclear@0 74 printf(" %d", vmodes[i].bpp);
nuclear@0 75 }
nuclear@0 76 putchar('\n');
nuclear@0 77
nuclear@0 78 free(vmodes);
nuclear@0 79 return 0;
nuclear@0 80 }
nuclear@0 81
nuclear@0 82 void sort_modes(struct video_mode *arr, int sz, int field)
nuclear@0 83 {
nuclear@0 84 int i, j;
nuclear@0 85 struct video_mode tmp;
nuclear@0 86
nuclear@0 87 for(i=0; i<sz; i++) {
nuclear@0 88 for(j=i+1; j<sz; j++) {
nuclear@0 89 if(((int*)(arr + i))[field] >= ((int*)(arr + j))[field]) {
nuclear@0 90 tmp = arr[i];
nuclear@0 91 arr[i] = arr[j];
nuclear@0 92 arr[j] = tmp;
nuclear@0 93 }
nuclear@0 94 }
nuclear@0 95 }
nuclear@0 96 }