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,