PCem

changeset 43:f53b76ab6f15

Devices can now be marked as not working, and disabled in release builds. Video card menu now build dynamically from list.
author TomW
date Thu Nov 28 20:03:59 2013 +0000
parents 2dc5624aebab
children 64fa8cf6ba95
files src/device.c src/device.h src/pc.rc src/resources.h src/sis496.c src/sound.c src/sound_adlib.c src/sound_adlibgold.c src/sound_cms.c src/sound_gus.c src/sound_pas16.c src/sound_sb.c src/sound_sn76489.c src/sound_wss.c src/vid_ati18800.c src/vid_ati28800.c src/vid_ati_mach64.c src/vid_cga.c src/vid_cl5429.c src/vid_ega.c src/vid_et4000.c src/vid_et4000w32.c src/vid_hercules.c src/vid_mda.c src/vid_olivetti_m24.c src/vid_oti067.c src/vid_paradise.c src/vid_pc1512.c src/vid_pc1640.c src/vid_pc200.c src/vid_s3.c src/vid_s3_virge.c src/vid_tandy.c src/vid_tgui9440.c src/vid_tvga.c src/vid_vga.c src/video.c src/video.h src/win.c
diffstat 39 files changed, 183 insertions(+), 133 deletions(-) [+]
line diff
     1.1 --- a/src/device.c	Tue Nov 26 19:35:52 2013 +0000
     1.2 +++ b/src/device.c	Thu Nov 28 20:03:59 2013 +0000
     1.3 @@ -42,6 +42,18 @@
     1.4          }
     1.5  }
     1.6  
     1.7 +int device_available(device_t *d)
     1.8 +{
     1.9 +#ifdef RELEASE_BUILD
    1.10 +        if (d->flags & DEVICE_NOT_WORKING)
    1.11 +                return 0;
    1.12 +#endif
    1.13 +        if (d->available)
    1.14 +                return d->available();
    1.15 +                
    1.16 +        return 1;        
    1.17 +}
    1.18 +
    1.19  void device_speed_changed()
    1.20  {
    1.21          int c;
     2.1 --- a/src/device.h	Tue Nov 26 19:35:52 2013 +0000
     2.2 +++ b/src/device.h	Thu Nov 28 20:03:59 2013 +0000
     2.3 @@ -1,6 +1,7 @@
     2.4  typedef struct device_t
     2.5  {
     2.6          char name[50];
     2.7 +        uint32_t flags;
     2.8          void *(*init)();
     2.9          void (*close)(void *p);
    2.10          int  (*available)();
    2.11 @@ -12,6 +13,12 @@
    2.12  void device_init();
    2.13  void device_add(device_t *d);
    2.14  void device_close_all();
    2.15 +int device_available(device_t *d);
    2.16  void device_speed_changed();
    2.17  void device_force_redraw();
    2.18  char *device_add_status_info(char *s, int max_len);
    2.19 +
    2.20 +enum
    2.21 +{
    2.22 +        DEVICE_NOT_WORKING = 1 /*Device does not currently work correctly and will be disabled in a release build*/
    2.23 +};
     3.1 --- a/src/pc.rc	Tue Nov 26 19:35:52 2013 +0000
     3.2 +++ b/src/pc.rc	Thu Nov 28 20:03:59 2013 +0000
     3.3 @@ -46,7 +46,7 @@
     3.4      DEFPUSHBUTTON   "OK",IDOK,17,216,50,14, WS_TABSTOP
     3.5      PUSHBUTTON      "Cancel",IDCANCEL,71,216,50,14, WS_TABSTOP
     3.6      COMBOBOX        IDC_COMBO1,62,16,107,120,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
     3.7 -    COMBOBOX        IDC_COMBO2,62,36,107,120,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
     3.8 +    COMBOBOX        IDC_COMBOVID,62,36,107,120,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
     3.9      COMBOBOX        IDC_COMBOCPUM,62,56,107,120,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
    3.10      COMBOBOX        IDC_COMBO3,62,76,107,120,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
    3.11      COMBOBOX        IDC_COMBOCHC,62,96,107,120,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
     4.1 --- a/src/resources.h	Tue Nov 26 19:35:52 2013 +0000
     4.2 +++ b/src/resources.h	Thu Nov 28 20:03:59 2013 +0000
     4.3 @@ -18,7 +18,7 @@
     4.4  #define IDM_CDROM_DISABLED 40200
     4.5  
     4.6  #define IDC_COMBO1 1000
     4.7 -#define IDC_COMBO2 1001
     4.8 +#define IDC_COMBOVID 1001
     4.9  #define IDC_COMBO3 1002
    4.10  #define IDC_COMBO4 1003
    4.11  #define IDC_COMBO5 1004
     5.1 --- a/src/sis496.c	Tue Nov 26 19:35:52 2013 +0000
     5.2 +++ b/src/sis496.c	Thu Nov 28 20:03:59 2013 +0000
     5.3 @@ -130,6 +130,7 @@
     5.4  device_t sis496_device =
     5.5  {
     5.6          "SiS 496/497",
     5.7 +        0,
     5.8          sis496_init,
     5.9          sis496_close,
    5.10          NULL,
     6.1 --- a/src/sound.c	Tue Nov 26 19:35:52 2013 +0000
     6.2 +++ b/src/sound.c	Thu Nov 28 20:03:59 2013 +0000
     6.3 @@ -46,10 +46,8 @@
     6.4  int sound_card_available(int card)
     6.5  {
     6.6          if (sound_cards[card].device)
     6.7 -        {
     6.8 -                if (sound_cards[card].device->available)
     6.9 -                        return sound_cards[card].device->available();
    6.10 -        }
    6.11 +                return device_available(sound_cards[card].device);
    6.12 +
    6.13          return 1;
    6.14  }
    6.15  
     7.1 --- a/src/sound_adlib.c	Tue Nov 26 19:35:52 2013 +0000
     7.2 +++ b/src/sound_adlib.c	Thu Nov 28 20:03:59 2013 +0000
     7.3 @@ -56,6 +56,7 @@
     7.4  device_t adlib_device =
     7.5  {
     7.6          "AdLib",
     7.7 +        0,
     7.8          adlib_init,
     7.9          adlib_close,
    7.10          NULL,
     8.1 --- a/src/sound_adlibgold.c	Tue Nov 26 19:35:52 2013 +0000
     8.2 +++ b/src/sound_adlibgold.c	Thu Nov 28 20:03:59 2013 +0000
     8.3 @@ -591,6 +591,7 @@
     8.4  device_t adgold_device =
     8.5  {
     8.6          "AdLib Gold",
     8.7 +        0,
     8.8          adgold_init,
     8.9          adgold_close,
    8.10          NULL,
     9.1 --- a/src/sound_cms.c	Tue Nov 26 19:35:52 2013 +0000
     9.2 +++ b/src/sound_cms.c	Thu Nov 28 20:03:59 2013 +0000
     9.3 @@ -173,6 +173,7 @@
     9.4  device_t cms_device =
     9.5  {
     9.6          "Creative Music System / Game Blaster",
     9.7 +        0,
     9.8          cms_init,
     9.9          cms_close,
    9.10          NULL,
    10.1 --- a/src/sound_gus.c	Tue Nov 26 19:35:52 2013 +0000
    10.2 +++ b/src/sound_gus.c	Thu Nov 28 20:03:59 2013 +0000
    10.3 @@ -1103,6 +1103,7 @@
    10.4  device_t gus_device =
    10.5  {
    10.6          "Gravis UltraSound",
    10.7 +        0,
    10.8          gus_init,
    10.9          gus_close,
   10.10          NULL,
    11.1 --- a/src/sound_pas16.c	Tue Nov 26 19:35:52 2013 +0000
    11.2 +++ b/src/sound_pas16.c	Thu Nov 28 20:03:59 2013 +0000
    11.3 @@ -747,6 +747,7 @@
    11.4  device_t pas16_device =
    11.5  {
    11.6          "Pro Audio Spectrum 16",
    11.7 +        DEVICE_NOT_WORKING,
    11.8          pas16_init,
    11.9          pas16_close,
   11.10          NULL,
    12.1 --- a/src/sound_sb.c	Tue Nov 26 19:35:52 2013 +0000
    12.2 +++ b/src/sound_sb.c	Thu Nov 28 20:03:59 2013 +0000
    12.3 @@ -432,6 +432,7 @@
    12.4  device_t sb_1_device =
    12.5  {
    12.6          "Sound Blaster v1.0",
    12.7 +        0,
    12.8          sb_1_init,
    12.9          sb_close,
   12.10          NULL,
   12.11 @@ -442,6 +443,7 @@
   12.12  device_t sb_15_device =
   12.13  {
   12.14          "Sound Blaster v1.5",
   12.15 +        0,
   12.16          sb_15_init,
   12.17          sb_close,
   12.18          NULL,
   12.19 @@ -452,6 +454,7 @@
   12.20  device_t sb_2_device =
   12.21  {
   12.22          "Sound Blaster v2.0",
   12.23 +        0,
   12.24          sb_2_init,
   12.25          sb_close,
   12.26          NULL,
   12.27 @@ -462,6 +465,7 @@
   12.28  device_t sb_pro_v1_device =
   12.29  {
   12.30          "Sound Blaster Pro v1",
   12.31 +        0,
   12.32          sb_pro_v1_init,
   12.33          sb_close,
   12.34          NULL,
   12.35 @@ -472,6 +476,7 @@
   12.36  device_t sb_pro_v2_device =
   12.37  {
   12.38          "Sound Blaster Pro v2",
   12.39 +        0,
   12.40          sb_pro_v2_init,
   12.41          sb_close,
   12.42          NULL,
   12.43 @@ -482,6 +487,7 @@
   12.44  device_t sb_16_device =
   12.45  {
   12.46          "Sound Blaster 16",
   12.47 +        0,
   12.48          sb_16_init,
   12.49          sb_close,
   12.50          NULL,
   12.51 @@ -492,6 +498,7 @@
   12.52  device_t sb_awe32_device =
   12.53  {
   12.54          "Sound Blaster AWE32",
   12.55 +        0,
   12.56          sb_awe32_init,
   12.57          sb_close,
   12.58          sb_awe32_available,
    13.1 --- a/src/sound_sn76489.c	Tue Nov 26 19:35:52 2013 +0000
    13.2 +++ b/src/sound_sn76489.c	Thu Nov 28 20:03:59 2013 +0000
    13.3 @@ -192,6 +192,7 @@
    13.4  device_t sn76489_device =
    13.5  {
    13.6          "TI SN74689 PSG",
    13.7 +        0,
    13.8          sn76489_init,
    13.9          sn76489_close,
   13.10          NULL,
    14.1 --- a/src/sound_wss.c	Tue Nov 26 19:35:52 2013 +0000
    14.2 +++ b/src/sound_wss.c	Thu Nov 28 20:03:59 2013 +0000
    14.3 @@ -123,6 +123,7 @@
    14.4  device_t wss_device =
    14.5  {
    14.6          "Windows Sound System",
    14.7 +        0,
    14.8          wss_init,
    14.9          wss_close,
   14.10          NULL,
    15.1 --- a/src/vid_ati18800.c	Tue Nov 26 19:35:52 2013 +0000
    15.2 +++ b/src/vid_ati18800.c	Thu Nov 28 20:03:59 2013 +0000
    15.3 @@ -170,6 +170,7 @@
    15.4  device_t ati18800_device =
    15.5  {
    15.6          "ATI-18800",
    15.7 +        0,
    15.8          ati18800_init,
    15.9          ati18800_close,
   15.10          NULL,
    16.1 --- a/src/vid_ati28800.c	Tue Nov 26 19:35:52 2013 +0000
    16.2 +++ b/src/vid_ati28800.c	Thu Nov 28 20:03:59 2013 +0000
    16.3 @@ -191,6 +191,7 @@
    16.4  device_t ati28800_device =
    16.5  {
    16.6          "ATI-28800",
    16.7 +        0,
    16.8          ati28800_init,
    16.9          ati28800_close,
   16.10          NULL,
    17.1 --- a/src/vid_ati_mach64.c	Tue Nov 26 19:35:52 2013 +0000
    17.2 +++ b/src/vid_ati_mach64.c	Thu Nov 28 20:03:59 2013 +0000
    17.3 @@ -2095,6 +2095,7 @@
    17.4  device_t mach64gx_device =
    17.5  {
    17.6          "ATI Mach64GX",
    17.7 +        0,
    17.8          mach64gx_init,
    17.9          mach64_close,
   17.10          NULL,
    18.1 --- a/src/vid_cga.c	Tue Nov 26 19:35:52 2013 +0000
    18.2 +++ b/src/vid_cga.c	Thu Nov 28 20:03:59 2013 +0000
    18.3 @@ -520,6 +520,7 @@
    18.4  device_t cga_device =
    18.5  {
    18.6          "CGA",
    18.7 +        0,
    18.8          cga_standalone_init,
    18.9          cga_close,
   18.10          NULL,
    19.1 --- a/src/vid_cl5429.c	Tue Nov 26 19:35:52 2013 +0000
    19.2 +++ b/src/vid_cl5429.c	Thu Nov 28 20:03:59 2013 +0000
    19.3 @@ -869,6 +869,7 @@
    19.4  device_t gd5429_device =
    19.5  {
    19.6          "Cirrus Logic GD5429",
    19.7 +        DEVICE_NOT_WORKING,
    19.8          gd5429_init,
    19.9          gd5429_close,
   19.10          NULL,
    20.1 --- a/src/vid_ega.c	Tue Nov 26 19:35:52 2013 +0000
    20.2 +++ b/src/vid_ega.c	Thu Nov 28 20:03:59 2013 +0000
    20.3 @@ -837,6 +837,7 @@
    20.4  device_t ega_device =
    20.5  {
    20.6          "EGA",
    20.7 +        0,
    20.8          ega_standalone_init,
    20.9          ega_close,
   20.10          NULL,
    21.1 --- a/src/vid_et4000.c	Tue Nov 26 19:35:52 2013 +0000
    21.2 +++ b/src/vid_et4000.c	Thu Nov 28 20:03:59 2013 +0000
    21.3 @@ -173,6 +173,7 @@
    21.4  device_t et4000_device =
    21.5  {
    21.6          "Tseng Labs ET4000AX",
    21.7 +        0,
    21.8          et4000_init,
    21.9          et4000_close,
   21.10          NULL,
    22.1 --- a/src/vid_et4000w32.c	Tue Nov 26 19:35:52 2013 +0000
    22.2 +++ b/src/vid_et4000w32.c	Thu Nov 28 20:03:59 2013 +0000
    22.3 @@ -1000,6 +1000,7 @@
    22.4  device_t et4000w32p_device =
    22.5  {
    22.6          "Tseng Labs ET4000/w32p",
    22.7 +        0,
    22.8          et4000w32p_init,
    22.9          et4000w32p_close,
   22.10          NULL,
    23.1 --- a/src/vid_hercules.c	Tue Nov 26 19:35:52 2013 +0000
    23.2 +++ b/src/vid_hercules.c	Thu Nov 28 20:03:59 2013 +0000
    23.3 @@ -354,6 +354,7 @@
    23.4  device_t hercules_device =
    23.5  {
    23.6          "Hercules",
    23.7 +        0,
    23.8          hercules_init,
    23.9          hercules_close,
   23.10          NULL,
    24.1 --- a/src/vid_mda.c	Tue Nov 26 19:35:52 2013 +0000
    24.2 +++ b/src/vid_mda.c	Thu Nov 28 20:03:59 2013 +0000
    24.3 @@ -311,6 +311,7 @@
    24.4  device_t mda_device =
    24.5  {
    24.6          "MDA",
    24.7 +        0,
    24.8          mda_init,
    24.9          mda_close,
   24.10          NULL,
    25.1 --- a/src/vid_olivetti_m24.c	Tue Nov 26 19:35:52 2013 +0000
    25.2 +++ b/src/vid_olivetti_m24.c	Thu Nov 28 20:03:59 2013 +0000
    25.3 @@ -482,6 +482,7 @@
    25.4  device_t m24_device =
    25.5  {
    25.6          "Olivetti M24 (video)",
    25.7 +        0,
    25.8          m24_init,
    25.9          m24_close,
   25.10          NULL,
    26.1 --- a/src/vid_oti067.c	Tue Nov 26 19:35:52 2013 +0000
    26.2 +++ b/src/vid_oti067.c	Thu Nov 28 20:03:59 2013 +0000
    26.3 @@ -159,6 +159,7 @@
    26.4  device_t oti067_device =
    26.5  {
    26.6          "Oak OTI-067",
    26.7 +        0,
    26.8          oti067_init,
    26.9          oti067_close,
   26.10          NULL,
    27.1 --- a/src/vid_paradise.c	Tue Nov 26 19:35:52 2013 +0000
    27.2 +++ b/src/vid_paradise.c	Thu Nov 28 20:03:59 2013 +0000
    27.3 @@ -345,6 +345,7 @@
    27.4  device_t paradise_pvga1a_device =
    27.5  {
    27.6          "Paradise PVGA1A",
    27.7 +        0,
    27.8          paradise_pvga1a_init,
    27.9          paradise_close,
   27.10          NULL,
   27.11 @@ -355,6 +356,7 @@
   27.12  device_t paradise_wd90c11_device =
   27.13  {
   27.14          "Paradise WD90C11",
   27.15 +        0,
   27.16          paradise_wd90c11_init,
   27.17          paradise_close,
   27.18          NULL,
    28.1 --- a/src/vid_pc1512.c	Tue Nov 26 19:35:52 2013 +0000
    28.2 +++ b/src/vid_pc1512.c	Thu Nov 28 20:03:59 2013 +0000
    28.3 @@ -481,6 +481,7 @@
    28.4  device_t pc1512_device =
    28.5  {
    28.6          "Amstrad PC1512 (video)",
    28.7 +        0,
    28.8          pc1512_init,
    28.9          pc1512_close,
   28.10          NULL,
    29.1 --- a/src/vid_pc1640.c	Tue Nov 26 19:35:52 2013 +0000
    29.2 +++ b/src/vid_pc1640.c	Thu Nov 28 20:03:59 2013 +0000
    29.3 @@ -144,6 +144,7 @@
    29.4  device_t pc1640_device =
    29.5  {
    29.6          "Amstrad PC1640 (video)",
    29.7 +        0,
    29.8          pc1640_init,
    29.9          pc1640_close,
   29.10          NULL,
    30.1 --- a/src/vid_pc200.c	Tue Nov 26 19:35:52 2013 +0000
    30.2 +++ b/src/vid_pc200.c	Thu Nov 28 20:03:59 2013 +0000
    30.3 @@ -134,6 +134,7 @@
    30.4  device_t pc200_device =
    30.5  {
    30.6          "Amstrad PC200 (video)",
    30.7 +        0,
    30.8          pc200_init,
    30.9          pc200_close,
   30.10          NULL,
    31.1 --- a/src/vid_s3.c	Tue Nov 26 19:35:52 2013 +0000
    31.2 +++ b/src/vid_s3.c	Thu Nov 28 20:03:59 2013 +0000
    31.3 @@ -1689,6 +1689,7 @@
    31.4  device_t s3_bahamas64_device =
    31.5  {
    31.6          "Paradise Bahamas 64 (S3 Vision864)",
    31.7 +        0,
    31.8          s3_bahamas64_init,
    31.9          s3_close,
   31.10          NULL,
   31.11 @@ -1700,6 +1701,7 @@
   31.12  device_t s3_9fx_device =
   31.13  {
   31.14          "Number 9 9FX (S3 Trio64)",
   31.15 +        0,
   31.16          s3_9fx_init,
   31.17          s3_close,
   31.18          NULL,
    32.1 --- a/src/vid_s3_virge.c	Tue Nov 26 19:35:52 2013 +0000
    32.2 +++ b/src/vid_s3_virge.c	Thu Nov 28 20:03:59 2013 +0000
    32.3 @@ -517,6 +517,7 @@
    32.4  device_t s3_virge_device =
    32.5  {
    32.6          "Diamond Stealth 3D 2000 (S3 VIRGE)",
    32.7 +        DEVICE_NOT_WORKING,
    32.8          s3_virge_init,
    32.9          s3_virge_close,
   32.10          NULL,
    33.1 --- a/src/vid_tandy.c	Tue Nov 26 19:35:52 2013 +0000
    33.2 +++ b/src/vid_tandy.c	Thu Nov 28 20:03:59 2013 +0000
    33.3 @@ -691,6 +691,7 @@
    33.4  device_t tandy_device =
    33.5  {
    33.6          "Tandy 1000 (video)",
    33.7 +        0,
    33.8          tandy_init,
    33.9          tandy_close,
   33.10          NULL,
    34.1 --- a/src/vid_tgui9440.c	Tue Nov 26 19:35:52 2013 +0000
    34.2 +++ b/src/vid_tgui9440.c	Thu Nov 28 20:03:59 2013 +0000
    34.3 @@ -1124,6 +1124,7 @@
    34.4  device_t tgui9440_device =
    34.5  {
    34.6          "Trident TGUI 9440",
    34.7 +        0,
    34.8          tgui9440_init,
    34.9          tgui_close,
   34.10          NULL,
    35.1 --- a/src/vid_tvga.c	Tue Nov 26 19:35:52 2013 +0000
    35.2 +++ b/src/vid_tvga.c	Thu Nov 28 20:03:59 2013 +0000
    35.3 @@ -284,6 +284,7 @@
    35.4  device_t tvga8900d_device =
    35.5  {
    35.6          "Trident TVGA 8900D",
    35.7 +        0,
    35.8          tvga8900d_init,
    35.9          tvga_close,
   35.10          NULL,
    36.1 --- a/src/vid_vga.c	Tue Nov 26 19:35:52 2013 +0000
    36.2 +++ b/src/vid_vga.c	Thu Nov 28 20:03:59 2013 +0000
    36.3 @@ -124,6 +124,7 @@
    36.4  device_t vga_device =
    36.5  {
    36.6          "VGA",
    36.7 +        DEVICE_NOT_WORKING,
    36.8          vga_init,
    36.9          vga_close,
   36.10          NULL,
    37.1 --- a/src/video.c	Tue Nov 26 19:35:52 2013 +0000
    37.2 +++ b/src/video.c	Thu Nov 28 20:03:59 2013 +0000
    37.3 @@ -33,6 +33,81 @@
    37.4  #include "vid_tvga.h"
    37.5  #include "vid_vga.h"
    37.6  
    37.7 +typedef struct
    37.8 +{
    37.9 +        char name[64];
   37.10 +        device_t *device;
   37.11 +        int legacy_id;
   37.12 +} VIDEO_CARD;
   37.13 +
   37.14 +static VIDEO_CARD video_cards[] =
   37.15 +{
   37.16 +        {"CGA",                                    &cga_device,          GFX_CGA},
   37.17 +        {"MDA",                                    &mda_device,          GFX_MDA},
   37.18 +        {"Hercules",                               &hercules_device,     GFX_HERCULES},
   37.19 +        {"EGA",                                    &ega_device,          GFX_EGA},
   37.20 +        {"Trident TVGA8900D",                      &tvga8900d_device,    GFX_TVGA},
   37.21 +        {"Tseng ET4000AX",                         &et4000_device,       GFX_ET4000},
   37.22 +        {"Diamond Stealth 32 (Tseng ET4000/w32p)", &et4000w32p_device,   GFX_ET4000W32},
   37.23 +        {"Paradise Bahamas 64 (S3 Vision864)",     &s3_bahamas64_device, GFX_BAHAMAS64},
   37.24 +        {"Number Nine 9FX (S3 Trio64)",            &s3_9fx_device,       GFX_N9_9FX},
   37.25 +        {"Diamond Stealth 3D 2000 (S3 ViRGE)",     &s3_virge_device,     GFX_VIRGE},
   37.26 +        {"Trident TGUI9440",                       &tgui9440_device,     GFX_TGUI9440},
   37.27 +        {"VGA",                                    &vga_device,          GFX_VGA},
   37.28 +        {"ATI VGA Edge-16 (ATI-18800)",            &ati18800_device,     GFX_VGAEDGE16},
   37.29 +        {"ATI VGA Charger",                        &ati28800_device,     GFX_VGACHARGER},
   37.30 +        {"OAK OTI-067",                            &oti067_device,       GFX_OTI067},
   37.31 +        {"ATI Graphics Pro Turbo (Mach64 GX)",     &mach64gx_device,     GFX_MACH64GX},
   37.32 +        {"Cirrus Logic CL-GD5429",                 &gd5429_device,       GFX_CL_GD5429},
   37.33 +        {"",                                       NULL,                 0}
   37.34 +};
   37.35 +
   37.36 +int video_card_available(int card)
   37.37 +{
   37.38 +        if (video_cards[card].device)
   37.39 +                return device_available(video_cards[card].device);
   37.40 +
   37.41 +        return 1;
   37.42 +}
   37.43 +
   37.44 +char *video_card_getname(int card)
   37.45 +{
   37.46 +        return video_cards[card].name;
   37.47 +}
   37.48 +
   37.49 +int video_card_getid(char *s)
   37.50 +{
   37.51 +        int c = 0;
   37.52 +
   37.53 +        while (video_cards[c].device)
   37.54 +        {
   37.55 +                if (!strcmp(video_cards[c].name, s))
   37.56 +                        return c;
   37.57 +                c++;
   37.58 +        }
   37.59 +        
   37.60 +        return 0;
   37.61 +}
   37.62 +
   37.63 +int video_old_to_new(int card)
   37.64 +{
   37.65 +        int c = 0;
   37.66 +        
   37.67 +        while (video_cards[c].device)
   37.68 +        {
   37.69 +                if (video_cards[c].legacy_id == card)
   37.70 +                        return c;
   37.71 +                c++;
   37.72 +        }
   37.73 +        
   37.74 +        return 0;
   37.75 +}
   37.76 +
   37.77 +int video_new_to_old(int card)
   37.78 +{
   37.79 +        return video_cards[card].legacy_id;
   37.80 +}
   37.81 +
   37.82  uint32_t *video_15to32, *video_16to32;
   37.83  
   37.84  int egareads=0,egawrites=0;
   37.85 @@ -159,82 +234,7 @@
   37.86                  device_add(&oti067_device);
   37.87                  return;
   37.88          }
   37.89 -        switch (gfxcard)
   37.90 -        {
   37.91 -                case GFX_MDA:
   37.92 -                device_add(&mda_device);
   37.93 -                break;
   37.94 -
   37.95 -                case GFX_HERCULES:
   37.96 -                device_add(&hercules_device);
   37.97 -                break;
   37.98 -                
   37.99 -                case GFX_CGA:
  37.100 -                device_add(&cga_device);
  37.101 -                break;
  37.102 -                
  37.103 -                case GFX_EGA:
  37.104 -                device_add(&ega_device);
  37.105 -                break;
  37.106 -                
  37.107 -                case GFX_TVGA:
  37.108 -                device_add(&tvga8900d_device);
  37.109 -                break;
  37.110 -                
  37.111 -                case GFX_ET4000:
  37.112 -                device_add(&et4000_device);
  37.113 -                break;
  37.114 -                
  37.115 -                case GFX_ET4000W32:
  37.116 -                device_add(&et4000w32p_device);
  37.117 -                break;
  37.118 -
  37.119 -                case GFX_BAHAMAS64:
  37.120 -                device_add(&s3_bahamas64_device);
  37.121 -                break;
  37.122 -
  37.123 -                case GFX_N9_9FX:
  37.124 -                device_add(&s3_9fx_device);
  37.125 -                break;
  37.126 -                
  37.127 -                case GFX_STEALTH64:
  37.128 -                break;
  37.129 -                
  37.130 -                case GFX_VIRGE:
  37.131 -                device_add(&s3_virge_device);
  37.132 -                break;
  37.133 -                
  37.134 -                case GFX_TGUI9440:
  37.135 -                device_add(&tgui9440_device);
  37.136 -                break;
  37.137 -                
  37.138 -                case GFX_VGA:
  37.139 -                device_add(&vga_device);
  37.140 -                break;
  37.141 -
  37.142 -                case GFX_VGAEDGE16:
  37.143 -                device_add(&ati18800_device);
  37.144 -                break;
  37.145 -
  37.146 -                case GFX_VGACHARGER:
  37.147 -                device_add(&ati18800_device);
  37.148 -                break;
  37.149 -                                
  37.150 -                case GFX_OTI067:
  37.151 -                device_add(&oti067_device);
  37.152 -                return;
  37.153 -
  37.154 -                case GFX_MACH64GX:
  37.155 -                device_add(&mach64gx_device);
  37.156 -                return;
  37.157 -
  37.158 -                case GFX_CL_GD5429:
  37.159 -                device_add(&gd5429_device);
  37.160 -                return;
  37.161 -
  37.162 -                default:
  37.163 -                fatal("Bad gfx card %i\n",gfxcard);
  37.164 -        }
  37.165 +        device_add(video_cards[video_old_to_new(gfxcard)].device);
  37.166  }
  37.167  
  37.168  
  37.169 @@ -245,29 +245,7 @@
  37.170  
  37.171  int xsize=1,ysize=1;
  37.172  
  37.173 -
  37.174 -PALETTE cgapal;/* =
  37.175 -{
  37.176 -        { 0,  0,  0},{0,42,0},{42,0,0},{42,21,0},
  37.177 -        { 0,  0,  0},{0,42,42},{42,0,42},{42,42,42},
  37.178 -        { 0,  0,  0},{21,63,21},{63,21,21},{63,63,21},
  37.179 -        { 0,  0,  0},{21,63,63},{63,21,63},{63,63,63},
  37.180 -
  37.181 -        {0,   0,  0}, { 0,  0, 42}, { 0, 42,  0}, { 0, 42, 42},
  37.182 -        {42,  0,  0}, {42,  0, 42}, {42, 21, 00}, {42, 42, 42},
  37.183 -        {21, 21, 21}, {21, 21, 63}, {21, 63, 21}, {21, 63, 63},
  37.184 -        {63, 21, 21}, {63, 21, 63}, {63, 63, 21}, {63, 63, 63},
  37.185 -
  37.186 -        {0,0,0},{0,21,0},{0,0,42},{0,42,42},
  37.187 -        {42,0,21},{21,10,21},{42,0,42},{42,0,63},
  37.188 -        {21,21,21},{21,63,21},{42,21,42},{21,63,63},
  37.189 -        {63,0,0},{42,42,0},{63,21,42},{41,41,41},
  37.190 -        
  37.191 -        {0,0,0},{0,42,42},{42,0,0},{42,42,42},
  37.192 -        {0,0,0},{0,42,42},{42,0,0},{42,42,42},
  37.193 -        {0,0,0},{0,63,63},{63,0,0},{63,63,63},
  37.194 -        {0,0,0},{0,63,63},{63,0,0},{63,63,63},
  37.195 -};*/
  37.196 +PALETTE cgapal;
  37.197  
  37.198  void loadfont(char *s, int format)
  37.199  {
    38.1 --- a/src/video.h	Tue Nov 26 19:35:52 2013 +0000
    38.2 +++ b/src/video.h	Thu Nov 28 20:03:59 2013 +0000
    38.3 @@ -1,3 +1,9 @@
    38.4 +int video_card_available(int card);
    38.5 +char *video_card_getname(int card);
    38.6 +int video_card_getid(char *s);
    38.7 +int video_old_to_new(int card);
    38.8 +int video_new_to_old(int card);
    38.9 +
   38.10  extern int egareads,egawrites;
   38.11  
   38.12  extern int fullchange;
    39.1 --- a/src/win.c	Tue Nov 26 19:35:52 2013 +0000
    39.2 +++ b/src/win.c	Thu Nov 28 20:03:59 2013 +0000
    39.3 @@ -560,7 +560,6 @@
    39.4  
    39.5  extern int is486;
    39.6  int romstolist[26], listtomodel[26], romstomodel[26], modeltolist[26];
    39.7 -int vidtolist[20],listtovid[20];
    39.8  static int settings_sound_to_list[20], settings_list_to_sound[20];
    39.9  
   39.10  int mem_list_to_size[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,32,48,64,256};
   39.11 @@ -578,6 +577,7 @@
   39.12  
   39.13  BOOL CALLBACK configdlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
   39.14  {
   39.15 +        char temp_str[256];
   39.16          HWND h;
   39.17          int c, d;
   39.18          int rom,gfx,mem,fpu;
   39.19 @@ -606,29 +606,27 @@
   39.20                          c++;
   39.21                  }
   39.22                  SendMessage(h, CB_SETCURSEL, modeltolist[model], 0);
   39.23 -                
   39.24 -                h=GetDlgItem(hdlg,IDC_COMBO2);
   39.25 -                memset(vidtolist, 0, sizeof(vidtolist));
   39.26 -                c=4;
   39.27 -                SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"CGA"); vidtolist[GFX_CGA]=0; listtovid[0]=0;
   39.28 -                SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"MDA"); vidtolist[GFX_MDA]=1; listtovid[1]=1;
   39.29 -                SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"Hercules"); vidtolist[GFX_HERCULES]=2; listtovid[2]=2;
   39.30 -                SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"EGA"); vidtolist[GFX_EGA]=3; listtovid[3]=3;
   39.31 -                if (gfx_present[GFX_TVGA])       { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"Trident 8900D");           vidtolist[GFX_TVGA]=c;          listtovid[c]=GFX_TVGA;          c++;       }
   39.32 -                if (gfx_present[GFX_ET4000])     { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"Tseng ET4000AX");          vidtolist[GFX_ET4000]=c;        listtovid[c]=GFX_ET4000;        c++;       }
   39.33 -                if (gfx_present[GFX_ET4000W32])  { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"Diamond Stealth 32");      vidtolist[GFX_ET4000W32]=c;     listtovid[c]=GFX_ET4000W32;     c++;       }
   39.34 -                if (gfx_present[GFX_BAHAMAS64])  { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"Paradise Bahamas 64");     vidtolist[GFX_BAHAMAS64]=c;     listtovid[c]=GFX_BAHAMAS64;     c++;       }
   39.35 -                if (gfx_present[GFX_N9_9FX])     { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"Number Nine 9FX");         vidtolist[GFX_N9_9FX]=c;        listtovid[c]=GFX_N9_9FX;        c++;       }
   39.36 -                if (gfx_present[GFX_VIRGE])      { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"S3 VIRGE");                vidtolist[GFX_VIRGE]=c;         listtovid[c]=GFX_VIRGE;         c++;       }
   39.37 -                if (gfx_present[GFX_TGUI9440])   { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"Trident TGUI9440");        vidtolist[GFX_TGUI9440]=c;      listtovid[c]=GFX_TGUI9440;      c++;       }
   39.38 -                if (gfx_present[GFX_VGA])        { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"VGA");                     vidtolist[GFX_VGA]=c;           listtovid[c]=GFX_VGA;           c++;       }
   39.39 -                if (gfx_present[GFX_VGAEDGE16])  { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"ATI VGA Edge-16");         vidtolist[GFX_VGAEDGE16]=c;     listtovid[c]=GFX_VGAEDGE16;     c++;       }                
   39.40 -                if (gfx_present[GFX_VGACHARGER]) { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"ATI VGA Charger");         vidtolist[GFX_VGACHARGER]=c;    listtovid[c]=GFX_VGACHARGER;    c++;       }                
   39.41 -                if (gfx_present[GFX_OTI067])     { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"Oak OTI-067");             vidtolist[GFX_OTI067]=c;        listtovid[c]=GFX_OTI067;        c++;       }
   39.42 -                if (gfx_present[GFX_MACH64GX])   { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"ATI Graphics Pro Turbo");  vidtolist[GFX_MACH64GX]=c;      listtovid[c]=GFX_MACH64GX;      c++;       }
   39.43 -                if (gfx_present[GFX_CL_GD5429])  { SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"Cirrus Logic CL-GD5429");  vidtolist[GFX_CL_GD5429]=c;     listtovid[c]=GFX_CL_GD5429;     c++;       }
   39.44 -                SendMessage(h,CB_SETCURSEL,vidtolist[gfxcard],0);
   39.45 -                if (models[model].fixed_gfxcard) EnableWindow(h,FALSE);
   39.46 +
   39.47 +                h = GetDlgItem(hdlg, IDC_COMBOVID);
   39.48 +                c = d = 0;
   39.49 +                while (1)
   39.50 +                {
   39.51 +                        char *s = video_card_getname(c);
   39.52 +
   39.53 +                        if (!s[0])
   39.54 +                                break;
   39.55 +
   39.56 +                        if (video_card_available(c))
   39.57 +                        {
   39.58 +                                SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
   39.59 +                                if (video_new_to_old(c) == gfxcard)
   39.60 +                                        SendMessage(h, CB_SETCURSEL, d, 0);                                
   39.61 +
   39.62 +                                d++;
   39.63 +                        }
   39.64 +
   39.65 +                        c++;
   39.66 +                }
   39.67  
   39.68                  h=GetDlgItem(hdlg,IDC_COMBOCPUM);
   39.69                  c = 0;
   39.70 @@ -736,8 +734,9 @@
   39.71                          h=GetDlgItem(hdlg,IDC_COMBO1);
   39.72                          temp_model = listtomodel[SendMessage(h,CB_GETCURSEL,0,0)];
   39.73  
   39.74 -                        h=GetDlgItem(hdlg,IDC_COMBO2);
   39.75 -                        gfx=listtovid[SendMessage(h,CB_GETCURSEL,0,0)];
   39.76 +                        h = GetDlgItem(hdlg, IDC_COMBOVID);
   39.77 +                        SendMessage(h, CB_GETLBTEXT, SendMessage(h,CB_GETCURSEL,0,0), (LPARAM)temp_str);
   39.78 +                        gfx = video_new_to_old(video_card_getid(temp_str));
   39.79  
   39.80                          h=GetDlgItem(hdlg,IDC_COMBOMEM);
   39.81                          mem=mem_list_to_size[SendMessage(h,CB_GETCURSEL,0,0)];
   39.82 @@ -818,11 +817,22 @@
   39.83                                  temp_model = listtomodel[SendMessage(h,CB_GETCURSEL,0,0)];
   39.84                                  
   39.85                                  /*Enable/disable gfxcard list*/
   39.86 -                                h = GetDlgItem(hdlg, IDC_COMBO2);
   39.87 +                                h = GetDlgItem(hdlg, IDC_COMBOVID);
   39.88                                  if (!models[temp_model].fixed_gfxcard)
   39.89                                  {
   39.90 +                                        char *s = video_card_getname(video_old_to_new(gfxcard));
   39.91 +                                        
   39.92                                          EnableWindow(h, TRUE);
   39.93 -                                        SendMessage(h, CB_SETCURSEL, gfxcard, 0);
   39.94 +                                        
   39.95 +                                        c = 0;
   39.96 +                                        while (1)
   39.97 +                                        {
   39.98 +                                                SendMessage(h, CB_GETLBTEXT, c, (LPARAM)temp_str);
   39.99 +                                                if (!strcmp(temp_str, s))
  39.100 +                                                        break;
  39.101 +                                                c++;
  39.102 +                                        }
  39.103 +                                        SendMessage(h, CB_SETCURSEL, c, 0);
  39.104                                  }
  39.105                                  else
  39.106                                          EnableWindow(h, FALSE);