nuclear@0: #include nuclear@0: #include nuclear@0: #include "vbe.h" nuclear@0: nuclear@0: #define REALPTR(s, o) (void*)(((uint32_t)(s) << 4) + (uint32_t)(o)) nuclear@0: #define VBEPTR(x) REALPTR(((x) & 0xffff0000) >> 16, (x) & 0xffff) nuclear@0: #define VBEPTR_SEG(x) (((x) & 0xffff0000) >> 16) nuclear@0: #define VBEPTR_OFF(x) ((x) & 0xffff) nuclear@0: nuclear@0: struct video_mode { nuclear@0: int xres, yres, bpp; nuclear@4: unsigned long addr; nuclear@0: }; nuclear@0: nuclear@0: void sort_modes(struct video_mode *arr, int sz, int field); nuclear@0: nuclear@0: int main(int argc, char **argv) nuclear@0: { nuclear@0: int i, nmodes; nuclear@0: struct vbe_info *vbe; nuclear@0: struct vbe_mode_info *mode; nuclear@0: uint16_t *modes; nuclear@0: struct video_mode *vmodes; nuclear@1: char *vendor, *product, *prod_rev; nuclear@4: unsigned long prev_addr = 0; nuclear@0: nuclear@0: if(!(vbe = vbe_get_info())) { nuclear@0: fprintf(stderr, "VBE not found\n"); nuclear@0: return 1; nuclear@0: } nuclear@1: nuclear@1: if(!(vendor = VBEPTR(vbe->oem_vendor_name_ptr)) || !*vendor) { nuclear@1: vendor = "unknown"; nuclear@1: } nuclear@1: if(!(product = VBEPTR(vbe->oem_product_name_ptr)) || !*product) { nuclear@1: product = "unknown"; nuclear@1: } nuclear@1: if(!(prod_rev = VBEPTR(vbe->oem_product_rev_ptr)) || !*prod_rev) { nuclear@1: prod_rev = "unknown"; nuclear@1: } nuclear@1: nuclear@0: printf("VBE version: %x.%x\n", vbe->version >> 8, vbe->version & 0xff); nuclear@1: printf("Graphics adapter: %s, %s (%s)\n", vendor, product, prod_rev); nuclear@1: printf("Video memory: %dkb\n", vbe->total_mem << 6); nuclear@0: nuclear@0: modes = VBEPTR(vbe->vid_mode_ptr); nuclear@0: nmodes = 0; nuclear@0: for(i=0; i<1024; i++) { nuclear@0: if(modes[i] == 0xffff) break; nuclear@0: nmodes++; nuclear@0: } nuclear@0: printf("%d video modes found:\n", nmodes); nuclear@0: nuclear@0: if(!(vmodes = malloc(nmodes * sizeof *vmodes))) { nuclear@0: fprintf(stderr, "failed to allocate video modes array\n"); nuclear@0: return 1; nuclear@0: } nuclear@0: nuclear@0: for(i=0; ixres; nuclear@0: vmodes[i].yres = mode->yres; nuclear@0: vmodes[i].bpp = mode->bpp; nuclear@4: vmodes[i].addr = mode->fb_addr; nuclear@0: } nuclear@0: nuclear@0: sort_modes(vmodes, nmodes, 2); nuclear@0: sort_modes(vmodes, nmodes, 1); nuclear@0: nuclear@0: for(i=0; i= ((int*)(arr + j))[field]) { nuclear@0: tmp = arr[i]; nuclear@0: arr[i] = arr[j]; nuclear@0: arr[j] = tmp; nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: }