From 68d557188abd0b1395344e1efd323dab632826f7 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 17 Feb 2022 11:28:01 -0300 Subject: [PATCH 1/9] Bump version to 3.2.1 --- CMakeLists.txt | 2 +- src/include_make/86box/version.h | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 56a4d446a..baebe22b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ if(MUNT_EXTERNAL) endif() project(86Box - VERSION 3.2 + VERSION 3.2.1 DESCRIPTION "Emulator of x86-based systems" HOMEPAGE_URL "https://86box.net" LANGUAGES C CXX) diff --git a/src/include_make/86box/version.h b/src/include_make/86box/version.h index d2a0b2791..4e877ca24 100644 --- a/src/include_make/86box/version.h +++ b/src/include_make/86box/version.h @@ -20,12 +20,12 @@ #define EMU_NAME "86Box" #define EMU_NAME_W LSTR(EMU_NAME) -#define EMU_VERSION "3.2" +#define EMU_VERSION "3.2.1" #define EMU_VERSION_W LSTR(EMU_VERSION) -#define EMU_VERSION_EX "3.02" +#define EMU_VERSION_EX "3.21" #define EMU_VERSION_MAJ 3 -#define EMU_VERSION_MIN 0 -#define EMU_VERSION_PATCH 0 +#define EMU_VERSION_MIN 2 +#define EMU_VERSION_PATCH 1 #define EMU_BUILD_NUM 0 From 29b37d9f974c0db606b3716298626029bcf9b8b6 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 17 Feb 2022 11:29:35 -0300 Subject: [PATCH 2/9] Make SST flash not fatal on size mismatch, fixes Shuttle HOT-433A with old Intel flash files --- src/mem/sst_flash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mem/sst_flash.c b/src/mem/sst_flash.c index 1de5e6e32..bcc3c3aa9 100644 --- a/src/mem/sst_flash.c +++ b/src/mem/sst_flash.c @@ -442,7 +442,7 @@ sst_init(const device_t *info) f = nvr_fopen(flash_path, "rb"); if (f) { if (fread(&(dev->array[0x00000]), 1, dev->size, f) != dev->size) - fatal("Less than %i bytes read from the SST Flash ROM file\n", dev->size); + pclog("Less than %i bytes read from the SST Flash ROM file\n", dev->size); fclose(f); } else dev->dirty = 1; /* It is by definition dirty on creation. */ From d77dd42f8ebd4f903d82ccd58dd6a35aee1bfb72 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 18 Feb 2022 00:04:48 +0600 Subject: [PATCH 3/9] qt: Fix network adapter combobox being grayed out when PCap is initially enabled --- src/qt/qt_settingsnetwork.cpp | 10 ++++++++++ src/qt/qt_settingsnetwork.hpp | 2 ++ 2 files changed, 12 insertions(+) diff --git a/src/qt/qt_settingsnetwork.cpp b/src/qt/qt_settingsnetwork.cpp index 290fea43b..98b1ac486 100644 --- a/src/qt/qt_settingsnetwork.cpp +++ b/src/qt/qt_settingsnetwork.cpp @@ -127,3 +127,13 @@ void SettingsNetwork::on_pushButtonConfigure_clicked() { DeviceConfig::ConfigureDevice(network_card_getdevice(ui->comboBoxAdapter->currentData().toInt()), 0, qobject_cast(Settings::settings)); } + +void SettingsNetwork::on_comboBoxPcap_currentIndexChanged(int index) +{ + if (index < 0) { + return; + } + + enableElements(ui); +} + diff --git a/src/qt/qt_settingsnetwork.hpp b/src/qt/qt_settingsnetwork.hpp index f17eb98f1..b473ee3df 100644 --- a/src/qt/qt_settingsnetwork.hpp +++ b/src/qt/qt_settingsnetwork.hpp @@ -25,6 +25,8 @@ private slots: void on_comboBoxAdapter_currentIndexChanged(int index); void on_comboBoxNetwork_currentIndexChanged(int index); + void on_comboBoxPcap_currentIndexChanged(int index); + private: Ui::SettingsNetwork *ui; int machineId = 0; From 6544bd9fa0018be5537c44f25c48a2afe342eb5c Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 17 Feb 2022 15:20:32 -0300 Subject: [PATCH 4/9] Jenkins: Exclude one /usr/share directory created by SDL --- .ci/AppImageBuilder.yml | 1 + .ci/build.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.ci/AppImageBuilder.yml b/.ci/AppImageBuilder.yml index 317be2317..fb2482491 100644 --- a/.ci/AppImageBuilder.yml +++ b/.ci/AppImageBuilder.yml @@ -64,6 +64,7 @@ AppDir: - usr/lib/cmake - usr/lib/pkgconfig - usr/sbin + - usr/share/aclocal - usr/share/alsa - usr/share/apport - usr/share/bug diff --git a/.ci/build.sh b/.ci/build.sh index 5cd5f3baa..a791521f5 100644 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -232,7 +232,7 @@ else then pkgs="$pkgs build-essential" else - sudo dpkg --add-architecture $arch_deb + sudo dpkg --add-architecture "$arch_deb" pkgs="$pkgs crossbuild-essential-$arch_deb" fi From 10875e7c7c7ef7fa117e5f9bcba0112afd40e856 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 17 Feb 2022 15:22:11 -0300 Subject: [PATCH 5/9] snd_cs423x: Fix crash caused by initializing SBPro before ISAPnP --- src/sound/snd_cs423x.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index d159182e4..e89efb434 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -776,9 +776,6 @@ cs423x_init(const device_t *info) if ((dev->eeprom_data[0] == 0x55) && (dev->eeprom_data[1] == 0xbb)) dev->eeprom = i2c_eeprom_init(i2c_gpio_get_bus(dev->i2c), 0x50, dev->eeprom_data, sizeof(dev->eeprom_data), 1); - /* Initialize ISAPnP. */ - dev->pnp_card = isapnp_add_card(NULL, 0, cs423x_pnp_config_changed, NULL, NULL, NULL, dev); - /* Initialize SBPro codec. The WSS codec is initialized later by cs423x_reset */ dev->sb = device_add(&sb_pro_compat_device); sound_set_cd_audio_filter(sbpro_filter_cd_audio, dev->sb); /* CD audio filter for the default context */ @@ -787,6 +784,9 @@ cs423x_init(const device_t *info) cs423x_reset(dev); sound_add_handler(cs423x_get_buffer, dev); + /* Initialize ISAPnP. */ + dev->pnp_card = isapnp_add_card(NULL, 0, cs423x_pnp_config_changed, NULL, NULL, NULL, dev); + return dev; } From 7696eea94eba9997d5644822732613a663a09fc3 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 17 Feb 2022 16:44:49 -0300 Subject: [PATCH 6/9] isapnp: Check if a card has a valid ROM before allowing it to be isolated --- src/device/isapnp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/isapnp.c b/src/device/isapnp.c index 2b75969ce..18b11ba3d 100644 --- a/src/device/isapnp.c +++ b/src/device/isapnp.c @@ -268,7 +268,7 @@ isapnp_read_data(uint16_t addr, void *priv) case 0x01: /* Serial Isolation */ card = dev->first_card; while (card) { - if (card->enable && (card->state == PNP_STATE_ISOLATION)) + if (card->enable && card->rom && (card->state == PNP_STATE_ISOLATION)) break; card = card->next; } From 7f0c8fae5c43930c4171968eb9b3541f07531c39 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 17 Feb 2022 17:46:11 -0300 Subject: [PATCH 7/9] snd_cs423x: Actually fix the startup crash, caused by co-existing with VIA 686 SBPro compatibility --- src/chipset/via_pipc.c | 2 +- src/sound/snd_cs423x.c | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/chipset/via_pipc.c b/src/chipset/via_pipc.c index a9da704d8..1308d6cff 100644 --- a/src/chipset/via_pipc.c +++ b/src/chipset/via_pipc.c @@ -1577,7 +1577,7 @@ pipc_init(const device_t *info) dev->ac97 = device_add(&ac97_via_device); ac97_via_set_slot(dev->ac97, dev->slot, PCI_INTC); - dev->sb = device_add(&sb_pro_compat_device); + dev->sb = device_add_inst(&sb_pro_compat_device, 2); #ifndef VIA_PIPC_FM_EMULATION dev->sb->opl_enabled = 1; #endif diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index e89efb434..a7bd6cc17 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -708,7 +708,7 @@ cs423x_reset(void *priv) /* Reset PnP resource data, state and logical devices. */ dev->pnp_enable = 1; cs423x_pnp_enable(dev, 1, 1); - if (dev->pnp_card) + if (dev->pnp_card && dev->sb) isapnp_reset_card(dev->pnp_card); /* Reset SLAM. */ @@ -776,17 +776,17 @@ cs423x_init(const device_t *info) if ((dev->eeprom_data[0] == 0x55) && (dev->eeprom_data[1] == 0xbb)) dev->eeprom = i2c_eeprom_init(i2c_gpio_get_bus(dev->i2c), 0x50, dev->eeprom_data, sizeof(dev->eeprom_data), 1); + /* Initialize ISAPnP. */ + dev->pnp_card = isapnp_add_card(NULL, 0, cs423x_pnp_config_changed, NULL, NULL, NULL, dev); + /* Initialize SBPro codec. The WSS codec is initialized later by cs423x_reset */ - dev->sb = device_add(&sb_pro_compat_device); + dev->sb = device_add_inst(&sb_pro_compat_device, 1); sound_set_cd_audio_filter(sbpro_filter_cd_audio, dev->sb); /* CD audio filter for the default context */ /* Initialize RAM, registers and WSS codec. */ cs423x_reset(dev); sound_add_handler(cs423x_get_buffer, dev); - /* Initialize ISAPnP. */ - dev->pnp_card = isapnp_add_card(NULL, 0, cs423x_pnp_config_changed, NULL, NULL, NULL, dev); - return dev; } From 79703457cfbb28116a6d5c5d176b6c15637d286c Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 18 Feb 2022 04:52:03 -0500 Subject: [PATCH 8/9] Disable CLANG64 builds for now --- .github/workflows/cmake.yml | 8 ++++---- src/network/CMakeLists.txt | 2 +- src/unix/unix.c | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 0c85655c1..5f95e1309 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -25,7 +25,7 @@ jobs: msys2: name: MSYS2 ${{ matrix.build.name }} build (${{ matrix.environment.msystem }}) - runs-on: windows-latest + runs-on: windows-2022 defaults: run: @@ -68,8 +68,8 @@ jobs: prefix: mingw-w64-ucrt-x86_64 # - msystem: CLANG32 # prefix: mingw-w64-clang-i686 - - msystem: CLANG64 - prefix: mingw-w64-clang-x86_64 +# - msystem: CLANG64 +# prefix: mingw-w64-clang-x86_64 steps: - uses: msys2/setup-msys2@v2 @@ -210,7 +210,7 @@ jobs: linux: name: "Linux GCC 11 (${{ matrix.build.name }} x86_64)" - runs-on: ubuntu-latest + runs-on: ubuntu-2004 strategy: fail-fast: true diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt index 5cfa87d91..ee9f9bdcc 100644 --- a/src/network/CMakeLists.txt +++ b/src/network/CMakeLists.txt @@ -26,4 +26,4 @@ if(SLIRP_EXTERNAL) else() add_subdirectory(slirp) target_link_libraries(86Box slirp) -endif() \ No newline at end of file +endif() diff --git a/src/unix/unix.c b/src/unix/unix.c index a93609e2e..21418697a 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1272,4 +1272,4 @@ void endblit() void ui_sb_mt32lcd(char* str) { -} \ No newline at end of file +} From 07cba51e7bb7dfbeaa09747c3341d20d16a59a41 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 18 Feb 2022 13:46:04 -0300 Subject: [PATCH 9/9] Implement Crystal CS4235 --- src/include/86box/snd_ad1848.h | 5 ++ src/include/86box/sound.h | 2 + src/sound/snd_ad1848.c | 38 +++++++--- src/sound/snd_cs423x.c | 133 ++++++++++++++++++++++----------- src/sound/sound.c | 1 + 5 files changed, 125 insertions(+), 54 deletions(-) diff --git a/src/include/86box/snd_ad1848.h b/src/include/86box/snd_ad1848.h index 3e61deea7..17e7b5050 100644 --- a/src/include/86box/snd_ad1848.h +++ b/src/include/86box/snd_ad1848.h @@ -23,6 +23,7 @@ enum { AD1848_TYPE_DEFAULT = 0, AD1848_TYPE_CS4248, AD1848_TYPE_CS4231, + AD1848_TYPE_CS4235, AD1848_TYPE_CS4236 }; @@ -46,6 +47,10 @@ typedef struct { int16_t buffer[SOUNDBUFLEN * 2]; int pos; + + void *cram_priv, + (*cram_write)(uint16_t addr, uint8_t val, void *priv); + uint8_t (*cram_read)(uint16_t addr, void *priv); } ad1848_t; diff --git a/src/include/86box/sound.h b/src/include/86box/sound.h index f7b3bca0a..cd53a06a6 100644 --- a/src/include/86box/sound.h +++ b/src/include/86box/sound.h @@ -135,6 +135,8 @@ extern const device_t wss_device; extern const device_t ncr_business_audio_device; /* Crystal CS423x */ +extern const device_t cs4235_device; +extern const device_t cs4235_onboard_device; extern const device_t cs4236b_device; extern const device_t cs4237b_device; extern const device_t cs4238b_device; diff --git a/src/sound/snd_ad1848.c b/src/sound/snd_ad1848.c index ff4c0be83..024242438 100644 --- a/src/sound/snd_ad1848.c +++ b/src/sound/snd_ad1848.c @@ -16,7 +16,7 @@ * * Copyright 2008-2020 Sarah Walker. * Copyright 2018-2020 TheCollector1995. - * Copyright 2021 RichardG. + * Copyright 2021-2022 RichardG. */ #include #include @@ -56,7 +56,7 @@ ad1848_setdma(ad1848_t *ad1848, int dma) void ad1848_updatevolmask(ad1848_t *ad1848) { - if ((ad1848->type == AD1848_TYPE_CS4236) && ((ad1848->xregs[4] & 0x10) || ad1848->wten)) + if ((ad1848->type >= AD1848_TYPE_CS4235) && ((ad1848->xregs[4] & 0x10) || ad1848->wten)) ad1848->wave_vol_mask = 0x3f; else ad1848->wave_vol_mask = 0x7f; @@ -69,7 +69,7 @@ ad1848_updatefreq(ad1848_t *ad1848) double freq; uint8_t set = 0; - if (ad1848->type == AD1848_TYPE_CS4236) { + if (ad1848->type >= AD1848_TYPE_CS4235) { if (ad1848->xregs[11] & 0x20) { freq = 16934400LL; switch (ad1848->xregs[13]) { @@ -134,7 +134,7 @@ ad1848_read(uint16_t addr, void *priv) break; case 18: case 19: - if (ad1848->type == AD1848_TYPE_CS4236) { + if (ad1848->type >= AD1848_TYPE_CS4235) { if ((ad1848->xregs[4] & 0x14) == 0x14) /* FM remapping */ ret = ad1848->xregs[ad1848->index - 12]; /* real FM volume on registers 6 and 7 */ else if (ad1848->wten && !(ad1848->xregs[4] & 0x08)) /* wavetable remapping */ @@ -142,8 +142,14 @@ ad1848_read(uint16_t addr, void *priv) } break; + case 20: case 21: + /* Backdoor to the Control/RAM registers on CS4235. */ + if ((ad1848->type == AD1848_TYPE_CS4235) && (ad1848->xregs[18] & 0x80)) + ret = ad1848->cram_read(ad1848->index - 15, ad1848->cram_priv); + break; + case 23: - if ((ad1848->type == AD1848_TYPE_CS4236) && (ad1848->regs[23] & 0x08)) { + if ((ad1848->type >= AD1848_TYPE_CS4235) && (ad1848->regs[23] & 0x08)) { if ((ad1848->xindex & 0xfe) == 0x00) /* remapped line volume */ ret = ad1848->regs[18 + ad1848->xindex]; else @@ -174,7 +180,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) ad1848->index = val & 0x1f; /* cs4231a extended mode enabled */ else ad1848->index = val & 0x0f; /* ad1848/cs4248 mode TODO: some variants/clones DO NOT mirror, just ignore the writes? */ - if (ad1848->type == AD1848_TYPE_CS4236) + if (ad1848->type >= AD1848_TYPE_CS4235) ad1848->regs[23] &= ~0x08; /* clear XRAE */ ad1848->trd = val & 0x20; ad1848->mce = val & 0x40; @@ -183,7 +189,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) case 1: switch (ad1848->index) { case 10: - if (ad1848->type != AD1848_TYPE_CS4236) + if (ad1848->type < AD1848_TYPE_CS4235) break; /* fall-through */ @@ -223,7 +229,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) break; case 18: case 19: - if (ad1848->type == AD1848_TYPE_CS4236) { + if (ad1848->type >= AD1848_TYPE_CS4235) { if ((ad1848->xregs[4] & 0x14) == 0x14) { /* FM remapping */ ad1848->xregs[ad1848->index - 12] = val; /* real FM volume on extended registers 6 and 7 */ temp = 1; @@ -265,12 +271,20 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) } break; + case 20: case 21: + /* Backdoor to the Control/RAM registers on CS4235. */ + if ((ad1848->type == AD1848_TYPE_CS4235) && (ad1848->xregs[18] & 0x80)) { + ad1848->cram_write(ad1848->index - 15, val, ad1848->cram_priv); + val = ad1848->regs[ad1848->index]; + } + break; + case 22: updatefreq = 1; break; case 23: - if ((ad1848->type == AD1848_TYPE_CS4236) && ((ad1848->regs[12] & 0x60) == 0x60)) { + if ((ad1848->type >= AD1848_TYPE_CS4235) && ((ad1848->regs[12] & 0x60) == 0x60)) { if (!(ad1848->regs[23] & 0x08)) { /* existing (not new) XRAE is clear */ ad1848->xindex = ((val & 0x04) << 2) | (val >> 4); break; @@ -327,7 +341,7 @@ ad1848_write(uint16_t addr, uint8_t val, void *priv) if (updatefreq) ad1848_updatefreq(ad1848); - if ((ad1848->type == AD1848_TYPE_CS4231) || (ad1848->type == AD1848_TYPE_CS4236)) { /* TODO: configure CD volume for CS4248/AD1848 too */ + if (ad1848->type >= AD1848_TYPE_CS4231) { /* TODO: configure CD volume for CS4248/AD1848 too */ temp = (ad1848->type == AD1848_TYPE_CS4231) ? 18 : 4; if (ad1848->regs[temp] & 0x80) ad1848->cd_vol_l = 0; @@ -474,7 +488,7 @@ ad1848_init(ad1848_t *ad1848, uint8_t type) ad1848->regs[8] = 0; ad1848->regs[9] = 0x08; ad1848->regs[10] = ad1848->regs[11] = 0; - if ((type == AD1848_TYPE_CS4248) || (type == AD1848_TYPE_CS4231) || (type == AD1848_TYPE_CS4236)) + if ((type == AD1848_TYPE_CS4248) || (type == AD1848_TYPE_CS4231) || (type >= AD1848_TYPE_CS4235)) ad1848->regs[12] = 0x8a; else ad1848->regs[12] = 0xa; @@ -489,7 +503,7 @@ ad1848_init(ad1848_t *ad1848, uint8_t type) ad1848->regs[25] = CS4231; ad1848->regs[26] = 0x80; ad1848->regs[29] = 0x80; - } else if (type == AD1848_TYPE_CS4236) { + } else if (type >= AD1848_TYPE_CS4235) { ad1848->regs[16] = ad1848->regs[17] = 0; ad1848->regs[18] = ad1848->regs[19] = 0; ad1848->regs[20] = ad1848->regs[21] = 0; diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index a7bd6cc17..c1e19a630 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -12,7 +12,7 @@ * * Authors: RichardG, * - * Copyright 2021 RichardG. + * Copyright 2021-2022 RichardG. */ #include #include @@ -37,7 +37,10 @@ #include <86box/nvr.h> +#define CRYSTAL_NOEEPROM 0x100 + enum { + CRYSTAL_CS4235 = 0xdd, CRYSTAL_CS4236B = 0xcb, CRYSTAL_CS4237B = 0xc8, CRYSTAL_CS4238B = 0xc9 @@ -69,7 +72,7 @@ static const uint8_t cs4236b_eeprom[] = { 0x10, 0x03, /* DMA routing */ /* PnP resources */ - 0x0e, 0x63, 0x42, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, /* CSC4236, dummy checksum (filled in by isapnp_add_card) */ + 0x0e, 0x63, 0x42, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, /* CSC4236, dummy checksum (filled in by isapnp_add_card) */ 0x0a, 0x10, 0x01, /* PnP version 1.0, vendor version 0.1 */ 0x82, 0x0e, 0x00, 'C', 'r', 'y', 's', 't', 'a', 'l', ' ', 'C', 'o', 'd', 'e' ,'c', 0x00, /* ANSI identifier */ @@ -312,7 +315,8 @@ cs423x_write(uint16_t addr, uint8_t val, void *priv) break; case 6: /* RAM Access End */ - if (!val) { + /* TriGem Delhi-III BIOS writes undocumented value 0x40 instead of 0x00. */ + if ((val == 0x00) || (val == 0x40)) { dev->ram_dl = 0; /* Update PnP state and resource data. */ @@ -356,6 +360,20 @@ cs423x_slam_write(uint16_t addr, uint8_t val, void *priv) break; case CRYSTAL_SLAM_INDEX: + /* Intercept the Activate Audio Device command. */ + if (val == 0x79) { + /* Apply the last logical device's configuration. */ + if (dev->slam_config) { + cs423x_pnp_config_changed(dev->slam_ld, dev->slam_config, dev); + free(dev->slam_config); + dev->slam_config = NULL; + } + + /* Exit out of SLAM. */ + dev->slam_state = CRYSTAL_SLAM_NONE; + break; + } + /* Write register index. */ dev->slam_reg = val; dev->slam_state = CRYSTAL_SLAM_BYTE1; @@ -429,18 +447,6 @@ cs423x_slam_write(uint16_t addr, uint8_t val, void *priv) /* Activate or deactivate the device. */ dev->slam_config->activate = val & 0x01; break; - - case 0x79: /* activate chip */ - /* Apply the last logical device's configuration. */ - if (dev->slam_config) { - cs423x_pnp_config_changed(dev->slam_ld, dev->slam_config, dev); - free(dev->slam_config); - dev->slam_config = NULL; - } - - /* Exit out of SLAM. */ - dev->slam_state = CRYSTAL_SLAM_NONE; - break; } /* Prepare for the next register, unless a two-byte read returns above. */ @@ -560,10 +566,12 @@ cs423x_pnp_enable(cs423x_t *dev, uint8_t update_rom, uint8_t update_hwconfig) } /* Update SPS. */ - if (dev->ram_data[0x4003] & 0x04) - dev->indirect_regs[8] |= 0x04; - else - dev->indirect_regs[8] &= ~0x04; + if (dev->type != CRYSTAL_CS4235) { + if (dev->ram_data[0x4003] & 0x04) + dev->indirect_regs[8] |= 0x04; + else + dev->indirect_regs[8] &= ~0x04; + } /* Update IFM. */ if (dev->ram_data[0x4003] & 0x80) @@ -723,8 +731,9 @@ cs423x_init(const device_t *info) memset(dev, 0, sizeof(cs423x_t)); /* Initialize model-specific data. */ - dev->type = info->local; + dev->type = info->local & 0xff; switch (dev->type) { + case CRYSTAL_CS4235: case CRYSTAL_CS4236B: case CRYSTAL_CS4237B: case CRYSTAL_CS4238B: @@ -735,36 +744,45 @@ cs423x_init(const device_t *info) /* Different Chip Version and ID registers, which shouldn't be reset by ad1848_init */ dev->ad1848.xregs[25] = dev->type; - /* Load EEPROM contents from template. */ - memcpy(dev->eeprom_data, cs4236b_eeprom, sizeof(cs4236b_eeprom)); + if (!(info->local & CRYSTAL_NOEEPROM)) { + /* Load EEPROM contents from template. */ + memcpy(dev->eeprom_data, cs4236b_eeprom, sizeof(cs4236b_eeprom)); - /* Set content size. */ - dev->eeprom_data[2] = sizeof(cs4236b_eeprom) >> 8; - dev->eeprom_data[3] = sizeof(cs4236b_eeprom) & 0xff; + /* Set content size. */ + dev->eeprom_data[2] = sizeof(cs4236b_eeprom) >> 8; + dev->eeprom_data[3] = sizeof(cs4236b_eeprom) & 0xff; - /* Set PnP card ID and EEPROM file name. */ - switch (dev->type) { - case CRYSTAL_CS4236B: - dev->nvr_path = "cs4236b.nvr"; - break; + /* Set PnP card ID and EEPROM file name. */ + switch (dev->type) { + case CRYSTAL_CS4235: + dev->eeprom_data[8] = 0x05; + dev->eeprom_data[16] = 0x08; + dev->eeprom_data[26] = 0x25; + dev->nvr_path = "cs4235.nvr"; + break; - case CRYSTAL_CS4237B: - dev->eeprom_data[26] = 0x37; - dev->nvr_path = "cs4237b.nvr"; - break; + case CRYSTAL_CS4236B: + dev->nvr_path = "cs4236b.nvr"; + break; - case CRYSTAL_CS4238B: - dev->eeprom_data[26] = 0x38; - dev->nvr_path = "cs4238b.nvr"; - break; + case CRYSTAL_CS4237B: + dev->eeprom_data[26] = 0x37; + dev->nvr_path = "cs4237b.nvr"; + break; + + case CRYSTAL_CS4238B: + dev->eeprom_data[26] = 0x38; + dev->nvr_path = "cs4238b.nvr"; + break; + } + + /* Load EEPROM contents from file if present. */ + cs423x_nvram(dev, 0); } - /* Load EEPROM contents from file if present. */ - cs423x_nvram(dev, 0); - /* Initialize game port. The '7B and '8B game port only responds to 6 I/O ports; the remaining 2 ports are reserved on those chips, and probably connected to the Digital Assist feature. */ - dev->gameport = gameport_add((dev->type == CRYSTAL_CS4236B) ? &gameport_pnp_device : &gameport_pnp_6io_device); + dev->gameport = gameport_add(((dev->type == CRYSTAL_CS4235) || (dev->type == CRYSTAL_CS4236B)) ? &gameport_pnp_device : &gameport_pnp_6io_device); break; } @@ -787,6 +805,11 @@ cs423x_init(const device_t *info) cs423x_reset(dev); sound_add_handler(cs423x_get_buffer, dev); + /* Add Control/RAM backdoor handlers for CS4235. */ + dev->ad1848.cram_priv = dev; + dev->ad1848.cram_read = cs423x_read; + dev->ad1848.cram_write = cs423x_write; + return dev; } @@ -817,6 +840,32 @@ cs423x_speed_changed(void *priv) } +const device_t cs4235_device = +{ + "Crystal CS4235", + "cs4235", + DEVICE_ISA | DEVICE_AT, + CRYSTAL_CS4235, + cs423x_init, cs423x_close, cs423x_reset, + { NULL }, + cs423x_speed_changed, + NULL, + NULL +}; + +const device_t cs4235_onboard_device = +{ + "Crystal CS4235 (On-Board)", + "cs4235_onboard", + DEVICE_ISA | DEVICE_AT, + CRYSTAL_CS4235 | CRYSTAL_NOEEPROM, + cs423x_init, cs423x_close, cs423x_reset, + { NULL }, + cs423x_speed_changed, + NULL, + NULL +}; + const device_t cs4236b_device = { "Crystal CS4236B", diff --git a/src/sound/sound.c b/src/sound/sound.c index 7fbbd4d1c..e12b38bcb 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -106,6 +106,7 @@ static const SOUND_CARD sound_cards[] = { &adgold_device }, { &azt2316a_device }, { &azt1605_device }, + { &cs4235_device }, { &cs4236b_device }, { &sb_1_device }, { &sb_15_device },