blob: 77fcecdf8d9865e7bb3a42d75bbfcb880352c870 [file] [log] [blame]
Kevin O'Connor3471fdb2012-01-14 19:02:43 -05001// Standard VGA IO port access
2//
3// Copyright (C) 2012 Kevin O'Connor <kevin@koconnor.net>
4//
5// This file may be distributed under the terms of the GNU LGPLv3 license.
6
Kevin O'Connorf98bbf02012-01-27 23:09:02 -05007#include "farptr.h" // GET_FARVAR
Kevin O'Connorc682ffe2016-08-05 11:48:20 -04008#include "stdvga.h" // VGAREG_PEL_MASK
9#include "vgautil.h" // stdvga_pelmask_read
Kevin O'Connor4ade5232013-09-18 21:41:48 -040010#include "x86.h" // inb
Kevin O'Connor3471fdb2012-01-14 19:02:43 -050011
12u8
13stdvga_pelmask_read(void)
14{
15 return inb(VGAREG_PEL_MASK);
16}
17
18void
19stdvga_pelmask_write(u8 value)
20{
21 outb(value, VGAREG_PEL_MASK);
22}
23
24
25u8
26stdvga_misc_read(void)
27{
28 return inb(VGAREG_READ_MISC_OUTPUT);
29}
30
31void
32stdvga_misc_write(u8 value)
33{
34 outb(value, VGAREG_WRITE_MISC_OUTPUT);
35}
36
37void
38stdvga_misc_mask(u8 off, u8 on)
39{
40 stdvga_misc_write((stdvga_misc_read() & ~off) | on);
41}
42
43
44u8
45stdvga_sequ_read(u8 index)
46{
47 outb(index, VGAREG_SEQU_ADDRESS);
48 return inb(VGAREG_SEQU_DATA);
49}
50
51void
52stdvga_sequ_write(u8 index, u8 value)
53{
54 outw((value<<8) | index, VGAREG_SEQU_ADDRESS);
55}
56
57void
58stdvga_sequ_mask(u8 index, u8 off, u8 on)
59{
60 outb(index, VGAREG_SEQU_ADDRESS);
61 u8 v = inb(VGAREG_SEQU_DATA);
62 outb((v & ~off) | on, VGAREG_SEQU_DATA);
63}
64
65
66u8
67stdvga_grdc_read(u8 index)
68{
69 outb(index, VGAREG_GRDC_ADDRESS);
70 return inb(VGAREG_GRDC_DATA);
71}
72
73void
74stdvga_grdc_write(u8 index, u8 value)
75{
76 outw((value<<8) | index, VGAREG_GRDC_ADDRESS);
77}
78
79void
80stdvga_grdc_mask(u8 index, u8 off, u8 on)
81{
82 outb(index, VGAREG_GRDC_ADDRESS);
83 u8 v = inb(VGAREG_GRDC_DATA);
84 outb((v & ~off) | on, VGAREG_GRDC_DATA);
85}
86
87
88u8
89stdvga_crtc_read(u16 crtc_addr, u8 index)
90{
91 outb(index, crtc_addr);
92 return inb(crtc_addr + 1);
93}
94
95void
96stdvga_crtc_write(u16 crtc_addr, u8 index, u8 value)
97{
98 outw((value<<8) | index, crtc_addr);
99}
100
101void
102stdvga_crtc_mask(u16 crtc_addr, u8 index, u8 off, u8 on)
103{
104 outb(index, crtc_addr);
105 u8 v = inb(crtc_addr + 1);
106 outb((v & ~off) | on, crtc_addr + 1);
107}
108
109
110u8
111stdvga_attr_read(u8 index)
112{
113 inb(VGAREG_ACTL_RESET);
114 u8 orig = inb(VGAREG_ACTL_ADDRESS);
115 outb(index, VGAREG_ACTL_ADDRESS);
116 u8 v = inb(VGAREG_ACTL_READ_DATA);
117 inb(VGAREG_ACTL_RESET);
118 outb(orig, VGAREG_ACTL_ADDRESS);
119 return v;
120}
121
122void
123stdvga_attr_write(u8 index, u8 value)
124{
125 inb(VGAREG_ACTL_RESET);
126 u8 orig = inb(VGAREG_ACTL_ADDRESS);
127 outb(index, VGAREG_ACTL_ADDRESS);
128 outb(value, VGAREG_ACTL_WRITE_DATA);
129 outb(orig, VGAREG_ACTL_ADDRESS);
130}
131
132void
133stdvga_attr_mask(u8 index, u8 off, u8 on)
134{
135 inb(VGAREG_ACTL_RESET);
136 u8 orig = inb(VGAREG_ACTL_ADDRESS);
137 outb(index, VGAREG_ACTL_ADDRESS);
138 u8 v = inb(VGAREG_ACTL_READ_DATA);
139 outb((v & ~off) | on, VGAREG_ACTL_WRITE_DATA);
140 outb(orig, VGAREG_ACTL_ADDRESS);
141}
142
143u8
144stdvga_attrindex_read(void)
145{
146 inb(VGAREG_ACTL_RESET);
147 return inb(VGAREG_ACTL_ADDRESS);
148}
149
150void
151stdvga_attrindex_write(u8 value)
152{
153 inb(VGAREG_ACTL_RESET);
154 outb(value, VGAREG_ACTL_ADDRESS);
155}
156
157
158void
159stdvga_dac_read(u16 seg, u8 *data_far, u8 start, int count)
160{
161 outb(start, VGAREG_DAC_READ_ADDRESS);
162 while (count) {
163 SET_FARVAR(seg, *data_far, inb(VGAREG_DAC_DATA));
164 data_far++;
165 SET_FARVAR(seg, *data_far, inb(VGAREG_DAC_DATA));
166 data_far++;
167 SET_FARVAR(seg, *data_far, inb(VGAREG_DAC_DATA));
168 data_far++;
169 count--;
170 }
171}
172
173void
174stdvga_dac_write(u16 seg, u8 *data_far, u8 start, int count)
175{
176 outb(start, VGAREG_DAC_WRITE_ADDRESS);
177 while (count) {
178 outb(GET_FARVAR(seg, *data_far), VGAREG_DAC_DATA);
179 data_far++;
180 outb(GET_FARVAR(seg, *data_far), VGAREG_DAC_DATA);
181 data_far++;
182 outb(GET_FARVAR(seg, *data_far), VGAREG_DAC_DATA);
183 data_far++;
184 count--;
185 }
186}