|
|
1.1 ! root 1: /* ! 2: * $Id$ ! 3: * $Source$ ! 4: * ! 5: * by ! 6: * Steve M. Gehlbach <[email protected]> ! 7: * ! 8: * These routines set graphics mode and alpha mode ! 9: * for switching back and forth. ! 10: * ! 11: * Register settings are ! 12: * more or less as follows: ! 13: * ! 14: * Register Graphics Alpha ! 15: * 16 color ! 16: * ------------------------------------------------ ! 17: * GDC_MODE 0x00 0x10 ! 18: * GDC_MISC 0x05 0x0e ! 19: * SEQ_MEMORY_MODE 0x06 0x02 ! 20: * SEQ_PLANE_WRITE 0x0f 0x03 ! 21: * CRTC_CURSOR_START 0x20 0x00 ! 22: * CRTC_CURSOR_END 0x00 CHAR_HEIGHT-1 ! 23: * CRTC_MODE 0xe3 0xa3 ! 24: * CRTC_MAX_SCAN 0x40 0x40 | CHAR_HEIGHT-1 ! 25: * ATC_MODE 0x01 0x0c ! 26: * ! 27: */ ! 28: ! 29: #include "asm/io.h" ! 30: #include "vga.h" ! 31: ! 32: void vga_set_gmode (void) { ! 33: u8 byte; ! 34: ! 35: byte = read_att_b(ATC_MODE) & ~0x0f; ! 36: write_att(byte|0x1, ATC_MODE); ! 37: // ! 38: // display is off at this point ! 39: ! 40: byte = read_seq_b(SEQ_PLANE_WRITE) & ~0xf; ! 41: write_seq(byte|0xf,SEQ_PLANE_WRITE); // all planes ! 42: byte = read_seq_b(SEQ_MEMORY_MODE); ! 43: write_seq(byte|4,SEQ_MEMORY_MODE); ! 44: ! 45: byte = read_gra_b(GDC_MODE) & ~0x10; ! 46: write_gra(byte,GDC_MODE); ! 47: write_gra(0x05, GDC_MISC); ! 48: ! 49: write_crtc(0x20, CRTC_CURSOR_START); ! 50: write_crtc(0x00, CRTC_CURSOR_END); ! 51: byte = read_crtc_b(CRTC_MODE) & ~0xe0; ! 52: write_crtc(byte|0xe0, CRTC_MODE); ! 53: byte = read_crtc_b(CRTC_MAX_SCAN) & ~0x01f; ! 54: write_crtc(byte, CRTC_MAX_SCAN); ! 55: ! 56: byte = inb(MIS_R); // get 3c2 value by reading 3cc ! 57: outb(byte & ~0xc,MIS_W); // clear last bits to set 25Mhz clock and low page ! 58: ! 59: ! 60: // turn on display, disable access to attr palette ! 61: inb(IS1_RC); ! 62: outb(0x20, ATT_IW); ! 63: } ! 64: ! 65: void vga_set_amode (void) { ! 66: u8 byte; ! 67: write_att(0x0c, ATC_MODE); ! 68: ! 69: //reset palette to normal in the case it was changed ! 70: write_att(0x0, ATC_COLOR_PAGE); ! 71: // ! 72: // display is off at this point ! 73: ! 74: write_seq(0x3,SEQ_PLANE_WRITE); // planes 0 & 1 ! 75: byte = read_seq_b(SEQ_MEMORY_MODE) & ~0x04; ! 76: write_seq(byte,SEQ_MEMORY_MODE); ! 77: ! 78: byte = read_gra_b(GDC_MODE) & ~0x60; ! 79: write_gra(byte|0x10,GDC_MODE); ! 80: ! 81: write_gra(0x0e, GDC_MISC); ! 82: ! 83: write_crtc(0x00, CRTC_CURSOR_START); ! 84: write_crtc(CHAR_HEIGHT-1, CRTC_CURSOR_END); ! 85: ! 86: byte = read_crtc_b(CRTC_MODE) & ~0xe0; ! 87: write_crtc(byte|0xa0, CRTC_MODE); ! 88: byte = read_crtc_b(CRTC_MAX_SCAN) & ~0x01f; ! 89: write_crtc(byte | (CHAR_HEIGHT-1), CRTC_MAX_SCAN); ! 90: ! 91: ! 92: // turn on display, disable access to attr palette ! 93: inb(IS1_RC); ! 94: outb(0x20, ATT_IW); ! 95: } ! 96: ! 97: /* ! 98: * by Steve M. Gehlbach, Ph.D. <[email protected]> ! 99: * ! 100: * vga_font_load loads a font into font memory. It ! 101: * assumes alpha mode has been set. ! 102: * ! 103: * The font load code follows technique used ! 104: * in the tiara project, which came from ! 105: * the Universal Talkware Boot Loader, ! 106: * http://www.talkware.net. ! 107: */ ! 108: ! 109: void vga_font_load(unsigned char *vidmem, const unsigned char *font, int height, int num_chars) { ! 110: ! 111: /* Note: the font table is 'height' long but the font storage area ! 112: * is 32 bytes long. ! 113: */ ! 114: ! 115: int i,j; ! 116: u8 byte; ! 117: ! 118: // set sequencer map 2, odd/even off ! 119: byte = read_seq_b(SEQ_PLANE_WRITE) & ~0xf; ! 120: write_seq(byte|4,SEQ_PLANE_WRITE); ! 121: byte = read_seq_b(SEQ_MEMORY_MODE); ! 122: write_seq(byte|4,SEQ_MEMORY_MODE); ! 123: ! 124: // select graphics map 2, odd/even off, map starts at 0xa0000 ! 125: write_gra(2,GDC_PLANE_READ); ! 126: byte = read_gra_b(GDC_MODE) & ~0x10; ! 127: write_gra(byte,GDC_MODE); ! 128: write_gra(0,GDC_MISC); ! 129: ! 130: for (i = 0 ; i < num_chars ; i++) { ! 131: for (j = 0 ; j < height ; j++) { ! 132: vidmem[i*32+j] = font[i*16+j]; ! 133: } ! 134: } ! 135: ! 136: // set sequencer back to maps 0,1, odd/even on ! 137: byte = read_seq_b(SEQ_PLANE_WRITE) & ~0xf; ! 138: write_seq(byte|3,SEQ_PLANE_WRITE); ! 139: byte = read_seq_b(SEQ_MEMORY_MODE) & ~0x4; ! 140: write_seq(byte,SEQ_MEMORY_MODE); ! 141: ! 142: // select graphics back to map 0,1, odd/even on ! 143: write_gra(0,GDC_PLANE_READ); ! 144: byte = read_gra_b(GDC_MODE); ! 145: write_gra(byte|0x10,GDC_MODE); ! 146: write_gra(0xe,GDC_MISC); ! 147: ! 148: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.