summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/decocass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/decocass.cpp')
-rw-r--r--src/mame/machine/decocass.cpp499
1 files changed, 296 insertions, 203 deletions
diff --git a/src/mame/machine/decocass.cpp b/src/mame/machine/decocass.cpp
index c7bb5483039..abac33a48e7 100644
--- a/src/mame/machine/decocass.cpp
+++ b/src/mame/machine/decocass.cpp
@@ -241,7 +241,7 @@ void decocass_state::decocass_fno( offs_t offset, uint8_t data )
#endif
-READ8_MEMBER(decocass_state::decocass_type1_r)
+READ8_MEMBER(decocass_type1_state::decocass_type1_r)
{
if (!m_type1_map)
return 0x00;
@@ -429,11 +429,10 @@ static uint8_t type1_latch_16_pass_3_inv_1_table[8] = { T1PROM,T1LATCHINV,T1PROM
static uint8_t type1_map1100[8] = { T1PROM,T1PROM,T1LATCHINV,T1PROM,T1DIRECT,T1PROM,T1LATCH,T1PROM };
-MACHINE_RESET_MEMBER(decocass_state,cocean1a) /* 10 */
+MACHINE_RESET_MEMBER(decocass_type1_state,cocean1a) /* 10 */
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DP-1100 map)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_map1100;
m_type1_inmap = MAKE_MAP(0,1,2,3,4,5,6,7);
m_type1_outmap = MAKE_MAP(0,1,2,3,4,5,6,7);
@@ -461,11 +460,10 @@ MACHINE_RESET_MEMBER(decocass_state,cocean1a) /* 10 */
static uint8_t type1_map1120[8] = { T1PROM,T1PROM,T1LATCHINV,T1DIRECT,T1PROM,T1LATCH,T1PROM,T1PROM };
-MACHINE_RESET_MEMBER(decocass_state,cfboy0a1) /* 12 */
+MACHINE_RESET_MEMBER(decocass_type1_state,cfboy0a1) /* 12 */
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DP-1120 map)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_map1120;
m_type1_inmap = MAKE_MAP(0,1,2,3,4,5,6,7);
m_type1_outmap = MAKE_MAP(0,1,2,3,4,5,6,7);
@@ -491,11 +489,10 @@ TYPE 1
static uint8_t type1_map_clocknchj[8] = { T1PROM,T1PROM,T1DIRECT,T1LATCHINV,T1PROM,T1PROM,T1LATCH,T1PROM };
-MACHINE_RESET_MEMBER(decocass_state,clocknchj) /* 11 */
+MACHINE_RESET_MEMBER(decocass_type1_state,clocknchj) /* 11 */
{
- decocass_state::machine_reset();
- LOG(0,("dongle type #1x (type1_map_clocknchj map)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
+ machine_reset();
+ LOG(0,("dongle type #1 (type1_map_clocknchj map)\n"));
m_type1_map = type1_map_clocknchj;
m_type1_inmap = MAKE_MAP(0,1,2,3,4,5,6,7);
m_type1_outmap = MAKE_MAP(0,1,2,3,4,5,6,7);
@@ -511,7 +508,7 @@ MACHINE_RESET_MEMBER(decocass_state,clocknchj) /* 11 */
* - Pro Tennis
*
***************************************************************************/
-READ8_MEMBER(decocass_state::decocass_type2_r)
+READ8_MEMBER(decocass_type2_state::decocass_type2_r)
{
uint8_t data;
@@ -540,7 +537,7 @@ READ8_MEMBER(decocass_state::decocass_type2_r)
return data;
}
-WRITE8_MEMBER(decocass_state::decocass_type2_w)
+WRITE8_MEMBER(decocass_type2_state::decocass_type2_w)
{
if (1 == m_type2_xx_latch)
{
@@ -593,7 +590,7 @@ WRITE8_MEMBER(decocass_state::decocass_type2_w)
* - Fighting Ice Hockey
*
***************************************************************************/
-READ8_MEMBER(decocass_state::decocass_type3_r)
+READ8_MEMBER(decocass_type3_state::decocass_type3_r)
{
uint8_t data, save;
@@ -791,7 +788,7 @@ READ8_MEMBER(decocass_state::decocass_type3_r)
return data;
}
-WRITE8_MEMBER(decocass_state::decocass_type3_w)
+WRITE8_MEMBER(decocass_type3_state::decocass_type3_w)
{
if (1 == (offset & 1))
{
@@ -831,7 +828,7 @@ WRITE8_MEMBER(decocass_state::decocass_type3_w)
*
***************************************************************************/
-READ8_MEMBER(decocass_state::decocass_type4_r)
+READ8_MEMBER(decocass_type4_state::decocass_type4_r)
{
uint8_t data;
@@ -876,7 +873,7 @@ READ8_MEMBER(decocass_state::decocass_type4_r)
return data;
}
-WRITE8_MEMBER(decocass_state::decocass_type4_w)
+WRITE8_MEMBER(decocass_type4_state::decocass_type4_w)
{
if (1 == (offset & 1))
{
@@ -914,7 +911,7 @@ WRITE8_MEMBER(decocass_state::decocass_type4_w)
*
***************************************************************************/
-READ8_MEMBER(decocass_state::decocass_type5_r)
+READ8_MEMBER(decocass_type5_state::decocass_type5_r)
{
uint8_t data;
@@ -956,7 +953,7 @@ READ8_MEMBER(decocass_state::decocass_type5_r)
return data;
}
-WRITE8_MEMBER(decocass_state::decocass_type5_w)
+WRITE8_MEMBER(decocass_type5_state::decocass_type5_w)
{
if (1 == (offset & 1))
{
@@ -990,7 +987,7 @@ WRITE8_MEMBER(decocass_state::decocass_type5_w)
*
***************************************************************************/
-READ8_MEMBER(decocass_state::decocass_nodong_r)
+READ8_MEMBER(decocass_nodong_state::decocass_nodong_r)
{
uint8_t data;
@@ -1024,6 +1021,94 @@ READ8_MEMBER(decocass_state::decocass_nodong_r)
return data;
}
+
+/***************************************************************************
+ *
+ * Widel Multigame Dongle
+ * - provides access to a large ROM
+ *
+ ***************************************************************************/
+
+READ8_MEMBER(decocass_widel_state::decocass_widel_r)
+{
+ uint8_t data;
+
+ if (1 == (offset & 1))
+ {
+ if (0 == (offset & E5XX_MASK))
+ {
+ data = m_mcu->upi41_master_r(space,1);
+ LOG(4,("%10s 6502-PC: %04x decocass_widel_r(%02x): $%02x <- 8041 STATUS\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data));
+ }
+ else
+ {
+ data = 0xff; /* open data bus? */
+ LOG(4,("%10s 6502-PC: %04x decocass_widel_r(%02x): $%02x <- open bus\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data));
+ }
+ }
+ else
+ {
+ if (m_widel_latch)
+ {
+ uint8_t *prom = space.machine().root_device().memregion("dongle")->base();
+
+ data = prom[m_widel_ctrs | (m_decomult_bank << 16)];
+ LOG(3,("%10s 6502-PC: %04x decocass_widel_r(%02x): $%02x '%c' <- PROM[%04x]\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, (data >= 32) ? data : '.', m_widel_ctrs));
+
+ m_widel_ctrs = (m_widel_ctrs + 1) & 0xffff;
+ if (m_widel_ctrs == 0)
+ {
+ m_decomult_bank++;
+ }
+
+ }
+ else
+ {
+ if (0 == (offset & E5XX_MASK))
+ {
+ data = m_mcu->upi41_master_r(space,0);
+ LOG(3,("%10s 6502-PC: %04x decocass_widel_r(%02x): $%02x '%c' <- open bus (D0 replaced with latch)\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, (data >= 32) ? data : '.'));
+ }
+ else
+ {
+ data = 0xff; /* open data bus? */
+ LOG(4,("%10s 6502-PC: %04x decocass_widel_r(%02x): $%02x <- open bus\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data));
+ }
+ }
+ }
+
+ return data;
+}
+
+WRITE8_MEMBER(decocass_widel_state::decocass_widel_w)
+{
+ if (1 == (offset & 1))
+ {
+ if (1 == m_widel_latch)
+ {
+ m_widel_ctrs = data << 8; // clears lower bits
+ LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> CTRS MSB (%04x)\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, m_widel_ctrs));
+ return;
+ }
+ else
+ if (0xc0 == (data & 0xf0))
+ {
+ m_widel_latch = 1;
+ }
+ }
+ else
+ {
+ if (m_widel_latch)
+ {
+ m_widel_ctrs = data; // clears upper bits
+ LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> CTRS LSB (%04x)\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, m_widel_ctrs));
+ return;
+ }
+ }
+ LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, offset & 1 ? "8041-CMND" : "8041-DATA"));
+ m_mcu->upi41_master_w(space,offset, data);
+}
+
/***************************************************************************
*
* Main dongle and 8041 interface
@@ -1099,28 +1184,27 @@ WRITE8_MEMBER(decocass_state::decocass_e5xx_w)
* DE-0091xx daughter board handler
*
* The DE-0091xx daughter board seems to be a read-only ROM board with
- * two times five 4K ROMs. The only game using it (so far) is
- * Treasure Island, which has 4 ROMs.
+ * two times five 4K ROMs.
+ *
* The board's ROMs are mapped into view for reads between addresses
- * 0x6000 and 0xafff by setting bit0 of address 0xe900.
+ * 0x6000 and 0xafff by setting bits 0 and 1 of address 0xe900.
*
***************************************************************************/
WRITE8_MEMBER(decocass_state::decocass_e900_w)
{
- m_de0091_enable = data & 1;
- membank("bank1")->set_entry(data & 1);
- /* Perhaps the second row of ROMs is enabled by another bit.
- * There is no way to verify this yet, so for now just look
- * at bit 0 to enable the daughter board at reads between
- * 0x6000 and 0xafff.
- */
+ m_de0091_enable = data & 3;
+
+ if (m_de0091_enable == 0x3) // invalid
+ return;
+
+ membank("bank1")->set_entry(data & 3);
}
WRITE8_MEMBER(decocass_state::decocass_de0091_w)
{
- /* don't allow writes to the ROMs */
- if (!m_de0091_enable)
+ /* don't allow writes to the ROMs - actually cexplore requires us to allow them */
+ //if (!m_de0091_enable)
decocass_charram_w(space, offset, data);
}
@@ -1137,18 +1221,6 @@ void decocass_state::decocass_machine_state_save_init()
save_item(NAME(m_i8041_p1));
save_item(NAME(m_i8041_p2));
save_item(NAME(m_de0091_enable));
- save_item(NAME(m_type1_inmap));
- save_item(NAME(m_type1_outmap));
- save_item(NAME(m_type2_d2_latch));
- save_item(NAME(m_type2_xx_latch));
- save_item(NAME(m_type2_promaddr));
- save_item(NAME(m_type3_ctrs));
- save_item(NAME(m_type3_d0_latch));
- save_item(NAME(m_type3_pal_19));
- save_item(NAME(m_type3_swap));
- save_item(NAME(m_type4_ctrs));
- save_item(NAME(m_type4_latch));
- save_item(NAME(m_type5_latch));
save_item(NAME(m_sound_ack));
save_item(NAME(m_quadrature_decoder));
@@ -1171,6 +1243,7 @@ void decocass_state::machine_start()
{
}
+
void decocass_state::machine_reset()
{
m_firsttime = 1;
@@ -1188,23 +1261,6 @@ void decocass_state::machine_reset()
m_i8041_p2_read_latch = 0xff;
m_de0091_enable = 0;
- m_type1_inmap = MAKE_MAP(0,1,2,3,4,5,6,7);
- m_type1_outmap = MAKE_MAP(0,1,2,3,4,5,6,7);
-
- m_type2_d2_latch = 0;
- m_type2_xx_latch = 0;
- m_type2_promaddr = 0;
-
- m_type3_ctrs = 0;
- m_type3_d0_latch = 0;
- m_type3_pal_19 = 0;
- m_type3_swap = 0;
-
- m_type4_ctrs = 0;
- m_type4_latch = 0;
-
- m_type5_latch = 0;
-
memset(m_quadrature_decoder, 0, sizeof(m_quadrature_decoder));
m_sound_ack = 0;
m_audio_nmi_enabled = 0;
@@ -1224,274 +1280,301 @@ void decocass_state::machine_reset()
m_center_v_shift = 0;
}
-MACHINE_RESET_MEMBER(decocass_state,ctsttape)
+void decocass_type1_state::machine_start()
+{
+ save_item(NAME(m_type1_inmap));
+ save_item(NAME(m_type1_outmap));
+}
+
+void decocass_type1_state::machine_reset()
{
decocass_state::machine_reset();
+
+ m_dongle_r = read8_delegate(FUNC(decocass_type1_state::decocass_type1_r),this);
+ m_type1_inmap = MAKE_MAP(0,1,2,3,4,5,6,7);
+ m_type1_outmap = MAKE_MAP(0,1,2,3,4,5,6,7);
+}
+
+void decocass_type2_state::machine_start()
+{
+ save_item(NAME(m_type2_d2_latch));
+ save_item(NAME(m_type2_xx_latch));
+ save_item(NAME(m_type2_promaddr));
+}
+
+void decocass_type2_state::machine_reset()
+{
+ decocass_state::machine_reset();
+
+ LOG(0,("dongle type #2 (CS82-007)\n"));
+ m_dongle_r = read8_delegate(FUNC(decocass_type2_state::decocass_type2_r),this);
+ m_dongle_w = write8_delegate(FUNC(decocass_type2_state::decocass_type2_w),this);
+
+ m_type2_d2_latch = 0;
+ m_type2_xx_latch = 0;
+ m_type2_promaddr = 0;
+}
+
+void decocass_type3_state::machine_start()
+{
+ save_item(NAME(m_type3_ctrs));
+ save_item(NAME(m_type3_d0_latch));
+ save_item(NAME(m_type3_pal_19));
+ save_item(NAME(m_type3_swap));
+}
+
+void decocass_type3_state::machine_reset()
+{
+ decocass_state::machine_reset();
+
+ m_dongle_r = read8_delegate(FUNC(decocass_type3_state::decocass_type3_r),this);
+ m_dongle_w = write8_delegate(FUNC(decocass_type3_state::decocass_type3_w),this);
+
+ m_type3_ctrs = 0;
+ m_type3_d0_latch = 0;
+ m_type3_pal_19 = 0;
+ m_type3_swap = 0;
+}
+
+void decocass_type4_state::machine_start()
+{
+ save_item(NAME(m_type4_ctrs));
+ save_item(NAME(m_type4_latch));
+}
+
+void decocass_type4_state::machine_reset()
+{
+ decocass_state::machine_reset();
+
+ LOG(0,("dongle type #4 (32K ROM)\n"));
+ m_dongle_r = read8_delegate(FUNC(decocass_type4_state::decocass_type4_r),this);
+ m_dongle_w = write8_delegate(FUNC(decocass_type4_state::decocass_type4_w),this);
+
+ m_type4_ctrs = 0;
+ m_type4_latch = 0;
+}
+
+void decocass_type5_state::machine_start()
+{
+ save_item(NAME(m_type5_latch));
+}
+
+void decocass_type5_state::machine_reset()
+{
+ decocass_state::machine_reset();
+
+ LOG(0,("dongle type #5 (NOP)\n"));
+ m_dongle_r = read8_delegate(FUNC(decocass_type5_state::decocass_type5_r),this);
+ m_dongle_w = write8_delegate(FUNC(decocass_type5_state::decocass_type5_w),this);
+
+ m_type5_latch = 0;
+}
+
+void decocass_nodong_state::machine_reset()
+{
+ decocass_state::machine_reset();
+ LOG(0, ("no dongle\n"));
+ m_dongle_r = read8_delegate(FUNC(decocass_nodong_state::decocass_nodong_r), this);
+}
+
+MACHINE_RESET_MEMBER(decocass_type1_state,ctsttape)
+{
+ machine_reset();
LOG(0,("dongle type #1 (DE-0061)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_pass_136_table;
}
-MACHINE_RESET_MEMBER(decocass_state,chwy)
+MACHINE_RESET_MEMBER(decocass_type1_state,chwy)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DE-0061 own PROM)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_27_pass_3_inv_2_table;
}
-MACHINE_RESET_MEMBER(decocass_state,cdsteljn)
+MACHINE_RESET_MEMBER(decocass_type1_state,cdsteljn)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (A-0061)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_27_pass_3_inv_2_table;
}
-MACHINE_RESET_MEMBER(decocass_state,cterrani)
+MACHINE_RESET_MEMBER(decocass_type1_state,cterrani)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DE-0061 straight)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_26_pass_3_inv_2_table;
m_type1_inmap = MAKE_MAP(0,1,2,3,4,5,6,7);
m_type1_outmap = MAKE_MAP(0,1,2,3,4,5,6,7);
}
-MACHINE_RESET_MEMBER(decocass_state,castfant)
+MACHINE_RESET_MEMBER(decocass_type1_state,castfant)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DE-0061)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_16_pass_3_inv_1_table;
}
-MACHINE_RESET_MEMBER(decocass_state,csuperas)
+MACHINE_RESET_MEMBER(decocass_type1_state,csuperas)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DE-0061 flip 4-5)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_26_pass_3_inv_2_table;
m_type1_inmap = MAKE_MAP(0,1,2,3,5,4,6,7);
m_type1_outmap = MAKE_MAP(0,1,2,3,5,4,6,7);
}
-MACHINE_RESET_MEMBER(decocass_state,cmanhat)
+MACHINE_RESET_MEMBER(decocass_type1_state,cmanhat)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DE-0061)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_xab_pass_x54_table;
}
-MACHINE_RESET_MEMBER(decocass_state,clocknch)
+MACHINE_RESET_MEMBER(decocass_type1_state,clocknch)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DE-0061 flip 2-3)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_26_pass_3_inv_2_table;
m_type1_inmap = MAKE_MAP(0,1,3,2,4,5,6,7);
m_type1_outmap = MAKE_MAP(0,1,3,2,4,5,6,7);
}
-MACHINE_RESET_MEMBER(decocass_state,cprogolf)
+MACHINE_RESET_MEMBER(decocass_type1_state,cprogolf)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DE-0061 flip 0-1)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_26_pass_3_inv_2_table;
m_type1_inmap = MAKE_MAP(1,0,2,3,4,5,6,7);
m_type1_outmap = MAKE_MAP(1,0,2,3,4,5,6,7);
}
-MACHINE_RESET_MEMBER(decocass_state,cprogolfj)
+MACHINE_RESET_MEMBER(decocass_type1_state,cprogolfj)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (A-0061 flip 0-1)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_26_pass_3_inv_2_table;
m_type1_inmap = MAKE_MAP(1,0,2,3,4,5,6,7);
m_type1_outmap = MAKE_MAP(1,0,2,3,4,5,6,7);
}
-MACHINE_RESET_MEMBER(decocass_state,cluckypo)
+MACHINE_RESET_MEMBER(decocass_type1_state,cluckypo)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DE-0061 flip 1-3)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_26_pass_3_inv_2_table;
m_type1_inmap = MAKE_MAP(0,3,2,1,4,5,6,7);
m_type1_outmap = MAKE_MAP(0,3,2,1,4,5,6,7);
}
-MACHINE_RESET_MEMBER(decocass_state,ctisland)
+MACHINE_RESET_MEMBER(decocass_type1_state,ctisland)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DE-0061 flip 0-2)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_26_pass_3_inv_2_table;
m_type1_inmap = MAKE_MAP(2,1,0,3,4,5,6,7);
m_type1_outmap = MAKE_MAP(2,1,0,3,4,5,6,7);
}
-MACHINE_RESET_MEMBER(decocass_state,ctisland3)
+MACHINE_RESET_MEMBER(decocass_type1_state,ctisland3)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DE-0061 custom)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_ctisland3;
m_type1_inmap = MAKE_MAP(0,1,2,3,4,5,6,7); // correct for handcrafted prom
m_type1_outmap = MAKE_MAP(0,1,2,3,4,5,6,7); // ^
}
-MACHINE_RESET_MEMBER(decocass_state,cexplore)
+MACHINE_RESET_MEMBER(decocass_type1_state,cexplore)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #1 (DE-0061 own PROM)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type1_r),this);
m_type1_map = type1_latch_26_pass_5_inv_2_table;
}
-MACHINE_RESET_MEMBER(decocass_state,cdiscon1)
-{
- decocass_state::machine_reset();
- LOG(0,("dongle type #2 (CS82-007)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type2_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type2_w),this);
-}
-
-MACHINE_RESET_MEMBER(decocass_state,ctornado)
-{
- decocass_state::machine_reset();
- LOG(0,("dongle type #2 (CS82-007)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type2_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type2_w),this);
-}
-
-MACHINE_RESET_MEMBER(decocass_state,cmissnx)
-{
- decocass_state::machine_reset();
- LOG(0,("dongle type #2 (CS82-007)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type2_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type2_w),this);
-}
-
-MACHINE_RESET_MEMBER(decocass_state,cptennis)
-{
- decocass_state::machine_reset();
- LOG(0,("dongle type #2 (CS82-007)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type2_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type2_w),this);
-}
-
-MACHINE_RESET_MEMBER(decocass_state,cfishing)
+MACHINE_RESET_MEMBER(decocass_type3_state,cfishing)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_01;
}
-MACHINE_RESET_MEMBER(decocass_state,cbtime)
+MACHINE_RESET_MEMBER(decocass_type3_state,cbtime)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_12;
}
-MACHINE_RESET_MEMBER(decocass_state,cburnrub)
+MACHINE_RESET_MEMBER(decocass_type3_state,cburnrub)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_67;
}
-MACHINE_RESET_MEMBER(decocass_state,cgraplop)
+MACHINE_RESET_MEMBER(decocass_type3_state,cgraplop)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_56;
}
-MACHINE_RESET_MEMBER(decocass_state,cgraplop2)
+MACHINE_RESET_MEMBER(decocass_type3_state,cgraplop2)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_67;
}
-MACHINE_RESET_MEMBER(decocass_state,clapapa)
+MACHINE_RESET_MEMBER(decocass_type3_state,clapapa)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_34_7;
}
-MACHINE_RESET_MEMBER(decocass_state,cskater)
+MACHINE_RESET_MEMBER(decocass_type3_state,cskater)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_45;
}
-MACHINE_RESET_MEMBER(decocass_state,cprobowl)
+MACHINE_RESET_MEMBER(decocass_type3_state,cprobowl)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_34_0;
}
-MACHINE_RESET_MEMBER(decocass_state,cnightst)
+MACHINE_RESET_MEMBER(decocass_type3_state,cnightst)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_13;
}
-MACHINE_RESET_MEMBER(decocass_state,cpsoccer)
+MACHINE_RESET_MEMBER(decocass_type3_state,cpsoccer)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_24;
}
-MACHINE_RESET_MEMBER(decocass_state,csdtenis)
+MACHINE_RESET_MEMBER(decocass_type3_state,csdtenis)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_23_56;
}
-MACHINE_RESET_MEMBER(decocass_state,czeroize)
+MACHINE_RESET_MEMBER(decocass_type3_state,czeroize)
{
uint8_t *mem = memregion("dongle")->base();
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_23_56;
/*
@@ -1508,47 +1591,57 @@ MACHINE_RESET_MEMBER(decocass_state,czeroize)
mem[0x08a1] = 0xf7;
}
-MACHINE_RESET_MEMBER(decocass_state,cppicf)
+MACHINE_RESET_MEMBER(decocass_type3_state,cppicf)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_01;
}
-MACHINE_RESET_MEMBER(decocass_state,cfghtice)
+MACHINE_RESET_MEMBER(decocass_type3_state,cfghtice)
{
- decocass_state::machine_reset();
+ machine_reset();
LOG(0,("dongle type #3 (PAL)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type3_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type3_w),this);
m_type3_swap = TYPE3_SWAP_25;
}
-MACHINE_RESET_MEMBER(decocass_state,type4)
+
+
+
+// Note, this is a hack, I can't see where the bank bits actually get written out
+// and the MAME disassembly is currently a mess.
+READ8_MEMBER(decocass_widel_state::decocass_fbc2_r)
{
- decocass_state::machine_reset();
- LOG(0,("dongle type #4 (32K ROM)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type4_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type4_w),this);
+ if (!machine().side_effect_disabled())
+ {
+ uint8_t data = m_maincpu->space(AS_PROGRAM).read_byte(0xb3);
+ m_decomult_bank = data;
+ }
+ return 0xa8;
}
-MACHINE_RESET_MEMBER(decocass_state,cbdash)
+void decocass_widel_state::machine_start()
{
- decocass_state::machine_reset();
- LOG(0,("dongle type #5 (NOP)\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_type5_r),this);
- m_dongle_w = write8_delegate(FUNC(decocass_state::decocass_type5_w),this);
+ decocass_state::machine_start();
+
+ save_item(NAME(m_widel_ctrs));
+ save_item(NAME(m_widel_latch));
}
-MACHINE_RESET_MEMBER(decocass_state,cflyball)
+void decocass_widel_state::machine_reset()
{
decocass_state::machine_reset();
- LOG(0,("no dongle\n"));
- m_dongle_r = read8_delegate(FUNC(decocass_state::decocass_nodong_r),this);
+ LOG(0,("Deco Multigame Dongle\n"));
+ m_dongle_r = read8_delegate(FUNC(decocass_widel_state::decocass_widel_r),this);
+ m_dongle_w = write8_delegate(FUNC(decocass_widel_state::decocass_widel_w),this);
+
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0xfbc2, 0xfbc2, read8_delegate(FUNC(decocass_widel_state::decocass_fbc2_r),this));
+ m_decomult_bank = 0;
+ m_widel_ctrs = 0;
+ m_widel_latch = 0;
}
+
/***************************************************************************
*
* 8041 port handlers