8 #define SEG_ADDR(s) ((uint32_t)(s) << 4)
10 #define MODE_LFB (1 << 14)
12 extern void *low_mem_buffer;
14 struct vbe_info *vbe_get_info(void)
16 struct vbe_info *info;
17 struct int86regs regs;
19 info = low_mem_buffer;
21 memcpy(info->sig, "VBE2", 4);
23 memset(®s, 0, sizeof regs);
24 regs.es = (uint32_t)low_mem_buffer >> 4;
31 struct vbe_mode_info *vbe_get_mode_info(int mode)
33 struct vbe_mode_info *mi;
34 struct int86regs regs;
38 memset(®s, 0, sizeof regs);
39 regs.es = (uint32_t)low_mem_buffer >> 4;
44 if(regs.eax & 0xff00) {
51 int vbe_set_mode(int mode)
53 struct int86regs regs;
55 memset(®s, 0, sizeof regs);
60 if(regs.eax == 0x100) {
66 void print_mode_info(struct vbe_mode_info *mi)
68 static unsigned int maskbits[] = {0, 1, 3, 7, 0xf, 0x1f, 0x3f, 0x7f, 0xff};
70 printf("resolution: %dx%d\n", mi->xres, mi->yres);
71 printf("color depth: %d\n", mi->bpp);
72 printf("mode attributes: %x\n", mi->mode_attr);
73 printf("bytes per scanline: %d\n", mi->scanline_bytes);
74 printf("number of planes: %d\n", (int)mi->num_planes);
75 printf("number of banks: %d\n", (int)mi->num_banks);
76 printf("mem model: %d\n", (int)mi->mem_model);
77 printf("red bits: %d (mask: %x)\n", (int)mi->rmask_size, maskbits[mi->rmask_size] << mi->rpos);
78 printf("green bits: %d (mask: %x)\n", (int)mi->gmask_size, maskbits[mi->gmask_size] << mi->gpos);
79 printf("blue bits: %d (mask: %x)\n", (int)mi->bmask_size, maskbits[mi->bmask_size] << mi->bpos);
80 printf("framebuffer address: %x\n", (unsigned int)mi->fb_addr);