From f261d4edd66c010500ccbb1de6d1c6bb88b42f5e Mon Sep 17 00:00:00 2001 From: 0kmg <9137159+0kmg@users.noreply.github.com> Date: Mon, 4 Apr 2022 11:32:16 -0800 Subject: [PATCH] bus/sega8: Added partial support for recent 188 in 1 cartridge. (#9509) --- hash/sms.xml | 1 + src/devices/bus/sega8/rom.cpp | 50 ++++++++++++++++++++++++++++ src/devices/bus/sega8/rom.h | 23 +++++++++++++ src/devices/bus/sega8/sega8_slot.cpp | 3 ++ src/devices/bus/sega8/sega8_slot.h | 1 + 5 files changed, 78 insertions(+) diff --git a/hash/sms.xml b/hash/sms.xml index 2554cfdc239..e6beb194076 100644 --- a/hash/sms.xml +++ b/hash/sms.xml @@ -3033,6 +3033,7 @@ license:CC0 <unknown> + diff --git a/src/devices/bus/sega8/rom.cpp b/src/devices/bus/sega8/rom.cpp index 7d5d35710e9..6d7abd8338c 100644 --- a/src/devices/bus/sega8/rom.cpp +++ b/src/devices/bus/sega8/rom.cpp @@ -40,6 +40,7 @@ DEFINE_DEVICE_TYPE(SEGA8_ROM_NEMESIS, sega8_nemesis_device, "sega8_nem DEFINE_DEVICE_TYPE(SEGA8_ROM_JANGGUN, sega8_janggun_device, "sega8_janggun", "SMS Janggun Cart") DEFINE_DEVICE_TYPE(SEGA8_ROM_HICOM, sega8_hicom_device, "sega8_hicom", "SMS Hi-Com Carts") DEFINE_DEVICE_TYPE(SEGA8_ROM_KOREAN, sega8_korean_device, "sega8_korean", "SMS Korean Carts") +DEFINE_DEVICE_TYPE(SEGA8_ROM_KOREAN_188, sega8_korean_188_device, "sega8_korean_188", "SMS Korean 188 in 1 Multicart") DEFINE_DEVICE_TYPE(SEGA8_ROM_KOREAN_NB, sega8_korean_nb_device, "sega8_korean_nb", "SMS Korean No-Bank Mapper Carts") DEFINE_DEVICE_TYPE(SEGA8_ROM_SEOJIN, sega8_seojin_device, "sega8_seojin", "SMS Seo Jin Multi-cart") DEFINE_DEVICE_TYPE(SEGA8_ROM_X_TERMINATOR, sega8_x_terminator_device, "sega8_x_terminator", "GG X-Terminator") @@ -178,6 +179,13 @@ sega8_korean_device::sega8_korean_device(const machine_config &mconfig, const ch } +sega8_korean_188_device::sega8_korean_188_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : sega8_rom_device(mconfig, SEGA8_ROM_KOREAN_188, tag, owner, clock) + , m_rom_bank_base(0) +{ +} + + sega8_korean_nb_device::sega8_korean_nb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : sega8_rom_device(mconfig, SEGA8_ROM_KOREAN_NB, tag, owner, clock) { @@ -258,6 +266,7 @@ void sega8_codemasters_device::device_reset() m_ram_enabled = 0; } + void sega8_4pak_device::device_start() { save_item(NAME(m_rom_bank_base)); @@ -285,6 +294,17 @@ void sega8_zemina_device::device_reset() } +void sega8_korean_188_device::device_start() +{ + save_item(NAME(m_rom_bank_base)); +} + +void sega8_korean_188_device::device_reset() +{ + m_rom_bank_base = 0; +} + + void sega8_multicart_device::device_start() { save_item(NAME(m_block)); @@ -990,6 +1010,36 @@ void sega8_korean_device::write_cart(offs_t offset, uint8_t data) m_rom_bank_base[2] = data % m_rom_page_count; } + +/*------------------------------------------------- + + Korean Game 188 multicart, + writes to 0x2000 switch 8K banks at 0x4000-0xbfff + + TODO: figure out why menu #s 6, 13, etc don't load. + Add dumps of other compatible multicarts. + + -------------------------------------------------*/ + +u8 sega8_korean_188_device::read_cart(offs_t offset) +{ + if (offset < 0x4000) + return m_rom[offset]; + else + { + int bank = m_rom_bank_base ^ 0x1f; + bank %= m_rom_page_count * 2; + return m_rom[bank * 0x2000 + offset - 0x4000]; + } +} + +void sega8_korean_188_device::write_cart(offs_t offset, u8 data) +{ + if ((offset & 0x6000) == 0x2000) + m_rom_bank_base = data; +} + + /*------------------------------------------------- Seo Jin Multi-Carts diff --git a/src/devices/bus/sega8/rom.h b/src/devices/bus/sega8/rom.h index 1af8cdb1c5b..ec4928fba22 100644 --- a/src/devices/bus/sega8/rom.h +++ b/src/devices/bus/sega8/rom.h @@ -359,6 +359,28 @@ public: }; +// ======================> sega8_korean_188_device + +class sega8_korean_188_device : public sega8_rom_device +{ +public: + // construction/destruction + sega8_korean_188_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // reading and writing + virtual u8 read_cart(offs_t offset) override; + virtual void write_cart(offs_t offset, u8 data) override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + +private: + u8 m_rom_bank_base; +}; + + // ======================> sega8_korean_nb_device class sega8_korean_nb_device : public sega8_rom_device @@ -495,6 +517,7 @@ DECLARE_DEVICE_TYPE(SEGA8_ROM_NEMESIS, sega8_nemesis_device) DECLARE_DEVICE_TYPE(SEGA8_ROM_JANGGUN, sega8_janggun_device) DECLARE_DEVICE_TYPE(SEGA8_ROM_HICOM, sega8_hicom_device) DECLARE_DEVICE_TYPE(SEGA8_ROM_KOREAN, sega8_korean_device) +DECLARE_DEVICE_TYPE(SEGA8_ROM_KOREAN_188, sega8_korean_188_device) DECLARE_DEVICE_TYPE(SEGA8_ROM_KOREAN_NB, sega8_korean_nb_device) DECLARE_DEVICE_TYPE(SEGA8_ROM_SEOJIN, sega8_seojin_device) DECLARE_DEVICE_TYPE(SEGA8_ROM_MULTICART, sega8_multicart_device) diff --git a/src/devices/bus/sega8/sega8_slot.cpp b/src/devices/bus/sega8/sega8_slot.cpp index 14f100e5abb..fdde1bb9401 100644 --- a/src/devices/bus/sega8/sega8_slot.cpp +++ b/src/devices/bus/sega8/sega8_slot.cpp @@ -223,6 +223,7 @@ static const sega8_slot slot_list[] = { SEGA8_NEMESIS, "nemesis" }, { SEGA8_JANGGUN, "janggun" }, { SEGA8_KOREAN, "korean" }, + { SEGA8_KOREAN_188IN1, "korean_188in1" }, { SEGA8_KOREAN_NOBANK, "korean_nb" }, { SEGA8_OTHELLO, "othello" }, { SEGA8_CASTLE, "castle" }, @@ -916,6 +917,7 @@ void sg1000mk3_cart(device_slot_interface &device) device.option_add_internal("janggun", SEGA8_ROM_JANGGUN); device.option_add_internal("hicom", SEGA8_ROM_HICOM); device.option_add_internal("korean", SEGA8_ROM_KOREAN); + device.option_add_internal("korean_188in1", SEGA8_ROM_KOREAN_188); device.option_add_internal("korean_nb", SEGA8_ROM_KOREAN_NB); device.option_add_internal("seojin", SEGA8_ROM_SEOJIN); device.option_add_internal("othello", SEGA8_ROM_OTHELLO); @@ -937,6 +939,7 @@ void sms_cart(device_slot_interface &device) device.option_add_internal("janggun", SEGA8_ROM_JANGGUN); device.option_add_internal("hicom", SEGA8_ROM_HICOM); device.option_add_internal("korean", SEGA8_ROM_KOREAN); + device.option_add_internal("korean_188in1", SEGA8_ROM_KOREAN_188); device.option_add_internal("korean_nb", SEGA8_ROM_KOREAN_NB); } diff --git a/src/devices/bus/sega8/sega8_slot.h b/src/devices/bus/sega8/sega8_slot.h index 9118309ce33..831d0500f0a 100644 --- a/src/devices/bus/sega8/sega8_slot.h +++ b/src/devices/bus/sega8/sega8_slot.h @@ -25,6 +25,7 @@ enum SEGA8_NEMESIS, SEGA8_JANGGUN, SEGA8_KOREAN, + SEGA8_KOREAN_188IN1, SEGA8_KOREAN_NOBANK, SEGA8_OTHELLO, SEGA8_CASTLE,