|
|
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.