static int test_vbe(int x, int y, vbe_video_mode* mode) { char buffer[256]; struct vga_info info; struct vga_regs regs; adv_crtc crtc; draw_test_default(); snprintf(buffer, sizeof(buffer), "vbe %s 0x%x %dx%dx%d [%dx%d]", index_name(video_index()), mode->mode, video_size_x(), video_size_y(), video_bits_per_pixel(), video_virtual_x(), video_virtual_y()); draw_string(x, y, buffer, DRAW_COLOR_WHITE); ++y; ++y; vga_mode_get(®s); vga_regs_info_get(®s, &info); if (crtc_import(&crtc, &info, video_size_x(), video_size_y(), video_measured_vclock())==0) { ++y; y = test_crtc(x, y, &crtc, 0, 1, 0); } ++y; y = test_default_command(x, y); return y; }
void vga_mode_set(const struct vga_regs* regs) { unsigned i; vga_state.regs = *regs; vga_regs_info_get(&vga_state.regs, &vga_state.info); /* misc */ outportb(VGAREG_MISC_WRITE_DATA, regs->misc); /* pel */ outportb(VGAREG_PEL_MASK, 0xFF); /* sequencer reset on */ vga_outb(VGAREG_SEQ_ADDR, 0, 0x01); /* sequencer */ for (i = 1; i < VGAREG_SEQ_MAX; ++i) vga_outb(VGAREG_SEQ_ADDR, i, regs->seq[i]); /* sequencer reset off */ vga_outb(VGAREG_SEQ_ADDR, 0, 0x03); /* enable crtc */ vga_outb(VGAREG_CRTC_ADDR, 0x11, vga_inb(VGAREG_CRTC_ADDR, 0x11) & 0x7F); /* crtc */ for (i = 0; i < VGAREG_CRTC_MAX; ++i) vga_outb(VGAREG_CRTC_ADDR, i, regs->crtc[i]); /* graphics controller */ for (i = 0; i < VGAREG_GRACON_MAX; ++i) vga_outb(VGAREG_GRACON_ADDR, i, regs->gracon[i]); /* attribute controller */ for (i = 0; i < VGAREG_ATTRCON_MAX; ++i) vga_outb(VGAREG_ATTRCON_ADDR, i, regs->attrcon[i]); }
adv_error vgaline_mode_grab(vgaline_video_mode* mode) { struct vga_regs regs; struct vga_info info; assert(vgaline_is_active()); /* get the video mode */ vga_mode_get(®s); /* import information */ vga_regs_info_get(®s, &info); /* generate crtc values */ if (crtc_import(&mode->crtc, &info, info.size_x, info.size_y, info.vert_clock)!=0) return -1; mode->font_x = info.char_size_x; mode->font_y = info.char_size_y; crtc_name_set(&mode->crtc, "grabbed"); return 0; }