diff options
Diffstat (limited to 'src/mame/machine/decocass.cpp')
-rw-r--r-- | src/mame/machine/decocass.cpp | 499 |
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 |