/* * $Id$ * $Source$ * * by * Steve M. Gehlbach * * These routines set graphics mode and alpha mode * for switching back and forth. * * Register settings are * more or less as follows: * * Register Graphics Alpha * 16 color * ------------------------------------------------ * GDC_MODE 0x00 0x10 * GDC_MISC 0x05 0x0e * SEQ_MEMORY_MODE 0x06 0x02 * SEQ_PLANE_WRITE 0x0f 0x03 * CRTC_CURSOR_START 0x20 0x00 * CRTC_CURSOR_END 0x00 CHAR_HEIGHT-1 * CRTC_MODE 0xe3 0xa3 * CRTC_MAX_SCAN 0x40 0x40 | CHAR_HEIGHT-1 * ATC_MODE 0x01 0x0c * */ #include "asm/io.h" #include "vga.h" void vga_set_gmode (void) { u8 byte; byte = read_att_b(ATC_MODE) & ~0x0f; write_att(byte|0x1, ATC_MODE); // // display is off at this point byte = read_seq_b(SEQ_PLANE_WRITE) & ~0xf; write_seq(byte|0xf,SEQ_PLANE_WRITE); // all planes byte = read_seq_b(SEQ_MEMORY_MODE); write_seq(byte|4,SEQ_MEMORY_MODE); byte = read_gra_b(GDC_MODE) & ~0x10; write_gra(byte,GDC_MODE); write_gra(0x05, GDC_MISC); write_crtc(0x20, CRTC_CURSOR_START); write_crtc(0x00, CRTC_CURSOR_END); byte = read_crtc_b(CRTC_MODE) & ~0xe0; write_crtc(byte|0xe0, CRTC_MODE); byte = read_crtc_b(CRTC_MAX_SCAN) & ~0x01f; write_crtc(byte, CRTC_MAX_SCAN); byte = inb(MIS_R); // get 3c2 value by reading 3cc outb(byte & ~0xc,MIS_W); // clear last bits to set 25Mhz clock and low page // turn on display, disable access to attr palette inb(IS1_RC); outb(0x20, ATT_IW); } void vga_set_amode (void) { u8 byte; write_att(0x0c, ATC_MODE); //reset palette to normal in the case it was changed write_att(0x0, ATC_COLOR_PAGE); // // display is off at this point write_seq(0x3,SEQ_PLANE_WRITE); // planes 0 & 1 byte = read_seq_b(SEQ_MEMORY_MODE) & ~0x04; write_seq(byte,SEQ_MEMORY_MODE); byte = read_gra_b(GDC_MODE) & ~0x60; write_gra(byte|0x10,GDC_MODE); write_gra(0x0e, GDC_MISC); write_crtc(0x00, CRTC_CURSOR_START); write_crtc(CHAR_HEIGHT-1, CRTC_CURSOR_END); byte = read_crtc_b(CRTC_MODE) & ~0xe0; write_crtc(byte|0xa0, CRTC_MODE); byte = read_crtc_b(CRTC_MAX_SCAN) & ~0x01f; write_crtc(byte | (CHAR_HEIGHT-1), CRTC_MAX_SCAN); // turn on display, disable access to attr palette inb(IS1_RC); outb(0x20, ATT_IW); } /* * by Steve M. Gehlbach, Ph.D. * * vga_font_load loads a font into font memory. It * assumes alpha mode has been set. * * The font load code follows technique used * in the tiara project, which came from * the Universal Talkware Boot Loader, * http://www.talkware.net. */ void vga_font_load(unsigned char *vidmem, const unsigned char *font, int height, int num_chars) { /* Note: the font table is 'height' long but the font storage area * is 32 bytes long. */ int i,j; u8 byte; // set sequencer map 2, odd/even off byte = read_seq_b(SEQ_PLANE_WRITE) & ~0xf; write_seq(byte|4,SEQ_PLANE_WRITE); byte = read_seq_b(SEQ_MEMORY_MODE); write_seq(byte|4,SEQ_MEMORY_MODE); // select graphics map 2, odd/even off, map starts at 0xa0000 write_gra(2,GDC_PLANE_READ); byte = read_gra_b(GDC_MODE) & ~0x10; write_gra(byte,GDC_MODE); write_gra(0,GDC_MISC); for (i = 0 ; i < num_chars ; i++) { for (j = 0 ; j < height ; j++) { vidmem[i*32+j] = font[i*16+j]; } } // set sequencer back to maps 0,1, odd/even on byte = read_seq_b(SEQ_PLANE_WRITE) & ~0xf; write_seq(byte|3,SEQ_PLANE_WRITE); byte = read_seq_b(SEQ_MEMORY_MODE) & ~0x4; write_seq(byte,SEQ_MEMORY_MODE); // select graphics back to map 0,1, odd/even on write_gra(0,GDC_PLANE_READ); byte = read_gra_b(GDC_MODE); write_gra(byte|0x10,GDC_MODE); write_gra(0xe,GDC_MISC); }