d01b8ac5e7618b54ee5dbc1410ec3d443baa7818
[reactos.git] / reactos / subsystems / ntvdm / bios / vidbios.c
1 /*
2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
4 * FILE: vidbios.c
5 * PURPOSE: VDM Video BIOS Support Library
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
8 */
9
10 /* INCLUDES *******************************************************************/
11
12 #define NDEBUG
13
14 #include "emulator.h"
15 #include "cpu/cpu.h"
16 #include "cpu/bop.h"
17
18 #include "bios.h"
19 // #include "vidbios.h"
20
21 #include "io.h"
22 #include "hardware/vga.h"
23
24 /* DEFINES ********************************************************************/
25
26 /* BOP Identifiers */
27 #define BOP_VIDEO_INT 0x10
28
29 /* MACROS *********************************************************************/
30
31 //
32 // These macros are defined for ease-of-use of some VGA I/O ports
33 // whose addresses depend whether we are in Monochrome or Colour mode.
34 //
35 #define VGA_INSTAT1_READ Bda->CrtBasePort + 6 // VGA_INSTAT1_READ_MONO or VGA_INSTAT1_READ_COLOR
36 #define VGA_CRTC_INDEX Bda->CrtBasePort // VGA_CRTC_INDEX_MONO or VGA_CRTC_INDEX_COLOR
37 #define VGA_CRTC_DATA Bda->CrtBasePort + 1 // VGA_CRTC_DATA_MONO or VGA_CRTC_DATA_COLOR
38
39 /* PRIVATE VARIABLES **********************************************************/
40
41 /*
42 * VGA Register Configurations for BIOS Video Modes
43 * The configurations come from DOSBox.
44 */
45 static VGA_REGISTERS VideoMode_40x25_text =
46 {
47 /* Miscellaneous Register */
48 0x67,
49
50 /* Sequencer Registers */
51 {0x00, 0x08, 0x03, 0x00, 0x07},
52
53 /* CRTC Registers */
54 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0xA0, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
55 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x1F, 0x96, 0xB9, 0xA3,
56 0xFF},
57
58 /* GC Registers */
59 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
60
61 /* AC Registers */
62 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
63 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
64 };
65
66 static VGA_REGISTERS VideoMode_80x25_text =
67 {
68 /* Miscellaneous Register */
69 0x67,
70
71 /* Sequencer Registers */
72 {0x00, 0x00, 0x03, 0x00, 0x07},
73
74 /* CRTC Registers */
75 {0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 0xBF, 0x1F, 0x00, 0x4F, 0x0D, 0x0E,
76 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x1F, 0x96, 0xB9, 0xA3,
77 0xFF},
78
79 /* GC Registers */
80 {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0E, 0x0F, 0xFF},
81
82 /* AC Registers */
83 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
84 0x3C, 0x3D, 0x3E, 0x3F, 0x0C, 0x00, 0x0F, 0x08, 0x00}
85 };
86
87 static VGA_REGISTERS VideoMode_320x200_4color =
88 {
89 /* Miscellaneous Register */
90 0x63,
91
92 /* Sequencer Registers */
93 {0x00, 0x09, 0x03, 0x00, 0x02},
94
95 /* CRTC Registers */
96 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
97 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xA2,
98 0xFF},
99
100 /* GC Registers */
101 {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0F, 0x0F, 0xFF},
102
103 /* AC Registers */
104 {0x00, 0x13, 0x15, 0x17, 0x02, 0x04, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
105 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
106 };
107
108 static VGA_REGISTERS VideoMode_640x200_2color =
109 {
110 /* Miscellaneous Register */
111 0x63,
112
113 /* Sequencer Registers */
114 {0x00, 0x09, 0x0F, 0x00, 0x02},
115
116 /* CRTC Registers */
117 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC1, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xC2,
119 0xFF},
120
121 /* GC Registers */
122 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0xFF},
123
124 /* AC Registers */
125 {0x00, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
126 0x17, 0x17, 0x17, 0x17, 0x01, 0x00, 0x01, 0x00, 0x00}
127 };
128
129 static VGA_REGISTERS VideoMode_320x200_16color =
130 {
131 /* Miscellaneous Register */
132 0x63,
133
134 /* Sequencer Registers */
135 {0x00, 0x09, 0x0F, 0x00, 0x02},
136
137 /* CRTC Registers */
138 {0x2D, 0x27, 0x28, 0x90, 0x2B, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
139 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x14, 0x00, 0x96, 0xB9, 0xE3,
140 0xFF},
141
142 /* GC Registers */
143 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
144
145 /* AC Registers */
146 // {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
147 // 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
148 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
149 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
150 };
151
152 static VGA_REGISTERS VideoMode_640x200_16color =
153 {
154 /* Miscellaneous Register */
155 0x63,
156
157 /* Sequencer Registers */
158 {0x00, 0x01, 0x0F, 0x00, 0x02},
159
160 /* CRTC Registers */
161 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0xC0, 0x00, 0x00,
162 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x00, 0x96, 0xB9, 0xE3,
163 0xFF},
164
165 /* GC Registers */
166 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
167
168 /* AC Registers */
169 // {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
170 // 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
171 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x10, 0x11, 0x12, 0x13,
172 0x14, 0x15, 0x16, 0x17, 0x01, 0x00, 0x0F, 0x00, 0x00}
173 };
174
175 static VGA_REGISTERS VideoMode_640x350_16color =
176 {
177 /* Miscellaneous Register */
178 0xA3,
179
180 /* Sequencer Registers */
181 {0x00, 0x01, 0x0F, 0x00, 0x02},
182
183 /* CRTC Registers */
184 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x40, 0x00, 0x00,
185 0x00, 0x00, 0x00, 0x00, 0x83, 0x85, 0x5D, 0x28, 0x0F, 0x63, 0xBA, 0xE3,
186 0xFF},
187
188 /* GC Registers */
189 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
190
191 /* AC Registers */
192 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
193 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
194 };
195
196 static VGA_REGISTERS VideoMode_640x480_2color =
197 {
198 /* Miscellaneous Register */
199 0xE3,
200
201 /* Sequencer Registers */
202 {0x00, 0x01, 0x0F, 0x00, 0x02},
203
204 /* CRTC Registers */
205 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xC3,
207 0xFF},
208
209 /* GC Registers */
210 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
211
212 /* AC Registers */
213 {0x00, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
214 0x3F, 0x3F, 0x3F, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
215 };
216
217 static VGA_REGISTERS VideoMode_640x480_16color =
218 {
219 /* Miscellaneous Register */
220 0xE3,
221
222 /* Sequencer Registers */
223 {0x00, 0x01, 0x0F, 0x00, 0x02},
224
225 /* CRTC Registers */
226 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00,
227 0x00, 0x00, 0x00, 0x00, 0xEA, 0x8C, 0xDF, 0x28, 0x00, 0xE7, 0x04, 0xE3,
228 0xFF},
229
230 /* GC Registers */
231 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0xFF},
232
233 /* AC Registers */
234 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B,
235 0x3C, 0x3D, 0x3E, 0x3F, 0x01, 0x00, 0x0F, 0x00, 0x00}
236 };
237
238 static VGA_REGISTERS VideoMode_320x200_256color =
239 {
240 /* Miscellaneous Register */
241 0x63,
242
243 /* Sequencer Registers */
244 {0x00, 0x01, 0x0F, 0x00, 0x0E},
245
246 /* CRTC Registers */
247 {0x5F, 0x4F, 0x50, 0x82, 0x54, 0x80, 0xBF, 0x1F, 0x00, 0x41, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x9C, 0x8E, 0x8F, 0x28, 0x40, 0x96, 0xB9, 0xA3,
249 0xFF},
250
251 /* GC Registers */
252 {0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF},
253
254 /* AC Registers */
255 {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
256 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00}
257 };
258
259 /* See http://wiki.osdev.org/Drawing_In_Protected_Mode#Locating_Video_Memory */
260 static PVGA_REGISTERS VideoModes[BIOS_MAX_VIDEO_MODE + 1] =
261 {
262 &VideoMode_40x25_text, /* Mode 00h */ // 16 color (mono)
263 &VideoMode_40x25_text, /* Mode 01h */ // 16 color
264 &VideoMode_80x25_text, /* Mode 02h */ // 16 color (mono)
265 &VideoMode_80x25_text, /* Mode 03h */ // 16 color
266 &VideoMode_320x200_4color, /* Mode 04h */ // CGA 4 color
267 &VideoMode_320x200_4color, /* Mode 05h */ // CGA same (m) (uses 3rd CGA palette)
268 &VideoMode_640x200_2color, /* Mode 06h */ // CGA 640*200 2 color
269 NULL, /* Mode 07h */ // MDA monochrome text 80*25
270 NULL, /* Mode 08h */ // PCjr
271 NULL, /* Mode 09h */ // PCjr
272 NULL, /* Mode 0Ah */ // PCjr
273 NULL, /* Mode 0Bh */ // Reserved
274 NULL, /* Mode 0Ch */ // Reserved
275 &VideoMode_320x200_16color, /* Mode 0Dh */ // EGA 320*200 16 color
276 &VideoMode_640x200_16color, /* Mode 0Eh */ // EGA 640*200 16 color
277 NULL, /* Mode 0Fh */ // EGA 640*350 mono
278 &VideoMode_640x350_16color, /* Mode 10h */ // EGA 640*350 HiRes 16 color
279 &VideoMode_640x480_2color, /* Mode 11h */ // VGA 640*480 mono
280 &VideoMode_640x480_16color, /* Mode 12h */ // VGA
281 &VideoMode_320x200_256color, /* Mode 13h */ // VGA
282 };
283
284 // FIXME: Are they computable with the previous data ??
285 // Values taken from DOSBox.
286 static WORD VideoModePageSize[BIOS_MAX_VIDEO_MODE + 1] =
287 {
288 0x0800, 0x0800, 0x1000, 0x1000,
289 0x4000, 0x4000, 0x4000, 0x1000,
290 0x0000, 0x0000, 0x0000, 0x0000,
291 0x0000, 0x2000, 0x4000, 0x8000,
292 0x8000, 0xA000, 0xA000, 0x2000
293 };
294
295 /*
296 * BIOS Mode Palettes
297 *
298 * Many people have different versions of those palettes
299 * (e.g. DOSBox, http://www.brokenthorn.com/Resources/OSDevVid2.html ,
300 * etc...) A choice should be made at some point.
301 */
302
303 // This is the same as EgaPalette__HiRes
304 static CONST COLORREF TextPalette[VGA_MAX_COLORS / 4] =
305 {
306 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
307 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
308 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
309 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
310
311 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
312 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
313 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
314 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
315
316
317 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
318 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
319 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
320 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
321
322 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
323 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
324 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
325 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
326 };
327
328 // Unused at the moment
329 static CONST COLORREF mtext_palette[64] =
330 {
331 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
332 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
333 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
334 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
335 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
336 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
337 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
338 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
339
340 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
341 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
342 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
343 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
344 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
345 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
346 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
347 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
348 };
349
350 // Unused at the moment
351 static CONST COLORREF mtext_s3_palette[64] =
352 {
353 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
354 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
355 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
356 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
357 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
358 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
359 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
360 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
361
362 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
363 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
364 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
365 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
366 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
367 RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA), RGB(0xAA, 0xAA, 0xAA),
368 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF),
369 RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF), RGB(0xFF, 0xFF, 0xFF)
370 };
371
372 #if 0
373
374 // Unused at the moment
375 static CONST COLORREF CgaPalette[16] =
376 {
377 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
378 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
379 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
380 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
381 };
382
383 /* CGA palette 1 */
384 static CONST BYTE CgaPalette1[] =
385 {
386 0x00, /* 0 - Black */
387 0x03, /* 1 - Cyan */
388 0x05, /* 2- Magenta */
389 0x07, /* 3 - White */
390 }
391
392 /* CGA palette 1 bright */
393 static CONST BYTE CgaPalette1i[] =
394 {
395 0x00, /* 0 - Black */
396 0x13, /* 1 - Light cyan */
397 0x15, /* 2 - Light magenta */
398 0x17, /* 3 - Bright White */
399 };
400
401 /* CGA palette 2 */
402 static CONST BYTE CgaPalette2[] =
403 {
404 0x00, /* 0 - Black */
405 0x02, /* 1 - Green */
406 0x04, /* 2 - Red */
407 0x06, /* 3 - Brown */
408 };
409
410 /* CGA palette 2 bright */
411 static CONST BYTE CgaPalette2i[] =
412 {
413 0x00, /* 0 - Black */
414 0x12, /* 1 - Light green */
415 0x14, /* 2 - Light red */
416 0x16, /* 3 - Yellow */
417 };
418
419 // Unused at the moment; same palette as EgaPalette__16Colors
420 static CONST COLORREF CgaPalette2[VGA_MAX_COLORS / 4] =
421 {
422 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
423 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
424 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
425 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
426
427 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
428 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
429 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
430 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
431
432 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
433 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
434 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
435 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
436
437 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
438 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
439 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
440 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
441 };
442
443 #endif
444
445 static CONST COLORREF EgaPalette__16Colors[VGA_MAX_COLORS / 4] =
446 {
447 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
448 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
449
450 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
451 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
452
453
454 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
455 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
456
457 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
458 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
459
460
461
462 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
463 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
464
465 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
466 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
467
468
469 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
470 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
471
472 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
473 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
474 };
475
476 // This is the same as TextPalette
477 static CONST COLORREF EgaPalette__HiRes[VGA_MAX_COLORS / 4] =
478 {
479 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
480 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0xAA, 0x00), RGB(0xAA, 0xAA, 0xAA),
481 RGB(0x00, 0x00, 0x55), RGB(0x00, 0x00, 0xFF), RGB(0x00, 0xAA, 0x55), RGB(0x00, 0xAA, 0xFF),
482 RGB(0xAA, 0x00, 0x55), RGB(0xAA, 0x00, 0xFF), RGB(0xAA, 0xAA, 0x55), RGB(0xAA, 0xAA, 0xFF),
483
484 RGB(0x00, 0x55, 0x00), RGB(0x00, 0x55, 0xAA), RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0xAA),
485 RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0x55, 0xAA), RGB(0xAA, 0xFF, 0x00), RGB(0xAA, 0xFF, 0xAA),
486 RGB(0x00, 0x55, 0x55), RGB(0x00, 0x55, 0xFF), RGB(0x00, 0xFF, 0x55), RGB(0x00, 0xFF, 0xFF),
487 RGB(0xAA, 0x55, 0x55), RGB(0xAA, 0x55, 0xFF), RGB(0xAA, 0xFF, 0x55), RGB(0xAA, 0xFF, 0xFF),
488
489
490 RGB(0x55, 0x00, 0x00), RGB(0x55, 0x00, 0xAA), RGB(0x55, 0xAA, 0x00), RGB(0x55, 0xAA, 0xAA),
491 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x00, 0xAA), RGB(0xFF, 0xAA, 0x00), RGB(0xFF, 0xAA, 0xAA),
492 RGB(0x55, 0x00, 0x55), RGB(0x55, 0x00, 0xFF), RGB(0x55, 0xAA, 0x55), RGB(0x55, 0xAA, 0xFF),
493 RGB(0xFF, 0x00, 0x55), RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0xAA, 0x55), RGB(0xFF, 0xAA, 0xFF),
494
495 RGB(0x55, 0x55, 0x00), RGB(0x55, 0x55, 0xAA), RGB(0x55, 0xFF, 0x00), RGB(0x55, 0xFF, 0xAA),
496 RGB(0xFF, 0x55, 0x00), RGB(0xFF, 0x55, 0xAA), RGB(0xFF, 0xFF, 0x00), RGB(0xFF, 0xFF, 0xAA),
497 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
498 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF)
499 };
500
501 #define USE_REACTOS_COLORS
502 // #define USE_DOSBOX_COLORS
503
504 /*
505 * Same palette as the default one 'VgaDefaultPalette' in vga.c
506 */
507 #if defined(USE_REACTOS_COLORS)
508
509 // ReactOS colors
510 static CONST COLORREF VgaPalette[VGA_MAX_COLORS] =
511 {
512 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
513 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
514 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
515 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
516 RGB(0x00, 0x00, 0x00), RGB(0x10, 0x10, 0x10), RGB(0x20, 0x20, 0x20), RGB(0x35, 0x35, 0x35),
517 RGB(0x45, 0x45, 0x45), RGB(0x55, 0x55, 0x55), RGB(0x65, 0x65, 0x65), RGB(0x75, 0x75, 0x75),
518 RGB(0x8A, 0x8A, 0x8A), RGB(0x9A, 0x9A, 0x9A), RGB(0xAA, 0xAA, 0xAA), RGB(0xBA, 0xBA, 0xBA),
519 RGB(0xCA, 0xCA, 0xCA), RGB(0xDF, 0xDF, 0xDF), RGB(0xEF, 0xEF, 0xEF), RGB(0xFF, 0xFF, 0xFF),
520 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x82, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
521 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x82), RGB(0xFF, 0x00, 0x41),
522 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x82, 0x00), RGB(0xFF, 0xBE, 0x00),
523 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x82, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
524 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x82), RGB(0x00, 0xFF, 0xBE),
525 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x82, 0xFF), RGB(0x00, 0x41, 0xFF),
526 RGB(0x82, 0x82, 0xFF), RGB(0x9E, 0x82, 0xFF), RGB(0xBE, 0x82, 0xFF), RGB(0xDF, 0x82, 0xFF),
527 RGB(0xFF, 0x82, 0xFF), RGB(0xFF, 0x82, 0xDF), RGB(0xFF, 0x82, 0xBE), RGB(0xFF, 0x82, 0x9E),
528 RGB(0xFF, 0x82, 0x82), RGB(0xFF, 0x9E, 0x82), RGB(0xFF, 0xBE, 0x82), RGB(0xFF, 0xDF, 0x82),
529 RGB(0xFF, 0xFF, 0x82), RGB(0xDF, 0xFF, 0x82), RGB(0xBE, 0xFF, 0x82), RGB(0x9E, 0xFF, 0x82),
530 RGB(0x82, 0xFF, 0x82), RGB(0x82, 0xFF, 0x9E), RGB(0x82, 0xFF, 0xBE), RGB(0x82, 0xFF, 0xDF),
531 RGB(0x82, 0xFF, 0xFF), RGB(0x82, 0xDF, 0xFF), RGB(0x82, 0xBE, 0xFF), RGB(0x82, 0x9E, 0xFF),
532 RGB(0xBA, 0xBA, 0xFF), RGB(0xCA, 0xBA, 0xFF), RGB(0xDF, 0xBA, 0xFF), RGB(0xEF, 0xBA, 0xFF),
533 RGB(0xFF, 0xBA, 0xFF), RGB(0xFF, 0xBA, 0xEF), RGB(0xFF, 0xBA, 0xDF), RGB(0xFF, 0xBA, 0xCA),
534 RGB(0xFF, 0xBA, 0xBA), RGB(0xFF, 0xCA, 0xBA), RGB(0xFF, 0xDF, 0xBA), RGB(0xFF, 0xEF, 0xBA),
535 RGB(0xFF, 0xFF, 0xBA), RGB(0xEF, 0xFF, 0xBA), RGB(0xDF, 0xFF, 0xBA), RGB(0xCA, 0xFF, 0xBA),
536 RGB(0xBA, 0xFF, 0xBA), RGB(0xBA, 0xFF, 0xCA), RGB(0xBA, 0xFF, 0xDF), RGB(0xBA, 0xFF, 0xEF),
537 RGB(0xBA, 0xFF, 0xFF), RGB(0xBA, 0xEF, 0xFF), RGB(0xBA, 0xDF, 0xFF), RGB(0xBA, 0xCA, 0xFF),
538 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x39, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
539 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x39), RGB(0x71, 0x00, 0x1C),
540 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x39, 0x00), RGB(0x71, 0x55, 0x00),
541 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x39, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
542 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x39), RGB(0x00, 0x71, 0x55),
543 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x39, 0x71), RGB(0x00, 0x1C, 0x71),
544 RGB(0x39, 0x39, 0x71), RGB(0x45, 0x39, 0x71), RGB(0x55, 0x39, 0x71), RGB(0x61, 0x39, 0x71),
545 RGB(0x71, 0x39, 0x71), RGB(0x71, 0x39, 0x61), RGB(0x71, 0x39, 0x55), RGB(0x71, 0x39, 0x45),
546 RGB(0x71, 0x39, 0x39), RGB(0x71, 0x45, 0x39), RGB(0x71, 0x55, 0x39), RGB(0x71, 0x61, 0x39),
547 RGB(0x71, 0x71, 0x39), RGB(0x61, 0x71, 0x39), RGB(0x55, 0x71, 0x39), RGB(0x45, 0x71, 0x39),
548 RGB(0x39, 0x71, 0x39), RGB(0x39, 0x71, 0x45), RGB(0x39, 0x71, 0x55), RGB(0x39, 0x71, 0x61),
549 RGB(0x39, 0x71, 0x71), RGB(0x39, 0x61, 0x71), RGB(0x39, 0x55, 0x71), RGB(0x39, 0x45, 0x71),
550 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
551 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
552 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
553 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
554 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
555 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
556 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x31, 0x00, 0x41),
557 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x31), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
558 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x31, 0x00),
559 RGB(0x41, 0x41, 0x00), RGB(0x31, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
560 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x31),
561 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x31, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
562 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x31, 0x20, 0x41), RGB(0x39, 0x20, 0x41),
563 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x39), RGB(0x41, 0x20, 0x31), RGB(0x41, 0x20, 0x28),
564 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x31, 0x20), RGB(0x41, 0x39, 0x20),
565 RGB(0x41, 0x41, 0x20), RGB(0x39, 0x41, 0x20), RGB(0x31, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
566 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x31), RGB(0x20, 0x41, 0x39),
567 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x39, 0x41), RGB(0x20, 0x31, 0x41), RGB(0x20, 0x28, 0x41),
568 RGB(0x2D, 0x2D, 0x41), RGB(0x31, 0x2D, 0x41), RGB(0x35, 0x2D, 0x41), RGB(0x3D, 0x2D, 0x41),
569 RGB(0x41, 0x2D, 0x41), RGB(0x41, 0x2D, 0x3D), RGB(0x41, 0x2D, 0x35), RGB(0x41, 0x2D, 0x31),
570 RGB(0x41, 0x2D, 0x2D), RGB(0x41, 0x31, 0x2D), RGB(0x41, 0x35, 0x2D), RGB(0x41, 0x3D, 0x2D),
571 RGB(0x41, 0x41, 0x2D), RGB(0x3D, 0x41, 0x2D), RGB(0x35, 0x41, 0x2D), RGB(0x31, 0x41, 0x2D),
572 RGB(0x2D, 0x41, 0x2D), RGB(0x2D, 0x41, 0x31), RGB(0x2D, 0x41, 0x35), RGB(0x2D, 0x41, 0x3D),
573 RGB(0x2D, 0x41, 0x41), RGB(0x2D, 0x3D, 0x41), RGB(0x2D, 0x35, 0x41), RGB(0x2D, 0x31, 0x41),
574 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
575 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
576 };
577
578 #elif defined(USE_DOSBOX_COLORS)
579
580 // DOSBox colors
581 static CONST COLORREF VgaPalette[VGA_MAX_COLORS] =
582 {
583 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0xAA), RGB(0x00, 0xAA, 0x00), RGB(0x00, 0xAA, 0xAA),
584 RGB(0xAA, 0x00, 0x00), RGB(0xAA, 0x00, 0xAA), RGB(0xAA, 0x55, 0x00), RGB(0xAA, 0xAA, 0xAA),
585 RGB(0x55, 0x55, 0x55), RGB(0x55, 0x55, 0xFF), RGB(0x55, 0xFF, 0x55), RGB(0x55, 0xFF, 0xFF),
586 RGB(0xFF, 0x55, 0x55), RGB(0xFF, 0x55, 0xFF), RGB(0xFF, 0xFF, 0x55), RGB(0xFF, 0xFF, 0xFF),
587 RGB(0x00, 0x00, 0x00), RGB(0x14, 0x14, 0x14), RGB(0x20, 0x20, 0x20), RGB(0x2C, 0x2C, 0x2C),
588 RGB(0x38, 0x38, 0x38), RGB(0x45, 0x45, 0x45), RGB(0x51, 0x51, 0x51), RGB(0x61, 0x61, 0x61),
589 RGB(0x71, 0x71, 0x71), RGB(0x82, 0x82, 0x82), RGB(0x92, 0x92, 0x92), RGB(0xA2, 0xA2, 0xA2),
590 RGB(0xB6, 0xB6, 0xB6), RGB(0xCB, 0xCB, 0xCB), RGB(0xE3, 0xE3, 0xE3), RGB(0xFF, 0xFF, 0xFF),
591 RGB(0x00, 0x00, 0xFF), RGB(0x41, 0x00, 0xFF), RGB(0x7D, 0x00, 0xFF), RGB(0xBE, 0x00, 0xFF),
592 RGB(0xFF, 0x00, 0xFF), RGB(0xFF, 0x00, 0xBE), RGB(0xFF, 0x00, 0x7D), RGB(0xFF, 0x00, 0x41),
593 RGB(0xFF, 0x00, 0x00), RGB(0xFF, 0x41, 0x00), RGB(0xFF, 0x7D, 0x00), RGB(0xFF, 0xBE, 0x00),
594 RGB(0xFF, 0xFF, 0x00), RGB(0xBE, 0xFF, 0x00), RGB(0x7D, 0xFF, 0x00), RGB(0x41, 0xFF, 0x00),
595 RGB(0x00, 0xFF, 0x00), RGB(0x00, 0xFF, 0x41), RGB(0x00, 0xFF, 0x7D), RGB(0x00, 0xFF, 0xBE),
596 RGB(0x00, 0xFF, 0xFF), RGB(0x00, 0xBE, 0xFF), RGB(0x00, 0x7D, 0xFF), RGB(0x00, 0x41, 0xFF),
597 RGB(0x7D, 0x7D, 0xFF), RGB(0x9E, 0x7D, 0xFF), RGB(0xBE, 0x7D, 0xFF), RGB(0xDF, 0x7D, 0xFF),
598 RGB(0xFF, 0x7D, 0xFF), RGB(0xFF, 0x7D, 0xDF), RGB(0xFF, 0x7D, 0xBE), RGB(0xFF, 0x7D, 0x9E),
599
600 RGB(0xFF, 0x7D, 0x7D), RGB(0xFF, 0x9E, 0x7D), RGB(0xFF, 0xBE, 0x7D), RGB(0xFF, 0xDF, 0x7D),
601 RGB(0xFF, 0xFF, 0x7D), RGB(0xDF, 0xFF, 0x7D), RGB(0xBE, 0xFF, 0x7D), RGB(0x9E, 0xFF, 0x7D),
602 RGB(0x7D, 0xFF, 0x7D), RGB(0x7D, 0xFF, 0x9E), RGB(0x7D, 0xFF, 0xBE), RGB(0x7D, 0xFF, 0xDF),
603 RGB(0x7D, 0xFF, 0xFF), RGB(0x7D, 0xDF, 0xFF), RGB(0x7D, 0xBE, 0xFF), RGB(0x7D, 0x9E, 0xFF),
604 RGB(0xB6, 0xB6, 0xFF), RGB(0xC7, 0xB6, 0xFF), RGB(0xDB, 0xB6, 0xFF), RGB(0xEB, 0xB6, 0xFF),
605 RGB(0xFF, 0xB6, 0xFF), RGB(0xFF, 0xB6, 0xEB), RGB(0xFF, 0xB6, 0xDB), RGB(0xFF, 0xB6, 0xC7),
606 RGB(0xFF, 0xB6, 0xB6), RGB(0xFF, 0xC7, 0xB6), RGB(0xFF, 0xDB, 0xB6), RGB(0xFF, 0xEB, 0xB6),
607 RGB(0xFF, 0xFF, 0xB6), RGB(0xEB, 0xFF, 0xB6), RGB(0xDB, 0xFF, 0xB6), RGB(0xC7, 0xFF, 0xB6),
608 RGB(0xB6, 0xFF, 0xB6), RGB(0xB6, 0xFF, 0xC7), RGB(0xB6, 0xFF, 0xDB), RGB(0xB6, 0xFF, 0xEB),
609 RGB(0xB6, 0xFF, 0xFF), RGB(0xB6, 0xEB, 0xFF), RGB(0xB6, 0xDB, 0xFF), RGB(0xB6, 0xC7, 0xFF),
610 RGB(0x00, 0x00, 0x71), RGB(0x1C, 0x00, 0x71), RGB(0x38, 0x00, 0x71), RGB(0x55, 0x00, 0x71),
611 RGB(0x71, 0x00, 0x71), RGB(0x71, 0x00, 0x55), RGB(0x71, 0x00, 0x38), RGB(0x71, 0x00, 0x1C),
612 RGB(0x71, 0x00, 0x00), RGB(0x71, 0x1C, 0x00), RGB(0x71, 0x38, 0x00), RGB(0x71, 0x55, 0x00),
613 RGB(0x71, 0x71, 0x00), RGB(0x55, 0x71, 0x00), RGB(0x38, 0x71, 0x00), RGB(0x1C, 0x71, 0x00),
614 RGB(0x00, 0x71, 0x00), RGB(0x00, 0x71, 0x1C), RGB(0x00, 0x71, 0x38), RGB(0x00, 0x71, 0x55),
615 RGB(0x00, 0x71, 0x71), RGB(0x00, 0x55, 0x71), RGB(0x00, 0x38, 0x71), RGB(0x00, 0x1C, 0x71),
616
617 RGB(0x38, 0x38, 0x71), RGB(0x45, 0x38, 0x71), RGB(0x55, 0x38, 0x71), RGB(0x61, 0x38, 0x71),
618 RGB(0x71, 0x38, 0x71), RGB(0x71, 0x38, 0x61), RGB(0x71, 0x38, 0x55), RGB(0x71, 0x38, 0x45),
619 RGB(0x71, 0x38, 0x38), RGB(0x71, 0x45, 0x38), RGB(0x71, 0x55, 0x38), RGB(0x71, 0x61, 0x38),
620 RGB(0x71, 0x71, 0x38), RGB(0x61, 0x71, 0x38), RGB(0x55, 0x71, 0x38), RGB(0x45, 0x71, 0x38),
621 RGB(0x38, 0x71, 0x38), RGB(0x38, 0x71, 0x45), RGB(0x38, 0x71, 0x55), RGB(0x38, 0x71, 0x61),
622 RGB(0x38, 0x71, 0x71), RGB(0x38, 0x61, 0x71), RGB(0x38, 0x55, 0x71), RGB(0x38, 0x45, 0x71),
623 RGB(0x51, 0x51, 0x71), RGB(0x59, 0x51, 0x71), RGB(0x61, 0x51, 0x71), RGB(0x69, 0x51, 0x71),
624 RGB(0x71, 0x51, 0x71), RGB(0x71, 0x51, 0x69), RGB(0x71, 0x51, 0x61), RGB(0x71, 0x51, 0x59),
625 RGB(0x71, 0x51, 0x51), RGB(0x71, 0x59, 0x51), RGB(0x71, 0x61, 0x51), RGB(0x71, 0x69, 0x51),
626 RGB(0x71, 0x71, 0x51), RGB(0x69, 0x71, 0x51), RGB(0x61, 0x71, 0x51), RGB(0x59, 0x71, 0x51),
627 RGB(0x51, 0x71, 0x51), RGB(0x51, 0x71, 0x59), RGB(0x51, 0x71, 0x61), RGB(0x51, 0x71, 0x69),
628 RGB(0x51, 0x71, 0x71), RGB(0x51, 0x69, 0x71), RGB(0x51, 0x61, 0x71), RGB(0x51, 0x59, 0x71),
629 RGB(0x00, 0x00, 0x41), RGB(0x10, 0x00, 0x41), RGB(0x20, 0x00, 0x41), RGB(0x30, 0x00, 0x41),
630 RGB(0x41, 0x00, 0x41), RGB(0x41, 0x00, 0x30), RGB(0x41, 0x00, 0x20), RGB(0x41, 0x00, 0x10),
631 RGB(0x41, 0x00, 0x00), RGB(0x41, 0x10, 0x00), RGB(0x41, 0x20, 0x00), RGB(0x41, 0x30, 0x00),
632 RGB(0x41, 0x41, 0x00), RGB(0x30, 0x41, 0x00), RGB(0x20, 0x41, 0x00), RGB(0x10, 0x41, 0x00),
633
634 RGB(0x00, 0x41, 0x00), RGB(0x00, 0x41, 0x10), RGB(0x00, 0x41, 0x20), RGB(0x00, 0x41, 0x30),
635 RGB(0x00, 0x41, 0x41), RGB(0x00, 0x30, 0x41), RGB(0x00, 0x20, 0x41), RGB(0x00, 0x10, 0x41),
636 RGB(0x20, 0x20, 0x41), RGB(0x28, 0x20, 0x41), RGB(0x30, 0x20, 0x41), RGB(0x38, 0x20, 0x41),
637 RGB(0x41, 0x20, 0x41), RGB(0x41, 0x20, 0x38), RGB(0x41, 0x20, 0x30), RGB(0x41, 0x20, 0x28),
638 RGB(0x41, 0x20, 0x20), RGB(0x41, 0x28, 0x20), RGB(0x41, 0x30, 0x20), RGB(0x41, 0x38, 0x20),
639 RGB(0x41, 0x41, 0x20), RGB(0x38, 0x41, 0x20), RGB(0x30, 0x41, 0x20), RGB(0x28, 0x41, 0x20),
640 RGB(0x20, 0x41, 0x20), RGB(0x20, 0x41, 0x28), RGB(0x20, 0x41, 0x30), RGB(0x20, 0x41, 0x38),
641 RGB(0x20, 0x41, 0x41), RGB(0x20, 0x38, 0x41), RGB(0x20, 0x30, 0x41), RGB(0x20, 0x28, 0x41),
642 RGB(0x2C, 0x2C, 0x41), RGB(0x30, 0x2C, 0x41), RGB(0x34, 0x2C, 0x41), RGB(0x3C, 0x2C, 0x41),
643 RGB(0x41, 0x2C, 0x41), RGB(0x41, 0x2C, 0x3C), RGB(0x41, 0x2C, 0x34), RGB(0x41, 0x2C, 0x30),
644 RGB(0x41, 0x2C, 0x2C), RGB(0x41, 0x30, 0x2C), RGB(0x41, 0x34, 0x2C), RGB(0x41, 0x3C, 0x2C),
645 RGB(0x41, 0x41, 0x2C), RGB(0x3C, 0x41, 0x2C), RGB(0x34, 0x41, 0x2C), RGB(0x30, 0x41, 0x2C),
646 RGB(0x2C, 0x41, 0x2C), RGB(0x2C, 0x41, 0x30), RGB(0x2C, 0x41, 0x34), RGB(0x2C, 0x41, 0x3C),
647 RGB(0x2C, 0x41, 0x41), RGB(0x2C, 0x3C, 0x41), RGB(0x2C, 0x34, 0x41), RGB(0x2C, 0x30, 0x41),
648 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00),
649 RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00), RGB(0x00, 0x00, 0x00)
650 };
651
652 #endif
653
654 static CONST UCHAR Font8x8[VGA_FONT_CHARACTERS * 8] =
655 {
656 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
657 0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E,
658 0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E,
659 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
660 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,
661 0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x92, 0x10, 0x7C,
662 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C,
663 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00,
664 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF,
665 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
666 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF,
667 0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78,
668 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18,
669 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0,
670 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0,
671 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99,
672 0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00,
673 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00,
674 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18,
675 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00,
676 0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00,
677 0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0x86, 0xFC,
678 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00,
679 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF,
680 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00,
681 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00,
682 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00,
683 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
684 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00,
685 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
686 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00,
687 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00,
688 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
689 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00,
690 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
691 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
692 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00,
693 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00,
694 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00,
695 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
696 0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00,
697 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00,
698 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
699 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
700 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30,
701 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
702 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
703 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
704 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00,
705 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00,
706 0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00,
707 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00,
708 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00,
709 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00,
710 0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00,
711 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00,
712 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00,
713 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00,
714 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
715 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
716 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00,
717 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00,
718 0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00,
719 0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00,
720 0x7C, 0xC6, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00,
721 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00,
722 0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00,
723 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00,
724 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00,
725 0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
726 0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00,
727 0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00,
728 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00,
729 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
730 0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
731 0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00,
732 0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00,
733 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
734 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00,
735 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
736 0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,
737 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x0E, 0x00,
738 0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00,
739 0x7C, 0xC6, 0xE0, 0x78, 0x0E, 0xC6, 0x7C, 0x00,
740 0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
741 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00,
742 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
743 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
744 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00,
745 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00,
746 0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00,
747 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00,
748 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00,
749 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00,
750 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
751 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
752 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
753 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
754 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00,
755 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00,
756 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00,
757 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
758 0x38, 0x6C, 0x64, 0xF0, 0x60, 0x60, 0xF0, 0x00,
759 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
760 0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00,
761 0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
762 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78,
763 0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
764 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
765 0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xD6, 0x00,
766 0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
767 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
768 0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0,
769 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
770 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0xF0, 0x00,
771 0x00, 0x00, 0x7C, 0xC0, 0x70, 0x1C, 0xF8, 0x00,
772 0x10, 0x30, 0xFC, 0x30, 0x30, 0x34, 0x18, 0x00,
773 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
774 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
775 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
776 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00,
777 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
778 0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00,
779 0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00,
780 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00,
781 0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00,
782 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
783 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00,
784 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x0C, 0x06, 0x7C,
785 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
786 0x1C, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
787 0x7E, 0x81, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0x00,
788 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
789 0xE0, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
790 0x30, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
791 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x78, 0x0C, 0x38,
792 0x7E, 0x81, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00,
793 0xCC, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
794 0xE0, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
795 0xCC, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
796 0x7C, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
797 0xE0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
798 0xC6, 0x10, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
799 0x30, 0x30, 0x00, 0x78, 0xCC, 0xFC, 0xCC, 0x00,
800 0x1C, 0x00, 0xFC, 0x60, 0x78, 0x60, 0xFC, 0x00,
801 0x00, 0x00, 0x7F, 0x0C, 0x7F, 0xCC, 0x7F, 0x00,
802 0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00,
803 0x78, 0x84, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
804 0x00, 0xCC, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
805 0x00, 0xE0, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
806 0x78, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
807 0x00, 0xE0, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
808 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
809 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00,
810 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
811 0x18, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x18,
812 0x38, 0x6C, 0x64, 0xF0, 0x60, 0xE6, 0xFC, 0x00,
813 0xCC, 0xCC, 0x78, 0x30, 0xFC, 0x30, 0xFC, 0x30,
814 0xF8, 0xCC, 0xCC, 0xFA, 0xC6, 0xCF, 0xC6, 0xC3,
815 0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0xD8, 0x70,
816 0x1C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
817 0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
818 0x00, 0x1C, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
819 0x00, 0x1C, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
820 0x00, 0xF8, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0x00,
821 0xFC, 0x00, 0xCC, 0xEC, 0xFC, 0xDC, 0xCC, 0x00,
822 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00,
823 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00,
824 0x18, 0x00, 0x18, 0x18, 0x30, 0x66, 0x3C, 0x00,
825 0x00, 0x00, 0x00, 0xFC, 0xC0, 0xC0, 0x00, 0x00,
826 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x0C, 0x00, 0x00,
827 0xC6, 0xCC, 0xD8, 0x36, 0x6B, 0xC2, 0x84, 0x0F,
828 0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6D, 0xCF, 0x03,
829 0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00,
830 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
831 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00,
832 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
833 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
834 0xDB, 0xF6, 0xDB, 0x6F, 0xDB, 0x7E, 0xD7, 0xED,
835 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
836 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18,
837 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
838 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36,
839 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36,
840 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
841 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36,
842 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
843 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36,
844 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00,
845 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00,
846 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00,
847 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18,
848 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00,
849 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
850 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18,
851 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
852 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
853 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18,
854 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
855 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36,
856 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00,
857 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36,
858 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00,
859 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36,
860 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36,
861 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
862 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36,
863 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
864 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00,
865 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18,
866 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36,
867 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00,
868 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00,
869 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
870 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36,
871 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36,
872 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18,
873 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00,
874 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18,
875 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
876 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
877 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
878 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
879 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
880 0x00, 0x00, 0x76, 0xDC, 0xC8, 0xDC, 0x76, 0x00,
881 0x00, 0x78, 0xCC, 0xF8, 0xCC, 0xF8, 0xC0, 0xC0,
882 0x00, 0xFC, 0xCC, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
883 0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x00,
884 0xFC, 0xCC, 0x60, 0x30, 0x60, 0xCC, 0xFC, 0x00,
885 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0x70, 0x00,
886 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
887 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00,
888 0xFC, 0x30, 0x78, 0xCC, 0xCC, 0x78, 0x30, 0xFC,
889 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x6C, 0x38, 0x00,
890 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x6C, 0xEE, 0x00,
891 0x1C, 0x30, 0x18, 0x7C, 0xCC, 0xCC, 0x78, 0x00,
892 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00,
893 0x06, 0x0C, 0x7E, 0xDB, 0xDB, 0x7E, 0x60, 0xC0,
894 0x38, 0x60, 0xC0, 0xF8, 0xC0, 0x60, 0x38, 0x00,
895 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
896 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00,
897 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00,
898 0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xFC, 0x00,
899 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xFC, 0x00,
900 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18,
901 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70,
902 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00,
903 0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00,
904 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
905 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
906 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
907 0x0F, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C,
908 0x58, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00,
909 0x70, 0x98, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00,
910 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00,
911 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
912 };
913
914 static CONST UCHAR Font8x16[VGA_FONT_CHARACTERS * 16] =
915 {
916 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
917 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
918 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD,
919 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00,
920 0x00, 0x00, 0x7C, 0xFE, 0xFE, 0xD6, 0xFE, 0xFE,
921 0xBA, 0xC6, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00,
922 0x00, 0x00, 0x00, 0x6C, 0xEE, 0xFE, 0xFE, 0xFE,
923 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
924 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C,
925 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
926 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x10, 0x6C,
927 0xEE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
928 0x00, 0x00, 0x10, 0x38, 0x7C, 0x7C, 0xFE, 0xFE,
929 0xFE, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00,
930 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C,
931 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
932 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0xC3,
933 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
934 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C, 0x66, 0x66,
935 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
936 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0x99, 0x99,
937 0x99, 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
938 0x00, 0x00, 0x1E, 0x0E, 0x1E, 0x36, 0x78, 0xCC,
939 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
940 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18,
941 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
942 0x00, 0x00, 0x1E, 0x1A, 0x1E, 0x18, 0x18, 0x18,
943 0x18, 0x78, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00,
944 0x00, 0x00, 0x3E, 0x36, 0x3E, 0x36, 0x36, 0x76,
945 0xF6, 0x66, 0x0E, 0x1E, 0x0C, 0x00, 0x00, 0x00,
946 0x00, 0x00, 0x18, 0xDB, 0x7E, 0x3C, 0x66, 0x66,
947 0x3C, 0x7E, 0xDB, 0x18, 0x00, 0x00, 0x00, 0x00,
948 0x00, 0x00, 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xFE,
949 0xFC, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00,
950 0x00, 0x00, 0x00, 0x02, 0x0E, 0x3E, 0x7E, 0xFE,
951 0x7E, 0x3E, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00,
952 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
953 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
954 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
955 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
956 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0xDB, 0x7B,
957 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00,
958 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x7C, 0xF6,
959 0xDE, 0x7C, 0x0C, 0xC6, 0xC6, 0x7C, 0x00, 0x00,
960 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00,
962 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
963 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
964 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18,
965 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
966 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
967 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
968 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0xFF,
969 0x0E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
970 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0xFE,
971 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
972 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
973 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
974 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x66, 0xFF,
975 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
976 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x38, 0x7C,
977 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
978 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C, 0x7C,
979 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
980 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
981 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
982 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x3C, 0x18,
983 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
984 0x00, 0x36, 0x36, 0x36, 0x36, 0x14, 0x00, 0x00,
985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
986 0x00, 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C,
987 0xFE, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
988 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0x78,
989 0x3C, 0x06, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00,
990 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x66, 0x0C,
991 0x18, 0x30, 0x66, 0xC6, 0x00, 0x00, 0x00, 0x00,
992 0x00, 0x00, 0x38, 0x6C, 0x38, 0x30, 0x76, 0x7E,
993 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
994 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
995 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
996 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30,
997 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
998 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C,
999 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
1000 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x38, 0xFE,
1001 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1002 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E,
1003 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1004 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1005 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1006 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1007 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1009 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1010 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18,
1011 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00,
1012 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xCE, 0xDE, 0xF6,
1013 0xE6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1014 0x00, 0x00, 0x18, 0x78, 0x18, 0x18, 0x18, 0x18,
1015 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
1016 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x06, 0x0C, 0x18,
1017 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1018 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06,
1019 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1020 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xCC,
1021 0xFE, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00,
1022 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x06,
1023 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1024 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xFC, 0xC6,
1025 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1026 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x0C, 0x18, 0x30,
1027 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00,
1028 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6,
1029 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1030 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E,
1031 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1032 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1033 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,
1034 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00,
1035 0x00, 0x0C, 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00,
1036 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0xC0,
1037 0x60, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00,
1038 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
1039 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1040 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06,
1041 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
1042 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18,
1043 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1044 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xDE, 0xDE,
1045 0xDE, 0xDC, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00,
1046 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE,
1047 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1048 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66,
1049 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1050 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0,
1051 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1052 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66,
1053 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,
1054 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1055 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1056 0x00, 0x00, 0xFE, 0x66, 0x60, 0x64, 0x7C, 0x64,
1057 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1058 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0,
1059 0xCE, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1060 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6,
1061 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1062 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1063 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1064 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18,
1065 0x18, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1066 0x00, 0x00, 0xC6, 0xC6, 0xCC, 0xD8, 0xF0, 0xF0,
1067 0xD8, 0xCC, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1068 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60,
1069 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
1070 0x00, 0x00, 0xC6, 0xC6, 0xEE, 0xEE, 0xFE, 0xD6,
1071 0xD6, 0xD6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1072 0x00, 0x00, 0xC6, 0xC6, 0xE6, 0xE6, 0xF6, 0xDE,
1073 0xCE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1074 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1075 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1076 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x66, 0x7C,
1077 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1078 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1079 0xC6, 0xD6, 0xD6, 0x7C, 0x06, 0x00, 0x00, 0x00,
1080 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x78,
1081 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1082 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0x70, 0x1C,
1083 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1084 0x00, 0x00, 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18,
1085 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1086 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1087 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1088 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1089 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1090 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6,
1091 0xFE, 0xEE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1092 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x38,
1093 0x6C, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1094 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C,
1095 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1096 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30,
1097 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1098 0x00, 0x00, 0x7C, 0x60, 0x60, 0x60, 0x60, 0x60,
1099 0x60, 0x60, 0x60, 0x7C, 0x00, 0x00, 0x00, 0x00,
1100 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30,
1101 0x18, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
1102 0x00, 0x00, 0x7C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,
1103 0x0C, 0x0C, 0x0C, 0x7C, 0x00, 0x00, 0x00, 0x00,
1104 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00,
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1107 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,
1108 0x00, 0x18, 0x18, 0x18, 0x0C, 0x00, 0x00, 0x00,
1109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1110 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1111 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1112 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1113 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
1114 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1115 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1116 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC,
1117 0xCC, 0xCC, 0xCC, 0x7E, 0x00, 0x00, 0x00, 0x00,
1118 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1119 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1120 0x00, 0x00, 0x1C, 0x36, 0x30, 0x30, 0xFC, 0x30,
1121 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00,
1122 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCE, 0xC6,
1123 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1124 0x00, 0x00, 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66,
1125 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1126 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18,
1127 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1128 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x0C,
1129 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1130 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x66, 0x6C,
1131 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1132 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1133 0x18, 0x18, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00,
1134 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xD6,
1135 0xD6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1136 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1137 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
1138 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1139 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1140 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66,
1141 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00, 0x00,
1142 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC,
1143 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00, 0x00,
1144 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x60,
1145 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
1146 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0,
1147 0x7C, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1148 0x00, 0x00, 0x30, 0x30, 0x30, 0xFC, 0x30, 0x30,
1149 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,
1150 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC,
1151 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
1152 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1153 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
1154 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xD6,
1155 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00,
1156 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0x6C,
1157 0x38, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1158 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1159 0xC6, 0xCE, 0x76, 0x06, 0xC6, 0x7C, 0x00, 0x00,
1160 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x86, 0x0C,
1161 0x18, 0x30, 0x62, 0xFE, 0x00, 0x00, 0x00, 0x00,
1162 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18,
1163 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00,
1164 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
1165 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1166 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18,
1167 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
1168 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00,
1169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1170 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38,
1171 0x6C, 0x6C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1172 0x00, 0x00, 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0xC6,
1173 0x66, 0x3C, 0x18, 0x0C, 0xCC, 0x38, 0x00, 0x00,
1174 0x00, 0x00, 0xC6, 0x00, 0x00, 0xC6, 0xC6, 0xC6,
1175 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1176 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1177 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1178 0x00, 0x30, 0x78, 0xCC, 0x00, 0x78, 0x0C, 0x7C,
1179 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1180 0x00, 0x00, 0xCC, 0x00, 0x00, 0x78, 0x0C, 0x7C,
1181 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1182 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C,
1183 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1184 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78, 0x0C, 0x7C,
1185 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1186 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0,
1187 0xC6, 0x7C, 0x18, 0x0C, 0x6C, 0x38, 0x00, 0x00,
1188 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1189 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1190 0x00, 0x00, 0xCC, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1191 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1192 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1193 0xFE, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1194 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
1195 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1196 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18,
1197 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1198 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x18,
1199 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1200 0x00, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6,
1201 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1202 0x38, 0x6C, 0x38, 0x00, 0x38, 0x6C, 0xC6, 0xC6,
1203 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1204 0x0C, 0x18, 0x30, 0x00, 0xFE, 0x60, 0x60, 0x7C,
1205 0x60, 0x60, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00,
1206 0x00, 0x00, 0x00, 0x00, 0x66, 0xDB, 0x1B, 0x7F,
1207 0xD8, 0xD8, 0xDF, 0x76, 0x00, 0x00, 0x00, 0x00,
1208 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0xD8, 0xFE,
1209 0xD8, 0xD8, 0xD8, 0xDE, 0x00, 0x00, 0x00, 0x00,
1210 0x00, 0x30, 0x78, 0xCC, 0x00, 0x7C, 0xC6, 0xC6,
1211 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1212 0x00, 0x00, 0xC6, 0x00, 0x00, 0x7C, 0xC6, 0xC6,
1213 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1214 0x00, 0x30, 0x18, 0x0C, 0x00, 0x7C, 0xC6, 0xC6,
1215 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1216 0x00, 0x30, 0x78, 0xCC, 0x00, 0xC6, 0xC6, 0xC6,
1217 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1218 0x00, 0x60, 0x30, 0x18, 0x00, 0xC6, 0xC6, 0xC6,
1219 0xC6, 0xC6, 0xCE, 0x76, 0x00, 0x00, 0x00, 0x00,
1220 0x00, 0x18, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18,
1221 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1222 0x00, 0xC6, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6,
1223 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1224 0x00, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1225 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1226 0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC0, 0xC0,
1227 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1228 0x00, 0x38, 0x6C, 0x60, 0x60, 0xF0, 0x60, 0x60,
1229 0x60, 0x66, 0xF6, 0x6C, 0x00, 0x00, 0x00, 0x00,
1230 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E,
1231 0x18, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1232 0x00, 0x00, 0x3E, 0x63, 0x63, 0x30, 0x1C, 0x06,
1233 0x63, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1234 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x63, 0x38,
1235 0x0E, 0x63, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00,
1236 0x00, 0x0C, 0x18, 0x30, 0x00, 0x78, 0x0C, 0x7C,
1237 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1238 0x00, 0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18,
1239 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
1240 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xC6,
1241 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1242 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC,
1243 0xCC, 0xCC, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1244 0x00, 0x00, 0x76, 0xDC, 0x00, 0xBC, 0x66, 0x66,
1245 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
1246 0x00, 0x76, 0xDC, 0x00, 0xC6, 0xC6, 0xE6, 0xF6,
1247 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1248 0x00, 0x21, 0x1E, 0x00, 0x1E, 0x33, 0x60, 0x60,
1249 0x67, 0x63, 0x33, 0x1D, 0x00, 0x00, 0x00, 0x00,
1250 0x00, 0x42, 0x3C, 0x00, 0x3B, 0x66, 0x66, 0x66,
1251 0x3E, 0x06, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
1252 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30,
1253 0x60, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
1254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1255 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
1256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E,
1257 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
1258 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x30,
1259 0x60, 0xDC, 0x36, 0x0C, 0x18, 0x3E, 0x00, 0x00,
1260 0x00, 0x60, 0x60, 0x62, 0x66, 0x6C, 0x18, 0x36,
1261 0x6E, 0xDE, 0x36, 0x7E, 0x06, 0x06, 0x00, 0x00,
1262 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x3C,
1263 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00,
1264 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6C, 0xD8,
1265 0x6C, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1266 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x6C, 0x36,
1267 0x6C, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1268 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1269 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
1270 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1271 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55,
1272 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1273 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77,
1274 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1275 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1276 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1277 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1278 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1279 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1280 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6,
1281 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
1283 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1284 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8,
1285 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1286 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xF6,
1287 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1288 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1289 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1290 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6,
1291 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1292 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xFE,
1293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1294 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE,
1295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1296 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8,
1297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,
1299 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1300 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1302 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1305 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1306 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F,
1307 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1310 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF,
1311 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1312 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1313 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1314 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
1315 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1316 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3F,
1317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1318 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37,
1319 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1320 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF,
1321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1322 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7,
1323 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1324 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37,
1325 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1326 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1328 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7,
1329 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1330 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF,
1331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1332 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1334 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF,
1335 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
1337 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1338 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F,
1339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1340 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F,
1341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1342 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F,
1343 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,
1345 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1346 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF,
1347 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
1348 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF,
1349 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1350 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8,
1351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
1353 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1354 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1355 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1357 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1358 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1359 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
1360 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1361 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
1362 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
1363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1364 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0xD8, 0xD8,
1365 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00,
1366 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xD8, 0xFC, 0xC6,
1367 0xC6, 0xC6, 0xC6, 0xCC, 0x00, 0x00, 0x00, 0x00,
1368 0x00, 0x00, 0xFE, 0x66, 0x62, 0x60, 0x60, 0x60,
1369 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00,
1370 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x6C, 0x6C,
1371 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
1372 0x00, 0x00, 0xFE, 0xC6, 0x62, 0x30, 0x18, 0x18,
1373 0x30, 0x62, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
1374 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xCC,
1375 0xCC, 0xCC, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00,
1376 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66,
1377 0x66, 0x7C, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00,
1378 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18,
1379 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
1380 0x00, 0x00, 0xFE, 0x38, 0x38, 0x6C, 0xC6, 0xC6,
1381 0x6C, 0x38, 0x38, 0xFE, 0x00, 0x00, 0x00, 0x00,
1382 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE,
1383 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
1384 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6,
1385 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00, 0x00, 0x00,
1386 0x00, 0x00, 0x3E, 0x60, 0x60, 0x3C, 0x66, 0xC6,
1387 0xC6, 0xC6, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
1388 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB,
1389 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1390 0x00, 0x00, 0x02, 0x06, 0x7C, 0xCE, 0xDE, 0xF6,
1391 0xF6, 0x7C, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00,
1392 0x00, 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C,
1393 0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00,
1394 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6,
1395 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
1396 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE,
1397 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00,
1398 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18,
1399 0x18, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1400 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18,
1401 0x30, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1402 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18,
1403 0x0C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
1404 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1E, 0x1A, 0x18,
1405 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1406 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
1407 0x18, 0x18, 0x58, 0x78, 0x30, 0x00, 0x00, 0x00,
1408 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E,
1409 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
1410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC,
1411 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00,
1412 0x00, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x00,
1413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
1415 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1417 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1418 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18,
1419 0xD8, 0xD8, 0x78, 0x38, 0x18, 0x00, 0x00, 0x00,
1420 0x00, 0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C,
1421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1422 0x00, 0x00, 0x70, 0xD8, 0x18, 0x30, 0x60, 0xF8,
1423 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1424 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E,
1425 0x7E, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00,
1426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1428 };
1429
1430 /* PRIVATE FUNCTIONS **********************************************************/
1431
1432 static VOID VidBiosReadWindow(LPWORD Buffer, SMALL_RECT Rectangle, BYTE Page)
1433 {
1434 INT i, j;
1435 INT Counter = 0;
1436 WORD Character;
1437 DWORD VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Page * Bda->VideoPageSize);
1438
1439 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
1440 {
1441 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
1442 {
1443 /* Read from video memory */
1444 EmulatorReadMemory(&EmulatorContext,
1445 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
1446 (LPVOID)&Character,
1447 sizeof(WORD));
1448
1449 /* Write the data to the buffer in row order */
1450 Buffer[Counter++] = Character;
1451 }
1452 }
1453 }
1454
1455 static VOID VidBiosWriteWindow(LPWORD Buffer, SMALL_RECT Rectangle, BYTE Page)
1456 {
1457 INT i, j;
1458 INT Counter = 0;
1459 WORD Character;
1460 DWORD VideoAddress = TO_LINEAR(TEXT_VIDEO_SEG, Page * Bda->VideoPageSize);
1461
1462 for (i = Rectangle.Top; i <= Rectangle.Bottom; i++)
1463 {
1464 for (j = Rectangle.Left; j <= Rectangle.Right; j++)
1465 {
1466 Character = Buffer[Counter++];
1467
1468 /* Write to video memory */
1469 EmulatorWriteMemory(&EmulatorContext,
1470 VideoAddress + (i * Bda->ScreenColumns + j) * sizeof(WORD),
1471 (LPVOID)&Character,
1472 sizeof(WORD));
1473 }
1474 }
1475 }
1476
1477 static BOOLEAN VidBiosScrollWindow(INT Direction,
1478 DWORD Amount,
1479 SMALL_RECT Rectangle,
1480 BYTE Page,
1481 BYTE FillAttribute)
1482 {
1483 DWORD i;
1484 LPWORD WindowData;
1485 WORD WindowWidth = Rectangle.Right - Rectangle.Left + 1;
1486 WORD WindowHeight = Rectangle.Bottom - Rectangle.Top + 1;
1487 DWORD WindowSize = WindowWidth * WindowHeight;
1488
1489 /* Allocate a buffer for the window */
1490 WindowData = (LPWORD)HeapAlloc(GetProcessHeap(),
1491 HEAP_ZERO_MEMORY,
1492 WindowSize * sizeof(WORD));
1493 if (WindowData == NULL) return FALSE;
1494
1495 /* Read the window data */
1496 VidBiosReadWindow(WindowData, Rectangle, Page);
1497
1498 if ((Amount == 0)
1499 || (((Direction == SCROLL_DIRECTION_UP)
1500 || (Direction == SCROLL_DIRECTION_DOWN))
1501 && (Amount >= WindowHeight))
1502 || (((Direction == SCROLL_DIRECTION_LEFT)
1503 || (Direction == SCROLL_DIRECTION_RIGHT))
1504 && (Amount >= WindowWidth)))
1505 {
1506 /* Fill the window */
1507 for (i = 0; i < WindowSize; i++)
1508 {
1509 WindowData[i] = MAKEWORD(' ', FillAttribute);
1510 }
1511
1512 goto Done;
1513 }
1514
1515 switch (Direction)
1516 {
1517 case SCROLL_DIRECTION_UP:
1518 {
1519 RtlMoveMemory(WindowData,
1520 &WindowData[WindowWidth * Amount],
1521 (WindowSize - WindowWidth * Amount) * sizeof(WORD));
1522
1523 for (i = 0; i < Amount * WindowWidth; i++)
1524 {
1525 WindowData[WindowSize - i - 1] = MAKEWORD(' ', FillAttribute);
1526 }
1527
1528 break;
1529 }
1530
1531 case SCROLL_DIRECTION_DOWN:
1532 {
1533 RtlMoveMemory(&WindowData[WindowWidth * Amount],
1534 WindowData,
1535 (WindowSize - WindowWidth * Amount) * sizeof(WORD));
1536
1537 for (i = 0; i < Amount * WindowWidth; i++)
1538 {
1539 WindowData[i] = MAKEWORD(' ', FillAttribute);
1540 }
1541
1542 break;
1543 }
1544
1545 default:
1546 {
1547 // TODO: NOT IMPLEMENTED!
1548 UNIMPLEMENTED;
1549 }
1550 }
1551
1552 Done:
1553 /* Write back the window data */
1554 VidBiosWriteWindow(WindowData, Rectangle, Page);
1555
1556 /* Free the window buffer */
1557 HeapFree(GetProcessHeap(), 0, WindowData);
1558
1559 return TRUE;
1560 }
1561
1562 static __inline VOID VgaSetSinglePaletteRegister(BYTE Index, BYTE Value)
1563 {
1564 /* Write the index */
1565 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
1566 IOWriteB(VGA_AC_INDEX, Index);
1567
1568 /* Write the data */
1569 IOWriteB(VGA_AC_WRITE, Value);
1570 }
1571
1572 static BOOLEAN VgaSetRegisters(PVGA_REGISTERS Registers)
1573 {
1574 INT i;
1575
1576 if (Registers == NULL) return FALSE;
1577
1578 /* Disable interrupts */
1579 setIF(0);
1580
1581 /*
1582 * Set the CRT base address according to the selected mode,
1583 * monochrome or color. The following macros:
1584 * VGA_INSTAT1_READ, VGA_CRTC_INDEX and VGA_CRTC_DATA are then
1585 * used to access the correct VGA I/O ports.
1586 */
1587 Bda->CrtBasePort = (Registers->Misc & 0x01) ? VGA_CRTC_INDEX_COLOR
1588 : VGA_CRTC_INDEX_MONO;
1589
1590 /* Write the misc register */
1591 IOWriteB(VGA_MISC_WRITE, Registers->Misc);
1592
1593 /* Synchronous reset on */
1594 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_RESET_REG);
1595 IOWriteB(VGA_SEQ_DATA , VGA_SEQ_RESET_AR);
1596
1597 /* Write the sequencer registers */
1598 for (i = 1; i < VGA_SEQ_MAX_REG; i++)
1599 {
1600 IOWriteB(VGA_SEQ_INDEX, i);
1601 IOWriteB(VGA_SEQ_DATA, Registers->Sequencer[i]);
1602 }
1603
1604 /* Synchronous reset off */
1605 IOWriteB(VGA_SEQ_INDEX, VGA_SEQ_RESET_REG);
1606 IOWriteB(VGA_SEQ_DATA , VGA_SEQ_RESET_SR | VGA_SEQ_RESET_AR);
1607
1608 /* Unlock CRTC registers 0-7 */
1609 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_END_HORZ_BLANKING_REG);
1610 IOWriteB(VGA_CRTC_DATA, IOReadB(VGA_CRTC_DATA) | 0x80);
1611 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_VERT_RETRACE_END_REG);
1612 IOWriteB(VGA_CRTC_DATA, IOReadB(VGA_CRTC_DATA) & ~0x80);
1613 // Make sure they remain unlocked
1614 Registers->CRT[VGA_CRTC_END_HORZ_BLANKING_REG] |= 0x80;
1615 Registers->CRT[VGA_CRTC_VERT_RETRACE_END_REG] &= ~0x80;
1616
1617 /* Write the CRTC registers */
1618 for (i = 0; i < VGA_CRTC_MAX_REG; i++)
1619 {
1620 IOWriteB(VGA_CRTC_INDEX, i);
1621 IOWriteB(VGA_CRTC_DATA, Registers->CRT[i]);
1622 }
1623
1624 /* Write the GC registers */
1625 for (i = 0; i < VGA_GC_MAX_REG; i++)
1626 {
1627 IOWriteB(VGA_GC_INDEX, i);
1628 IOWriteB(VGA_GC_DATA, Registers->Graphics[i]);
1629 }
1630
1631 /* Write the AC registers */
1632 // DbgPrint("\n");
1633 for (i = 0; i < VGA_AC_MAX_REG; i++)
1634 {
1635 VgaSetSinglePaletteRegister(i, Registers->Attribute[i]);
1636 // DbgPrint("Registers->Attribute[%d] = %d\n", i, Registers->Attribute[i]);
1637 }
1638 // DbgPrint("\n");
1639
1640 /* Set the PEL mask */
1641 IOWriteB(VGA_DAC_MASK, 0xFF);
1642
1643 /* Enable screen and disable palette access */
1644 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
1645 IOWriteB(VGA_AC_INDEX, 0x20);
1646
1647 /* Enable interrupts */
1648 setIF(1);
1649
1650 return TRUE;
1651 }
1652
1653 static VOID VgaSetPalette(const COLORREF* Palette, ULONG Size)
1654 {
1655 ULONG i;
1656
1657 // /* Disable screen and enable palette access */
1658 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
1659 // IOWriteB(VGA_AC_INDEX, 0x00);
1660
1661 for (i = 0; i < Size; i++)
1662 {
1663 IOWriteB(VGA_DAC_WRITE_INDEX, i);
1664 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetRValue(Palette[i])));
1665 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetGValue(Palette[i])));
1666 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(GetBValue(Palette[i])));
1667 }
1668
1669 /* The following step might be optional */
1670 for (i = Size; i < VGA_MAX_COLORS; i++)
1671 {
1672 IOWriteB(VGA_DAC_WRITE_INDEX, i);
1673 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
1674 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
1675 IOWriteB(VGA_DAC_DATA, VGA_COLOR_TO_DAC(0x00));
1676 }
1677
1678 /* Enable screen and disable palette access */
1679 // IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
1680 // IOWriteB(VGA_AC_INDEX, 0x20);
1681 }
1682
1683 static VOID VgaChangePalette(BYTE ModeNumber)
1684 {
1685 const COLORREF* Palette;
1686 ULONG Size;
1687
1688 if (ModeNumber >= 0x13)
1689 {
1690 /* VGA modes */
1691 Palette = VgaPalette;
1692 Size = sizeof(VgaPalette)/sizeof(VgaPalette[0]);
1693 }
1694 else if (ModeNumber == 0x10) // || (ModeNumber == 0x0D) || (ModeNumber == 0x0E)
1695 {
1696 /* EGA HiRes mode */
1697 Palette = EgaPalette__HiRes;
1698 Size = sizeof(EgaPalette__HiRes)/sizeof(EgaPalette__HiRes[0]);
1699 }
1700 #if 0
1701 else if ((ModeNumber == 0x04) || (ModeNumber == 0x05))
1702 {
1703 /*
1704 * CGA modes; this palette contains both normal and
1705 * bright versions of CGA palettes 0 and 1
1706 */
1707 Palette = CgaPalette2;
1708 Size = sizeof(CgaPalette2)/sizeof(CgaPalette2[0]);
1709 }
1710 #endif
1711 else // if ((ModeNumber == 0x0D) || (ModeNumber == 0x0E))
1712 {
1713 /* EGA modes */
1714 Palette = EgaPalette__16Colors;
1715 Size = sizeof(EgaPalette__16Colors)/sizeof(EgaPalette__16Colors[0]);
1716 }
1717
1718 VgaSetPalette(Palette, Size);
1719 }
1720
1721 static VOID VidBiosGetCursorPosition(PBYTE Row, PBYTE Column, BYTE Page)
1722 {
1723 /* Make sure the selected video page is valid */
1724 if (Page >= BIOS_MAX_PAGES) return;
1725
1726 /* Get the cursor location */
1727 *Row = HIBYTE(Bda->CursorPosition[Page]);
1728 *Column = LOBYTE(Bda->CursorPosition[Page]);
1729 }
1730
1731 static VOID VidBiosSetCursorPosition(BYTE Row, BYTE Column, BYTE Page)
1732 {
1733 /* Make sure the selected video page is valid */
1734 if (Page >= BIOS_MAX_PAGES) return;
1735
1736 /* Update the position in the BDA */
1737 Bda->CursorPosition[Page] = MAKEWORD(Column, Row);
1738
1739 /* Check if this is the current video page */
1740 if (Page == Bda->VideoPage)
1741 {
1742 WORD Offset = Row * Bda->ScreenColumns + Column;
1743
1744 /* Modify the CRTC registers */
1745 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_LOW_REG);
1746 IOWriteB(VGA_CRTC_DATA , LOBYTE(Offset));
1747 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_HIGH_REG);
1748 IOWriteB(VGA_CRTC_DATA , HIBYTE(Offset));
1749 }
1750 }
1751
1752 VOID VidBiosSyncCursorPosition(VOID)
1753 {
1754 BYTE Row, Column;
1755 BYTE Low, High;
1756 SHORT ScreenColumns = VgaGetDisplayResolution().X;
1757 WORD Offset;
1758
1759 /* Get the cursor location */
1760 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_LOW_REG);
1761 Low = IOReadB(VGA_CRTC_DATA);
1762 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_LOC_HIGH_REG);
1763 High = IOReadB(VGA_CRTC_DATA);
1764
1765 Offset = MAKEWORD(Low, High);
1766
1767 Row = (BYTE)(Offset / ScreenColumns);
1768 Column = (BYTE)(Offset % ScreenColumns);
1769
1770 /* Synchronize our cursor position with VGA */
1771 VidBiosSetCursorPosition(Row, Column, Bda->VideoPage);
1772 }
1773
1774 BYTE VidBiosGetVideoMode(VOID)
1775 {
1776 return Bda->VideoMode;
1777 }
1778
1779 static BOOLEAN VidBiosSetVideoMode(BYTE ModeNumber)
1780 {
1781 BYTE Page;
1782 COORD Resolution;
1783 BOOLEAN DoNotClear = !!(ModeNumber & 0x80);
1784 PVGA_REGISTERS VgaMode;
1785
1786 /* Retrieve the real mode number and check its validity */
1787 ModeNumber &= 0x7F;
1788 // if (ModeNumber >= sizeof(VideoModes)/sizeof(VideoModes[0]))
1789 if (ModeNumber > BIOS_MAX_VIDEO_MODE)
1790 {
1791 DPRINT1("VidBiosSetVideoMode -- Mode %02Xh invalid\n", ModeNumber);
1792 return FALSE;
1793 }
1794
1795 VgaMode = VideoModes[ModeNumber];
1796
1797 DPRINT1("Switching to mode %02Xh %s clearing the screen; VgaMode = 0x%p\n",
1798 ModeNumber, (DoNotClear ? "without" : "and"), VgaMode);
1799
1800 if (!VgaSetRegisters(VgaMode)) return FALSE;
1801
1802 VgaChangePalette(ModeNumber);
1803
1804 /*
1805 * IBM standard modes do not clear the screen if the
1806 * high bit of AL is set (EGA or higher only).
1807 * See Ralf Brown: http://www.ctyme.com/intr/rb-0069.htm
1808 * for more information.
1809 */
1810 if (!DoNotClear) VgaClearMemory();
1811
1812 // Bda->CrtModeControl;
1813 // Bda->CrtColorPaletteMask;
1814 // Bda->EGAFlags;
1815 // Bda->VGAFlags;
1816
1817 /* Update the values in the BDA */
1818 Bda->VideoMode = ModeNumber;
1819 Bda->VideoPageSize = VideoModePageSize[ModeNumber];
1820 Bda->VideoPage = 0;
1821 Bda->VideoPageOffset = Bda->VideoPage * Bda->VideoPageSize;
1822
1823 /* Set the start address in the CRTC */
1824 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG);
1825 IOWriteB(VGA_CRTC_DATA , LOBYTE(Bda->VideoPageOffset));
1826 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_HIGH_REG);
1827 IOWriteB(VGA_CRTC_DATA , HIBYTE(Bda->VideoPageOffset));
1828
1829 /* Update the character height */
1830 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_MAX_SCAN_LINE_REG);
1831 Bda->CharacterHeight = 1 + (IOReadB(VGA_CRTC_DATA) & 0x1F);
1832
1833 /* Update the screen size */
1834 Resolution = VgaGetDisplayResolution();
1835 Bda->ScreenColumns = Resolution.X;
1836 Bda->ScreenRows = Resolution.Y - 1;
1837
1838 /* Set the cursor position for each page */
1839 for (Page = 0; Page < BIOS_MAX_PAGES; ++Page)
1840 VidBiosSetCursorPosition(0, 0, Page);
1841
1842 /* Refresh display */
1843 VgaRefreshDisplay();
1844
1845 return TRUE;
1846 }
1847
1848 static BOOLEAN VidBiosSetVideoPage(BYTE PageNumber)
1849 {
1850 BYTE Row, Column;
1851
1852 /* Check if the page exists */
1853 if (PageNumber >= BIOS_MAX_PAGES) return FALSE;
1854
1855 /* Check if this is the same page */
1856 if (PageNumber == Bda->VideoPage) return TRUE;
1857
1858 /* Update the values in the BDA */
1859 Bda->VideoPage = PageNumber;
1860 Bda->VideoPageOffset = Bda->VideoPage * Bda->VideoPageSize;
1861
1862 /* Set the start address in the CRTC */
1863 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_LOW_REG);
1864 IOWriteB(VGA_CRTC_DATA , LOBYTE(Bda->VideoPageOffset));
1865 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_START_ADDR_HIGH_REG);
1866 IOWriteB(VGA_CRTC_DATA , HIBYTE(Bda->VideoPageOffset));
1867
1868 /*
1869 * Get the cursor location (we don't update anything on the BIOS side
1870 * but we update the cursor location on the VGA side).
1871 */
1872 VidBiosGetCursorPosition(&Row, &Column, PageNumber);
1873 VidBiosSetCursorPosition(Row, Column, PageNumber);
1874
1875 return TRUE;
1876 }
1877
1878 static VOID VidBiosPrintCharacter(CHAR Character, BYTE Attribute, BYTE Page)
1879 {
1880 WORD CharData = MAKEWORD(Character, Attribute);
1881 BYTE Row, Column;
1882
1883 /* Make sure the page exists */
1884 if (Page >= BIOS_MAX_PAGES) return;
1885
1886 /* Get the cursor location */
1887 VidBiosGetCursorPosition(&Row, &Column, Page);
1888
1889 if (Character == '\a')
1890 {
1891 /* Bell control character */
1892 // NOTE: We may use what the terminal emulator offers to us...
1893 Beep(800, 200);
1894 return;
1895 }
1896 else if (Character == '\b')
1897 {
1898 /* Backspace control character */
1899 if (Column > 0)
1900 {
1901 Column--;
1902 }
1903 else if (Row > 0)
1904 {
1905 Column = Bda->ScreenColumns - 1;
1906 Row--;
1907 }
1908
1909 /* Erase the existing character */
1910 CharData = MAKEWORD(' ', Attribute);
1911 EmulatorWriteMemory(&EmulatorContext,
1912 TO_LINEAR(TEXT_VIDEO_SEG,
1913 Page * Bda->VideoPageSize +
1914 (Row * Bda->ScreenColumns + Column) * sizeof(WORD)),
1915 (LPVOID)&CharData,
1916 sizeof(WORD));
1917 }
1918 else if (Character == '\t')
1919 {
1920 /* Horizontal Tabulation control character */
1921 do
1922 {
1923 // Taken from DOSBox
1924 VidBiosPrintCharacter(' ', Attribute, Page);
1925 VidBiosGetCursorPosition(&Row, &Column, Page);
1926 } while (Column % 8);
1927 }
1928 else if (Character == '\n')
1929 {
1930 /* Line Feed control character */
1931 Row++;
1932 }
1933 else if (Character == '\r')
1934 {
1935 /* Carriage Return control character */
1936 Column = 0;
1937 }
1938 else
1939 {
1940 /* Default character */
1941
1942 /* Write the character */
1943 EmulatorWriteMemory(&EmulatorContext,
1944 TO_LINEAR(TEXT_VIDEO_SEG,
1945 Page * Bda->VideoPageSize +
1946 (Row * Bda->ScreenColumns + Column) * sizeof(WORD)),
1947 (LPVOID)&CharData,
1948 sizeof(WORD));
1949
1950 /* Advance the cursor */
1951 Column++;
1952 }
1953
1954 /* Check if it passed the end of the row */
1955 if (Column >= Bda->ScreenColumns)
1956 {
1957 /* Return to the first column and go to the next line */
1958 Column = 0;
1959 Row++;
1960 }
1961
1962 /* Scroll the screen up if needed */
1963 if (Row > Bda->ScreenRows)
1964 {
1965 /* The screen must be scrolled up */
1966 SMALL_RECT Rectangle = { 0, 0, Bda->ScreenColumns - 1, Bda->ScreenRows };
1967
1968 VidBiosScrollWindow(SCROLL_DIRECTION_UP,
1969 1,
1970 Rectangle,
1971 Page,
1972 DEFAULT_ATTRIBUTE);
1973
1974 Row--;
1975 }
1976
1977 /* Set the cursor position */
1978 VidBiosSetCursorPosition(Row, Column, Page);
1979 }
1980
1981 /* PUBLIC FUNCTIONS ***********************************************************/
1982
1983 VOID WINAPI VidBiosVideoService(LPWORD Stack)
1984 {
1985 switch (getAH())
1986 {
1987 /* Set Video Mode */
1988 case 0x00:
1989 {
1990 VidBiosSetVideoMode(getAL());
1991 break;
1992 }
1993
1994 /* Set Text-Mode Cursor Shape */
1995 case 0x01:
1996 {
1997 /* Update the BDA */
1998 Bda->CursorStartLine = getCH();
1999 Bda->CursorEndLine = getCL();
2000
2001 /* Modify the CRTC registers */
2002 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_START_REG);
2003 IOWriteB(VGA_CRTC_DATA , Bda->CursorStartLine);
2004 IOWriteB(VGA_CRTC_INDEX, VGA_CRTC_CURSOR_END_REG);
2005 IOWriteB(VGA_CRTC_DATA , Bda->CursorEndLine);
2006
2007 break;
2008 }
2009
2010 /* Set Cursor Position */
2011 case 0x02:
2012 {
2013 VidBiosSetCursorPosition(getDH(), getDL(), getBH());
2014 break;
2015 }
2016
2017 /* Get Cursor Position and Shape */
2018 case 0x03:
2019 {
2020 /* Make sure the selected video page exists */
2021 if (getBH() >= BIOS_MAX_PAGES) break;
2022
2023 /* Return the result */
2024 setAX(0);
2025 setCX(MAKEWORD(Bda->CursorEndLine, Bda->CursorStartLine));
2026 setDX(Bda->CursorPosition[getBH()]);
2027 break;
2028 }
2029
2030 /* Query Light Pen */
2031 case 0x04:
2032 {
2033 /*
2034 * On modern BIOSes, this function returns 0
2035 * so that we can ignore the other registers.
2036 */
2037 setAX(0);
2038 break;
2039 }
2040
2041 /* Select Active Display Page */
2042 case 0x05:
2043 {
2044 VidBiosSetVideoPage(getAL());
2045 break;
2046 }
2047
2048 /* Scroll Window Up/Down */
2049 case 0x06:
2050 case 0x07:
2051 {
2052 SMALL_RECT Rectangle = { getCL(), getCH(), getDL(), getDH() };
2053
2054 /* Call the internal function */
2055 VidBiosScrollWindow((getAH() == 0x06) ? SCROLL_DIRECTION_UP
2056 : SCROLL_DIRECTION_DOWN,
2057 getAL(),
2058 Rectangle,
2059 Bda->VideoPage,
2060 getBH());
2061
2062 break;
2063 }
2064
2065 /* Read Character and Attribute at Cursor Position */
2066 case 0x08:
2067 {
2068 WORD CharacterData;
2069 BYTE Page = getBH();
2070 DWORD Offset;
2071
2072 /* Check if the page exists */
2073 if (Page >= BIOS_MAX_PAGES) break;
2074
2075 /* Find the offset of the character */
2076 Offset = Page * Bda->VideoPageSize +
2077 (HIBYTE(Bda->CursorPosition[Page]) * Bda->ScreenColumns +
2078 LOBYTE(Bda->CursorPosition[Page])) * 2;
2079
2080 /* Read from the video memory */
2081 EmulatorReadMemory(&EmulatorContext,
2082 TO_LINEAR(TEXT_VIDEO_SEG, Offset),
2083 (LPVOID)&CharacterData,
2084 sizeof(WORD));
2085
2086 /* Return the character data in AX */
2087 setAX(CharacterData);
2088
2089 break;
2090 }
2091
2092 /* Write Character and Attribute at Cursor Position */
2093 case 0x09:
2094 /* Write Character only (PCjr: + Attribute) at Cursor Position */
2095 case 0x0A:
2096 {
2097 WORD CharacterData = MAKEWORD(getAL(), getBL());
2098 BYTE Page = getBH();
2099 DWORD Offset, Counter = getCX();
2100
2101 /* Check if the page exists */
2102 if (Page >= BIOS_MAX_PAGES) break;
2103
2104 /* Find the offset of the character */
2105 Offset = Page * Bda->VideoPageSize +
2106 (HIBYTE(Bda->CursorPosition[Page]) * Bda->ScreenColumns +
2107 LOBYTE(Bda->CursorPosition[Page])) * 2;
2108
2109 /* Write to video memory a certain number of times */
2110 while (Counter > 0)
2111 {
2112 EmulatorWriteMemory(&EmulatorContext,
2113 TO_LINEAR(TEXT_VIDEO_SEG, Offset),
2114 (LPVOID)&CharacterData,
2115 (getAH() == 0x09) ? sizeof(WORD) : sizeof(BYTE));
2116 Offset += 2;
2117 Counter--;
2118 }
2119
2120 break;
2121 }
2122
2123 /* Set Video Colors */
2124 case 0x0B:
2125 {
2126 if (Bda->VideoMode < 4 || Bda->VideoMode > 6)
2127 {
2128 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X is unsupported for non-CGA modes\n",
2129 getAH(), getBH());
2130 break;
2131 }
2132
2133 switch (getBH())
2134 {
2135 case 0x00: /* Set Background/Border Color */
2136 {
2137 #ifdef DOSBOX
2138 BYTE Index = getBL();
2139 BYTE CrtColorPaletteMask = Bda->CrtColorPaletteMask;
2140 CrtColorPaletteMask = (CrtColorPaletteMask & 0xE0) | (Index & 0x1F);
2141 Bda->CrtColorPaletteMask = CrtColorPaletteMask;
2142
2143 Index = ((Index << 1) & 0x10) | (Index & 0x7);
2144
2145 /* Always set the overscan color */
2146 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Index);
2147
2148 /* Don't set any extra colors when in text mode */
2149 if (Bda->VideoMode <= 3) break;
2150
2151 VgaSetSinglePaletteRegister(0x00, Index);
2152
2153 Index = (CrtColorPaletteMask & 0x10) | 0x02 | ((CrtColorPaletteMask & 0x20) >> 5);
2154
2155 VgaSetSinglePaletteRegister(0x01, Index);
2156 Index += 2;
2157 VgaSetSinglePaletteRegister(0x02, Index);
2158 Index += 2;
2159 VgaSetSinglePaletteRegister(0x03, Index);
2160 #else
2161 /* Background/Border Color is modifiable via the first index */
2162 VgaSetSinglePaletteRegister(0x00, getBL());
2163 #endif
2164
2165 /* Enable screen and disable palette access */
2166 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2167 IOWriteB(VGA_AC_INDEX, 0x20);
2168 break;
2169 }
2170
2171 case 0x01: /* Set Palette */
2172 {
2173 BYTE Index = getBL();
2174 BYTE CrtColorPaletteMask = Bda->CrtColorPaletteMask;
2175 CrtColorPaletteMask = (CrtColorPaletteMask & 0xDF) | ((Index & 1) ? 0x20 : 0x0);
2176 Bda->CrtColorPaletteMask = CrtColorPaletteMask;
2177
2178 /* Don't set any extra colors when in text mode */
2179 if (Bda->VideoMode <= 3) break;
2180
2181 Index = (CrtColorPaletteMask & 0x10) | 0x02 | Index;
2182
2183 VgaSetSinglePaletteRegister(0x01, Index);
2184 Index += 2;
2185 VgaSetSinglePaletteRegister(0x02, Index);
2186 Index += 2;
2187 VgaSetSinglePaletteRegister(0x03, Index);
2188
2189 /* Enable screen and disable palette access */
2190 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2191 IOWriteB(VGA_AC_INDEX, 0x20);
2192 break;
2193 }
2194
2195 default:
2196 DPRINT1("BIOS Function INT 10h, AH = 0Bh, BH = 0x%02X NOT IMPLEMENTED\n",
2197 getAH(), getBH());
2198 break;
2199 }
2200
2201 break;
2202 }
2203
2204 /* Teletype Output */
2205 case 0x0E:
2206 {
2207 VidBiosPrintCharacter(getAL(), getBL(), getBH());
2208 break;
2209 }
2210
2211 /* Get Current Video Mode */
2212 case 0x0F:
2213 {
2214 setAX(MAKEWORD(Bda->VideoMode, Bda->ScreenColumns));
2215 setBX(MAKEWORD(getBL(), Bda->VideoPage));
2216 break;
2217 }
2218
2219 /* Palette Control */
2220 case 0x10:
2221 {
2222 switch (getAL())
2223 {
2224 /* Set Single Palette Register */
2225 case 0x00:
2226 {
2227 VgaSetSinglePaletteRegister(getBL(), getBH());
2228
2229 /* Enable screen and disable palette access */
2230 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2231 IOWriteB(VGA_AC_INDEX, 0x20);
2232 break;
2233 }
2234
2235 /* Set Overscan Color */
2236 case 0x01:
2237 {
2238 VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, getBH());
2239
2240 /* Enable screen and disable palette access */
2241 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2242 IOWriteB(VGA_AC_INDEX, 0x20);
2243 break;
2244 }
2245
2246 /* Set All Palette Registers */
2247 case 0x02:
2248 {
2249 INT i;
2250 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
2251
2252 /* Set the palette registers */
2253 for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
2254 {
2255 VgaSetSinglePaletteRegister(i, Buffer[i]);
2256 }
2257
2258 /* Set the overscan register */
2259 // VgaSetSinglePaletteRegister(VGA_AC_OVERSCAN_REG, Buffer[VGA_AC_PAL_F_REG + 1]);
2260 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
2261 IOWriteB(VGA_AC_WRITE, Buffer[VGA_AC_PAL_F_REG + 1]);
2262
2263 /* Enable screen and disable palette access */
2264 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2265 IOWriteB(VGA_AC_INDEX, 0x20);
2266 break;
2267 }
2268
2269 /* Get Single Palette Register */
2270 case 0x07:
2271 {
2272 /* Write the index */
2273 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2274 IOWriteB(VGA_AC_INDEX, getBL());
2275
2276 /* Read the data */
2277 setBH(IOReadB(VGA_AC_READ));
2278
2279 /* Enable screen and disable palette access */
2280 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2281 IOWriteB(VGA_AC_INDEX, 0x20);
2282 break;
2283 }
2284
2285 /* Get Overscan Color */
2286 case 0x08:
2287 {
2288 /* Write the index */
2289 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2290 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
2291
2292 /* Read the data */
2293 setBH(IOReadB(VGA_AC_READ));
2294
2295 /* Enable screen and disable palette access */
2296 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2297 IOWriteB(VGA_AC_INDEX, 0x20);
2298 break;
2299 }
2300
2301 /* Get All Palette Registers */
2302 case 0x09:
2303 {
2304 INT i;
2305 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
2306
2307 /* Get the palette registers */
2308 for (i = 0; i <= VGA_AC_PAL_F_REG; i++)
2309 {
2310 /* Write the index */
2311 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2312 IOWriteB(VGA_AC_INDEX, i);
2313
2314 /* Read the data */
2315 Buffer[i] = IOReadB(VGA_AC_READ);
2316 }
2317
2318 /* Get the overscan register */
2319 IOWriteB(VGA_AC_INDEX, VGA_AC_OVERSCAN_REG);
2320 Buffer[VGA_AC_PAL_F_REG + 1] = IOReadB(VGA_AC_READ);
2321
2322 /* Enable screen and disable palette access */
2323 IOReadB(VGA_INSTAT1_READ); // Put the AC register into index state
2324 IOWriteB(VGA_AC_INDEX, 0x20);
2325 break;
2326 }
2327
2328 /* Set Individual DAC Register */
2329 case 0x10:
2330 {
2331 /* Write the index */
2332 // Certainly in BL and not in BX as said by Ralf Brown...
2333 IOWriteB(VGA_DAC_WRITE_INDEX, getBL());
2334
2335 /* Write the data in this order: Red, Green, Blue */
2336 IOWriteB(VGA_DAC_DATA, getDH());
2337 IOWriteB(VGA_DAC_DATA, getCH());
2338 IOWriteB(VGA_DAC_DATA, getCL());
2339
2340 break;
2341 }
2342
2343 /* Set Block of DAC Registers */
2344 case 0x12:
2345 {
2346 INT i;
2347 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
2348
2349 /* Write the index */
2350 // Certainly in BL and not in BX as said by Ralf Brown...
2351 IOWriteB(VGA_DAC_WRITE_INDEX, getBL());
2352
2353 for (i = 0; i < getCX(); i++)
2354 {
2355 /* Write the data in this order: Red, Green, Blue */
2356 IOWriteB(VGA_DAC_DATA, *Buffer++);
2357 IOWriteB(VGA_DAC_DATA, *Buffer++);
2358 IOWriteB(VGA_DAC_DATA, *Buffer++);
2359 }
2360
2361 break;
2362 }
2363
2364 /* Get Individual DAC Register */
2365 case 0x15:
2366 {
2367 /* Write the index */
2368 IOWriteB(VGA_DAC_READ_INDEX, getBL());
2369
2370 /* Read the data in this order: Red, Green, Blue */
2371 setDH(IOReadB(VGA_DAC_DATA));
2372 setCH(IOReadB(VGA_DAC_DATA));
2373 setCL(IOReadB(VGA_DAC_DATA));
2374
2375 break;
2376 }
2377
2378 /* Get Block of DAC Registers */
2379 case 0x17:
2380 {
2381 INT i;
2382 LPBYTE Buffer = SEG_OFF_TO_PTR(getES(), getDX());
2383
2384 /* Write the index */
2385 // Certainly in BL and not in BX as said by Ralf Brown...
2386 IOWriteB(VGA_DAC_READ_INDEX, getBL());
2387
2388 for (i = 0; i < getCX(); i++)
2389 {
2390 /* Write the data in this order: Red, Green, Blue */
2391 *Buffer++ = IOReadB(VGA_DAC_DATA);
2392 *Buffer++ = IOReadB(VGA_DAC_DATA);
2393 *Buffer++ = IOReadB(VGA_DAC_DATA);
2394 }
2395
2396 break;
2397 }
2398
2399 default:
2400 {
2401 DPRINT1("BIOS Palette Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
2402 getAL());
2403 break;
2404 }
2405 }
2406
2407 break;
2408 }
2409
2410 /* Font Control */
2411 case 0x11:
2412 {
2413 switch (getAL())
2414 {
2415 case 0x30:
2416 {
2417 USHORT Offsets[] =
2418 {
2419 FONT_8x8_HIGH_OFFSET, /* 00h - INT 0x1F pointer */
2420 0, /* 01h - NOT IMPLEMENTED - INT 0x43 pointer */
2421 0, /* 02h - NOT IMPLEMENTED - 8x14 font */
2422 FONT_8x8_OFFSET, /* 03h - 8x8 font */
2423 FONT_8x8_HIGH_OFFSET, /* 04h - 8x8 font, upper half */
2424 0, /* 05h - NOT IMPLEMENTED - 9x14 font */
2425 FONT_8x16_OFFSET, /* 06h - 8x16 font */
2426 0, /* 07h - NOT IMPLEMENTED - 9x16 font */
2427 };
2428
2429 /* Return the data */
2430 setES(VIDEO_BIOS_DATA_SEG);
2431 setBP(Offsets[getBH() & 7]);
2432
2433 break;
2434 }
2435
2436 default:
2437 {
2438 DPRINT1("BIOS Font Control Sub-command AL = 0x%02X NOT IMPLEMENTED\n",
2439 getAL());
2440 }
2441 }
2442
2443 break;
2444 }
2445
2446 /* Alternate Function Select */
2447 case 0x12:
2448 {
2449 DPRINT1("BIOS Function INT 10h, AH = 12h (Alternate Function Select), BX = 0x%04X NOT IMPLEMENTED\n",
2450 getBX());
2451 break;
2452 }
2453
2454 /* Write String */
2455 case 0x13:
2456 {
2457 DPRINT1("BIOS Function INT 13h (Write String) is UNIMPLEMENTED\n");
2458 break;
2459 }
2460
2461 /* Display combination code */
2462 case 0x1A:
2463 {
2464 switch (getAL())
2465 {
2466 case 0x00: /* Get Display combiantion code */
2467 setAX(MAKEWORD(0x1A, 0x1A));
2468 setBX(MAKEWORD(0x08, 0x00)); /* VGA w/ color analog display */
2469 break;
2470 case 0x01: /* Set Display combination code */
2471 DPRINT1("Set Display combination code - Unsupported\n");
2472 break;
2473 default:
2474 break;
2475 }
2476 break;
2477 }
2478
2479 default:
2480 {
2481 DPRINT1("BIOS Function INT 10h, AH = 0x%02X, AL = 0x%02X, BH = 0x%02X NOT IMPLEMENTED\n",
2482 getAH(), getAL(), getBH());
2483 }
2484 }
2485 }
2486
2487
2488 /*
2489 * Those attach / detach functions are work-in-progress
2490 */
2491
2492 static BOOL Attached = TRUE;
2493
2494 VOID VidBiosAttachToConsole(VOID)
2495 {
2496 // VgaRefreshDisplay();
2497 if (!Attached)
2498 {
2499 VgaAttachToConsole();
2500 Attached = TRUE;
2501 }
2502
2503 VgaRefreshDisplay();
2504 VidBiosSyncCursorPosition();
2505 }
2506
2507 VOID VidBiosDetachFromConsole(VOID)
2508 {
2509 /* Perform another screen refresh */
2510 VgaRefreshDisplay();
2511
2512 /* Detach from the console */
2513 VgaDetachFromConsole(FALSE);
2514 Attached = FALSE;
2515 }
2516
2517 BOOLEAN VidBiosInitialize(VOID)
2518 {
2519 /* Some interrupts are in fact addresses to tables */
2520 ((PULONG)BaseAddress)[0x1D] = (ULONG)NULL;
2521 ((PULONG)BaseAddress)[0x1F] = MAKELONG(FONT_8x8_HIGH_OFFSET, VIDEO_BIOS_DATA_SEG);
2522 // ((PULONG)BaseAddress)[0x42] = (ULONG)NULL;
2523 ((PULONG)BaseAddress)[0x43] = (ULONG)NULL;
2524 ((PULONG)BaseAddress)[0x44] = (ULONG)NULL;
2525
2526 /* Fill the tables */
2527 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x8_OFFSET),
2528 Font8x8,
2529 sizeof(Font8x8));
2530 RtlMoveMemory(SEG_OFF_TO_PTR(VIDEO_BIOS_DATA_SEG, FONT_8x16_OFFSET),
2531 Font8x16,
2532 sizeof(Font8x16));
2533
2534 /* Write the default font to the VGA font plane */
2535 VgaWriteFont(0, Font8x16, 16);
2536
2537 /* Initialize the VGA BDA data */
2538 Bda->VGAOptions = 0x30; /* 256 KB Video RAM */
2539 Bda->VGASwitches = 0x09; /* High-resolution */
2540
2541 //
2542 // FIXME: At the moment we always set a VGA mode. In the future,
2543 // we should set this mode **only** when:
2544 // - an app starts to use directly the video memory
2545 // (that should be done in emulator.c)
2546 // - or starts to use non-stream I/O interrupts
2547 // (that should be done here, or maybe in VGA ??)
2548 //
2549
2550 /* Set the default video mode */
2551 VidBiosSetVideoMode(BIOS_DEFAULT_VIDEO_MODE);
2552
2553 /* Synchronize our cursor position with VGA */
2554 VidBiosSyncCursorPosition();
2555
2556 /* Register the BIOS support BOPs */
2557 RegisterBop(BOP_VIDEO_INT, VidBiosVideoService);
2558
2559 return TRUE;
2560 }
2561
2562 VOID VidBiosCleanup(VOID)
2563 {
2564 }
2565
2566 /* EOF */