PCem

changeset 31:08a942c94a1d

New 'available' function in device API, to determine whether required ROMs are available. Currently used when building soundcard menu, to remove AWE32 when required ROM dump is not present.
author TomW
date Mon Nov 04 18:23:15 2013 +0000
parents 3afc5d31f5dc
children f50409fd5bac
files src/device.h src/mem.c src/sis496.c src/sound.c src/sound.h 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_tvga.c src/vid_vga.c src/win.c
diffstat 35 files changed, 92 insertions(+), 39 deletions(-) [+]
line diff
     1.1 --- a/src/device.h	Sat Nov 02 19:38:59 2013 +0000
     1.2 +++ b/src/device.h	Mon Nov 04 18:23:15 2013 +0000
     1.3 @@ -3,6 +3,7 @@
     1.4          char name[50];
     1.5          void *(*init)();
     1.6          void (*close)(void *p);
     1.7 +        int  (*available)();
     1.8          void (*speed_changed)(void *p);
     1.9          void (*force_redraw)(void *p);
    1.10          int  (*add_status_info)(char *s, int max_len, void *p);
     2.1 --- a/src/mem.c	Sat Nov 02 19:38:59 2013 +0000
     2.2 +++ b/src/mem.c	Mon Nov 04 18:23:15 2013 +0000
     2.3 @@ -14,6 +14,7 @@
     2.4  #include "video.h"
     2.5  #include "x86.h"
     2.6  #include "cpu.h"
     2.7 +#include "rom.h"
     2.8  
     2.9  static uint8_t       (*_mem_read_b[0x40000])(uint32_t addr, void *priv);
    2.10  static uint16_t      (*_mem_read_w[0x40000])(uint32_t addr, void *priv);
    2.11 @@ -44,20 +45,6 @@
    2.12  uint8_t *ram,*rom,*vram,*vrom;
    2.13  uint8_t romext[32768];
    2.14  
    2.15 -FILE *romfopen(char *fn, char *mode)
    2.16 -{
    2.17 -        char s[512];
    2.18 -//        pclog("romfopen %s\n", fn);
    2.19 -        strcpy(s,pcempath);
    2.20 -//        pclog("s = %s\n", s);
    2.21 -        put_backslash(s);
    2.22 -//        pclog("s = %s\n", s);
    2.23 -//        pclog("strcat %s %s\n", s, fn);
    2.24 -        strcat(s,fn);
    2.25 -//        pclog("s = %s\n", s);
    2.26 -        return fopen(s,mode);
    2.27 -}
    2.28 -
    2.29  static void mem_load_xtide_bios()
    2.30  {
    2.31          FILE *f;
     3.1 --- a/src/sis496.c	Sat Nov 02 19:38:59 2013 +0000
     3.2 +++ b/src/sis496.c	Mon Nov 04 18:23:15 2013 +0000
     3.3 @@ -134,5 +134,6 @@
     3.4          sis496_close,
     3.5          NULL,
     3.6          NULL,
     3.7 +        NULL,
     3.8          NULL
     3.9  };
     4.1 --- a/src/sound.c	Sat Nov 02 19:38:59 2013 +0000
     4.2 +++ b/src/sound.c	Mon Nov 04 18:23:15 2013 +0000
     4.3 @@ -43,6 +43,16 @@
     4.4          {"", NULL}
     4.5  };
     4.6  
     4.7 +int sound_card_available(int card)
     4.8 +{
     4.9 +        if (sound_cards[card].device)
    4.10 +        {
    4.11 +                if (sound_cards[card].device->available)
    4.12 +                        return sound_cards[card].device->available();
    4.13 +        }
    4.14 +        return 1;
    4.15 +}
    4.16 +
    4.17  char *sound_card_getname(int card)
    4.18  {
    4.19          return sound_cards[card].name;
     5.1 --- a/src/sound.h	Sat Nov 02 19:38:59 2013 +0000
     5.2 +++ b/src/sound.h	Mon Nov 04 18:23:15 2013 +0000
     5.3 @@ -5,5 +5,6 @@
     5.4  
     5.5  extern int sound_card_current;
     5.6  
     5.7 +int sound_card_available(int card);
     5.8  char *sound_card_getname(int card);
     5.9  void sound_card_init();
     6.1 --- a/src/sound_adlib.c	Sat Nov 02 19:38:59 2013 +0000
     6.2 +++ b/src/sound_adlib.c	Mon Nov 04 18:23:15 2013 +0000
     6.3 @@ -60,5 +60,6 @@
     6.4          adlib_close,
     6.5          NULL,
     6.6          NULL,
     6.7 +        NULL,
     6.8          NULL
     6.9  };
     7.1 --- a/src/sound_adlibgold.c	Sat Nov 02 19:38:59 2013 +0000
     7.2 +++ b/src/sound_adlibgold.c	Mon Nov 04 18:23:15 2013 +0000
     7.3 @@ -595,5 +595,6 @@
     7.4          adgold_close,
     7.5          NULL,
     7.6          NULL,
     7.7 +        NULL,
     7.8          NULL
     7.9  };
     8.1 --- a/src/sound_cms.c	Sat Nov 02 19:38:59 2013 +0000
     8.2 +++ b/src/sound_cms.c	Mon Nov 04 18:23:15 2013 +0000
     8.3 @@ -177,5 +177,6 @@
     8.4          cms_close,
     8.5          NULL,
     8.6          NULL,
     8.7 +        NULL,
     8.8          NULL
     8.9  };
     9.1 --- a/src/sound_gus.c	Sat Nov 02 19:38:59 2013 +0000
     9.2 +++ b/src/sound_gus.c	Mon Nov 04 18:23:15 2013 +0000
     9.3 @@ -1105,6 +1105,7 @@
     9.4          "Gravis UltraSound",
     9.5          gus_init,
     9.6          gus_close,
     9.7 +        NULL,
     9.8          gus_speed_changed,
     9.9          NULL,
    9.10          NULL
    10.1 --- a/src/sound_pas16.c	Sat Nov 02 19:38:59 2013 +0000
    10.2 +++ b/src/sound_pas16.c	Mon Nov 04 18:23:15 2013 +0000
    10.3 @@ -751,5 +751,6 @@
    10.4          pas16_close,
    10.5          NULL,
    10.6          NULL,
    10.7 +        NULL,
    10.8          NULL
    10.9  };
    11.1 --- a/src/sound_sb.c	Sat Nov 02 19:38:59 2013 +0000
    11.2 +++ b/src/sound_sb.c	Mon Nov 04 18:23:15 2013 +0000
    11.3 @@ -376,6 +376,11 @@
    11.4          return sb;
    11.5  }
    11.6  
    11.7 +int sb_awe32_available()
    11.8 +{
    11.9 +        return rom_present("roms/awe32.raw");
   11.10 +}
   11.11 +
   11.12  void *sb_awe32_init()
   11.13  {
   11.14          sb_t *sb = malloc(sizeof(sb_t));
   11.15 @@ -429,6 +434,7 @@
   11.16          "Sound Blaster v1.0",
   11.17          sb_1_init,
   11.18          sb_close,
   11.19 +        NULL,
   11.20          sb_speed_changed,
   11.21          NULL,
   11.22          NULL
   11.23 @@ -438,6 +444,7 @@
   11.24          "Sound Blaster v1.5",
   11.25          sb_15_init,
   11.26          sb_close,
   11.27 +        NULL,
   11.28          sb_speed_changed,
   11.29          NULL,
   11.30          NULL
   11.31 @@ -447,6 +454,7 @@
   11.32          "Sound Blaster v2.0",
   11.33          sb_2_init,
   11.34          sb_close,
   11.35 +        NULL,
   11.36          sb_speed_changed,
   11.37          NULL,
   11.38          NULL
   11.39 @@ -456,6 +464,7 @@
   11.40          "Sound Blaster Pro v1",
   11.41          sb_pro_v1_init,
   11.42          sb_close,
   11.43 +        NULL,
   11.44          sb_speed_changed,
   11.45          NULL,
   11.46          NULL
   11.47 @@ -465,6 +474,7 @@
   11.48          "Sound Blaster Pro v2",
   11.49          sb_pro_v2_init,
   11.50          sb_close,
   11.51 +        NULL,
   11.52          sb_speed_changed,
   11.53          NULL,
   11.54          NULL
   11.55 @@ -474,6 +484,7 @@
   11.56          "Sound Blaster 16",
   11.57          sb_16_init,
   11.58          sb_close,
   11.59 +        NULL,
   11.60          sb_speed_changed,
   11.61          NULL,
   11.62          NULL
   11.63 @@ -483,6 +494,7 @@
   11.64          "Sound Blaster AWE32",
   11.65          sb_awe32_init,
   11.66          sb_close,
   11.67 +        sb_awe32_available,
   11.68          sb_speed_changed,
   11.69          NULL,
   11.70          NULL
    12.1 --- a/src/sound_sn76489.c	Sat Nov 02 19:38:59 2013 +0000
    12.2 +++ b/src/sound_sn76489.c	Mon Nov 04 18:23:15 2013 +0000
    12.3 @@ -196,5 +196,6 @@
    12.4          sn76489_close,
    12.5          NULL,
    12.6          NULL,
    12.7 +        NULL,
    12.8          NULL
    12.9  };
    13.1 --- a/src/sound_wss.c	Sat Nov 02 19:38:59 2013 +0000
    13.2 +++ b/src/sound_wss.c	Mon Nov 04 18:23:15 2013 +0000
    13.3 @@ -305,5 +305,6 @@
    13.4          wss_close,
    13.5          NULL,
    13.6          NULL,
    13.7 +        NULL,
    13.8          NULL
    13.9  };
    14.1 --- a/src/vid_ati18800.c	Sat Nov 02 19:38:59 2013 +0000
    14.2 +++ b/src/vid_ati18800.c	Mon Nov 04 18:23:15 2013 +0000
    14.3 @@ -165,6 +165,7 @@
    14.4          "ATI-18800",
    14.5          ati18800_init,
    14.6          ati18800_close,
    14.7 +        NULL,
    14.8          ati18800_speed_changed,
    14.9          ati18800_force_redraw,
   14.10          svga_add_status_info
    15.1 --- a/src/vid_ati28800.c	Sat Nov 02 19:38:59 2013 +0000
    15.2 +++ b/src/vid_ati28800.c	Mon Nov 04 18:23:15 2013 +0000
    15.3 @@ -186,6 +186,7 @@
    15.4          "ATI-28800",
    15.5          ati28800_init,
    15.6          ati28800_close,
    15.7 +        NULL,
    15.8          ati28800_speed_changed,
    15.9          ati28800_force_redraw,
   15.10          svga_add_status_info
    16.1 --- a/src/vid_ati_mach64.c	Sat Nov 02 19:38:59 2013 +0000
    16.2 +++ b/src/vid_ati_mach64.c	Mon Nov 04 18:23:15 2013 +0000
    16.3 @@ -2084,6 +2084,7 @@
    16.4          "ATI Mach64GX",
    16.5          mach64gx_init,
    16.6          mach64_close,
    16.7 +        NULL,
    16.8          mach64_speed_changed,
    16.9          mach64_force_redraw,
   16.10          svga_add_status_info
    17.1 --- a/src/vid_cga.c	Sat Nov 02 19:38:59 2013 +0000
    17.2 +++ b/src/vid_cga.c	Mon Nov 04 18:23:15 2013 +0000
    17.3 @@ -522,6 +522,7 @@
    17.4          "CGA",
    17.5          cga_standalone_init,
    17.6          cga_close,
    17.7 +        NULL,
    17.8          cga_speed_changed,
    17.9          NULL,
   17.10          NULL
    18.1 --- a/src/vid_cl5429.c	Sat Nov 02 19:38:59 2013 +0000
    18.2 +++ b/src/vid_cl5429.c	Mon Nov 04 18:23:15 2013 +0000
    18.3 @@ -855,6 +855,7 @@
    18.4          "Cirrus Logic GD5429",
    18.5          gd5429_init,
    18.6          gd5429_close,
    18.7 +        NULL,
    18.8          gd5429_speed_changed,
    18.9          gd5429_force_redraw,
   18.10          svga_add_status_info
    19.1 --- a/src/vid_ega.c	Sat Nov 02 19:38:59 2013 +0000
    19.2 +++ b/src/vid_ega.c	Mon Nov 04 18:23:15 2013 +0000
    19.3 @@ -839,6 +839,7 @@
    19.4          "EGA",
    19.5          ega_standalone_init,
    19.6          ega_close,
    19.7 +        NULL,
    19.8          ega_speed_changed,
    19.9          NULL,
   19.10          NULL
    20.1 --- a/src/vid_et4000.c	Sat Nov 02 19:38:59 2013 +0000
    20.2 +++ b/src/vid_et4000.c	Mon Nov 04 18:23:15 2013 +0000
    20.3 @@ -159,6 +159,7 @@
    20.4          "Tseng Labs ET4000AX",
    20.5          et4000_init,
    20.6          et4000_close,
    20.7 +        NULL,
    20.8          et4000_speed_changed,
    20.9          et4000_force_redraw,
   20.10          svga_add_status_info
    21.1 --- a/src/vid_et4000w32.c	Sat Nov 02 19:38:59 2013 +0000
    21.2 +++ b/src/vid_et4000w32.c	Mon Nov 04 18:23:15 2013 +0000
    21.3 @@ -988,6 +988,7 @@
    21.4          "Tseng Labs ET4000/w32p",
    21.5          et4000w32p_init,
    21.6          et4000w32p_close,
    21.7 +        NULL,
    21.8          et4000w32p_speed_changed,
    21.9          et4000w32p_force_redraw,
   21.10          svga_add_status_info
    22.1 --- a/src/vid_hercules.c	Sat Nov 02 19:38:59 2013 +0000
    22.2 +++ b/src/vid_hercules.c	Mon Nov 04 18:23:15 2013 +0000
    22.3 @@ -356,6 +356,7 @@
    22.4          "Hercules",
    22.5          hercules_init,
    22.6          hercules_close,
    22.7 +        NULL,
    22.8          hercules_speed_changed,
    22.9          NULL,
   22.10          NULL
    23.1 --- a/src/vid_mda.c	Sat Nov 02 19:38:59 2013 +0000
    23.2 +++ b/src/vid_mda.c	Mon Nov 04 18:23:15 2013 +0000
    23.3 @@ -313,6 +313,7 @@
    23.4          "MDA",
    23.5          mda_init,
    23.6          mda_close,
    23.7 +        NULL,
    23.8          mda_speed_changed,
    23.9          NULL,
   23.10          NULL
    24.1 --- a/src/vid_olivetti_m24.c	Sat Nov 02 19:38:59 2013 +0000
    24.2 +++ b/src/vid_olivetti_m24.c	Mon Nov 04 18:23:15 2013 +0000
    24.3 @@ -484,6 +484,7 @@
    24.4          "Olivetti M24 (video)",
    24.5          m24_init,
    24.6          m24_close,
    24.7 +        NULL,
    24.8          m24_speed_changed,
    24.9          NULL,
   24.10          NULL
    25.1 --- a/src/vid_oti067.c	Sat Nov 02 19:38:59 2013 +0000
    25.2 +++ b/src/vid_oti067.c	Mon Nov 04 18:23:15 2013 +0000
    25.3 @@ -154,6 +154,7 @@
    25.4          "Oak OTI-067",
    25.5          oti067_init,
    25.6          oti067_close,
    25.7 +        NULL,
    25.8          oti067_speed_changed,
    25.9          oti067_force_redraw,
   25.10          svga_add_status_info
    26.1 --- a/src/vid_paradise.c	Sat Nov 02 19:38:59 2013 +0000
    26.2 +++ b/src/vid_paradise.c	Mon Nov 04 18:23:15 2013 +0000
    26.3 @@ -336,6 +336,7 @@
    26.4          "Paradise PVGA1A",
    26.5          paradise_pvga1a_init,
    26.6          paradise_close,
    26.7 +        NULL,
    26.8          paradise_speed_changed,
    26.9          paradise_force_redraw,
   26.10          svga_add_status_info
   26.11 @@ -345,6 +346,7 @@
   26.12          "Paradise WD90C11",
   26.13          paradise_wd90c11_init,
   26.14          paradise_close,
   26.15 +        NULL,
   26.16          paradise_speed_changed,
   26.17          paradise_force_redraw,
   26.18          svga_add_status_info
    27.1 --- a/src/vid_pc1512.c	Sat Nov 02 19:38:59 2013 +0000
    27.2 +++ b/src/vid_pc1512.c	Mon Nov 04 18:23:15 2013 +0000
    27.3 @@ -483,6 +483,7 @@
    27.4          "Amstrad PC1512 (video)",
    27.5          pc1512_init,
    27.6          pc1512_close,
    27.7 +        NULL,
    27.8          pc1512_speed_changed,
    27.9          NULL,
   27.10          NULL
    28.1 --- a/src/vid_pc1640.c	Sat Nov 02 19:38:59 2013 +0000
    28.2 +++ b/src/vid_pc1640.c	Mon Nov 04 18:23:15 2013 +0000
    28.3 @@ -146,6 +146,7 @@
    28.4          "Amstrad PC1640 (video)",
    28.5          pc1640_init,
    28.6          pc1640_close,
    28.7 +        NULL,
    28.8          pc1640_speed_changed,
    28.9          NULL,
   28.10          NULL
    29.1 --- a/src/vid_pc200.c	Sat Nov 02 19:38:59 2013 +0000
    29.2 +++ b/src/vid_pc200.c	Mon Nov 04 18:23:15 2013 +0000
    29.3 @@ -136,6 +136,7 @@
    29.4          "Amstrad PC200 (video)",
    29.5          pc200_init,
    29.6          pc200_close,
    29.7 +        NULL,
    29.8          pc200_speed_changed,
    29.9          NULL,
   29.10          NULL
    30.1 --- a/src/vid_s3.c	Sat Nov 02 19:38:59 2013 +0000
    30.2 +++ b/src/vid_s3.c	Mon Nov 04 18:23:15 2013 +0000
    30.3 @@ -1629,6 +1629,7 @@
    30.4          "Paradise Bahamas 64 (S3 Vision864)",
    30.5          s3_bahamas64_init,
    30.6          s3_close,
    30.7 +        NULL,
    30.8          s3_speed_changed,
    30.9          s3_force_redraw,
   30.10          svga_add_status_info
   30.11 @@ -1639,6 +1640,7 @@
   30.12          "Number 9 9FX (S3 Trio64)",
   30.13          s3_9fx_init,
   30.14          s3_close,
   30.15 +        NULL,
   30.16          s3_speed_changed,
   30.17          s3_force_redraw,
   30.18          svga_add_status_info
    31.1 --- a/src/vid_s3_virge.c	Sat Nov 02 19:38:59 2013 +0000
    31.2 +++ b/src/vid_s3_virge.c	Mon Nov 04 18:23:15 2013 +0000
    31.3 @@ -508,6 +508,7 @@
    31.4          "Diamond Stealth 3D 2000 (S3 VIRGE)",
    31.5          s3_virge_init,
    31.6          s3_virge_close,
    31.7 +        NULL,
    31.8          s3_virge_speed_changed,
    31.9          s3_virge_force_redraw,
   31.10          svga_add_status_info
    32.1 --- a/src/vid_tandy.c	Sat Nov 02 19:38:59 2013 +0000
    32.2 +++ b/src/vid_tandy.c	Mon Nov 04 18:23:15 2013 +0000
    32.3 @@ -693,6 +693,7 @@
    32.4          "Tandy 1000 (video)",
    32.5          tandy_init,
    32.6          tandy_close,
    32.7 +        NULL,
    32.8          tandy_speed_changed,
    32.9          NULL,
   32.10          NULL
    33.1 --- a/src/vid_tvga.c	Sat Nov 02 19:38:59 2013 +0000
    33.2 +++ b/src/vid_tvga.c	Mon Nov 04 18:23:15 2013 +0000
    33.3 @@ -513,25 +513,6 @@
    33.4          tvga->svga.fullchange = changeframecount;
    33.5  }
    33.6  
    33.7 -device_t tvga8900d_device =
    33.8 -{
    33.9 -        "Trident TVGA 8900D",
   33.10 -        tvga8900d_init,
   33.11 -        tvga_close,
   33.12 -        tvga_speed_changed,
   33.13 -        tvga_force_redraw,
   33.14 -        svga_add_status_info
   33.15 -};
   33.16 -device_t tgui9440_device =
   33.17 -{
   33.18 -        "Trident TGUI 9440",
   33.19 -        tgui9440_init,
   33.20 -        tvga_close,
   33.21 -        tvga_speed_changed,
   33.22 -        tvga_force_redraw,
   33.23 -        svga_add_status_info
   33.24 -};
   33.25 -
   33.26  enum
   33.27  {
   33.28  	TGUI_BITBLT = 1
   33.29 @@ -1119,3 +1100,25 @@
   33.30  //	pclog("tvga_accel_write_fb_l %08X %08X\n", addr, val);
   33.31  	tvga_accel_command(32, ((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24), tvga);
   33.32  }
   33.33 +
   33.34 +device_t tvga8900d_device =
   33.35 +{
   33.36 +        "Trident TVGA 8900D",
   33.37 +        tvga8900d_init,
   33.38 +        tvga_close,
   33.39 +        NULL,
   33.40 +        tvga_speed_changed,
   33.41 +        tvga_force_redraw,
   33.42 +        svga_add_status_info
   33.43 +};
   33.44 +
   33.45 +device_t tgui9440_device =
   33.46 +{
   33.47 +        "Trident TGUI 9440",
   33.48 +        tgui9440_init,
   33.49 +        tvga_close,
   33.50 +        NULL,
   33.51 +        tvga_speed_changed,
   33.52 +        tvga_force_redraw,
   33.53 +        svga_add_status_info
   33.54 +};
    34.1 --- a/src/vid_vga.c	Sat Nov 02 19:38:59 2013 +0000
    34.2 +++ b/src/vid_vga.c	Mon Nov 04 18:23:15 2013 +0000
    34.3 @@ -119,6 +119,7 @@
    34.4          "VGA",
    34.5          vga_init,
    34.6          vga_close,
    34.7 +        NULL,
    34.8          vga_speed_changed,
    34.9          vga_force_redraw,
   34.10          svga_add_status_info
    35.1 --- a/src/win.c	Sat Nov 02 19:38:59 2013 +0000
    35.2 +++ b/src/win.c	Mon Nov 04 18:23:15 2013 +0000
    35.3 @@ -561,6 +561,7 @@
    35.4  extern int is486;
    35.5  int romstolist[26], listtomodel[26], romstomodel[26], modeltolist[26];
    35.6  int vidtolist[20],listtovid[20];
    35.7 +static int settings_sound_to_list[20], settings_list_to_sound[20];
    35.8  
    35.9  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};
   35.10  int mem_size_to_list[]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,
   35.11 @@ -607,7 +608,7 @@
   35.12                  SendMessage(h, CB_SETCURSEL, modeltolist[model], 0);
   35.13                  
   35.14                  h=GetDlgItem(hdlg,IDC_COMBO2);
   35.15 -                for (c=0;c<6;c++) vidtolist[c]=0;
   35.16 +                memset(vidtolist, 0, sizeof(vidtolist));
   35.17                  c=4;
   35.18                  SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"CGA"); vidtolist[GFX_CGA]=0; listtovid[0]=0;
   35.19                  SendMessage(h,CB_ADDSTRING,0,(LPARAM)(LPCSTR)"MDA"); vidtolist[GFX_MDA]=1; listtovid[1]=1;
   35.20 @@ -652,18 +653,26 @@
   35.21                  SendMessage(h, CB_SETCURSEL, cpu, 0);
   35.22  
   35.23                  h=GetDlgItem(hdlg,IDC_COMBOSND);
   35.24 -                c = 0;
   35.25 +                c = d = 0;
   35.26                  while (1)
   35.27                  {
   35.28                          char *s = sound_card_getname(c);
   35.29  
   35.30                          if (!s[0])
   35.31                                  break;
   35.32 -                                
   35.33 -                        SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
   35.34 +
   35.35 +                        settings_sound_to_list[c] = d;
   35.36 +                        
   35.37 +                        if (sound_card_available(c))
   35.38 +                        {
   35.39 +                                SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
   35.40 +                                settings_list_to_sound[d] = c;
   35.41 +                                d++;
   35.42 +                        }
   35.43 +
   35.44                          c++;
   35.45                  }
   35.46 -                SendMessage(h, CB_SETCURSEL, sound_card_current, 0);
   35.47 +                SendMessage(h, CB_SETCURSEL, settings_sound_to_list[sound_card_current], 0);
   35.48  
   35.49                  h=GetDlgItem(hdlg, IDC_CHECK3);
   35.50                  SendMessage(h, BM_SETCHECK, GAMEBLASTER, 0);
   35.51 @@ -747,7 +756,7 @@
   35.52                          temp_GUS = SendMessage(h, BM_GETCHECK, 0, 0);
   35.53  
   35.54                          h = GetDlgItem(hdlg, IDC_COMBOSND);
   35.55 -                        temp_sound_card_current = SendMessage(h, CB_GETCURSEL, 0, 0);
   35.56 +                        temp_sound_card_current = settings_list_to_sound[SendMessage(h, CB_GETCURSEL, 0, 0)];
   35.57  
   35.58                          if (temp_model != model || gfx != gfxcard || mem != mem_size || fpu != hasfpu || temp_GAMEBLASTER != GAMEBLASTER || temp_GUS != GUS || temp_sound_card_current != sound_card_current)
   35.59                          {