1 // Standard VGA IO port access
3 // Copyright (C) 2012 Kevin O'Connor <kevin@koconnor.net>
5 // This file may be distributed under the terms of the GNU LGPLv3 license.
7 #include "farptr.h" // GET_FARVAR
8 #include "stdvga.h" // stdvga_pelmask_read
9 #include "x86.h" // inb
12 stdvga_pelmask_read(void)
14 return inb(VGAREG_PEL_MASK);
18 stdvga_pelmask_write(u8 value)
20 outb(value, VGAREG_PEL_MASK);
25 stdvga_misc_read(void)
27 return inb(VGAREG_READ_MISC_OUTPUT);
31 stdvga_misc_write(u8 value)
33 outb(value, VGAREG_WRITE_MISC_OUTPUT);
37 stdvga_misc_mask(u8 off, u8 on)
39 stdvga_misc_write((stdvga_misc_read() & ~off) | on);
44 stdvga_sequ_read(u8 index)
46 outb(index, VGAREG_SEQU_ADDRESS);
47 return inb(VGAREG_SEQU_DATA);
51 stdvga_sequ_write(u8 index, u8 value)
53 outw((value<<8) | index, VGAREG_SEQU_ADDRESS);
57 stdvga_sequ_mask(u8 index, u8 off, u8 on)
59 outb(index, VGAREG_SEQU_ADDRESS);
60 u8 v = inb(VGAREG_SEQU_DATA);
61 outb((v & ~off) | on, VGAREG_SEQU_DATA);
66 stdvga_grdc_read(u8 index)
68 outb(index, VGAREG_GRDC_ADDRESS);
69 return inb(VGAREG_GRDC_DATA);
73 stdvga_grdc_write(u8 index, u8 value)
75 outw((value<<8) | index, VGAREG_GRDC_ADDRESS);
79 stdvga_grdc_mask(u8 index, u8 off, u8 on)
81 outb(index, VGAREG_GRDC_ADDRESS);
82 u8 v = inb(VGAREG_GRDC_DATA);
83 outb((v & ~off) | on, VGAREG_GRDC_DATA);
88 stdvga_crtc_read(u16 crtc_addr, u8 index)
90 outb(index, crtc_addr);
91 return inb(crtc_addr + 1);
95 stdvga_crtc_write(u16 crtc_addr, u8 index, u8 value)
97 outw((value<<8) | index, crtc_addr);
101 stdvga_crtc_mask(u16 crtc_addr, u8 index, u8 off, u8 on)
103 outb(index, crtc_addr);
104 u8 v = inb(crtc_addr + 1);
105 outb((v & ~off) | on, crtc_addr + 1);
110 stdvga_attr_read(u8 index)
112 inb(VGAREG_ACTL_RESET);
113 u8 orig = inb(VGAREG_ACTL_ADDRESS);
114 outb(index, VGAREG_ACTL_ADDRESS);
115 u8 v = inb(VGAREG_ACTL_READ_DATA);
116 inb(VGAREG_ACTL_RESET);
117 outb(orig, VGAREG_ACTL_ADDRESS);
122 stdvga_attr_write(u8 index, u8 value)
124 inb(VGAREG_ACTL_RESET);
125 u8 orig = inb(VGAREG_ACTL_ADDRESS);
126 outb(index, VGAREG_ACTL_ADDRESS);
127 outb(value, VGAREG_ACTL_WRITE_DATA);
128 outb(orig, VGAREG_ACTL_ADDRESS);
132 stdvga_attr_mask(u8 index, u8 off, u8 on)
134 inb(VGAREG_ACTL_RESET);
135 u8 orig = inb(VGAREG_ACTL_ADDRESS);
136 outb(index, VGAREG_ACTL_ADDRESS);
137 u8 v = inb(VGAREG_ACTL_READ_DATA);
138 outb((v & ~off) | on, VGAREG_ACTL_WRITE_DATA);
139 outb(orig, VGAREG_ACTL_ADDRESS);
143 stdvga_attrindex_read(void)
145 inb(VGAREG_ACTL_RESET);
146 return inb(VGAREG_ACTL_ADDRESS);
150 stdvga_attrindex_write(u8 value)
152 inb(VGAREG_ACTL_RESET);
153 outb(value, VGAREG_ACTL_ADDRESS);
158 stdvga_dac_read(u16 seg, u8 *data_far, u8 start, int count)
160 outb(start, VGAREG_DAC_READ_ADDRESS);
162 SET_FARVAR(seg, *data_far, inb(VGAREG_DAC_DATA));
164 SET_FARVAR(seg, *data_far, inb(VGAREG_DAC_DATA));
166 SET_FARVAR(seg, *data_far, inb(VGAREG_DAC_DATA));
173 stdvga_dac_write(u16 seg, u8 *data_far, u8 start, int count)
175 outb(start, VGAREG_DAC_WRITE_ADDRESS);
177 outb(GET_FARVAR(seg, *data_far), VGAREG_DAC_DATA);
179 outb(GET_FARVAR(seg, *data_far), VGAREG_DAC_DATA);
181 outb(GET_FARVAR(seg, *data_far), VGAREG_DAC_DATA);