2 * Copyright (C) 2007-2009 Luc Verhaegen <libv@skynet.be>
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the Free
6 * Software Foundation; either version 2 of the License, or (at your option)
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 #include <pc80/vga_io.h>
22 * pci io enable should've happened before
27 vga_enable_mask(0x01, 0x01);
29 /* cr io is at 0x3D4/0x3D5 */
30 vga_misc_mask(0x01, 0x01);
32 /* clear cr0-7 protection */
33 vga_cr_mask(0x11, 0x00, 0x80);
42 vga_sr_write(0x02, 0x03);
43 vga_sr_write(0x03, 0x00);
44 vga_sr_write(0x04, 0x02); /* access all 256kB */
46 vga_gr_write(0x00, 0x00);
47 vga_gr_write(0x01, 0x00);
48 vga_gr_write(0x02, 0x00);
49 vga_gr_write(0x03, 0x00);
50 vga_gr_write(0x04, 0x00);
51 vga_gr_write(0x05, 0x10);
52 vga_gr_write(0x06, 0x0E); /* map at 0xB8000 */
53 vga_gr_write(0x07, 0x00);
54 vga_gr_write(0x08, 0xFF);
56 /* o/e enable: ram enable */
57 vga_misc_mask(0x22, 0x22);
66 memset((void *)VGA_FB
, 0x00, 0x8000);
73 vga_palette_init(void)
77 /* set up attribute registers */
78 for (i
= 0; i
< 0x10; i
++)
81 vga_ar_write(0x10, 0x0c);
82 vga_ar_write(0x11, 0x00);
83 vga_ar_write(0x12, 0x0F);
84 vga_ar_write(0x13, 0x08);
85 vga_ar_write(0x14, 0x00);
87 vga_palette_disable();
89 /* load actual palette */
90 vga_dac_mask_write(0xFF);
92 for (i
= 0; i
< 0x100; i
++) {
93 vga_dac_write_address(i
);
94 vga_dac_data_write(default_vga_palette
[i
].red
);
95 vga_dac_data_write(default_vga_palette
[i
].green
);
96 vga_dac_data_write(default_vga_palette
[i
].blue
);
104 vga_mode_set(int hdisplay
, int hblankstart
, int hsyncstart
, int hsyncend
,
105 int hblankend
, int htotal
, int vdisplay
, int vblankstart
,
106 int vsyncstart
, int vsyncend
, int vblankend
, int vtotal
,
112 vga_cr_write(0x00, htotal
);
117 vga_cr_write(0x01, hdisplay
);
119 /* hblankstart: 2048 */
122 vga_cr_write(0x02, hblankstart
);
124 /* hblankend: hblankstart + 512 */
127 vga_cr_mask(0x03, hblankend
, 0x1F);
128 vga_cr_mask(0x05, hblankend
<< 2, 0x80);
130 /* hsyncstart: 255 * 8: 2040 */
131 vga_cr_write(0x04, hsyncstart
/ 8);
133 /* hsyncend: hsyncstart + 255 */
134 vga_cr_mask(0x05, hsyncend
/ 8, 0x1F);
138 vga_cr_write(0x06, vtotal
);
139 vga_cr_mask(0x07, vtotal
>> 8, 0x01);
140 vga_cr_mask(0x07, vtotal
>> 4, 0x20);
144 vga_cr_write(0x12, vdisplay
);
145 vga_cr_mask(0x07, vdisplay
>> 7, 0x02);
146 vga_cr_mask(0x07, vdisplay
>> 3, 0x40);
148 /* vblankstart: 1024 */
150 vga_cr_write(0x15, vblankstart
);
151 vga_cr_mask(0x07, vblankstart
>> 5, 0x08);
152 vga_cr_mask(0x09, vblankstart
>> 4, 0x20);
154 /* vblankend: vblankstart + 256 */
156 vga_cr_write(0x16, vblankend
);
158 /* vsyncstart: 1023 */
159 vga_cr_write(0x10, vsyncstart
);
160 vga_cr_mask(0x07, vsyncstart
>> 6, 0x04);
161 vga_cr_mask(0x07, vsyncstart
>> 2, 0x80);
163 /* vsyncend: vsyncstart + 16 */
164 vga_cr_mask(0x11, vsyncend
, 0x0F);
167 vga_cr_write(0x13, stride
/ 8);
170 vga_cr_write(0x18, 0xFF);
171 vga_cr_mask(0x07, 0x10, 0x10);
172 vga_cr_mask(0x09, 0x40, 0x40);
174 vga_misc_mask(0x44, 0xCC); /* set up clock: 27mhz and h/vsync */
176 vga_cr_mask(0x09, 0x00, 0x80); /* disable doublescan */
180 vga_font_8x16_load(void)
184 unsigned char sr2
, sr4
, gr5
, gr6
;
189 sr2
= vga_sr_read(0x02);
190 sr4
= vga_sr_read(0x04);
191 gr5
= vga_gr_read(0x05);
192 gr6
= vga_gr_read(0x06);
194 /* disable odd/even */
195 vga_sr_mask(0x04, 0x04, 0x04);
196 vga_gr_mask(0x05, 0x00, 0x10);
197 vga_gr_mask(0x06, 0x00, 0x02);
200 vga_sr_write(0x02, 0x04);
201 p
= (unsigned char *) VGA_FB
;
202 for (i
= 0; i
< count
; i
++) {
203 for (j
= 0; j
< 32; j
++) {
205 *p
= vga_font_8x16
[i
][j
];
212 vga_gr_write(0x06, gr6
);
213 vga_gr_write(0x05, gr5
);
214 vga_sr_write(0x04, sr4
);
215 vga_sr_write(0x02, sr2
);
217 /* set up font size */
218 vga_cr_mask(0x09, 16 - 1, 0x1F);
225 vga_cursor_enable(int enable
)
228 vga_cr_mask(0x0A, 0x00, 0x20);
230 vga_cr_mask(0x0A, 0x20, 0x20);
237 vga_cursor_reset(void)
239 vga_cr_write(0x0A, 0x2E);
240 vga_cr_write(0x0B, 0x0E);
241 vga_cr_write(0x0E, 0x00);
242 vga_cr_write(0x0F, 0x00);
249 vga_cursor_set(unsigned int line
, unsigned int character
)
251 unsigned int offset
= (80 * line
+ character
) & 0xFFFF;
253 vga_cr_write(0x0A, 0x0E);
254 vga_cr_write(0x0B, 0x0E);
255 vga_cr_write(0x0E, offset
>> 8);
256 vga_cr_write(0x0F, offset
& 0xFF);
263 vga_frame_set(unsigned int line
, unsigned int character
)
265 unsigned int offset
= (80 * line
+ character
) & 0xFFFF;
267 vga_cr_write(0x0C, offset
>> 8);
268 vga_cr_write(0x0D, offset
& 0xFF);
272 * simply fills a line with the given string.
275 vga_line_write(unsigned int line
, const char *string
)
277 unsigned short *p
= (unsigned short *) VGA_FB
+ (80 * line
);
278 int i
, len
= strlen(string
);
280 for (i
= 0; i
< 80; i
++) {
282 p
[i
] = 0x0F00 | string
[i
];
289 * set up everything to get a basic 80x25 textmode.
292 vga_textmode_init(void)
294 vga_sr_write(0x00, 0x01); /* clear reset */
295 vga_sr_write(0x01, 0x00);
298 vga_cr_mask(0x03, 0x80, 0xE0);
299 vga_cr_mask(0x05, 0x00, 0x60);
301 vga_cr_write(0x08, 0x00);
303 vga_cr_write(0x14, 0x00); /* */
305 vga_cr_write(0x17, 0x23);
309 vga_mode_set(640, 648, 680, 776, 792, 800,
310 400, 407, 412, 414, 442, 449, 320);
317 vga_font_8x16_load();
319 vga_sr_mask(0x00, 0x02, 0x02); /* take us out of reset */
320 vga_cr_mask(0x17, 0x80, 0x80); /* sync! */