+ u16 mode = cirrus_vesamode_to_mode(regs->cx & 0x3fff);
+ if (!mode) {
+ regs->ax = 0x014f;
+ return;
+ }
+ struct cirrus_mode_s *table_g = cirrus_get_modeentry(mode);
+ u32 lfb = GET_GLOBAL(cirrus_lfb_addr); // XXX
+ if ((regs->cx & 0x4000) && !lfb) {
+ regs->ax = 0x014f;
+ return;
+ }
+
+ u16 seg = regs->es;
+ struct vbe_mode_info *info = (void*)(regs->di+0);
+ memset_far(seg, info, 0, sizeof(*info));
+
+ SET_FARVAR(seg, info->mode_attributes, lfb ? 0xbb : 0x3b);
+ SET_FARVAR(seg, info->winA_attributes, 0x07);
+ SET_FARVAR(seg, info->winB_attributes, 0);
+ SET_FARVAR(seg, info->win_granularity, 16);
+ SET_FARVAR(seg, info->win_size, 64);
+ SET_FARVAR(seg, info->winA_seg, SEG_GRAPH);
+ SET_FARVAR(seg, info->winB_seg, 0x0);
+ SET_FARVAR(seg, info->win_func_ptr.segoff, 0x0); // XXX
+ u16 linesize = cirrus_get_line_offset_entry(table_g);
+ SET_FARVAR(seg, info->bytes_per_scanline, linesize);
+ SET_FARVAR(seg, info->xres, GET_GLOBAL(table_g->width));
+ u16 height = GET_GLOBAL(table_g->height);
+ SET_FARVAR(seg, info->yres, height);
+ SET_FARVAR(seg, info->xcharsize, 8);
+ SET_FARVAR(seg, info->ycharsize, 16);
+ SET_FARVAR(seg, info->planes, 1);
+ SET_FARVAR(seg, info->bits_per_pixel, GET_GLOBAL(table_g->depth));
+ SET_FARVAR(seg, info->banks, 1);
+ SET_FARVAR(seg, info->mem_model, GET_GLOBAL(table_g->vesacolortype));
+ SET_FARVAR(seg, info->bank_size, 0);
+
+ int pages = (cirrus_get_memsize() * 64 * 1024) / (height * linesize);
+ SET_FARVAR(seg, info->pages, pages - 1);
+ SET_FARVAR(seg, info->reserved0, 0);
+
+ SET_FARVAR(seg, info->red_size, GET_GLOBAL(table_g->vesaredmask));
+ SET_FARVAR(seg, info->red_pos, GET_GLOBAL(table_g->vesaredpos));
+ SET_FARVAR(seg, info->green_size, GET_GLOBAL(table_g->vesagreenmask));
+ SET_FARVAR(seg, info->green_pos, GET_GLOBAL(table_g->vesagreenpos));
+ SET_FARVAR(seg, info->blue_size, GET_GLOBAL(table_g->vesabluemask));
+ SET_FARVAR(seg, info->blue_pos, GET_GLOBAL(table_g->vesabluepos));
+ SET_FARVAR(seg, info->alpha_size, GET_GLOBAL(table_g->vesareservedmask));
+ SET_FARVAR(seg, info->alpha_pos, GET_GLOBAL(table_g->vesareservedpos));
+ u8 directcolor_info = GET_GLOBAL(table_g->bitsperpixel) <= 8;
+ SET_FARVAR(seg, info->directcolor_info, directcolor_info);
+
+ SET_FARVAR(seg, info->phys_base, lfb);
+
+ regs->ax = 0x004f;