1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <math.h>
4 #include "ibm.h"
5 #include "device.h"
6 #include "mem.h"
7 #include "video.h"
8 #include "vid_svga.h"
9 #include "io.h"
10 #include "cpu.h"
11 #include "rom.h"
12 #include "thread.h"
13 #include "timer.h"
14
15 #include "vid_ati18800.h"
16 #include "vid_ati28800.h"
17 #include "vid_ati_mach64.h"
18 #include "vid_cga.h"
19 #include "vid_cl5429.h"
20 #include "vid_compaq_cga.h"
21 #include "vid_ega.h"
22 #include "vid_et4000.h"
23 #include "vid_et4000w32.h"
24 #include "vid_genius.h"
25 #include "vid_hercules.h"
26 #include "vid_ht216.h"
27 #include "vid_incolor.h"
28 #include "vid_colorplus.h"
29 #include "vid_mda.h"
30 #include "vid_olivetti_m24.h"
31 #include "vid_oti037.h"
32 #include "vid_oti067.h"
33 #include "vid_paradise.h"
34 #include "vid_pc1512.h"
35 #include "vid_pc1640.h"
36 #include "vid_pc200.h"
37 #include "vid_pcjr.h"
38 #include "vid_ps1_svga.h"
39 #include "vid_s3.h"
40 #include "vid_s3_virge.h"
41 #include "vid_sigma.h"
42 #include "vid_tandy.h"
43 #include "vid_tandysl.h"
44 #include "vid_tgui9440.h"
45 #include "vid_tvga.h"
46 #include "vid_vga.h"
47 #include "vid_wy700.h"
48 #include "vid_t3100e.h"
49 #include "vid_t1000.h"
50
51 enum
52 {
53 VIDEO_ISA = 0,
54 VIDEO_BUS
55 };
56
57 #define VIDEO_FLAG_TYPE_CGA 0
58 #define VIDEO_FLAG_TYPE_MDA 1
59 #define VIDEO_FLAG_TYPE_SPECIAL 2
60 #define VIDEO_FLAG_TYPE_MASK 3
61
62
63 typedef struct
64 {
65 int type;
66 int write_b, write_w, write_l;
67 int read_b, read_w, read_l;
68 } video_timings_t;
69
70 typedef struct
71 {
72 char name[64];
73 char internal_name[24];
74 device_t *device;
75 int legacy_id;
76 int flags;
77 video_timings_t timing;
78 } VIDEO_CARD;
79
80 static VIDEO_CARD video_cards[] =
81 {
82 {"ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx", &mach64gx_device, GFX_MACH64GX, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}},
83 {"ATI Video Xpression (Mach64 VT2)", "mach64vt2", &mach64vt2_device, GFX_MACH64VT2, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}},
84 {"ATI Korean VGA (ATI-28800)", "ati28800k", &ati28800k_device, GFX_ATIKOREANVGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
85 {"ATI VGA Charger (ATI-28800)", "ati28800", &ati28800_device, GFX_VGACHARGER, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
86 {"ATI VGA Edge-16 (ATI-18800)", "ati18800", &ati18800_device, GFX_VGAEDGE16, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
87 {"CGA", "cga", &cga_device, GFX_CGA, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
88 {"Cirrus Logic CL-GD5429", "cl_gd5429", &gd5429_device, GFX_CL_GD5429, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
89 {"Cirrus Logic CL-GD5430", "cl_gd5430", &gd5430_device, GFX_CL_GD5430, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
90 {"Cirrus Logic CL-GD5434", "cl_gd5434", &gd5434_device, GFX_CL_GD5434, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
91 {"Compaq CGA", "compaq_cga", &compaq_cga_device, GFX_COMPAQ_CGA, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
92 {"Diamond Stealth 32 (Tseng ET4000/w32p)", "stealth32", &et4000w32p_device, GFX_ET4000W32, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}},
93 {"Diamond Stealth 3D 2000 (S3 ViRGE)", "stealth3d_2000", &s3_virge_device, GFX_VIRGE, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
94 {"EGA", "ega", &ega_device, GFX_EGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
95 {"Hercules", "hercules", &hercules_device, GFX_HERCULES, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
96 {"Hercules InColor", "incolor", &incolor_device, GFX_INCOLOR, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
97 {"MDA", "mda", &mda_device, GFX_MDA, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
98 {"MDSI Genius", "genius", &genius_device, GFX_GENIUS, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
99 {"Number Nine 9FX (S3 Trio64)", "n9_9fx", &s3_9fx_device, GFX_N9_9FX, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
100 {"OAK OTI-037", "oti037", &oti037_device, GFX_OTI037, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
101 {"OAK OTI-067", "oti067", &oti067_device, GFX_OTI067, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
102 {"Olivetti GO481 (Paradise PVGA1A)", "olivetti_go481", ¶dise_pvga1a_oli_go481_device, GFX_OLIVETTI_GO481, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
103 {"Paradise Bahamas 64 (S3 Vision864)", "bahamas64", &s3_bahamas64_device, GFX_BAHAMAS64, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 5, 20, 20, 35}},
104 {"Phoenix S3 Trio32", "px_trio32", &s3_phoenix_trio32_device, GFX_PHOENIX_TRIO32, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
105 {"Phoenix S3 Trio64", "px_trio64", &s3_phoenix_trio64_device, GFX_PHOENIX_TRIO64, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
106 {"Plantronics ColorPlus", "plantronics", &colorplus_device, GFX_COLORPLUS, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
107 {"S3 ViRGE/DX", "virge375", &s3_virge_375_device, GFX_VIRGEDX, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
108 {"Sigma Color 400", "sigma400", &sigma_device, GFX_SIGMA400, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
109 {"Trident TVGA8900D", "tvga8900d", &tvga8900d_device, GFX_TVGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}},
110 {"Trigem Korean VGA (Tseng ET4000AX)", "tgkorvga", &et4000k_device, GFX_TGKOREANVGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
111 {"Tseng ET4000AX", "et4000ax", &et4000_device, GFX_ET4000, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
112 {"Trident TGUI9400CXi", "tgui9400cxi", &tgui9400cxi_device, GFX_TGUI9400CXI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 8, 16, 4, 8, 16}},
113 {"Trident TGUI9440", "tgui9440", &tgui9440_device, GFX_TGUI9440, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 8, 16, 4, 8, 16}},
114 {"VGA", "vga", &vga_device, GFX_VGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
115 {"Wyse 700", "wy700", &wy700_device, GFX_WY700, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
116 {"", "", NULL, 0}
117 };
118
119 static video_timings_t timing_dram = {VIDEO_BUS, 0,0,0, 0,0,0}; /*No additional waitstates*/
120 static video_timings_t timing_pc1512 = {VIDEO_BUS, 0,0,0, 0,0,0}; /*PC1512 video code handles waitstates itself*/
121 static video_timings_t timing_pc1640 = {VIDEO_ISA, 8,16,32, 8,16,32};
122 static video_timings_t timing_pc200 = {VIDEO_ISA, 8,16,32, 8,16,32};
123 static video_timings_t timing_m24 = {VIDEO_ISA, 8,16,32, 8,16,32};
124 static video_timings_t timing_pvga1a = {VIDEO_ISA, 6, 8,16, 6, 8,16};
125 static video_timings_t timing_wd90c11 = {VIDEO_ISA, 3, 3, 6, 5, 5,10};
126 static video_timings_t timing_oti067 = {VIDEO_ISA, 6, 8,16, 6, 8,16};
127 static video_timings_t timing_vga = {VIDEO_ISA, 8,16,32, 8,16,32};
128 static video_timings_t timing_ps1_svga = {VIDEO_ISA, 6, 8,16, 6, 8,16};
129 static video_timings_t timing_t3100e = {VIDEO_ISA, 8,16,32, 8,16,32};
130 static video_timings_t timing_t1000 = {VIDEO_ISA, 8,16,32, 8,16,32};
131 static video_timings_t timing_pc425x = {VIDEO_BUS, 5, 5, 9, 20,20,30};
132 static video_timings_t timing_pb410a = {VIDEO_BUS, 5, 5, 9, 20,20,30};
133 static video_timings_t timing_pb570 = {VIDEO_BUS, 4, 4, 8, 10,10,20};
134 static video_timings_t timing_pb520r = {VIDEO_BUS, 4, 4, 8, 10,10,20};
135
video_card_available(int card)136 int video_card_available(int card)
137 {
138 if (card == GFX_BUILTIN)
139 return 1;
140
141 if (video_cards[card].device)
142 return device_available(video_cards[card].device);
143
144 return 1;
145 }
146
video_card_getname(int card)147 char *video_card_getname(int card)
148 {
149 if (card == GFX_BUILTIN)
150 return "Built-in video";
151 return video_cards[card].name;
152 }
153
video_card_getdevice(int card,int romset)154 device_t *video_card_getdevice(int card, int romset)
155 {
156 switch (romset)
157 {
158 case ROM_IBMPCJR:
159 return &pcjr_video_device;
160
161 case ROM_TANDY:
162 case ROM_TANDY1000HX:
163 return &tandy_device;
164
165 case ROM_TANDY1000SL2:
166 return &tandysl_device;
167
168 case ROM_PC1512:
169 return &pc1512_device;
170
171 case ROM_PC1640:
172 if (card == GFX_BUILTIN)
173 return &pc1640_device;
174 break;
175
176 case ROM_PC200:
177 if (card == GFX_BUILTIN)
178 return &pc200_device;
179 break;
180
181 case ROM_PPC512:
182 if (card == GFX_BUILTIN)
183 return &ppc512_device;
184 break;
185
186 case ROM_OLIM24:
187 return &m24_device;
188
189 case ROM_PC2086:
190 if (card == GFX_BUILTIN)
191 return ¶dise_pvga1a_pc2086_device;
192 break;
193
194 case ROM_PC3086:
195 if (card == GFX_BUILTIN)
196 return ¶dise_pvga1a_pc3086_device;
197 break;
198
199 case ROM_MEGAPC:
200 return ¶dise_wd90c11_megapc_device;
201
202 case ROM_ACER386:
203 return &oti067_acer386_device;
204
205 case ROM_AMA932J:
206 return &oti067_ama932j_device;
207
208 case ROM_IBMPS1_2011:
209 case ROM_IBMPS2_M30_286:
210 case ROM_IBMPS2_M50:
211 case ROM_IBMPS2_M55SX:
212 case ROM_IBMPS2_M70_TYPE3:
213 case ROM_IBMPS2_M70_TYPE4:
214 case ROM_IBMPS2_M80:
215 return &ps1vga_device;
216
217 case ROM_IBMPS1_2121:
218 return &ps1_m2121_svga_device;
219
220 case ROM_T3100E:
221 return &t3100e_device;
222
223 case ROM_T1000:
224 case ROM_T1200:
225 return &t1000_device;
226
227 case ROM_ELX_PC425X:
228 return &tgui9400cxi_elx_device;
229
230 case ROM_PB410A:
231 return &ht216_32_pb410a_device;
232
233 case ROM_PB570:
234 return &gd5430_pb570_device;
235
236 case ROM_PB520R:
237 return &gd5434_pb520r_device;
238 }
239 return video_cards[card].device;
240 }
241
video_card_has_config(int card,int romset)242 int video_card_has_config(int card, int romset)
243 {
244 /* Allow builtin cards to have configuration */
245 device_t *device = video_card_getdevice(card, romset);
246
247 if (!device)
248 {
249 return 0;
250 }
251 return device->config ? 1 : 0;
252 }
253
video_card_getid(char * s)254 int video_card_getid(char *s)
255 {
256 int c = 0;
257
258 while (video_cards[c].device)
259 {
260 if (!strcmp(video_cards[c].name, s))
261 return c;
262 c++;
263 }
264
265 if (!strcmp(s, "Built-in video"))
266 return GFX_BUILTIN;
267
268 return 0;
269 }
270
video_old_to_new(int card)271 int video_old_to_new(int card)
272 {
273 int c = 0;
274
275 if (card == GFX_BUILTIN)
276 return GFX_BUILTIN;
277
278 while (video_cards[c].device)
279 {
280 if (video_cards[c].legacy_id == card)
281 return c;
282 c++;
283 }
284
285 return 0;
286 }
287
video_new_to_old(int card)288 int video_new_to_old(int card)
289 {
290 if (card == GFX_BUILTIN)
291 return GFX_BUILTIN;
292
293 return video_cards[card].legacy_id;
294 }
295
video_get_internal_name(int card)296 char *video_get_internal_name(int card)
297 {
298 if (card == GFX_BUILTIN)
299 return "builtin";
300
301 return video_cards[card].internal_name;
302 }
303
video_get_video_from_internal_name(char * s)304 int video_get_video_from_internal_name(char *s)
305 {
306 int c = 0;
307
308 if (!strcmp(s, "builtin"))
309 return GFX_BUILTIN;
310
311 while (video_cards[c].legacy_id != -1)
312 {
313 if (!strcmp(video_cards[c].internal_name, s))
314 return video_cards[c].legacy_id;
315 c++;
316 }
317
318 return 0;
319 }
320
video_is_mda()321 int video_is_mda()
322 {
323 switch (romset)
324 {
325 case ROM_PC200:
326 case ROM_PPC512:
327 if (gfxcard == GFX_BUILTIN)
328 {
329 /* The chipset here can emulate either CGA or MDA. Find out which */
330 return (pc200_is_mda);
331 }
332 break;
333
334 case ROM_PC1640:
335 case ROM_PC2086:
336 case ROM_PC3086:
337 case ROM_MEGAPC:
338 case ROM_ACER386:
339 if (gfxcard != GFX_BUILTIN)
340 break;
341 case ROM_IBMPCJR:
342 case ROM_TANDY:
343 case ROM_TANDY1000HX:
344 case ROM_TANDY1000SL2:
345 case ROM_PC1512:
346 case ROM_OLIM24:
347 case ROM_IBMPS1_2011:
348 case ROM_IBMPS2_M30_286:
349 case ROM_IBMPS2_M50:
350 case ROM_IBMPS2_M55SX:
351 case ROM_IBMPS2_M70_TYPE3:
352 case ROM_IBMPS2_M70_TYPE4:
353 case ROM_IBMPS2_M80:
354 case ROM_IBMPS1_2121:
355 case ROM_T3100E:
356 case ROM_T1000:
357 case ROM_ELX_PC425X:
358 case ROM_PB410A:
359 case ROM_PB570:
360 case ROM_PB520R:
361 return 0;
362 }
363 return (video_cards[video_old_to_new(gfxcard)].flags & VIDEO_FLAG_TYPE_MASK) == VIDEO_FLAG_TYPE_MDA;
364 }
video_is_cga()365 int video_is_cga()
366 {
367 switch (romset)
368 {
369 case ROM_PC200:
370 case ROM_PPC512:
371 if (gfxcard == GFX_BUILTIN)
372 {
373 /* The chipset here can emulate either CGA or MDA. Find out which */
374 return (!pc200_is_mda);
375 }
376 break;
377
378 case ROM_IBMPCJR:
379 case ROM_TANDY:
380 case ROM_TANDY1000HX:
381 case ROM_TANDY1000SL2:
382 case ROM_PC1512:
383 case ROM_OLIM24:
384 case ROM_T3100E:
385 case ROM_T1000:
386 return 1;
387
388 case ROM_PC1640:
389 case ROM_PC2086:
390 case ROM_PC3086:
391 case ROM_MEGAPC:
392 case ROM_ACER386:
393 if (gfxcard != GFX_BUILTIN)
394 break;
395 case ROM_IBMPS1_2011:
396 case ROM_IBMPS2_M30_286:
397 case ROM_IBMPS2_M50:
398 case ROM_IBMPS2_M55SX:
399 case ROM_IBMPS2_M70_TYPE3:
400 case ROM_IBMPS2_M70_TYPE4:
401 case ROM_IBMPS2_M80:
402 case ROM_IBMPS1_2121:
403 case ROM_ELX_PC425X:
404 case ROM_PB410A:
405 case ROM_PB570:
406 case ROM_PB520R:
407 return 0;
408 }
409 return (video_cards[video_old_to_new(gfxcard)].flags & VIDEO_FLAG_TYPE_MASK) == VIDEO_FLAG_TYPE_CGA;
410 }
video_is_ega_vga()411 int video_is_ega_vga()
412 {
413 switch (romset)
414 {
415 case ROM_IBMPCJR:
416 case ROM_TANDY:
417 case ROM_TANDY1000HX:
418 case ROM_TANDY1000SL2:
419 case ROM_PC1512:
420 case ROM_PC200:
421 case ROM_PPC512:
422 case ROM_OLIM24:
423 case ROM_T3100E:
424 case ROM_T1000:
425 return 0;
426
427 case ROM_PC1640:
428 case ROM_PC2086:
429 case ROM_PC3086:
430 case ROM_MEGAPC:
431 case ROM_ACER386:
432 case ROM_AMA932J:
433 case ROM_IBMPS1_2011:
434 case ROM_IBMPS2_M30_286:
435 case ROM_IBMPS2_M50:
436 case ROM_IBMPS2_M55SX:
437 case ROM_IBMPS2_M70_TYPE3:
438 case ROM_IBMPS2_M70_TYPE4:
439 case ROM_IBMPS2_M80:
440 case ROM_IBMPS1_2121:
441 case ROM_ELX_PC425X:
442 case ROM_PB410A:
443 case ROM_PB570:
444 case ROM_PB520R:
445 return 1;
446 }
447 return (video_cards[video_old_to_new(gfxcard)].flags & VIDEO_FLAG_TYPE_MASK) == VIDEO_FLAG_TYPE_SPECIAL;
448 }
449
450 int video_fullscreen = 0, video_fullscreen_scale, video_fullscreen_first;
451 int video_force_aspect_ration = 0;
452 int vid_disc_indicator = 0;
453
454 uint32_t *video_15to32, *video_16to32;
455
456 int egareads=0,egawrites=0;
457 int changeframecount=2;
458
459 uint8_t rotatevga[8][256];
460
461 int frames = 0;
462 int video_frames = 0;
463 int video_refresh_rate = 0;
464
465 int fullchange;
466
467 uint8_t edatlookup[4][4];
468
469 /*Video timing settings -
470
471 8-bit - 1mb/sec
472 B = 8 ISA clocks
473 W = 16 ISA clocks
474 L = 32 ISA clocks
475
476 Slow 16-bit - 2mb/sec
477 B = 6 ISA clocks
478 W = 8 ISA clocks
479 L = 16 ISA clocks
480
481 Fast 16-bit - 4mb/sec
482 B = 3 ISA clocks
483 W = 3 ISA clocks
484 L = 6 ISA clocks
485
486 Slow VLB/PCI - 8mb/sec (ish)
487 B = 4 bus clocks
488 W = 8 bus clocks
489 L = 16 bus clocks
490
491 Mid VLB/PCI -
492 B = 4 bus clocks
493 W = 5 bus clocks
494 L = 10 bus clocks
495
496 Fast VLB/PCI -
497 B = 3 bus clocks
498 W = 3 bus clocks
499 L = 4 bus clocks
500 */
501
502 int video_speed = 0;
503 int video_timing[7][4] =
504 {
505 {VIDEO_ISA, 8, 16, 32},
506 {VIDEO_ISA, 6, 8, 16},
507 {VIDEO_ISA, 3, 3, 6},
508 {VIDEO_BUS, 4, 8, 16},
509 {VIDEO_BUS, 4, 5, 10},
510 {VIDEO_BUS, 3, 3, 4}
511 };
512
video_updatetiming()513 void video_updatetiming()
514 {
515 if (video_speed == -1)
516 {
517 video_timings_t *timing;
518 int new_gfxcard = 0;
519
520 new_gfxcard = video_old_to_new(gfxcard);
521 timing = &video_cards[new_gfxcard].timing;
522
523 switch (romset)
524 {
525 case ROM_IBMPCJR:
526 case ROM_TANDY:
527 case ROM_TANDY1000HX:
528 case ROM_TANDY1000SL2:
529 timing = &timing_dram;
530 break;
531
532 case ROM_PC1512:
533 timing = &timing_pc1512;
534 break;
535
536 case ROM_PC1640:
537 if (gfxcard == GFX_BUILTIN)
538 timing = &timing_pc1640;
539 break;
540
541 case ROM_PC200:
542 case ROM_PPC512:
543 if (gfxcard == GFX_BUILTIN)
544 timing = &timing_pc200;
545 break;
546
547 case ROM_OLIM24:
548 timing = &timing_m24;
549 break;
550
551 case ROM_PC2086:
552 case ROM_PC3086:
553 if (gfxcard == GFX_BUILTIN)
554 timing = &timing_pvga1a;
555 break;
556
557 case ROM_MEGAPC:
558 if (gfxcard == GFX_BUILTIN)
559 timing = &timing_wd90c11;
560 break;
561
562 case ROM_ACER386:
563 if (gfxcard == GFX_BUILTIN)
564 timing = &timing_oti067;
565 break;
566
567 case ROM_AMA932J:
568 if (gfxcard == GFX_BUILTIN)
569 timing = &timing_oti067;
570 break;
571
572 case ROM_IBMPS1_2011:
573 case ROM_IBMPS2_M30_286:
574 case ROM_IBMPS2_M50:
575 case ROM_IBMPS2_M55SX:
576 case ROM_IBMPS2_M70_TYPE3:
577 case ROM_IBMPS2_M70_TYPE4:
578 case ROM_IBMPS2_M80:
579 timing = &timing_vga;
580 break;
581
582 case ROM_IBMPS1_2121:
583 timing = &timing_ps1_svga;
584 break;
585
586 case ROM_T3100E:
587 timing = &timing_t3100e;
588 break;
589
590 case ROM_T1000:
591 timing = &timing_t1000;
592 break;
593
594 case ROM_ELX_PC425X:
595 timing = &timing_pc425x;
596 break;
597
598 case ROM_PB410A:
599 if (gfxcard == GFX_BUILTIN)
600 timing = &timing_pb410a;
601 break;
602
603 case ROM_PB570:
604 timing = &timing_pb570;
605 break;
606
607 case ROM_PB520R:
608 timing = &timing_pb520r;
609 break;
610 }
611
612
613 if (timing->type == VIDEO_ISA)
614 {
615 video_timing_read_b = ISA_CYCLES(timing->read_b);
616 video_timing_read_w = ISA_CYCLES(timing->read_w);
617 video_timing_read_l = ISA_CYCLES(timing->read_l);
618 video_timing_write_b = ISA_CYCLES(timing->write_b);
619 video_timing_write_w = ISA_CYCLES(timing->write_w);
620 video_timing_write_l = ISA_CYCLES(timing->write_l);
621 }
622 else
623 {
624 video_timing_read_b = (int)(bus_timing * timing->read_b);
625 video_timing_read_w = (int)(bus_timing * timing->read_w);
626 video_timing_read_l = (int)(bus_timing * timing->read_l);
627 video_timing_write_b = (int)(bus_timing * timing->write_b);
628 video_timing_write_w = (int)(bus_timing * timing->write_w);
629 video_timing_write_l = (int)(bus_timing * timing->write_l);
630 }
631 }
632 else
633 {
634 if (video_timing[video_speed][0] == VIDEO_ISA)
635 {
636 video_timing_read_b = ISA_CYCLES(video_timing[video_speed][1]);
637 video_timing_read_w = ISA_CYCLES(video_timing[video_speed][2]);
638 video_timing_read_l = ISA_CYCLES(video_timing[video_speed][3]);
639 video_timing_write_b = ISA_CYCLES(video_timing[video_speed][1]);
640 video_timing_write_w = ISA_CYCLES(video_timing[video_speed][2]);
641 video_timing_write_l = ISA_CYCLES(video_timing[video_speed][3]);
642 }
643 else
644 {
645 video_timing_read_b = (int)(bus_timing * video_timing[video_speed][1]);
646 video_timing_read_w = (int)(bus_timing * video_timing[video_speed][2]);
647 video_timing_read_l = (int)(bus_timing * video_timing[video_speed][3]);
648 video_timing_write_b = (int)(bus_timing * video_timing[video_speed][1]);
649 video_timing_write_w = (int)(bus_timing * video_timing[video_speed][2]);
650 video_timing_write_l = (int)(bus_timing * video_timing[video_speed][3]);
651 }
652 }
653 pclog("Video timing %i %i %i\n",video_timing_write_b, video_timing_write_w,video_timing_write_l);
654 if (cpu_16bitbus)
655 {
656 video_timing_read_l = video_timing_read_w * 2;
657 video_timing_write_l = video_timing_write_w * 2;
658 }
659 }
660
661 int video_timing_read_b, video_timing_read_w, video_timing_read_l;
662 int video_timing_write_b, video_timing_write_w, video_timing_write_l;
663
664 int video_res_x, video_res_y, video_bpp;
665
666 void (*video_blit_memtoscreen_func)(int x, int y, int y1, int y2, int w, int h);
667
video_init()668 void video_init()
669 {
670 pclog("Video_init %i %i\n",romset,gfxcard);
671
672 switch (romset)
673 {
674 case ROM_IBMPCJR:
675 device_add(&pcjr_video_device);
676 return;
677
678 case ROM_TANDY:
679 case ROM_TANDY1000HX:
680 device_add(&tandy_device);
681 return;
682
683 case ROM_TANDY1000SL2:
684 device_add(&tandysl_device);
685 return;
686
687 case ROM_PC1512:
688 device_add(&pc1512_device);
689 return;
690
691 case ROM_PC1640:
692 if (gfxcard == GFX_BUILTIN)
693 {
694 device_add(&pc1640_device);
695 return;
696 }
697 break;
698
699 case ROM_PC200:
700 if (gfxcard == GFX_BUILTIN)
701 {
702 device_add(&pc200_device);
703 return;
704 }
705 break;
706
707 case ROM_PPC512:
708 if (gfxcard == GFX_BUILTIN)
709 {
710 device_add(&ppc512_device);
711 return;
712 }
713 break;
714
715 case ROM_OLIM24:
716 device_add(&m24_device);
717 return;
718
719 case ROM_PC2086:
720 if (gfxcard == GFX_BUILTIN)
721 {
722 device_add(¶dise_pvga1a_pc2086_device);
723 return;
724 }
725 break;
726
727 case ROM_PC3086:
728 if (gfxcard == GFX_BUILTIN)
729 {
730 device_add(¶dise_pvga1a_pc3086_device);
731 return;
732 }
733 break;
734
735 case ROM_MEGAPC:
736 if (gfxcard == GFX_BUILTIN)
737 {
738 device_add(¶dise_wd90c11_megapc_device);
739 return;
740 }
741 break;
742
743 case ROM_ACER386:
744 device_add(&oti067_acer386_device);
745 if (gfxcard != GFX_BUILTIN)
746 {
747 svga_set_override(svga_get_pri(), 1);
748 break;
749 }
750 return;
751
752 case ROM_AMA932J:
753 device_add(&oti067_ama932j_device);
754 return;
755
756 case ROM_IBMPS1_2011:
757 case ROM_IBMPS2_M30_286:
758 case ROM_IBMPS2_M50:
759 case ROM_IBMPS2_M55SX:
760 case ROM_IBMPS2_M70_TYPE3:
761 case ROM_IBMPS2_M70_TYPE4:
762 case ROM_IBMPS2_M80:
763 device_add(&ps1vga_device);
764 return;
765
766 case ROM_IBMPS1_2121:
767 device_add(&ps1_m2121_svga_device);
768 return;
769
770 case ROM_T3100E:
771 device_add(&t3100e_device);
772 return;
773
774 case ROM_T1000:
775 case ROM_T1200:
776 device_add(&t1000_device);
777 return;
778
779 case ROM_ELX_PC425X:
780 device_add(&tgui9400cxi_elx_device);
781 return;
782
783 case ROM_PB410A:
784 device_add(&ht216_32_pb410a_device);
785 if (gfxcard != GFX_BUILTIN)
786 {
787 svga_set_override(svga_get_pri(), 1);
788 break;
789 }
790 return;
791
792 case ROM_PB570:
793 device_add(&gd5430_pb570_device);
794 if (gfxcard != GFX_BUILTIN)
795 {
796 svga_set_override(svga_get_pri(), 1);
797 break;
798 }
799 return;
800
801 case ROM_PB520R:
802 device_add(&gd5434_pb520r_device);
803 if (gfxcard != GFX_BUILTIN)
804 {
805 svga_set_override(svga_get_pri(), 1);
806 break;
807 }
808 return;
809 }
810 device_add(video_cards[video_old_to_new(gfxcard)].device);
811 }
812
813
814 BITMAP *buffer32;
815
816 uint8_t fontdat[2048][8];
817 uint8_t fontdatm[2048][16];
818 uint8_t fontdatw[512][32]; /* Wyse700 font */
819 uint8_t fontdat8x12[256][16]; /* MDSI Genius font */
820 uint8_t fontdatksc5601[16384][32]; /* Korean KSC-5601 font */
821 uint8_t fontdatksc5601_user[192][32]; /* Korean KSC-5601 user defined font */
822
823 int xsize=1,ysize=1;
824
loadfont(char * s,fontformat_t format)825 void loadfont(char *s, fontformat_t format)
826 {
827 FILE *f=romfopen(s,"rb");
828 int c,d;
829
830 pclog("loadfont %i %s %p\n", format, s, f);
831 if (!f)
832 {
833 return;
834 }
835 switch (format)
836 {
837 case FONT_MDA: /* MDA */
838 for (c=0;c<256;c++)
839 {
840 for (d=0;d<8;d++)
841 {
842 fontdatm[c][d]=getc(f);
843 }
844 }
845 for (c=0;c<256;c++)
846 {
847 for (d=0;d<8;d++)
848 {
849 fontdatm[c][d+8]=getc(f);
850 }
851 }
852 fseek(f,4096+2048,SEEK_SET);
853 for (c=0;c<256;c++)
854 {
855 for (d=0;d<8;d++)
856 {
857 fontdat[c][d]=getc(f);
858 }
859 }
860 break;
861 case FONT_PC200: /* PC200 */
862 for (d=0;d<4;d++) /* There are 4 fonts in the ROM */
863 {
864 for (c=0;c<256;c++) /* 8x14 MDA in 8x16 cell */
865 {
866 fread(&fontdatm[256*d+c], 1, 16, f);
867 }
868 for (c=0;c<256; c++) /* 8x8 CGA in 8x16 cell */
869 {
870 fread(fontdat[256*d+c], 1, 8, f);
871 fseek(f, 8, SEEK_CUR);
872 }
873 }
874 break;
875 default:
876 case FONT_CGA: /* CGA */
877 for (c=0;c<2048;c++) /* Allow up to 2048 chars */
878 {
879 for (d=0;d<8;d++)
880 {
881 fontdat[c][d]=getc(f);
882 }
883 }
884 break;
885 case FONT_WY700: /* Wyse 700 */
886 for (c=0;c<512;c++)
887 {
888 for (d=0;d<32;d++)
889 {
890 fontdatw[c][d]=getc(f);
891 }
892 }
893 break;
894 case FONT_MDSI: /* MDSI Genius */
895 for (c=0;c<256;c++)
896 {
897 for (d=0;d<16;d++)
898 {
899 fontdat8x12[c][d]=getc(f);
900 }
901 }
902 break;
903 case FONT_T3100E: /* Toshiba 3100e */
904 for (d = 0; d < 2048; d += 512) /* Four languages... */
905 {
906 for (c = d; c < d+256; c++)
907 {
908 fread(&fontdatm[c][8], 1, 8, f);
909 }
910 for (c = d+256; c < d+512; c++)
911 {
912 fread(&fontdatm[c][8], 1, 8, f);
913 }
914 for (c = d; c < d+256; c++)
915 {
916 fread(&fontdatm[c][0], 1, 8, f);
917 }
918 for (c = d+256; c < d+512; c++)
919 {
920 fread(&fontdatm[c][0], 1, 8, f);
921 }
922 fseek(f, 4096, SEEK_CUR); /* Skip blank section */
923 for (c = d; c < d+256; c++)
924 {
925 fread(&fontdat[c][0], 1, 8, f);
926 }
927 for (c = d+256; c < d+512; c++)
928 {
929 fread(&fontdat[c][0], 1, 8, f);
930 }
931 }
932 break;
933 case FONT_KSC5601: /* Korean KSC-5601 */
934 for (c=0;c<16384;c++)
935 {
936 for (d=0;d<32;d++)
937 {
938 fontdatksc5601[c][d]=getc(f);
939 }
940 }
941 break;
942 case FONT_SIGMA400: /* Sigma Color 400 */
943 /* The first 4k of the character ROM holds an 8x8 font */
944 for (c = 0; c < 256; c++)
945 {
946 fread(&fontdat[c][0], 1, 8, f);
947 fseek(f, 8, SEEK_CUR);
948 }
949 /* The second 4k holds an 8x16 font */
950 for (c = 0; c < 256; c++)
951 {
952 fread(&fontdatm[c][0], 1, 16, f);
953 }
954 break;
955 }
956 fclose(f);
957 }
958
959 static struct
960 {
961 int x, y, y1, y2, w, h;
962 int busy;
963 int buffer_in_use;
964
965 thread_t *blit_thread;
966 event_t *wake_blit_thread;
967 event_t *blit_complete;
968 event_t *buffer_not_in_use;
969 } blit_data;
970
971 static void blit_thread(void *param);
972
973 uint32_t cgapal[16];
974
initvideo()975 void initvideo()
976 {
977 int c, d, e;
978
979 buffer32 = create_bitmap(2048, 2048);
980
981 for (c = 0; c < 256; c++)
982 {
983 e = c;
984 for (d = 0; d < 8; d++)
985 {
986 rotatevga[d][c] = e;
987 e = (e >> 1) | ((e & 1) ? 0x80 : 0);
988 }
989 }
990 for (c = 0; c < 4; c++)
991 {
992 for (d = 0; d < 4; d++)
993 {
994 edatlookup[c][d] = 0;
995 if (c & 1) edatlookup[c][d] |= 1;
996 if (d & 1) edatlookup[c][d] |= 2;
997 if (c & 2) edatlookup[c][d] |= 0x10;
998 if (d & 2) edatlookup[c][d] |= 0x20;
999 // printf("Edat %i,%i now %02X\n",c,d,edatlookup[c][d]);
1000 }
1001 }
1002
1003 video_15to32 = malloc(4 * 65536);
1004 for (c = 0; c < 65536; c++)
1005 video_15to32[c] = ((c & 31) << 3) | (((c >> 5) & 31) << 11) | (((c >> 10) & 31) << 19);
1006
1007 video_16to32 = malloc(4 * 65536);
1008 for (c = 0; c < 65536; c++)
1009 video_16to32[c] = ((c & 31) << 3) | (((c >> 5) & 63) << 10) | (((c >> 11) & 31) << 19);
1010
1011 cgapal_rebuild(DISPLAY_RGB, 0);
1012
1013 blit_data.wake_blit_thread = thread_create_event();
1014 blit_data.blit_complete = thread_create_event();
1015 blit_data.buffer_not_in_use = thread_create_event();
1016 blit_data.blit_thread = thread_create(blit_thread, NULL);
1017 }
1018
closevideo()1019 void closevideo()
1020 {
1021 thread_kill(blit_data.blit_thread);
1022 thread_destroy_event(blit_data.buffer_not_in_use);
1023 thread_destroy_event(blit_data.blit_complete);
1024 thread_destroy_event(blit_data.wake_blit_thread);
1025
1026 free(video_15to32);
1027 free(video_16to32);
1028 destroy_bitmap(buffer32);
1029 }
1030
1031
blit_thread(void * param)1032 static void blit_thread(void *param)
1033 {
1034 while (1)
1035 {
1036 thread_wait_event(blit_data.wake_blit_thread, -1);
1037 thread_reset_event(blit_data.wake_blit_thread);
1038
1039 video_blit_memtoscreen_func(blit_data.x, blit_data.y, blit_data.y1, blit_data.y2, blit_data.w, blit_data.h);
1040
1041 blit_data.busy = 0;
1042 thread_set_event(blit_data.blit_complete);
1043 }
1044 }
1045
video_blit_complete()1046 void video_blit_complete()
1047 {
1048 blit_data.buffer_in_use = 0;
1049 thread_set_event(blit_data.buffer_not_in_use);
1050 }
1051
video_wait_for_blit()1052 void video_wait_for_blit()
1053 {
1054 while (blit_data.busy)
1055 thread_wait_event(blit_data.blit_complete, 1);
1056 thread_reset_event(blit_data.blit_complete);
1057 }
video_wait_for_buffer()1058 void video_wait_for_buffer()
1059 {
1060 while (blit_data.buffer_in_use)
1061 thread_wait_event(blit_data.buffer_not_in_use, 1);
1062 thread_reset_event(blit_data.buffer_not_in_use);
1063 }
1064
video_blit_memtoscreen(int x,int y,int y1,int y2,int w,int h)1065 void video_blit_memtoscreen(int x, int y, int y1, int y2, int w, int h)
1066 {
1067 video_frames++;
1068 if (h <= 0)
1069 return;
1070 video_wait_for_blit();
1071 blit_data.busy = 1;
1072 blit_data.buffer_in_use = 1;
1073 blit_data.x = x;
1074 blit_data.y = y;
1075 blit_data.y1 = y1;
1076 blit_data.y2 = y2;
1077 blit_data.w = w;
1078 blit_data.h = h;
1079 thread_set_event(blit_data.wake_blit_thread);
1080 }
1081
cgapal_rebuild(int display_type,int contrast)1082 void cgapal_rebuild(int display_type, int contrast)
1083 {
1084 switch (display_type)
1085 {
1086 case DISPLAY_GREEN:
1087 if (contrast)
1088 {
1089 cgapal[0x0] = makecol(0x00, 0x00, 0x00);
1090 cgapal[0x1] = makecol(0x00, 0x34, 0x0c);
1091 cgapal[0x2] = makecol(0x04, 0x5d, 0x14);
1092 cgapal[0x3] = makecol(0x04, 0x69, 0x18);
1093 cgapal[0x4] = makecol(0x08, 0xa2, 0x24);
1094 cgapal[0x5] = makecol(0x08, 0xb2, 0x28);
1095 cgapal[0x6] = makecol(0x0c, 0xe7, 0x34);
1096 cgapal[0x7] = makecol(0x0c, 0xf3, 0x38);
1097 cgapal[0x8] = makecol(0x00, 0x1c, 0x04);
1098 cgapal[0x9] = makecol(0x04, 0x4d, 0x10);
1099 cgapal[0xa] = makecol(0x04, 0x7d, 0x1c);
1100 cgapal[0xb] = makecol(0x04, 0x8e, 0x20);
1101 cgapal[0xc] = makecol(0x08, 0xc7, 0x2c);
1102 cgapal[0xd] = makecol(0x08, 0xd7, 0x30);
1103 cgapal[0xe] = makecol(0x14, 0xff, 0x45);
1104 cgapal[0xf] = makecol(0x34, 0xff, 0x5d);
1105 }
1106 else
1107 {
1108 cgapal[0x0] = makecol(0x00, 0x00, 0x00);
1109 cgapal[0x1] = makecol(0x00, 0x34, 0x0c);
1110 cgapal[0x2] = makecol(0x04, 0x55, 0x14);
1111 cgapal[0x3] = makecol(0x04, 0x5d, 0x14);
1112 cgapal[0x4] = makecol(0x04, 0x86, 0x20);
1113 cgapal[0x5] = makecol(0x04, 0x92, 0x20);
1114 cgapal[0x6] = makecol(0x08, 0xba, 0x2c);
1115 cgapal[0x7] = makecol(0x08, 0xc7, 0x2c);
1116 cgapal[0x8] = makecol(0x04, 0x8a, 0x20);
1117 cgapal[0x9] = makecol(0x08, 0xa2, 0x24);
1118 cgapal[0xa] = makecol(0x08, 0xc3, 0x2c);
1119 cgapal[0xb] = makecol(0x08, 0xcb, 0x30);
1120 cgapal[0xc] = makecol(0x0c, 0xe7, 0x34);
1121 cgapal[0xd] = makecol(0x0c, 0xef, 0x38);
1122 cgapal[0xe] = makecol(0x24, 0xff, 0x51);
1123 cgapal[0xf] = makecol(0x34, 0xff, 0x5d);
1124 }
1125 break;
1126 case DISPLAY_AMBER:
1127 if (contrast)
1128 {
1129 cgapal[0x0] = makecol(0x00, 0x00, 0x00);
1130 cgapal[0x1] = makecol(0x55, 0x14, 0x00);
1131 cgapal[0x2] = makecol(0x82, 0x2c, 0x00);
1132 cgapal[0x3] = makecol(0x92, 0x34, 0x00);
1133 cgapal[0x4] = makecol(0xcf, 0x61, 0x00);
1134 cgapal[0x5] = makecol(0xdf, 0x6d, 0x00);
1135 cgapal[0x6] = makecol(0xff, 0x9a, 0x04);
1136 cgapal[0x7] = makecol(0xff, 0xae, 0x18);
1137 cgapal[0x8] = makecol(0x2c, 0x08, 0x00);
1138 cgapal[0x9] = makecol(0x6d, 0x20, 0x00);
1139 cgapal[0xa] = makecol(0xa6, 0x45, 0x00);
1140 cgapal[0xb] = makecol(0xba, 0x51, 0x00);
1141 cgapal[0xc] = makecol(0xef, 0x79, 0x00);
1142 cgapal[0xd] = makecol(0xfb, 0x86, 0x00);
1143 cgapal[0xe] = makecol(0xff, 0xcb, 0x28);
1144 cgapal[0xf] = makecol(0xff, 0xe3, 0x34);
1145 }
1146 else
1147 {
1148 cgapal[0x0] = makecol(0x00, 0x00, 0x00);
1149 cgapal[0x1] = makecol(0x55, 0x14, 0x00);
1150 cgapal[0x2] = makecol(0x79, 0x24, 0x00);
1151 cgapal[0x3] = makecol(0x86, 0x2c, 0x00);
1152 cgapal[0x4] = makecol(0xae, 0x49, 0x00);
1153 cgapal[0x5] = makecol(0xbe, 0x55, 0x00);
1154 cgapal[0x6] = makecol(0xe3, 0x71, 0x00);
1155 cgapal[0x7] = makecol(0xef, 0x79, 0x00);
1156 cgapal[0x8] = makecol(0xb2, 0x4d, 0x00);
1157 cgapal[0x9] = makecol(0xcb, 0x5d, 0x00);
1158 cgapal[0xa] = makecol(0xeb, 0x79, 0x00);
1159 cgapal[0xb] = makecol(0xf3, 0x7d, 0x00);
1160 cgapal[0xc] = makecol(0xff, 0x9e, 0x04);
1161 cgapal[0xd] = makecol(0xff, 0xaa, 0x10);
1162 cgapal[0xe] = makecol(0xff, 0xdb, 0x30);
1163 cgapal[0xf] = makecol(0xff, 0xe3, 0x34);
1164 }
1165 break;
1166 case DISPLAY_WHITE:
1167 if (contrast)
1168 {
1169 cgapal[0x0] = makecol(0x00, 0x00, 0x00);
1170 cgapal[0x1] = makecol(0x37, 0x3d, 0x40);
1171 cgapal[0x2] = makecol(0x55, 0x5c, 0x5f);
1172 cgapal[0x3] = makecol(0x61, 0x67, 0x6b);
1173 cgapal[0x4] = makecol(0x8f, 0x95, 0x95);
1174 cgapal[0x5] = makecol(0x9b, 0xa0, 0x9f);
1175 cgapal[0x6] = makecol(0xcc, 0xcf, 0xc8);
1176 cgapal[0x7] = makecol(0xdf, 0xde, 0xd4);
1177 cgapal[0x8] = makecol(0x24, 0x27, 0x29);
1178 cgapal[0x9] = makecol(0x42, 0x48, 0x4c);
1179 cgapal[0xa] = makecol(0x70, 0x76, 0x78);
1180 cgapal[0xb] = makecol(0x81, 0x87, 0x87);
1181 cgapal[0xc] = makecol(0xaf, 0xb3, 0xb0);
1182 cgapal[0xd] = makecol(0xbb, 0xbf, 0xba);
1183 cgapal[0xe] = makecol(0xef, 0xed, 0xdf);
1184 cgapal[0xf] = makecol(0xff, 0xfd, 0xed);
1185 }
1186 else
1187 {
1188 cgapal[0x0] = makecol(0x00, 0x00, 0x00);
1189 cgapal[0x1] = makecol(0x37, 0x3d, 0x40);
1190 cgapal[0x2] = makecol(0x4a, 0x50, 0x54);
1191 cgapal[0x3] = makecol(0x55, 0x5c, 0x5f);
1192 cgapal[0x4] = makecol(0x78, 0x7e, 0x80);
1193 cgapal[0x5] = makecol(0x81, 0x87, 0x87);
1194 cgapal[0x6] = makecol(0xa3, 0xa7, 0xa6);
1195 cgapal[0x7] = makecol(0xaf, 0xb3, 0xb0);
1196 cgapal[0x8] = makecol(0x7a, 0x81, 0x83);
1197 cgapal[0x9] = makecol(0x8c, 0x92, 0x92);
1198 cgapal[0xa] = makecol(0xac, 0xb0, 0xad);
1199 cgapal[0xb] = makecol(0xb3, 0xb7, 0xb4);
1200 cgapal[0xc] = makecol(0xd1, 0xd3, 0xcb);
1201 cgapal[0xd] = makecol(0xd9, 0xdb, 0xd2);
1202 cgapal[0xe] = makecol(0xf7, 0xf5, 0xe7);
1203 cgapal[0xf] = makecol(0xff, 0xfd, 0xed);
1204 }
1205 break;
1206
1207 default:
1208 cgapal[0x0] = makecol(0x00, 0x00, 0x00);
1209 cgapal[0x1] = makecol(0x00, 0x00, 0xaa);
1210 cgapal[0x2] = makecol(0x00, 0xaa, 0x00);
1211 cgapal[0x3] = makecol(0x00, 0xaa, 0xaa);
1212 cgapal[0x4] = makecol(0xaa, 0x00, 0x00);
1213 cgapal[0x5] = makecol(0xaa, 0x00, 0xaa);
1214 if (display_type == DISPLAY_RGB_NO_BROWN)
1215 {
1216 cgapal[0x6] = makecol(0xaa, 0xaa, 0x00);
1217 }
1218 else
1219 {
1220 cgapal[0x6] = makecol(0xaa, 0x55, 0x00);
1221 }
1222 cgapal[0x7] = makecol(0xaa, 0xaa, 0xaa);
1223 cgapal[0x8] = makecol(0x55, 0x55, 0x55);
1224 cgapal[0x9] = makecol(0x55, 0x55, 0xff);
1225 cgapal[0xa] = makecol(0x55, 0xff, 0x55);
1226 cgapal[0xb] = makecol(0x55, 0xff, 0xff);
1227 cgapal[0xc] = makecol(0xff, 0x55, 0x55);
1228 cgapal[0xd] = makecol(0xff, 0x55, 0xff);
1229 cgapal[0xe] = makecol(0xff, 0xff, 0x55);
1230 cgapal[0xf] = makecol(0xff, 0xff, 0xff);
1231 break;
1232 }
1233 }
1234