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 "bregs.h" // struct bregs
10 #include "farptr.h" // SET_FARVAR
11 #include "vgatables.h" // VGAREG_*
14 /****************************************************************
16 ****************************************************************/
19 biosfn_set_border_color(struct bregs *regs)
21 inb(VGAREG_ACTL_RESET);
22 outb(0x00, VGAREG_ACTL_ADDRESS);
23 u8 al = regs->bl & 0x0f;
26 outb(al, VGAREG_ACTL_WRITE_DATA);
27 u8 bl = regs->bl & 0x10;
30 for (i = 1; i < 4; i++) {
31 outb(i, VGAREG_ACTL_ADDRESS);
33 al = inb(VGAREG_ACTL_READ_DATA);
36 outb(al, VGAREG_ACTL_WRITE_DATA);
38 outb(0x20, VGAREG_ACTL_ADDRESS);
42 biosfn_set_overscan_border_color(struct bregs *regs)
44 inb(VGAREG_ACTL_RESET);
45 outb(0x11, VGAREG_ACTL_ADDRESS);
46 outb(regs->bh, VGAREG_ACTL_WRITE_DATA);
47 outb(0x20, VGAREG_ACTL_ADDRESS);
51 biosfn_read_overscan_border_color(struct bregs *regs)
53 inb(VGAREG_ACTL_RESET);
54 outb(0x11, VGAREG_ACTL_ADDRESS);
55 regs->bh = inb(VGAREG_ACTL_READ_DATA);
56 inb(VGAREG_ACTL_RESET);
57 outb(0x20, VGAREG_ACTL_ADDRESS);
61 biosfn_set_palette(struct bregs *regs)
63 inb(VGAREG_ACTL_RESET);
64 u8 bl = regs->bl & 0x01;
66 for (i = 1; i < 4; i++) {
67 outb(i, VGAREG_ACTL_ADDRESS);
69 u8 al = inb(VGAREG_ACTL_READ_DATA);
72 outb(al, VGAREG_ACTL_WRITE_DATA);
74 outb(0x20, VGAREG_ACTL_ADDRESS);
78 biosfn_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 biosfn_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 biosfn_set_all_palette_reg(struct bregs *regs)
100 inb(VGAREG_ACTL_RESET);
102 u8 *data_far = (u8*)(regs->dx + 0);
104 for (i = 0; i < 0x10; i++) {
105 outb(i, VGAREG_ACTL_ADDRESS);
106 u8 val = GET_FARVAR(regs->es, *data_far);
107 outb(val, VGAREG_ACTL_WRITE_DATA);
110 outb(0x11, VGAREG_ACTL_ADDRESS);
111 outb(GET_FARVAR(regs->es, *data_far), VGAREG_ACTL_WRITE_DATA);
112 outb(0x20, VGAREG_ACTL_ADDRESS);
116 biosfn_get_all_palette_reg(struct bregs *regs)
118 u8 *data_far = (u8*)(regs->dx + 0);
120 for (i = 0; i < 0x10; i++) {
121 inb(VGAREG_ACTL_RESET);
122 outb(i, VGAREG_ACTL_ADDRESS);
123 SET_FARVAR(regs->es, *data_far, inb(VGAREG_ACTL_READ_DATA));
126 inb(VGAREG_ACTL_RESET);
127 outb(0x11, VGAREG_ACTL_ADDRESS);
128 SET_FARVAR(regs->es, *data_far, inb(VGAREG_ACTL_READ_DATA));
129 inb(VGAREG_ACTL_RESET);
130 outb(0x20, VGAREG_ACTL_ADDRESS);
134 biosfn_toggle_intensity(struct bregs *regs)
136 inb(VGAREG_ACTL_RESET);
137 outb(0x10, VGAREG_ACTL_ADDRESS);
138 u8 val = (inb(VGAREG_ACTL_READ_DATA) & 0x7f) | ((regs->bl & 0x01) << 3);
139 outb(val, VGAREG_ACTL_WRITE_DATA);
140 outb(0x20, VGAREG_ACTL_ADDRESS);
144 biosfn_select_video_dac_color_page(struct bregs *regs)
146 inb(VGAREG_ACTL_RESET);
147 outb(0x10, VGAREG_ACTL_ADDRESS);
148 u8 val = inb(VGAREG_ACTL_READ_DATA);
149 if (!(regs->bl & 0x01)) {
150 val = (val & 0x7f) | (regs->bh << 7);
151 outb(val, VGAREG_ACTL_WRITE_DATA);
152 outb(0x20, VGAREG_ACTL_ADDRESS);
155 inb(VGAREG_ACTL_RESET);
156 outb(0x14, VGAREG_ACTL_ADDRESS);
161 outb(bh, VGAREG_ACTL_WRITE_DATA);
162 outb(0x20, VGAREG_ACTL_ADDRESS);
166 biosfn_read_video_dac_state(struct bregs *regs)
168 inb(VGAREG_ACTL_RESET);
169 outb(0x10, VGAREG_ACTL_ADDRESS);
170 u8 val1 = inb(VGAREG_ACTL_READ_DATA) >> 7;
172 inb(VGAREG_ACTL_RESET);
173 outb(0x14, VGAREG_ACTL_ADDRESS);
174 u8 val2 = inb(VGAREG_ACTL_READ_DATA) & 0x0f;
178 inb(VGAREG_ACTL_RESET);
179 outb(0x20, VGAREG_ACTL_ADDRESS);
186 /****************************************************************
188 ****************************************************************/
191 biosfn_set_single_dac_reg(struct bregs *regs)
193 outb(regs->bl, VGAREG_DAC_WRITE_ADDRESS);
194 outb(regs->dh, VGAREG_DAC_DATA);
195 outb(regs->ch, VGAREG_DAC_DATA);
196 outb(regs->cl, VGAREG_DAC_DATA);
200 biosfn_read_single_dac_reg(struct bregs *regs)
202 outb(regs->bl, VGAREG_DAC_READ_ADDRESS);
203 regs->dh = inb(VGAREG_DAC_DATA);
204 regs->ch = inb(VGAREG_DAC_DATA);
205 regs->cl = inb(VGAREG_DAC_DATA);
209 biosfn_set_all_dac_reg(struct bregs *regs)
211 outb(regs->bl, VGAREG_DAC_WRITE_ADDRESS);
212 u8 *data_far = (u8*)(regs->dx + 0);
213 int count = regs->cx;
215 outb(GET_FARVAR(regs->es, *data_far), VGAREG_DAC_DATA);
217 outb(GET_FARVAR(regs->es, *data_far), VGAREG_DAC_DATA);
219 outb(GET_FARVAR(regs->es, *data_far), VGAREG_DAC_DATA);
226 biosfn_read_all_dac_reg(struct bregs *regs)
228 outb(regs->bl, VGAREG_DAC_READ_ADDRESS);
229 u8 *data_far = (u8*)(regs->dx + 0);
230 int count = regs->cx;
232 SET_FARVAR(regs->es, *data_far, inb(VGAREG_DAC_DATA));
234 SET_FARVAR(regs->es, *data_far, inb(VGAREG_DAC_DATA));
236 SET_FARVAR(regs->es, *data_far, inb(VGAREG_DAC_DATA));
243 biosfn_set_pel_mask(struct bregs *regs)
245 outb(regs->bl, VGAREG_PEL_MASK);
249 biosfn_read_pel_mask(struct bregs *regs)
251 regs->bl = inb(VGAREG_PEL_MASK);
255 /****************************************************************
257 ****************************************************************/
260 biosfn_set_text_block_specifier(struct bregs *regs)
262 outw((regs->bl << 8) | 0x03, VGAREG_SEQU_ADDRESS);
268 outw(0x0100, VGAREG_SEQU_ADDRESS);
269 outw(0x0402, VGAREG_SEQU_ADDRESS);
270 outw(0x0704, VGAREG_SEQU_ADDRESS);
271 outw(0x0300, VGAREG_SEQU_ADDRESS);
272 outw(0x0204, VGAREG_GRDC_ADDRESS);
273 outw(0x0005, VGAREG_GRDC_ADDRESS);
274 outw(0x0406, VGAREG_GRDC_ADDRESS);
278 release_font_access()
280 outw(0x0100, VGAREG_SEQU_ADDRESS);
281 outw(0x0302, VGAREG_SEQU_ADDRESS);
282 outw(0x0304, VGAREG_SEQU_ADDRESS);
283 outw(0x0300, VGAREG_SEQU_ADDRESS);
284 u16 v = (inw(VGAREG_READ_MISC_OUTPUT) & 0x01) ? 0x0e : 0x0a;
285 outw((v << 8) | 0x06, VGAREG_GRDC_ADDRESS);
286 outw(0x0004, VGAREG_GRDC_ADDRESS);
287 outw(0x1005, VGAREG_GRDC_ADDRESS);
291 /****************************************************************
293 ****************************************************************/
296 biosfn_enable_video_addressing(struct bregs *regs)
298 u8 v = ((regs->al << 1) & 0x02) ^ 0x02;
299 u8 v2 = inb(VGAREG_READ_MISC_OUTPUT) & ~0x02;
300 outb(v | v2, VGAREG_WRITE_MISC_OUTPUT);
307 // switch to color mode and enable CPU access 480 lines
308 outb(0xc3, VGAREG_WRITE_MISC_OUTPUT);
309 // more than 64k 3C4/04
310 outb(0x04, VGAREG_SEQU_ADDRESS);
311 outb(0x02, VGAREG_SEQU_DATA);