summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Fabio Priuli <etabeta78@users.noreply.github.com>2013-03-18 12:49:02 +0000
committer Fabio Priuli <etabeta78@users.noreply.github.com>2013-03-18 12:49:02 +0000
commit7923655446bae9040967f8aea690da625e22fe48 (patch)
tree9f9101312643e9bc06a05f2028d7d4a7fc983e05 /src
parentcd29176897abb077067e4d4c47a6c77cddb07936 (diff)
(MESS) megadriv.c: added support for reset-base Codemaster 2-in-1 cart and documented even more carts. nw.
Diffstat (limited to 'src')
-rw-r--r--src/mess/drivers/megadriv.c2
-rw-r--r--src/mess/machine/md_rom.c35
-rw-r--r--src/mess/machine/md_rom.h22
-rw-r--r--src/mess/machine/md_slot.c1
-rw-r--r--src/mess/machine/md_slot.h1
5 files changed, 61 insertions, 0 deletions
diff --git a/src/mess/drivers/megadriv.c b/src/mess/drivers/megadriv.c
index d870e7aee26..09656412eaa 100644
--- a/src/mess/drivers/megadriv.c
+++ b/src/mess/drivers/megadriv.c
@@ -322,6 +322,8 @@ static SLOT_INTERFACE_START(md_cart)
SLOT_INTERFACE_INTERNAL("rom_mm96", MD_SEPROM_MM96)
// STM95 EEPROM
SLOT_INTERFACE_INTERNAL("rom_stm95", MD_EEPROM_STM95)
+// CodeMasters 2-in-1 (reset based)
+ SLOT_INTERFACE_INTERNAL("rom_cm2in1", MD_ROM_CM2IN1)
// unique bankswitch
SLOT_INTERFACE_INTERNAL("rom_ssf2", MD_ROM_SSF2)
SLOT_INTERFACE_INTERNAL("rom_radica", MD_ROM_RADICA)
diff --git a/src/mess/machine/md_rom.c b/src/mess/machine/md_rom.c
index 1e9052f5c31..96bcc2dd742 100644
--- a/src/mess/machine/md_rom.c
+++ b/src/mess/machine/md_rom.c
@@ -23,6 +23,9 @@ const device_type MD_STD_ROM = &device_creator<md_std_rom_device>;
const device_type MD_ROM_SRAM = &device_creator<md_rom_sram_device>;
const device_type MD_ROM_FRAM = &device_creator<md_rom_fram_device>;
+// BASE CARTS + BANKSWITCH AT RESET
+const device_type MD_ROM_CM2IN1 = &device_creator<md_rom_cm2in1_device>;
+
// BASE CARTS + PROTECTION / BANKSWITCH
const device_type MD_ROM_SSF2 = &device_creator<md_rom_ssf2_device>;
const device_type MD_ROM_BUGSLIFE = &device_creator<md_rom_bugslife_device>;
@@ -80,6 +83,11 @@ md_rom_ssf2_device::md_rom_ssf2_device(const machine_config &mconfig, const char
{
}
+md_rom_cm2in1_device::md_rom_cm2in1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : md_std_rom_device(mconfig, MD_ROM_CM2IN1, "MD Codemasters 2in1", tag, owner, clock)
+{
+}
+
md_rom_mcpirate_device::md_rom_mcpirate_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: md_std_rom_device(mconfig, MD_ROM_MCPIR, "MD Pirate Multicarts (Various)", tag, owner, clock)
{
@@ -229,6 +237,18 @@ void md_rom_ssf2_device::device_reset()
m_lastdata = -1;
}
+void md_rom_cm2in1_device::device_start()
+{
+ m_base = -1;
+ save_item(NAME(m_base));
+}
+
+void md_rom_cm2in1_device::device_reset()
+{
+ m_base++;
+ m_base &= 1;
+}
+
void md_rom_mcpirate_device::device_start()
{
save_item(NAME(m_bank));
@@ -486,6 +506,21 @@ WRITE16_MEMBER(md_rom_ssf2_device::write_a13)
}
/*-------------------------------------------------
+ CODEMASTERS 2 IN 1 (RESET BASED)
+ -------------------------------------------------*/
+
+#define MD_ADDR_CM2IN1(a) (m_base == 0 ? ((a << 1) & 0x1fffff)/2 : (((a << 1) & 0x7ffff) + 0x200000)/2)
+
+READ16_MEMBER(md_rom_cm2in1_device::read)
+{
+ if (offset < 0x400000/2)
+ return m_rom[MD_ADDR_CM2IN1(offset)];
+ else
+ return 0xffff;
+}
+
+
+/*-------------------------------------------------
PIRATE MULTICARTS
-------------------------------------------------*/
diff --git a/src/mess/machine/md_rom.h b/src/mess/machine/md_rom.h
index 0286ed84dde..08a7041c2fa 100644
--- a/src/mess/machine/md_rom.h
+++ b/src/mess/machine/md_rom.h
@@ -83,6 +83,27 @@ private:
int m_lastoff, m_lastdata;
};
+// ======================> md_rom_cm2in1_device
+
+class md_rom_cm2in1_device : public md_std_rom_device
+{
+public:
+ // construction/destruction
+ md_rom_cm2in1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+ virtual void device_config_complete() { m_shortname = "md_rom_cm2in1"; }
+
+ // reading and writing
+ virtual DECLARE_READ16_MEMBER(read);
+
+private:
+ int m_base;
+};
+
+
// ======================> md_rom_mcpirate_device
class md_rom_mcpirate_device : public md_std_rom_device
@@ -559,6 +580,7 @@ private:
extern const device_type MD_STD_ROM;
extern const device_type MD_ROM_SRAM;
extern const device_type MD_ROM_FRAM;
+extern const device_type MD_ROM_CM2IN1;
extern const device_type MD_ROM_BUGSLIFE;
extern const device_type MD_ROM_CHINF3;
extern const device_type MD_ROM_ELFWOR;
diff --git a/src/mess/machine/md_slot.c b/src/mess/machine/md_slot.c
index 744e9a6977f..b6a3a4d9950 100644
--- a/src/mess/machine/md_slot.c
+++ b/src/mess/machine/md_slot.c
@@ -253,6 +253,7 @@ static const md_slot slot_list[] =
{ PSOLAR, "rom_stm95"},
{ SSF2, "rom_ssf2" },
+ { CM_2IN1, "rom_cm2in1" },
{ RADICA, "rom_radica" },
// { GAME_KANDUME, "rom_gkand" }, // what's needed by this?
diff --git a/src/mess/machine/md_slot.h b/src/mess/machine/md_slot.h
index ebb24db5ff1..40700fce9fa 100644
--- a/src/mess/machine/md_slot.h
+++ b/src/mess/machine/md_slot.h
@@ -42,6 +42,7 @@ enum
// Various
SSF2, /* Super Street Fighter 2 */
+ CM_2IN1, /* CodeMasters 2in1 : Psycho Pinball + Micro Machines */
GAME_KANDUME, /* Game no Kandume Otokuyou */
RADICA, /* Radica TV games.. these probably should be a separate driver since they are a separate 'console' */