adv_error vgaline_mode_set(const vgaline_video_mode* mode) { struct vga_regs regs; log_std_modeline_c(("vgaline: mode_set modeline", mode->crtc.pixelclock, mode->crtc.hde, mode->crtc.hrs, mode->crtc.hre, mode->crtc.ht, mode->crtc.vde, mode->crtc.vrs, mode->crtc.vre, mode->crtc.vt, crtc_is_nhsync(&mode->crtc), crtc_is_nvsync(&mode->crtc), crtc_is_doublescan(&mode->crtc), crtc_is_interlace(&mode->crtc))); if (vgaline_mode_realize(®s, mode)!=0) { return -1; } vga_mode_set(®s); if (mode->is_text) { vgaline_write_line = vgaline_write_line_text; switch (mode->font_y) { case 8 : vga_font_copy(vga_font_bios_8, 8, 0, 1); break; case 14 : vga_font_copy(vga_font_bios_14, 14, 0, 1); break; case 16 : vga_font_copy(vga_font_bios_16, 16, 0, 1); break; } vga_palette_raw_set(vga_palette_bios_text, 0, 256); } else { vgaline_write_line = vgaline_write_line_graph; vga_palette_raw_set(vga_palette_bios_graph, 0, 256); } vgaline_state.mode_active = 1; return 0; }
/* * set up everything to get a basic 80x25 textmode. */ void vga_textmode_init(void) { vga_sr_write(0x00, 0x01); /* clear reset */ vga_sr_write(0x01, 0x00); /* set up cr */ vga_cr_mask(0x03, 0x80, 0xE0); vga_cr_mask(0x05, 0x00, 0x60); vga_cr_write(0x08, 0x00); vga_cr_write(0x14, 0x00); /* */ vga_cr_write(0x17, 0x23); vga_palette_init(); vga_mode_set(640, 648, 680, 776, 792, 800, 400, 407, 412, 414, 442, 449, 320); vga_cursor_reset(); vga_frame_set(0, 0); vga_fb_init(); vga_fb_clear(); vga_font_8x16_load(); vga_sr_mask(0x00, 0x02, 0x02); /* take us out of reset */ vga_cr_mask(0x17, 0x80, 0x80); /* sync! */ }