3 // Copyright (C) 2009 Kevin O'Connor <kevin@koconnor.net>
4 // Copyright (C) 2001-2008 the LGPL VGABios developers Team
6 // This file may be distributed under the terms of the GNU LGPLv3 license.
8 #include "ioport.h" // outb
9 #include "farptr.h" // SET_FARVAR
10 #include "vgatables.h" // VGAREG_*
13 /****************************************************************
15 ****************************************************************/
18 vgahw_set_border_color(u8 color)
20 inb(VGAREG_ACTL_RESET);
21 outb(0x00, VGAREG_ACTL_ADDRESS);
25 outb(v1, VGAREG_ACTL_WRITE_DATA);
29 for (i = 1; i < 4; i++) {
30 outb(i, VGAREG_ACTL_ADDRESS);
32 u8 cur = inb(VGAREG_ACTL_READ_DATA);
35 outb(cur, VGAREG_ACTL_WRITE_DATA);
37 outb(0x20, VGAREG_ACTL_ADDRESS);
41 vgahw_set_overscan_border_color(u8 color)
43 inb(VGAREG_ACTL_RESET);
44 outb(0x11, VGAREG_ACTL_ADDRESS);
45 outb(color, VGAREG_ACTL_WRITE_DATA);
46 outb(0x20, VGAREG_ACTL_ADDRESS);
50 vgahw_get_overscan_border_color()
52 inb(VGAREG_ACTL_RESET);
53 outb(0x11, VGAREG_ACTL_ADDRESS);
54 u8 v = inb(VGAREG_ACTL_READ_DATA);
55 inb(VGAREG_ACTL_RESET);
56 outb(0x20, VGAREG_ACTL_ADDRESS);
61 vgahw_set_palette(u8 palid)
63 inb(VGAREG_ACTL_RESET);
66 for (i = 1; i < 4; i++) {
67 outb(i, VGAREG_ACTL_ADDRESS);
69 u8 v = inb(VGAREG_ACTL_READ_DATA);
72 outb(v, VGAREG_ACTL_WRITE_DATA);
74 outb(0x20, VGAREG_ACTL_ADDRESS);
78 vgahw_set_single_palette_reg(u8 reg, u8 val)
80 inb(VGAREG_ACTL_RESET);
81 outb(reg, VGAREG_ACTL_ADDRESS);
82 outb(val, VGAREG_ACTL_WRITE_DATA);
83 outb(0x20, VGAREG_ACTL_ADDRESS);
87 vgahw_get_single_palette_reg(u8 reg)
89 inb(VGAREG_ACTL_RESET);
90 outb(reg, VGAREG_ACTL_ADDRESS);
91 u8 v = inb(VGAREG_ACTL_READ_DATA);
92 inb(VGAREG_ACTL_RESET);
93 outb(0x20, VGAREG_ACTL_ADDRESS);
98 vgahw_set_all_palette_reg(u16 seg, u8 *data_far)
100 inb(VGAREG_ACTL_RESET);
102 for (i = 0; i < 0x10; i++) {
103 outb(i, VGAREG_ACTL_ADDRESS);
104 u8 val = GET_FARVAR(seg, *data_far);
105 outb(val, VGAREG_ACTL_WRITE_DATA);
108 outb(0x11, VGAREG_ACTL_ADDRESS);
109 outb(GET_FARVAR(seg, *data_far), VGAREG_ACTL_WRITE_DATA);
110 outb(0x20, VGAREG_ACTL_ADDRESS);
114 vgahw_get_all_palette_reg(u16 seg, u8 *data_far)
117 for (i = 0; i < 0x10; i++) {
118 inb(VGAREG_ACTL_RESET);
119 outb(i, VGAREG_ACTL_ADDRESS);
120 SET_FARVAR(seg, *data_far, inb(VGAREG_ACTL_READ_DATA));
123 inb(VGAREG_ACTL_RESET);
124 outb(0x11, VGAREG_ACTL_ADDRESS);
125 SET_FARVAR(seg, *data_far, inb(VGAREG_ACTL_READ_DATA));
126 inb(VGAREG_ACTL_RESET);
127 outb(0x20, VGAREG_ACTL_ADDRESS);
131 vgahw_toggle_intensity(u8 flag)
133 inb(VGAREG_ACTL_RESET);
134 outb(0x10, VGAREG_ACTL_ADDRESS);
135 u8 val = (inb(VGAREG_ACTL_READ_DATA) & 0xf7) | ((flag & 0x01) << 3);
136 outb(val, VGAREG_ACTL_WRITE_DATA);
137 outb(0x20, VGAREG_ACTL_ADDRESS);
141 vgahw_select_video_dac_color_page(u8 flag, u8 data)
143 inb(VGAREG_ACTL_RESET);
144 outb(0x10, VGAREG_ACTL_ADDRESS);
145 u8 val = inb(VGAREG_ACTL_READ_DATA);
146 if (!(flag & 0x01)) {
147 // select paging mode
148 val = (val & 0x7f) | (data << 7);
149 outb(val, VGAREG_ACTL_WRITE_DATA);
150 outb(0x20, VGAREG_ACTL_ADDRESS);
154 inb(VGAREG_ACTL_RESET);
155 outb(0x14, VGAREG_ACTL_ADDRESS);
159 outb(data, VGAREG_ACTL_WRITE_DATA);
160 outb(0x20, VGAREG_ACTL_ADDRESS);
164 vgahw_read_video_dac_state(u8 *pmode, u8 *curpage)
166 inb(VGAREG_ACTL_RESET);
167 outb(0x10, VGAREG_ACTL_ADDRESS);
168 u8 val1 = inb(VGAREG_ACTL_READ_DATA) >> 7;
170 inb(VGAREG_ACTL_RESET);
171 outb(0x14, VGAREG_ACTL_ADDRESS);
172 u8 val2 = inb(VGAREG_ACTL_READ_DATA) & 0x0f;
176 inb(VGAREG_ACTL_RESET);
177 outb(0x20, VGAREG_ACTL_ADDRESS);
184 /****************************************************************
186 ****************************************************************/
189 vgahw_set_dac_regs(u16 seg, u8 *data_far, u8 start, int count)
191 outb(start, VGAREG_DAC_WRITE_ADDRESS);
193 outb(GET_FARVAR(seg, *data_far), VGAREG_DAC_DATA);
195 outb(GET_FARVAR(seg, *data_far), VGAREG_DAC_DATA);
197 outb(GET_FARVAR(seg, *data_far), VGAREG_DAC_DATA);
204 vgahw_get_dac_regs(u16 seg, u8 *data_far, u8 start, int count)
206 outb(start, VGAREG_DAC_READ_ADDRESS);
208 SET_FARVAR(seg, *data_far, inb(VGAREG_DAC_DATA));
210 SET_FARVAR(seg, *data_far, inb(VGAREG_DAC_DATA));
212 SET_FARVAR(seg, *data_far, inb(VGAREG_DAC_DATA));
219 vgahw_set_pel_mask(u8 val)
221 outb(val, VGAREG_PEL_MASK);
227 return inb(VGAREG_PEL_MASK);
231 /****************************************************************
233 ****************************************************************/
236 vgahw_set_text_block_specifier(u8 spec)
238 outw((spec << 8) | 0x03, VGAREG_SEQU_ADDRESS);
244 outw(0x0100, VGAREG_SEQU_ADDRESS);
245 outw(0x0402, VGAREG_SEQU_ADDRESS);
246 outw(0x0704, VGAREG_SEQU_ADDRESS);
247 outw(0x0300, VGAREG_SEQU_ADDRESS);
248 outw(0x0204, VGAREG_GRDC_ADDRESS);
249 outw(0x0005, VGAREG_GRDC_ADDRESS);
250 outw(0x0406, VGAREG_GRDC_ADDRESS);
254 release_font_access()
256 outw(0x0100, VGAREG_SEQU_ADDRESS);
257 outw(0x0302, VGAREG_SEQU_ADDRESS);
258 outw(0x0304, VGAREG_SEQU_ADDRESS);
259 outw(0x0300, VGAREG_SEQU_ADDRESS);
260 u16 v = (inw(VGAREG_READ_MISC_OUTPUT) & 0x01) ? 0x0e : 0x0a;
261 outw((v << 8) | 0x06, VGAREG_GRDC_ADDRESS);
262 outw(0x0004, VGAREG_GRDC_ADDRESS);
263 outw(0x1005, VGAREG_GRDC_ADDRESS);
267 /****************************************************************
269 ****************************************************************/
272 vgahw_enable_video_addressing(u8 disable)
274 u8 v = (disable & 1) ? 0x00 : 0x02;
275 u8 v2 = inb(VGAREG_READ_MISC_OUTPUT) & ~0x02;
276 outb(v | v2, VGAREG_WRITE_MISC_OUTPUT);
282 // switch to color mode and enable CPU access 480 lines
283 outb(0xc3, VGAREG_WRITE_MISC_OUTPUT);
284 // more than 64k 3C4/04
285 outb(0x04, VGAREG_SEQU_ADDRESS);
286 outb(0x02, VGAREG_SEQU_DATA);