6 * Steve M. Gehlbach <steve@kesa.com>
8 * These routines set graphics mode and alpha mode
9 * for switching back and forth.
11 * Register settings are
12 * more or less as follows:
14 * Register Graphics Alpha
16 * ------------------------------------------------
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
24 * CRTC_MAX_SCAN 0x40 0x40 | CHAR_HEIGHT-1
32 void vga_set_gmode (void) {
35 byte
= read_att_b(ATC_MODE
) & ~0x0f;
36 write_att(byte
|0x1, ATC_MODE
);
38 // display is off at this point
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
);
45 byte
= read_gra_b(GDC_MODE
) & ~0x10;
46 write_gra(byte
,GDC_MODE
);
47 write_gra(0x05, GDC_MISC
);
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
);
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
60 // turn on display, disable access to attr palette
65 void vga_set_amode (void) {
67 write_att(0x0c, ATC_MODE
);
69 //reset palette to normal in the case it was changed
70 write_att(0x0, ATC_COLOR_PAGE
);
72 // display is off at this point
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
);
78 byte
= read_gra_b(GDC_MODE
) & ~0x60;
79 write_gra(byte
|0x10,GDC_MODE
);
81 write_gra(0x0e, GDC_MISC
);
83 write_crtc(0x00, CRTC_CURSOR_START
);
84 write_crtc(CHAR_HEIGHT
-1, CRTC_CURSOR_END
);
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
);
92 // turn on display, disable access to attr palette
98 * by Steve M. Gehlbach, Ph.D. <steve@kesa.com>
100 * vga_font_load loads a font into font memory. It
101 * assumes alpha mode has been set.
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.
109 void vga_font_load(unsigned char *vidmem
, const unsigned char *font
, int height
, int num_chars
) {
111 /* Note: the font table is 'height' long but the font storage area
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
);
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
);
130 for (i
= 0 ; i
< num_chars
; i
++) {
131 for (j
= 0 ; j
< height
; j
++) {
132 vidmem
[i
*32+j
] = font
[i
*16+j
];
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
);
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
);