8 #define SEG_ADDR(s) ((uint32_t)(s) << 4)
10 #define MODE_LFB (1 << 14)
12 extern unsigned char low_mem_buffer[];
14 struct vbe_info *vbe_get_info(void)
16 struct vbe_info *info;
17 struct int86regs regs;
19 printf("vbe_get_info... ");
21 info = (struct vbe_info*)low_mem_buffer;
23 memcpy(info->sig, "VBE2", 4);
25 memset(®s, 0, sizeof regs);
26 regs.es = (uint32_t)info >> 4;
30 printf("status: %d\n", (regs.eax >> 8) & 0xff);
32 if((regs.eax & 0xffff) != 0x4f) {
39 struct vbe_mode_info *vbe_get_mode_info(int mode)
41 struct vbe_mode_info *mi;
42 struct int86regs regs;
44 mi = (struct vbe_mode_info*)(low_mem_buffer + 512);
46 memset(®s, 0, sizeof regs);
47 regs.es = (uint32_t)mi >> 4;
52 if((regs.eax & 0xffff) != 0x4f) {
59 int vbe_set_mode(int mode)
61 struct int86regs regs;
63 memset(®s, 0, sizeof regs);
68 if(regs.eax == 0x100) {
74 void print_mode_info(struct vbe_mode_info *mi)
76 static unsigned int maskbits[] = {0, 1, 3, 7, 0xf, 0x1f, 0x3f, 0x7f, 0xff};
78 printf("resolution: %dx%d\n", mi->xres, mi->yres);
79 printf("color depth: %d\n", mi->bpp);
80 printf("mode attributes: %x\n", mi->mode_attr);
81 printf("bytes per scanline: %d\n", mi->scanline_bytes);
82 printf("number of planes: %d\n", (int)mi->num_planes);
83 printf("number of banks: %d\n", (int)mi->num_banks);
84 printf("mem model: %d\n", (int)mi->mem_model);
85 printf("red bits: %d (mask: %x)\n", (int)mi->rmask_size, maskbits[mi->rmask_size] << mi->rpos);
86 printf("green bits: %d (mask: %x)\n", (int)mi->gmask_size, maskbits[mi->gmask_size] << mi->gpos);
87 printf("blue bits: %d (mask: %x)\n", (int)mi->bmask_size, maskbits[mi->bmask_size] << mi->bpos);
88 printf("framebuffer address: %x\n", (unsigned int)mi->fb_addr);