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" // VGAREG_PEL_MASK
9
#include "vgautil.h" // stdvga_pelmask_read
10
#include "x86.h" // inb
13
stdvga_pelmask_read(void)
15
return inb(VGAREG_PEL_MASK);
19
stdvga_pelmask_write(u8 value)
21
outb(value, VGAREG_PEL_MASK);
26
stdvga_misc_read(void)
28
return inb(VGAREG_READ_MISC_OUTPUT);
32
stdvga_misc_write(u8 value)
34
outb(value, VGAREG_WRITE_MISC_OUTPUT);
38
stdvga_misc_mask(u8 off, u8 on)
40
stdvga_misc_write((stdvga_misc_read() & ~off) | on);
45
stdvga_sequ_read(u8 index)
47
outb(index, VGAREG_SEQU_ADDRESS);
48
return inb(VGAREG_SEQU_DATA);
52
stdvga_sequ_write(u8 index, u8 value)
54
outw((value<<8) | index, VGAREG_SEQU_ADDRESS);
58
stdvga_sequ_mask(u8 index, u8 off, u8 on)
60
outb(index, VGAREG_SEQU_ADDRESS);
61
u8 v = inb(VGAREG_SEQU_DATA);
62
outb((v & ~off) | on, VGAREG_SEQU_DATA);
67
stdvga_grdc_read(u8 index)
69
outb(index, VGAREG_GRDC_ADDRESS);
70
return inb(VGAREG_GRDC_DATA);
74
stdvga_grdc_write(u8 index, u8 value)
76
outw((value<<8) | index, VGAREG_GRDC_ADDRESS);
80
stdvga_grdc_mask(u8 index, u8 off, u8 on)
82
outb(index, VGAREG_GRDC_ADDRESS);
83
u8 v = inb(VGAREG_GRDC_DATA);
84
outb((v & ~off) | on, VGAREG_GRDC_DATA);
89
stdvga_crtc_read(u16 crtc_addr, u8 index)
91
outb(index, crtc_addr);
92
return inb(crtc_addr + 1);
96
stdvga_crtc_write(u16 crtc_addr, u8 index, u8 value)
98
outw((value<<8) | index, crtc_addr);
102
stdvga_crtc_mask(u16 crtc_addr, u8 index, u8 off, u8 on)
104
outb(index, crtc_addr);
105
u8 v = inb(crtc_addr + 1);
106
outb((v & ~off) | on, crtc_addr + 1);
111
stdvga_attr_read(u8 index)
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);
123
stdvga_attr_write(u8 index, u8 value)
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);
133
stdvga_attr_mask(u8 index, u8 off, u8 on)
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);
144
stdvga_attrindex_read(void)
146
inb(VGAREG_ACTL_RESET);
147
return inb(VGAREG_ACTL_ADDRESS);
151
stdvga_attrindex_write(u8 value)
153
inb(VGAREG_ACTL_RESET);
154
outb(value, VGAREG_ACTL_ADDRESS);
159
stdvga_dac_read(u16 seg, u8 *data_far, u8 start, int count)
161
outb(start, VGAREG_DAC_READ_ADDRESS);
163
SET_FARVAR(seg, *data_far, inb(VGAREG_DAC_DATA));
165
SET_FARVAR(seg, *data_far, inb(VGAREG_DAC_DATA));
167
SET_FARVAR(seg, *data_far, inb(VGAREG_DAC_DATA));
174
stdvga_dac_write(u16 seg, u8 *data_far, u8 start, int count)
176
outb(start, VGAREG_DAC_WRITE_ADDRESS);
178
outb(GET_FARVAR(seg, *data_far), VGAREG_DAC_DATA);
180
outb(GET_FARVAR(seg, *data_far), VGAREG_DAC_DATA);
182
outb(GET_FARVAR(seg, *data_far), VGAREG_DAC_DATA);