2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
5 * PURPOSE: VGA hardware emulation
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
12 /* DEFINES ********************************************************************/
14 #define VGA_NUM_BANKS 4
15 #define VGA_BANK_SIZE 0x10000
16 #define VGA_MAX_COLORS 256
17 #define VGA_PALETTE_SIZE (VGA_MAX_COLORS * 3)
18 #define VGA_BITMAP_INFO_SIZE (sizeof(BITMAPINFOHEADER) + 2 * (VGA_PALETTE_SIZE / 3))
19 #define VGA_MINIMUM_WIDTH 400
20 #define VGA_MINIMUM_HEIGHT 300
21 #define VGA_DAC_TO_COLOR(x) (((x) << 2) | ((x) >> 4))
22 #define VGA_COLOR_TO_DAC(x) ((x) >> 2)
23 #define VGA_INTERLACE_HIGH_BIT (1 << 13)
24 #define VGA_FONT_BANK 2
25 #define VGA_FONT_CHARACTERS 256
26 #define VGA_MAX_FONT_HEIGHT 32
27 #define VGA_FONT_SIZE (VGA_FONT_CHARACTERS * VGA_MAX_FONT_HEIGHT)
30 /* Register I/O ports */
32 #define VGA_MISC_READ 0x3CC
33 #define VGA_MISC_WRITE 0x3C2
35 #define VGA_INSTAT0_READ 0x3C2
37 #define VGA_INSTAT1_READ_MONO 0x3BA
38 #define VGA_INSTAT1_READ_COLOR 0x3DA
40 #define VGA_FEATURE_READ 0x3CA
41 #define VGA_FEATURE_WRITE_MONO 0x3BA
42 #define VGA_FEATURE_WRITE_COLOR 0x3DA
44 #define VGA_AC_INDEX 0x3C0
45 #define VGA_AC_WRITE 0x3C0
46 #define VGA_AC_READ 0x3C1
48 #define VGA_SEQ_INDEX 0x3C4
49 #define VGA_SEQ_DATA 0x3C5
51 #define VGA_DAC_MASK 0x3C6
52 #define VGA_DAC_READ_INDEX 0x3C7
53 #define VGA_DAC_WRITE_INDEX 0x3C8
54 #define VGA_DAC_DATA 0x3C9
56 #define VGA_CRTC_INDEX_MONO 0x3B4
57 #define VGA_CRTC_DATA_MONO 0x3B5
58 #define VGA_CRTC_INDEX_COLOR 0x3D4
59 #define VGA_CRTC_DATA_COLOR 0x3D5
61 #define VGA_GC_INDEX 0x3CE
62 #define VGA_GC_DATA 0x3CF
67 // Miscellaneous and Status Registers
70 /* Miscellaneous register bits */
71 #define VGA_MISC_COLOR (1 << 0)
72 #define VGA_MISC_RAM_ENABLED (1 << 1)
73 // #define VGA_MISC_CSEL1 (1 << 2)
74 // #define VGA_MISC_CSEL2 (1 << 3)
75 #define VGA_MISC_OE_PAGESEL (1 << 5)
76 #define VGA_MISC_HSYNCP (1 << 6)
77 #define VGA_MISC_VSYNCP (1 << 7)
79 /* Status register flags */
80 #define VGA_STAT_DD (1 << 0)
81 #define VGA_STAT_VRETRACE (1 << 3)
85 // Sequencer Registers
88 /* Sequencer reset register bits */
89 #define VGA_SEQ_RESET_AR (1 << 0)
90 #define VGA_SEQ_RESET_SR (1 << 1)
92 /* Sequencer clock register bits */
93 #define VGA_SEQ_CLOCK_98DM (1 << 0)
94 #define VGA_SEQ_CLOCK_SLR (1 << 2)
95 #define VGA_SEQ_CLOCK_DCR (1 << 3)
96 #define VGA_SEQ_CLOCK_S4 (1 << 4)
97 #define VGA_SEQ_CLOCK_SD (1 << 5)
99 /* Sequencer memory register bits */
100 #define VGA_SEQ_MEM_EXT (1 << 1)
101 #define VGA_SEQ_MEM_OE_DIS (1 << 2)
102 #define VGA_SEQ_MEM_C4 (1 << 3)
116 // CRT Controller Registers
119 /* CRTC overflow register bits */
120 #define VGA_CRTC_OVERFLOW_VT8 (1 << 0)
121 #define VGA_CRTC_OVERFLOW_VDE8 (1 << 1)
122 #define VGA_CRTC_OVERFLOW_VRS8 (1 << 2)
123 #define VGA_CRTC_OVERFLOW_SVB8 (1 << 3)
124 #define VGA_CRTC_OVERFLOW_LC8 (1 << 4)
125 #define VGA_CRTC_OVERFLOW_VT9 (1 << 5)
126 #define VGA_CRTC_OVERFLOW_VDE9 (1 << 6)
127 #define VGA_CRTC_OVERFLOW_VRS9 (1 << 7)
129 /* CRTC underline register bits */
130 #define VGA_CRTC_UNDERLINE_DWORD (1 << 6)
132 /* CRTC max scanline register bits */
133 #define VGA_CRTC_MAXSCANLINE_DOUBLE (1 << 7)
135 /* CRTC mode control register bits */
136 #define VGA_CRTC_MODE_CONTROL_WRAP (1 << 5)
137 #define VGA_CRTC_MODE_CONTROL_BYTE (1 << 6)
138 #define VGA_CRTC_MODE_CONTROL_SYNC (1 << 7)
142 VGA_CRTC_HORZ_TOTAL_REG
,
143 VGA_CRTC_END_HORZ_DISP_REG
,
144 VGA_CRTC_START_HORZ_BLANKING_REG
,
145 VGA_CRTC_END_HORZ_BLANKING_REG
,
146 VGA_CRTC_START_HORZ_RETRACE_REG
,
147 VGA_CRTC_END_HORZ_RETRACE_REG
,
148 VGA_CRTC_VERT_TOTAL_REG
,
149 VGA_CRTC_OVERFLOW_REG
,
150 VGA_CRTC_PRESET_ROW_SCAN_REG
,
151 VGA_CRTC_MAX_SCAN_LINE_REG
,
152 VGA_CRTC_CURSOR_START_REG
,
153 VGA_CRTC_CURSOR_END_REG
,
154 VGA_CRTC_START_ADDR_HIGH_REG
,
155 VGA_CRTC_START_ADDR_LOW_REG
,
156 VGA_CRTC_CURSOR_LOC_HIGH_REG
,
157 VGA_CRTC_CURSOR_LOC_LOW_REG
,
158 VGA_CRTC_VERT_RETRACE_START_REG
,
159 VGA_CRTC_VERT_RETRACE_END_REG
,
160 VGA_CRTC_VERT_DISP_END_REG
,
162 VGA_CRTC_UNDERLINE_REG
,
163 VGA_CRTC_START_VERT_BLANKING_REG
,
164 VGA_CRTC_END_VERT_BLANKING_REG
,
165 VGA_CRTC_MODE_CONTROL_REG
,
166 VGA_CRTC_LINE_COMPARE_REG
,
172 // Graphics Controller Registers
175 /* Graphics controller mode register bits */
176 #define VGA_GC_MODE_READ (1 << 3)
177 #define VGA_GC_MODE_OE (1 << 4)
178 #define VGA_GC_MODE_SHIFTREG (1 << 5)
179 #define VGA_GC_MODE_SHIFT256 (1 << 6)
181 /* Graphics controller miscellaneous register bits */
182 #define VGA_GC_MISC_NOALPHA (1 << 0)
183 #define VGA_GC_MISC_OE (1 << 1)
188 VGA_GC_ENABLE_RESET_REG
,
189 VGA_GC_COLOR_COMPARE_REG
,
191 VGA_GC_READ_MAP_SEL_REG
,
194 VGA_GC_COLOR_IGNORE_REG
,
201 // Attribute Controller Registers
202 // They are a relinquish of the CGA/EGA era.
205 /* AC mode control register bits */
206 #define VGA_AC_CONTROL_ATGE (1 << 0)
207 #define VGA_AC_CONTROL_MONO (1 << 1)
208 #define VGA_AC_CONTROL_LGE (1 << 2)
209 #define VGA_AC_CONTROL_BLINK (1 << 3)
210 #define VGA_AC_CONTROL_PPM (1 << 5)
211 #define VGA_AC_CONTROL_8BIT (1 << 6)
212 #define VGA_AC_CONTROL_P54S (1 << 7)
234 VGA_AC_COLOR_PLANE_REG
,
235 VGA_AC_HORZ_PANNING_REG
,
236 VGA_AC_COLOR_SEL_REG
,
241 typedef struct _VGA_REGISTERS
244 UCHAR Sequencer
[VGA_SEQ_MAX_REG
];
245 UCHAR CRT
[VGA_CRTC_MAX_REG
];
246 UCHAR Graphics
[VGA_GC_MAX_REG
];
247 UCHAR Attribute
[VGA_AC_MAX_REG
];
248 } VGA_REGISTERS
, *PVGA_REGISTERS
;
251 /* FUNCTIONS ******************************************************************/
253 VOID
ScreenEventHandler(PWINDOW_BUFFER_SIZE_RECORD ScreenEvent
);
254 BOOL
VgaAttachToConsole(VOID
);
255 VOID
VgaDetachFromConsole(BOOL ChangeMode
);
257 COORD
VgaGetDisplayResolution(VOID
);
258 VOID
VgaRefreshDisplay(VOID
);
259 VOID FASTCALL
VgaReadMemory(ULONG Address
, PVOID Buffer
, ULONG Size
);
260 BOOLEAN FASTCALL
VgaWriteMemory(ULONG Address
, PVOID Buffer
, ULONG Size
);
261 VOID
VgaWriteFont(UINT FontNumber
, CONST UCHAR
*FontData
, UINT Height
);
262 VOID
VgaClearMemory(VOID
);
263 BOOLEAN
VgaGetDoubleVisionState(PBOOLEAN Horizontal
, PBOOLEAN Vertical
);
265 BOOLEAN
VgaInitialize(HANDLE TextHandle
);
266 VOID
VgaCleanup(VOID
);