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", &paradise_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 &paradise_pvga1a_pc2086_device;
192                 break;
193 
194                 case ROM_PC3086:
195                 if (card == GFX_BUILTIN)
196                         return &paradise_pvga1a_pc3086_device;
197                 break;
198 
199                 case ROM_MEGAPC:
200                 return &paradise_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(&paradise_pvga1a_pc2086_device);
723                         return;
724                 }
725                 break;
726 
727                 case ROM_PC3086:
728                 if (gfxcard == GFX_BUILTIN)
729                 {
730                         device_add(&paradise_pvga1a_pc3086_device);
731                         return;
732                 }
733                 break;
734 
735                 case ROM_MEGAPC:
736                 if (gfxcard == GFX_BUILTIN)
737                 {
738                         device_add(&paradise_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