From db566d4954fd658ff3532c2042c4d93ceb0c39a0 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Tue, 6 Mar 2018 01:32:52 +0000 Subject: [PATCH] c-chip: use dumped c-chip for Volfied and Superman, remove simulation [Team Caps0ff] (#3298) * c-chip: use dumped c-chip for Volfied [Team Caps0ff] interrupt source still needs to be verified, but I've tested this to the end and it works fine with the real dump. * less static (nw) * hook the coin counters back up (nw) * tweaks (nw) * was too close after tweak (nw) * add support for dumped superman c-chip too, removed simulation [Team Caps0ff] also made the 68k and upd7810 use different banked windows into the RAM, this seems to prevent the fighting I was seeing, and also superman suggests that it might be correct, as it puts response values in a bank for the 68k but then changes the window so the 68k can't see them. needs further testing tho (other c-chip dumps might tell us more later) * use the 68k side handlers on megab too, even if it really doesn't care about anything (nw) * remove debug structure (nw) --- scripts/target/mame/arcade.lua | 1 - src/devices/cpu/upd7810/upd7810.cpp | 17 +- src/mame/drivers/taito_f2.cpp | 4 +- src/mame/drivers/taito_x.cpp | 188 +++-------- src/mame/drivers/volfied.cpp | 64 +++- src/mame/includes/taito_x.h | 23 +- src/mame/includes/volfied.h | 60 ++-- src/mame/machine/taitocchip.cpp | 163 ++++++++- src/mame/machine/taitocchip.h | 70 +++- src/mame/machine/volfied.cpp | 506 ---------------------------- 10 files changed, 374 insertions(+), 722 deletions(-) delete mode 100644 src/mame/machine/volfied.cpp diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index 3e3d4a0133b..1aa7afd7c6b 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -3859,7 +3859,6 @@ files { MAME_DIR .. "src/mame/video/undrfire.cpp", MAME_DIR .. "src/mame/drivers/volfied.cpp", MAME_DIR .. "src/mame/includes/volfied.h", - MAME_DIR .. "src/mame/machine/volfied.cpp", MAME_DIR .. "src/mame/video/volfied.cpp", MAME_DIR .. "src/mame/drivers/warriorb.cpp", MAME_DIR .. "src/mame/includes/warriorb.h", diff --git a/src/devices/cpu/upd7810/upd7810.cpp b/src/devices/cpu/upd7810/upd7810.cpp index 56a5fda29ff..ad2c2555bbc 100644 --- a/src/devices/cpu/upd7810/upd7810.cpp +++ b/src/devices/cpu/upd7810/upd7810.cpp @@ -1476,10 +1476,11 @@ void upd7810_device::handle_timers(int cycles) m_adcnt -= m_adtot; switch (m_adout) { - case 0: CR0 = m_tmpcr; break; - case 1: CR1 = m_tmpcr; break; - case 2: CR2 = m_tmpcr; break; - case 3: CR3 = m_tmpcr; break; + // volfied code checks bit 0x80, old code set bit 0x01, TODO: verify which bits are set on real hw + case 0: CR0 = m_tmpcr ? 0xff:0x00; break; + case 1: CR1 = m_tmpcr ? 0xff:0x00; break; + case 2: CR2 = m_tmpcr ? 0xff:0x00; break; + case 3: CR3 = m_tmpcr ? 0xff:0x00; break; } m_adout = (m_adout + 1) & 0x03; if (m_adout == 0) @@ -1510,10 +1511,10 @@ void upd7810_device::handle_timers(int cycles) m_adcnt -= m_adtot; switch (m_adout) { - case 0: CR0 = m_tmpcr; break; - case 1: CR1 = m_tmpcr; break; - case 2: CR2 = m_tmpcr; break; - case 3: CR3 = m_tmpcr; break; + case 0: CR0 = m_tmpcr ? 0xff:0x00; break; + case 1: CR1 = m_tmpcr ? 0xff:0x00; break; + case 2: CR2 = m_tmpcr ? 0xff:0x00; break; + case 3: CR3 = m_tmpcr ? 0xff:0x00; break; } m_adin = (m_adin + 1) & 0x07; m_adout = (m_adout + 1) & 0x03; diff --git a/src/mame/drivers/taito_f2.cpp b/src/mame/drivers/taito_f2.cpp index 8cfa517b0cc..ccd3b65e23c 100644 --- a/src/mame/drivers/taito_f2.cpp +++ b/src/mame/drivers/taito_f2.cpp @@ -653,8 +653,8 @@ ADDRESS_MAP_START(taitof2_state::megab_map) AM_RANGE(0x100000, 0x100001) AM_DEVWRITE8("tc0140syt", tc0140syt_device, master_port_w, 0xff00) AM_RANGE(0x100002, 0x100003) AM_DEVREADWRITE8("tc0140syt", tc0140syt_device, master_comm_r, master_comm_w, 0xff00) AM_RANGE(0x120000, 0x12000f) AM_DEVREADWRITE8("tc0220ioc", tc0220ioc_device, read, write, 0x00ff) - AM_RANGE(0x180000, 0x1807ff) AM_DEVREADWRITE8("cchip", taito_cchip_device, mem_r, mem_w, 0x00ff) - AM_RANGE(0x180800, 0x180fff) AM_DEVREADWRITE8("cchip", taito_cchip_device, asic_r, asic_w, 0x00ff) + AM_RANGE(0x180000, 0x1807ff) AM_DEVREADWRITE8("cchip", taito_cchip_device, mem68_r, mem68_w, 0x00ff) + AM_RANGE(0x180800, 0x180fff) AM_DEVREADWRITE8("cchip", taito_cchip_device, asic_r, asic68_w, 0x00ff) AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_RANGE(0x300000, 0x301fff) AM_RAM_DEVWRITE("palette", palette_device, write16) AM_SHARE("palette") AM_RANGE(0x400000, 0x40001f) AM_DEVWRITE8("tc0360pri", tc0360pri_device, write, 0x00ff) /* ?? */ diff --git a/src/mame/drivers/taito_x.cpp b/src/mame/drivers/taito_x.cpp index 08f667e1a75..b4362e2ff09 100644 --- a/src/mame/drivers/taito_x.cpp +++ b/src/mame/drivers/taito_x.cpp @@ -27,23 +27,6 @@ Supported games: This file contains routines to interface with the Taito Controller Chip (or "Command Chip") version 1. It's currently used by Superman. -Superman (revised SJ 060601) --------- - -In Superman, the C-chip's main purpose is to handle player inputs and -coins and pass commands along to the sound chip. - -The 68k queries the c-chip, which passes back $100 bytes of 68k code which -are then executed in RAM. To get around this, we hack in our own code to -communicate with the sound board, since we are familiar with the interface -as it's used in Rastan and Super Space Invaders '91. - -It is believed that the NOPs in the 68k code are there to supply the -necessary cycles to the cchip to switch banks. - -This code requires that the player & coin inputs be in input ports 2-4. - - Memory map: ---------------------------------------------------- 0x000000 - 0x07ffff : ROM @@ -345,114 +328,14 @@ Stephh's notes (based on the game M68000 code and some tests) : #include "screen.h" #include "speaker.h" - -/* This code for sound communication is a hack, it will not be - identical to the code derived from the real c-chip */ - -static const uint8_t superman_code[40] = +WRITE8_MEMBER(taitox_state::superman_counters_w) { - 0x48, 0xe7, 0x80, 0x80, /* MOVEM.L D0/A0,-(A7) ( Preserve Regs ) */ - 0x20, 0x6d, 0x1c, 0x40, /* MOVEA.L ($1C40,A5),A0 ( Load sound pointer in A0 ) */ - 0x30, 0x2f, 0x00, 0x0c, /* MOVE.W ($0C,A7),D0 ( Fetch sound number ) */ - 0x10, 0x80, /* MOVE.B D0,(A0) ( Store it on sound pointer ) */ - 0x52, 0x88, /* ADDQ.W #1,A0 ( Increment sound pointer ) */ - 0x20, 0x3c, 0x00, 0xf0, 0x1c, 0x40, /* MOVE.L #$F01C40,D0 ( Load top of buffer in D0 ) */ - 0xb1, 0xc0, /* CMPA.L D0,A0 ( Are we there yet? ) */ - 0x66, 0x04, /* BNE.S *+$6 ( No, we arent, skip next line ) */ - 0x41, 0xed, 0x1c, 0x20, /* LEA ($1C20,A5),A0 ( Point to the start of the buffer ) */ - 0x2b, 0x48, 0x1c, 0x40, /* MOVE.L A0,($1C40,A5) ( Store new sound pointer ) */ - 0x4c, 0xdf, 0x01, 0x01, /* MOVEM.L (A7)+, D0/A0 ( Restore Regs ) */ - 0x4e, 0x75 /* RTS ( Return ) */ -}; - -/************************************* - * - * Writes to C-Chip - Important Bits - * - *************************************/ - -WRITE16_MEMBER( taitox_state::cchip1_ctrl_w ) -{ - /* value 2 is written here */ + machine().bookkeeping().coin_lockout_w(1, data & 0x08); + machine().bookkeeping().coin_lockout_w(0, data & 0x04); + machine().bookkeeping().coin_counter_w(1, data & 0x02); + machine().bookkeeping().coin_counter_w(0, data & 0x01); } -WRITE16_MEMBER( taitox_state::cchip1_bank_w ) -{ - m_current_bank = data & 7; -} - -WRITE16_MEMBER( taitox_state::cchip1_ram_w ) -{ - if (m_current_bank == 0 && offset == 0x03) - { - m_cc_port = data; - - machine().bookkeeping().coin_lockout_w(1, data & 0x08); - machine().bookkeeping().coin_lockout_w(0, data & 0x04); - machine().bookkeeping().coin_counter_w(1, data & 0x02); - machine().bookkeeping().coin_counter_w(0, data & 0x01); - } - else - { - logerror("cchip1_w pc: %06x bank %02x offset %04x: %02x\n",m_maincpu->pc(),m_current_bank,offset,data); - } -} - - -/************************************* - * - * Reads from C-Chip - * - *************************************/ - -READ16_MEMBER( taitox_state::cchip1_ctrl_r ) -{ - /* - Bit 2 = Error signal - Bit 0 = Ready signal - */ - return 0x01; /* Return 0x05 for C-Chip error */ -} - -READ16_MEMBER( taitox_state::cchip1_ram_r ) -{ - /* Check for input ports */ - if (m_current_bank == 0) - { - switch (offset) - { - case 0x00: return machine().root_device().ioport("IN0")->read(); /* Player 1 controls + START1 */ - case 0x01: return machine().root_device().ioport("IN1")->read(); /* Player 2 controls + START2 */ - case 0x02: return machine().root_device().ioport("IN2")->read(); /* COINn + SERVICE1 + TILT */ - case 0x03: return m_cc_port; - } - } - - /* Other non-standard offsets */ - - if (m_current_bank == 1 && offset <= 0xff) - { - if (offset < 40) /* our hack code is only 40 bytes long */ - return superman_code[offset]; - else /* so pad with zeros */ - return 0; - } - - if (m_current_bank == 2) - { - switch (offset) - { - case 0x000: return 0x47; - case 0x001: return 0x57; - case 0x002: return 0x4b; - } - } - - logerror("cchip1_r bank: %02x offset: %04x\n",m_current_bank,offset); - return 0; -} - - READ16_MEMBER(taitox_state::superman_dsw_input_r) { switch (offset) @@ -542,9 +425,8 @@ ADDRESS_MAP_START(taitox_state::superman_map) AM_RANGE(0x600000, 0x600001) AM_WRITENOP /* written each frame at $3ab0, mostly 0x10 */ AM_RANGE(0x800000, 0x800001) AM_READNOP AM_DEVWRITE8("tc0140syt", tc0140syt_device, master_port_w, 0x00ff) AM_RANGE(0x800002, 0x800003) AM_DEVREADWRITE8("tc0140syt", tc0140syt_device, master_comm_r, master_comm_w, 0x00ff) - AM_RANGE(0x900000, 0x9007ff) AM_READWRITE(cchip1_ram_r, cchip1_ram_w) - AM_RANGE(0x900802, 0x900803) AM_READWRITE(cchip1_ctrl_r, cchip1_ctrl_w) - AM_RANGE(0x900c00, 0x900c01) AM_WRITE(cchip1_bank_w) + AM_RANGE(0x900000, 0x9007ff) AM_DEVREADWRITE8("cchip", taito_cchip_device, mem68_r, mem68_w, 0x00ff) + AM_RANGE(0x900800, 0x900fff) AM_DEVREADWRITE8("cchip", taito_cchip_device, asic_r, asic68_w, 0x00ff) AM_RANGE(0xb00000, 0xb00fff) AM_RAM_DEVWRITE("palette", palette_device, write16) AM_SHARE("palette") AM_RANGE(0xd00000, 0xd005ff) AM_RAM AM_DEVREADWRITE("spritegen", seta001_device, spriteylow_r16, spriteylow_w16) // Sprites Y AM_RANGE(0xd00600, 0xd00607) AM_RAM AM_DEVREADWRITE("spritegen", seta001_device, spritectrl_r16, spritectrl_w16) @@ -737,6 +619,16 @@ static INPUT_PORTS_START( superman ) PORT_DIPSETTING( 0x30, "3" ) PORT_DIPSETTING( 0x10, "4" ) PORT_DIPSETTING( 0x00, "5" ) + + PORT_MODIFY("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_TILT ) INPUT_PORTS_END static INPUT_PORTS_START( supermanu ) @@ -904,17 +796,26 @@ MACHINE_START_MEMBER(taitox_state,taitox) membank("z80bank")->configure_entries(0, banks, memregion("audiocpu")->base(), 0x4000); } -MACHINE_START_MEMBER(taitox_state,superman) +TIMER_DEVICE_CALLBACK_MEMBER(taitox_state::scanline) { - int banks = memregion("audiocpu")->bytes() / 0x4000; - membank("z80bank")->configure_entries(0, banks, memregion("audiocpu")->base(), 0x4000); - - m_current_bank = 0; - m_cc_port = 0; - save_item(NAME(m_current_bank)); - save_item(NAME(m_cc_port)); + if (param == 240) + { + m_maincpu->set_input_line(6, HOLD_LINE); + } + else if (param == 40) + { + // see notes in volfied.cpp + m_cchip->ext_interrupt(ASSERT_LINE); + m_cchip_irq_clear->adjust(attotime::zero); + } } +TIMER_DEVICE_CALLBACK_MEMBER(taitox_state::cchip_irq_clear_cb) +{ + m_cchip->ext_interrupt(CLEAR_LINE); +} + + /**************************************************************************/ MACHINE_CONFIG_START(taitox_state::superman) @@ -922,16 +823,23 @@ MACHINE_CONFIG_START(taitox_state::superman) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, XTAL(16'000'000)/2) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(superman_map) - MCFG_CPU_VBLANK_INT_DRIVER("screen", taitox_state, irq6_line_hold) - + //MCFG_CPU_VBLANK_INT_DRIVER("screen", taitox_state, irq6_line_hold) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", taitox_state, scanline, "screen", 0, 1) + MCFG_CPU_ADD("audiocpu", Z80, XTAL(16'000'000)/4) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(sound_map) - MCFG_TAITO_CCHIP_ADD("cchip", XTAL(12'000'000)/2) /* ? MHz */ + MCFG_TAITO_CCHIP_ADD("cchip", XTAL(12'000'000)) /* ? MHz */ + MCFG_CCHIP_IN_PORTA_CB(IOPORT("IN0")) + MCFG_CCHIP_IN_PORTB_CB(IOPORT("IN1")) + MCFG_CCHIP_IN_PORTAD_CB(IOPORT("IN2")) + MCFG_CCHIP_OUT_PORTC_CB(WRITE8(taitox_state, superman_counters_w)) + + MCFG_TIMER_DRIVER_ADD("cchip_irq_clear", taitox_state, cchip_irq_clear_cb) MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - enough for the sound CPU to read all commands */ - MCFG_MACHINE_START_OVERRIDE(taitox_state,superman) + MCFG_MACHINE_START_OVERRIDE(taitox_state,taitox) MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0) MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode") @@ -1178,7 +1086,7 @@ ROM_START( superman ) ROM_LOAD( "b61-01.e18", 0x00000, 0x80000, CRC(3cf99786) SHA1(f6febf9bda87ca04f0a5890d0e8001c26dfa6c81) ) ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "b61_11.m11", 0x0000, 0x2000, NO_DUMP ) + ROM_LOAD( "b61_11.m11", 0x0000, 0x2000, CRC(3bc5d44b) SHA1(6ba3ba35fe313af77d732412572d91a202b50542) ) ROM_END ROM_START( supermanu ) /* No US copyright notice or FBI logo - Just a coinage difference, see notes above */ @@ -1201,7 +1109,7 @@ ROM_START( supermanu ) /* No US copyright notice or FBI logo - Just a coinage di ROM_LOAD( "b61-01.e18", 0x00000, 0x80000, CRC(3cf99786) SHA1(f6febf9bda87ca04f0a5890d0e8001c26dfa6c81) ) ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "b61_11.m11", 0x0000, 0x2000, NO_DUMP ) + ROM_LOAD( "b61_11.m11", 0x0000, 0x2000, CRC(3bc5d44b) SHA1(6ba3ba35fe313af77d732412572d91a202b50542) ) ROM_END ROM_START( supermanj ) /* Shows a Japan copyright notice */ @@ -1224,7 +1132,7 @@ ROM_START( supermanj ) /* Shows a Japan copyright notice */ ROM_LOAD( "b61-01.e18", 0x00000, 0x80000, CRC(3cf99786) SHA1(f6febf9bda87ca04f0a5890d0e8001c26dfa6c81) ) ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "b61_11.m11", 0x0000, 0x2000, NO_DUMP ) + ROM_LOAD( "b61_11.m11", 0x0000, 0x2000, CRC(3bc5d44b) SHA1(6ba3ba35fe313af77d732412572d91a202b50542) ) ROM_END /* diff --git a/src/mame/drivers/volfied.cpp b/src/mame/drivers/volfied.cpp index 30aa289d9a4..d4f99622da7 100644 --- a/src/mame/drivers/volfied.cpp +++ b/src/mame/drivers/volfied.cpp @@ -78,9 +78,8 @@ ADDRESS_MAP_START(volfied_state::main_map) AM_RANGE(0xd00000, 0xd00001) AM_READWRITE(video_ctrl_r, video_ctrl_w) AM_RANGE(0xe00000, 0xe00001) AM_DEVWRITE8("ciu", pc060ha_device, master_port_w, 0x00ff) AM_RANGE(0xe00002, 0xe00003) AM_DEVREADWRITE8("ciu", pc060ha_device, master_comm_r, master_comm_w, 0x00ff) - AM_RANGE(0xf00000, 0xf007ff) AM_READWRITE(cchip_ram_r, cchip_ram_w) - AM_RANGE(0xf00802, 0xf00803) AM_READWRITE(cchip_ctrl_r, cchip_ctrl_w) - AM_RANGE(0xf00c00, 0xf00c01) AM_WRITE(cchip_bank_w) + AM_RANGE(0xf00000, 0xf007ff) AM_DEVREADWRITE8("cchip", taito_cchip_device, mem68_r, mem68_w, 0x00ff) + AM_RANGE(0xf00800, 0xf00fff) AM_DEVREADWRITE8("cchip", taito_cchip_device, asic_r, asic68_w, 0x00ff) ADDRESS_MAP_END ADDRESS_MAP_START(volfied_state::z80_map) @@ -161,11 +160,11 @@ static INPUT_PORTS_START( volfied ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL // TODO: probably correct based on initial analysis, but why is this on bit 0x80 when read through the c-chip when it was 0x08 in the simulation and for P1, is it just a Taito workaround for reading through ADC? INPUT_PORTS_END static INPUT_PORTS_START( volfiedu ) @@ -211,28 +210,63 @@ GFXDECODE_END void volfied_state::machine_start() { - cchip_init(); } void volfied_state::machine_reset() { - cchip_reset(); } +WRITE8_MEMBER(volfied_state::counters_w) +{ + machine().bookkeeping().coin_lockout_w(1, data & 0x80); + machine().bookkeeping().coin_lockout_w(0, data & 0x40); + machine().bookkeeping().coin_counter_w(1, data & 0x20); + machine().bookkeeping().coin_counter_w(0, data & 0x10); +} + +TIMER_DEVICE_CALLBACK_MEMBER(volfied_state::scanline) +{ + if (param == 240) + { + m_maincpu->set_input_line(4, HOLD_LINE); + } + else if (param == 40) + { + /* it isn't clear when / how this should be generated. if it's too close to the main vblank you get spurious inputs, including TILT and additional coins when ingame + so for now we generate it at a fixed interval after vbl. test mode doesn't use 68k interrupts so you get the odd bad frame in the input test as the idle loop + drifts out of sync with the vbl signal */ + m_cchip->ext_interrupt(ASSERT_LINE); + m_cchip_irq_clear->adjust(attotime::zero); + } +} + +TIMER_DEVICE_CALLBACK_MEMBER(volfied_state::cchip_irq_clear_cb) +{ + m_cchip->ext_interrupt(CLEAR_LINE); +} + + MACHINE_CONFIG_START(volfied_state::volfied) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M68000, CPU_CLOCK) /* 8MHz */ MCFG_CPU_PROGRAM_MAP(main_map) - MCFG_CPU_VBLANK_INT_DRIVER("screen", volfied_state, irq4_line_hold) +// MCFG_CPU_VBLANK_INT_DRIVER("screen", volfied_state, irq4_line_hold) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", volfied_state, scanline, "screen", 0, 1) MCFG_CPU_ADD("audiocpu", Z80, SOUND_CPU_CLOCK) /* 4MHz sound CPU, required to run the game */ MCFG_CPU_PROGRAM_MAP(z80_map) - MCFG_TAITO_CCHIP_ADD("cchip", XTAL(12'000'000)/2) /* ? MHz */ + MCFG_TAITO_CCHIP_ADD("cchip", XTAL(12'000'000)) /* ? MHz */ + MCFG_CCHIP_IN_PORTA_CB(IOPORT("F00007")) + MCFG_CCHIP_IN_PORTB_CB(IOPORT("F00009")) + MCFG_CCHIP_IN_PORTC_CB(IOPORT("F0000B")) + MCFG_CCHIP_IN_PORTAD_CB(IOPORT("F0000D")) + MCFG_CCHIP_OUT_PORTB_CB(WRITE8(volfied_state, counters_w)) MCFG_QUANTUM_TIME(attotime::from_hz(1200)) + MCFG_TIMER_DRIVER_ADD("cchip_irq_clear", volfied_state, cchip_irq_clear_cb) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -285,7 +319,7 @@ ROM_START( volfied ) ROM_LOAD16_BYTE( "c04-21.8", 0xc0001, 0x20000, CRC(8598d38e) SHA1(4ec1b819586b50e2f6aff2aaa5e3b06704b9bec2) ) ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "cchip_c04-23", 0x0000, 0x2000, NO_DUMP ) + ROM_LOAD( "cchip_c04-23", 0x0000, 0x2000, CRC(46b0b479) SHA1(73aa2267eb468c5aa5db67183047e9aef8321215) ) ROM_REGION( 0xc0000, "gfx1", 0 ) /* sprites 16x16 */ ROM_LOAD16_BYTE( "c04-16.2", 0x00000, 0x20000, CRC(8c2476ef) SHA1(972ddc8e47a669f1aeca67d02b4a0bed867ddb7d) ) @@ -317,7 +351,7 @@ ROM_START( volfiedo ) ROM_LOAD16_BYTE( "c04-21.8", 0xc0001, 0x20000, CRC(8598d38e) SHA1(4ec1b819586b50e2f6aff2aaa5e3b06704b9bec2) ) ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "cchip_c04-23", 0x0000, 0x2000, NO_DUMP ) + ROM_LOAD( "cchip_c04-23", 0x0000, 0x2000, CRC(46b0b479) SHA1(73aa2267eb468c5aa5db67183047e9aef8321215) ) ROM_REGION( 0xc0000, "gfx1", 0 ) /* sprites 16x16 */ ROM_LOAD16_BYTE( "c04-16.2", 0x00000, 0x20000, CRC(8c2476ef) SHA1(972ddc8e47a669f1aeca67d02b4a0bed867ddb7d) ) @@ -349,7 +383,7 @@ ROM_START( volfiedu ) ROM_LOAD16_BYTE( "c04-21.8", 0xc0001, 0x20000, CRC(8598d38e) SHA1(4ec1b819586b50e2f6aff2aaa5e3b06704b9bec2) ) ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "cchip_c04-23", 0x0000, 0x2000, NO_DUMP ) + ROM_LOAD( "cchip_c04-23", 0x0000, 0x2000, CRC(46b0b479) SHA1(73aa2267eb468c5aa5db67183047e9aef8321215) ) ROM_REGION( 0xc0000, "gfx1", 0 ) /* sprites 16x16 */ ROM_LOAD16_BYTE( "c04-16.2", 0x00000, 0x20000, CRC(8c2476ef) SHA1(972ddc8e47a669f1aeca67d02b4a0bed867ddb7d) ) @@ -381,7 +415,7 @@ ROM_START( volfieduo ) ROM_LOAD16_BYTE( "c04-21.8", 0xc0001, 0x20000, CRC(8598d38e) SHA1(4ec1b819586b50e2f6aff2aaa5e3b06704b9bec2) ) ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "cchip_c04-23", 0x0000, 0x2000, NO_DUMP ) + ROM_LOAD( "cchip_c04-23", 0x0000, 0x2000, CRC(46b0b479) SHA1(73aa2267eb468c5aa5db67183047e9aef8321215) ) ROM_REGION( 0xc0000, "gfx1", 0 ) /* sprites 16x16 */ ROM_LOAD16_BYTE( "c04-16.2", 0x00000, 0x20000, CRC(8c2476ef) SHA1(972ddc8e47a669f1aeca67d02b4a0bed867ddb7d) ) @@ -413,7 +447,7 @@ ROM_START( volfiedj ) ROM_LOAD16_BYTE( "c04-21.8", 0xc0001, 0x20000, CRC(8598d38e) SHA1(4ec1b819586b50e2f6aff2aaa5e3b06704b9bec2) ) ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "cchip_c04-23", 0x0000, 0x2000, NO_DUMP ) + ROM_LOAD( "cchip_c04-23", 0x0000, 0x2000, CRC(46b0b479) SHA1(73aa2267eb468c5aa5db67183047e9aef8321215) ) ROM_REGION( 0xc0000, "gfx1", 0 ) /* sprites 16x16 */ ROM_LOAD16_BYTE( "c04-16.2", 0x00000, 0x20000, CRC(8c2476ef) SHA1(972ddc8e47a669f1aeca67d02b4a0bed867ddb7d) ) @@ -445,7 +479,7 @@ ROM_START( volfiedjo ) ROM_LOAD16_BYTE( "c04-21.8", 0xc0001, 0x20000, CRC(8598d38e) SHA1(4ec1b819586b50e2f6aff2aaa5e3b06704b9bec2) ) ROM_REGION( 0x2000, "cchip:cchip_eprom", 0 ) - ROM_LOAD( "cchip_c04-23", 0x0000, 0x2000, NO_DUMP ) + ROM_LOAD( "cchip_c04-23", 0x0000, 0x2000, CRC(46b0b479) SHA1(73aa2267eb468c5aa5db67183047e9aef8321215) ) ROM_REGION( 0xc0000, "gfx1", 0 ) /* sprites 16x16 */ ROM_LOAD16_BYTE( "c04-16.2", 0x00000, 0x20000, CRC(8c2476ef) SHA1(972ddc8e47a669f1aeca67d02b4a0bed867ddb7d) ) diff --git a/src/mame/includes/taito_x.h b/src/mame/includes/taito_x.h index 7eee94ad658..b0e5b6d7673 100644 --- a/src/mame/includes/taito_x.h +++ b/src/mame/includes/taito_x.h @@ -8,34 +8,29 @@ #include "includes/seta.h" #include "machine/taitocchip.h" +#include "machine/timer.h" class taitox_state : public seta_state { public: taitox_state(const machine_config &mconfig, device_type type, const char *tag) : seta_state(mconfig, type, tag), - m_cchip(*this, "cchip") + m_cchip(*this, "cchip"), + m_cchip_irq_clear(*this, "cchip_irq_clear") { } - optional_device m_cchip; - DECLARE_READ16_MEMBER(superman_dsw_input_r); + DECLARE_WRITE8_MEMBER(superman_counters_w); DECLARE_READ16_MEMBER(daisenpu_input_r); DECLARE_WRITE16_MEMBER(daisenpu_input_w); DECLARE_WRITE16_MEMBER(kyustrkr_input_w); DECLARE_WRITE8_MEMBER(sound_bankswitch_w); DECLARE_DRIVER_INIT(kyustrkr); DECLARE_MACHINE_START(taitox); - DECLARE_MACHINE_START(superman); - // superman c-chip - uint16_t m_current_bank; - uint8_t m_cc_port; - DECLARE_READ16_MEMBER( cchip1_ctrl_r ); - DECLARE_READ16_MEMBER( cchip1_ram_r ); - DECLARE_WRITE16_MEMBER( cchip1_ctrl_w ); - DECLARE_WRITE16_MEMBER( cchip1_bank_w ); - DECLARE_WRITE16_MEMBER( cchip1_ram_w ); + TIMER_DEVICE_CALLBACK_MEMBER(scanline); + TIMER_DEVICE_CALLBACK_MEMBER(cchip_irq_clear_cb); + void superman(machine_config &config); void ballbros(machine_config &config); void gigandes(machine_config &config); @@ -46,6 +41,10 @@ public: void gigandes_map(address_map &map); void sound_map(address_map &map); void superman_map(address_map &map); + +private: + optional_device m_cchip; + optional_device m_cchip_irq_clear; }; #endif // MAME_INCLUDES_TAITO_X_H diff --git a/src/mame/includes/volfied.h b/src/mame/includes/volfied.h index 931e7a4e640..13c315b8d6c 100644 --- a/src/mame/includes/volfied.h +++ b/src/mame/includes/volfied.h @@ -13,6 +13,7 @@ #include "machine/taitocchip.h" #include "video/pc090oj.h" #include "screen.h" +#include "machine/timer.h" class volfied_state : public driver_device { @@ -28,23 +29,38 @@ public: m_audiocpu(*this, "audiocpu"), m_cchip(*this, "cchip"), m_pc090oj(*this, "pc090oj"), - m_screen(*this, "screen") { } + m_screen(*this, "screen"), + m_cchip_irq_clear(*this, "cchip_irq_clear") + { } + DECLARE_READ16_MEMBER(video_ram_r); + DECLARE_WRITE16_MEMBER(video_ram_w); + DECLARE_WRITE16_MEMBER(video_ctrl_w); + DECLARE_READ16_MEMBER(video_ctrl_r); + DECLARE_WRITE16_MEMBER(video_mask_w); + DECLARE_WRITE16_MEMBER(sprite_ctrl_w); + DECLARE_WRITE8_MEMBER(counters_w); + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void video_start() override; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + TIMER_DEVICE_CALLBACK_MEMBER(scanline); + TIMER_DEVICE_CALLBACK_MEMBER(cchip_irq_clear_cb); + + void refresh_pixel_layer( bitmap_ind16 &bitmap ); + + void volfied(machine_config &config); + void main_map(address_map &map); + void z80_map(address_map &map); + +private: /* memory pointers */ std::unique_ptr m_video_ram; - std::unique_ptr m_cchip_ram; /* video-related */ uint16_t m_video_ctrl; uint16_t m_video_mask; - /* c-chip */ - uint8_t m_current_bank; - uint8_t m_current_flag; - uint8_t m_cc_port; - uint8_t m_current_cmd; - emu_timer *m_cchip_timer; - /* devices */ required_device m_maincpu; required_device m_audiocpu; @@ -52,31 +68,7 @@ public: required_device m_pc090oj; required_device m_screen; - DECLARE_WRITE16_MEMBER(cchip_ctrl_w); - DECLARE_WRITE16_MEMBER(cchip_bank_w); - DECLARE_WRITE16_MEMBER(cchip_ram_w); - DECLARE_READ16_MEMBER(cchip_ctrl_r); - DECLARE_READ16_MEMBER(cchip_ram_r); - DECLARE_READ16_MEMBER(video_ram_r); - DECLARE_WRITE16_MEMBER(video_ram_w); - DECLARE_WRITE16_MEMBER(video_ctrl_w); - DECLARE_READ16_MEMBER(video_ctrl_r); - DECLARE_WRITE16_MEMBER(video_mask_w); - DECLARE_WRITE16_MEMBER(sprite_ctrl_w); - virtual void machine_start() override; - virtual void machine_reset() override; - virtual void video_start() override; - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - TIMER_CALLBACK_MEMBER(timer_callback); - void refresh_pixel_layer( bitmap_ind16 &bitmap ); - void cchip_init(); - void cchip_reset(); - - void volfied(machine_config &config); - void main_map(address_map &map); - void z80_map(address_map &map); -protected: - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + required_device m_cchip_irq_clear; }; #endif // MAME_INCLUDES_VOLFIED_H diff --git a/src/mame/machine/taitocchip.cpp b/src/mame/machine/taitocchip.cpp index 53dec88e261..5875db82eb8 100644 --- a/src/mame/machine/taitocchip.cpp +++ b/src/mame/machine/taitocchip.cpp @@ -105,10 +105,23 @@ taito_cchip_device::taito_cchip_device(const machine_config &mconfig, const char : device_t(mconfig, TAITO_CCHIP, tag, owner, clock), m_upd7811(*this, "upd7811"), m_upd4464_bank(*this, "upd4464_bank"), - m_upd4464(*this, "upd4464") + m_upd4464_bank68(*this, "upd4464_bank68"), + m_upd4464(*this, "upd4464"), + m_in_pa_cb(*this), + m_in_pb_cb(*this), + m_in_pc_cb(*this), + m_in_ad_cb(*this), + m_out_pa_cb(*this), + m_out_pb_cb(*this), + m_out_pc_cb(*this) { } +void taito_cchip_device::ext_interrupt(int state) +{ + m_upd7811->set_input_line(UPD7810_INTF1, state); +} + ROM_START( taito_cchip ) ROM_REGION( 0x1000, "upd7811", 0 ) // optically extracted, the internal checksum passes, although that doesn't rule out the possibility of error @@ -120,13 +133,17 @@ ADDRESS_MAP_START(taito_cchip_device::cchip_ram_bank) AM_RANGE(0x0000, 0x1fff) AM_RAM AM_SHARE("upd4464") // upd4464 ADDRESS_MAP_END +ADDRESS_MAP_START(taito_cchip_device::cchip_ram_bank68) + AM_RANGE(0x0000, 0x1fff) AM_RAM AM_SHARE("upd4464") +ADDRESS_MAP_END + READ8_MEMBER(taito_cchip_device::asic_r) { if ((offset != 0x001) && (!machine().side_effects_disabled())) // prevent logerror spam for now logerror("%s: asic_r %04x\n", machine().describe_context(), offset); if (offset<0x200) // 400-5ff is asic 'ram' return m_asic_ram[offset&3]; - return 0x00; // 600-7ff is read-only(?) asic banking reg, may read as open bus or never assert /DTACK on read? + return 0x00; // 600-7ff is write-only(?) asic banking reg, may read as open bus or never assert /DTACK on read? } WRITE8_MEMBER(taito_cchip_device::asic_w) @@ -141,6 +158,18 @@ WRITE8_MEMBER(taito_cchip_device::asic_w) m_asic_ram[offset&3] = data; } +WRITE8_MEMBER(taito_cchip_device::asic68_w) +{ + logerror("%s: asic68_w %04x %02x\n", machine().describe_context(), offset, data); + if (offset == 0x200) + { + logerror("cchip (68k side) set bank to %02x\n", data & 0x7); + m_upd4464_bank68->set_bank(data & 0x7); + } + else + m_asic_ram[offset&3] = data; +} + READ8_MEMBER(taito_cchip_device::mem_r) { offset &= 0x3ff; @@ -153,16 +182,126 @@ WRITE8_MEMBER(taito_cchip_device::mem_w) return m_upd4464_bank->write8(space,offset,data); } +READ8_MEMBER(taito_cchip_device::mem68_r) +{ + offset &= 0x3ff; + return m_upd4464_bank68->read8(space,offset); +} + +WRITE8_MEMBER(taito_cchip_device::mem68_w) +{ + offset &= 0x3ff; + return m_upd4464_bank68->write8(space,offset,data); +} + ADDRESS_MAP_START(taito_cchip_device::cchip_map) //AM_RANGE(0x0000, 0x0fff) AM_ROM // internal ROM of uPD7811 AM_RANGE(0x1000, 0x13ff) AM_DEVICE("upd4464_bank", address_map_bank_device, amap8) AM_RANGE(0x1400, 0x17ff) AM_READWRITE(asic_r, asic_w) - AM_RANGE(0x2000, 0x3fff) AM_ROM AM_REGION("cchip_eprom", 0) // might not map here + AM_RANGE(0x2000, 0x3fff) AM_ROM AM_REGION("cchip_eprom", 0) ADDRESS_MAP_END + + + +WRITE8_MEMBER(taito_cchip_device::porta_w) +{ + m_out_pa_cb(data); +} + +WRITE8_MEMBER(taito_cchip_device::portb_w) +{ + m_out_pb_cb(data); +} + +WRITE8_MEMBER(taito_cchip_device::portc_w) +{ + m_out_pc_cb(data); +} + +WRITE8_MEMBER(taito_cchip_device::portf_w) +{ + // internal? related to locking out the 68k? + logerror("%s port F written %.2x\n", machine().describe_context(), data); +} + +READ8_MEMBER(taito_cchip_device::porta_r) +{ + return m_in_pa_cb(); +} + +READ8_MEMBER(taito_cchip_device::portb_r) +{ + return m_in_pb_cb(); +} + +READ8_MEMBER(taito_cchip_device::portc_r) +{ + return m_in_pc_cb(); +} + + +READ_LINE_MEMBER( taito_cchip_device::an0_r ) +{ + return BIT(m_in_ad_cb(), 0); +} + +READ_LINE_MEMBER( taito_cchip_device::an1_r ) +{ + return BIT(m_in_ad_cb(), 1); +} + +READ_LINE_MEMBER( taito_cchip_device::an2_r ) +{ + return BIT(m_in_ad_cb(), 2); +} + + +READ_LINE_MEMBER( taito_cchip_device::an3_r ) +{ + return BIT(m_in_ad_cb(), 3); +} + +READ_LINE_MEMBER( taito_cchip_device::an4_r ) +{ + return BIT(m_in_ad_cb(), 4); +} + +READ_LINE_MEMBER( taito_cchip_device::an5_r ) +{ + return BIT(m_in_ad_cb(), 5); +} + +READ_LINE_MEMBER( taito_cchip_device::an6_r ) +{ + return BIT(m_in_ad_cb(), 6); +} + +READ_LINE_MEMBER( taito_cchip_device::an7_r ) +{ + return BIT(m_in_ad_cb(), 7); +} + + + MACHINE_CONFIG_START(taito_cchip_device::device_add_mconfig) MCFG_CPU_ADD("upd7811", UPD7811, DERIVED_CLOCK(1,1)) MCFG_CPU_PROGRAM_MAP(cchip_map) + MCFG_UPD7810_PORTA_READ_CB(READ8(taito_cchip_device, porta_r)) + MCFG_UPD7810_PORTB_READ_CB(READ8(taito_cchip_device, portb_r)) + MCFG_UPD7810_PORTC_READ_CB(READ8(taito_cchip_device, portc_r)) + MCFG_UPD7810_PORTA_WRITE_CB(WRITE8(taito_cchip_device, porta_w)) + MCFG_UPD7810_PORTB_WRITE_CB(WRITE8(taito_cchip_device, portb_w)) + MCFG_UPD7810_PORTC_WRITE_CB(WRITE8(taito_cchip_device, portc_w)) + MCFG_UPD7810_PORTF_WRITE_CB(WRITE8(taito_cchip_device, portf_w)) + MCFG_UPD7810_AN0(READLINE(taito_cchip_device, an0_r)) + MCFG_UPD7810_AN1(READLINE(taito_cchip_device, an1_r)) + MCFG_UPD7810_AN2(READLINE(taito_cchip_device, an2_r)) + MCFG_UPD7810_AN3(READLINE(taito_cchip_device, an3_r)) + MCFG_UPD7810_AN4(READLINE(taito_cchip_device, an4_r)) + MCFG_UPD7810_AN5(READLINE(taito_cchip_device, an5_r)) + MCFG_UPD7810_AN6(READLINE(taito_cchip_device, an6_r)) + MCFG_UPD7810_AN7(READLINE(taito_cchip_device, an7_r)) MCFG_DEVICE_ADD("upd4464_bank", ADDRESS_MAP_BANK, 0) MCFG_DEVICE_PROGRAM_MAP(cchip_ram_bank) @@ -170,14 +309,32 @@ MACHINE_CONFIG_START(taito_cchip_device::device_add_mconfig) MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8) MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(13) MCFG_ADDRESS_MAP_BANK_STRIDE(0x400) + + // the 68k has a different view into the banked memory? + MCFG_DEVICE_ADD("upd4464_bank68", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(cchip_ram_bank68) + MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) + MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8) + MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(13) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x400) MACHINE_CONFIG_END void taito_cchip_device::device_start() { m_upd4464_bank->set_bank(0); + m_upd4464_bank68->set_bank(0); + save_item(NAME(m_asic_ram)); m_asic_ram[0] = m_asic_ram[1] = m_asic_ram[2] = m_asic_ram[3] = 0; + + m_in_pa_cb.resolve_safe(0); + m_in_pb_cb.resolve_safe(0); + m_in_pc_cb.resolve_safe(0); + m_in_ad_cb.resolve_safe(0); + m_out_pa_cb.resolve_safe(); + m_out_pb_cb.resolve_safe(); + m_out_pc_cb.resolve_safe(); } void taito_cchip_device::device_reset() diff --git a/src/mame/machine/taitocchip.h b/src/mame/machine/taitocchip.h index 96bbdac0d95..526b54137c4 100644 --- a/src/mame/machine/taitocchip.h +++ b/src/mame/machine/taitocchip.h @@ -14,6 +14,27 @@ DECLARE_DEVICE_TYPE(TAITO_CCHIP, taito_cchip_device) #define MCFG_TAITO_CCHIP_ADD(_tag, _clock) \ MCFG_DEVICE_ADD(_tag, TAITO_CCHIP, _clock) +#define MCFG_CCHIP_IN_PORTA_CB(_devcb) \ + devcb = &downcast(*device).set_in_pa_callback(DEVCB_##_devcb); + +#define MCFG_CCHIP_IN_PORTB_CB(_devcb) \ + devcb = &downcast(*device).set_in_pb_callback(DEVCB_##_devcb); + +#define MCFG_CCHIP_IN_PORTC_CB(_devcb) \ + devcb = &downcast(*device).set_in_pc_callback(DEVCB_##_devcb); + +#define MCFG_CCHIP_IN_PORTAD_CB(_devcb) \ + devcb = &downcast(*device).set_in_ad_callback(DEVCB_##_devcb); + +#define MCFG_CCHIP_OUT_PORTA_CB(_devcb) \ + devcb = &downcast(*device).set_out_pa_callback(DEVCB_##_devcb); + +#define MCFG_CCHIP_OUT_PORTB_CB(_devcb) \ + devcb = &downcast(*device).set_out_pb_callback(DEVCB_##_devcb); + +#define MCFG_CCHIP_OUT_PORTC_CB(_devcb) \ + devcb = &downcast(*device).set_out_pc_callback(DEVCB_##_devcb); + class taito_cchip_device : public device_t { @@ -21,14 +42,51 @@ public: // construction/destruction taito_cchip_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + template devcb_base &set_in_pa_callback(Object &&cb) { return m_in_pa_cb.set_callback(std::forward(cb)); } + template devcb_base &set_in_pb_callback(Object &&cb) { return m_in_pb_cb.set_callback(std::forward(cb)); } + template devcb_base &set_in_pc_callback(Object &&cb) { return m_in_pc_cb.set_callback(std::forward(cb)); } + template devcb_base &set_in_ad_callback(Object &&cb) { return m_in_ad_cb.set_callback(std::forward(cb)); } + template devcb_base &set_out_pa_callback(Object &&cb) { return m_out_pa_cb.set_callback(std::forward(cb)); } + template devcb_base &set_out_pb_callback(Object &&cb) { return m_out_pb_cb.set_callback(std::forward(cb)); } + template devcb_base &set_out_pc_callback(Object &&cb) { return m_out_pc_cb.set_callback(std::forward(cb)); } + + // can be accessed externally DECLARE_READ8_MEMBER(asic_r); DECLARE_WRITE8_MEMBER(asic_w); + DECLARE_WRITE8_MEMBER(asic68_w); + DECLARE_READ8_MEMBER(mem_r); DECLARE_WRITE8_MEMBER(mem_w); + DECLARE_READ8_MEMBER(mem68_r); + DECLARE_WRITE8_MEMBER(mem68_w); + + void cchip_map(address_map &map); void cchip_ram_bank(address_map &map); + void cchip_ram_bank68(address_map &map); + + DECLARE_READ8_MEMBER(porta_r); + DECLARE_READ8_MEMBER(portb_r); + DECLARE_READ8_MEMBER(portc_r); + + DECLARE_WRITE8_MEMBER(porta_w); + DECLARE_WRITE8_MEMBER(portb_w); + DECLARE_WRITE8_MEMBER(portc_w); + DECLARE_WRITE8_MEMBER(portf_w); + + DECLARE_READ_LINE_MEMBER(an0_r); + DECLARE_READ_LINE_MEMBER(an1_r); + DECLARE_READ_LINE_MEMBER(an2_r); + DECLARE_READ_LINE_MEMBER(an3_r); + DECLARE_READ_LINE_MEMBER(an4_r); + DECLARE_READ_LINE_MEMBER(an5_r); + DECLARE_READ_LINE_MEMBER(an6_r); + DECLARE_READ_LINE_MEMBER(an7_r); + + void ext_interrupt(int state); + protected: virtual void device_add_mconfig(machine_config &config) override; virtual void device_start() override; @@ -36,10 +94,20 @@ protected: virtual void device_reset() override; private: + uint8_t m_asic_ram[4]; + required_device m_upd7811; required_device m_upd4464_bank; + required_device m_upd4464_bank68; required_shared_ptr m_upd4464; - uint8_t m_asic_ram[4]; + + devcb_read8 m_in_pa_cb; + devcb_read8 m_in_pb_cb; + devcb_read8 m_in_pc_cb; + devcb_read8 m_in_ad_cb; + devcb_write8 m_out_pa_cb; + devcb_write8 m_out_pb_cb; + devcb_write8 m_out_pc_cb; }; #endif // MAME_MACHINE_CCHIP_DEV_H diff --git a/src/mame/machine/volfied.cpp b/src/mame/machine/volfied.cpp deleted file mode 100644 index da0f89ab0df..00000000000 --- a/src/mame/machine/volfied.cpp +++ /dev/null @@ -1,506 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Bryan McPhail, Nicola Salmoria -/************************************************************************* - - Volfied C-Chip Protection - ========================= - - The C-Chip (Taito TC0030CMD) contains a NEC D78C11 (with 4k internal ROM) + - 8k EPROM + 8k DRAM + logic. - - Cheat: - volfied:0:100191:00:001:Complete level with 99.9% Now! - volfied:0:100192:99:501:Complete level with 99.9% Now! (2/3) - volfied:0:100193:09:501:Complete level with 99.9% Now! (3/3) - -*************************************************************************/ - -#include "emu.h" -#include "includes/volfied.h" - -static const uint16_t palette_data_01[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x104a, 0xce41, 0x8c39, 0x5252, 0xd662, 0x4a31, 0x0000, - 0x1e00, 0x1000, 0x9e01, 0x1e02, 0xde02, 0x0000, 0x0000, 0x0000, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x104a, 0xce41, 0x8c39, 0x5252, 0xd662, 0x4a31, 0x0000, - 0x1e00, 0x1000, 0x9e01, 0x1e02, 0xde02, 0x0000, 0x0000, 0x0000, - 0x0000, 0xd62a, 0x1002, 0xce01, 0x5a3b, 0xde7b, 0x4a31, 0x0000, - 0x1e00, 0x1000, 0x9e01, 0x1e02, 0xde02, 0x0038, 0x0e38, 0x0000 -}; - -static const uint16_t palette_data_02[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x4008, 0x0029, 0xc641, 0x4c52, 0x5473, 0xde7b, 0x1863, - 0x524a, 0xce39, 0x0821, 0x9c01, 0x1200, 0x8001, 0xc002, 0xce39, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x4a29, 0xce39, 0xde7b, 0x4001, 0x4002, 0xc003, - 0x9e01, 0x1e00, 0x0078, 0x0e00, 0x5401, 0x0040, 0xde03, 0x1600, - 0x0000, 0x4208, 0x0c39, 0xd061, 0x547a, 0x1472, 0xde7b, 0xde7b, - 0x187b, 0x947a, 0x0821, 0x9e79, 0x1040, 0x8079, 0xc07a, 0x0000 -}; - -static const uint16_t palette_data_03[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0xc038, 0x4049, 0xc059, 0x406a, 0xc07a, 0x4208, 0x0821, - 0x8c31, 0x1042, 0x9c73, 0x1e03, 0x1a02, 0x0c00, 0x1860, 0x1e78, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x4a29, 0xce39, 0xde7b, 0x4001, 0x4002, 0xc003, - 0x9e01, 0x1e00, 0x0078, 0x0e00, 0x5401, 0x0040, 0xde03, 0x1600, - 0x0000, 0xc001, 0x4002, 0x8002, 0xc002, 0xc002, 0x0001, 0xc001, - 0x9201, 0xc002, 0xc003, 0x0003, 0x8002, 0x4001, 0xc002, 0x4003 -}; - -static const uint16_t palette_data_04[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x1042, 0xce39, 0x8c31, 0x524a, 0xd65a, 0x4a29, 0x0000, - 0x1e00, 0x1000, 0x8c21, 0xce29, 0x0039, 0x0038, 0x0e38, 0x0038, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0xde7b, 0x1e00, 0xc003, 0x1042, 0xde03, 0x0000, 0xd65a, - 0xce39, 0x8c31, 0x4a29, 0x0078, 0xc07b, 0x1e02, 0x1e78, 0xc003, - 0x0000, 0x1002, 0xce01, 0x8c01, 0x5202, 0xd602, 0x4a01, 0x0000, - 0x1e00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static const uint16_t palette_data_05[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x1200, 0x1600, 0x1a00, 0x9e01, 0x8021, 0xc029, 0x0032, - 0x803a, 0x4208, 0x0821, 0x1042, 0xd65a, 0x9c73, 0xde03, 0x5c02, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0xde7b, 0x1e00, 0xc003, 0x1042, 0xde03, 0x0000, 0xd65a, - 0xce39, 0x8c31, 0x4a29, 0x0078, 0xc07b, 0x1e02, 0x1e78, 0xc003, - 0x0000, 0x5202, 0xd602, 0x5a03, 0xde03, 0x8021, 0xc029, 0x0032, - 0x803a, 0x4208, 0x0821, 0x1042, 0xd65a, 0x9c73, 0xde03, 0x5c02 -}; - -static const uint16_t palette_data_06[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x9e52, 0x9028, 0x9428, 0x9828, 0x9e28, 0x4208, 0xde7b, - 0xde03, 0x9c02, 0xc03a, 0x0063, 0x586b, 0x9252, 0x8a31, 0x5e31, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0xde7b, 0x1e00, 0xc003, 0x1042, 0xde03, 0x0000, 0xd65a, - 0xce39, 0x8c31, 0x4a29, 0x0078, 0xc07b, 0x1e02, 0x1e78, 0xc003, - 0x0263, 0x9e52, 0x8058, 0x0879, 0x8c79, 0x107a, 0x4208, 0xde7b, - 0xde01, 0x1e01, 0xc03a, 0x0063, 0x586b, 0x9252, 0x8a31, 0x527a -}; - -static const uint16_t palette_data_07[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0xc038, 0x4049, 0xc059, 0x406a, 0xc07a, 0x4208, 0x0821, - 0x8c31, 0x1042, 0x9c73, 0x1e03, 0x1a02, 0x0c00, 0x1860, 0x1e78, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x4a29, 0xce39, 0xde7b, 0x4001, 0x4002, 0xc003, - 0x9e01, 0x1e00, 0x0078, 0x0e00, 0x5401, 0x0040, 0xde03, 0x1600, - 0x0000, 0x8001, 0x0002, 0x8002, 0x0003, 0x8003, 0x4208, 0x0821, - 0x8c31, 0x1042, 0x9c73, 0x1e00, 0x5c02, 0x0c00, 0x1860, 0x1e78 -}; - -static const uint16_t palette_data_08[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x1042, 0xce39, 0x8c31, 0x524a, 0xd65a, 0x4a29, 0x0000, - 0x1e00, 0x1000, 0x9e01, 0x5e02, 0x5e03, 0x0038, 0x0e38, 0x0000, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0xde7b, 0x1e00, 0xc003, 0x1042, 0xde03, 0x0000, 0xd65a, - 0xce39, 0x8c31, 0x4a29, 0x0078, 0xc07b, 0x1e02, 0x1e78, 0xc003, - 0x0000, 0x5202, 0x1002, 0xce19, 0x9432, 0x1843, 0x8c11, 0x0000, - 0x1e00, 0x1000, 0x9e01, 0x5e02, 0x5e03, 0x0038, 0x0e38, 0x0000 -}; - -static const uint16_t palette_data_09[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x1048, 0x1250, 0x1458, 0x1660, 0xd418, 0x9e02, 0xc203, - 0x4208, 0x4a29, 0x8c31, 0x1042, 0x1e78, 0x166b, 0x0c38, 0x1868, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0xde7b, 0x1e00, 0xc003, 0x1042, 0xde03, 0x0000, 0xd65a, - 0xce39, 0x8c31, 0x4a29, 0x0078, 0xc07b, 0x1e02, 0x1e78, 0xc003, - 0x0000, 0x1600, 0x1a21, 0x5c29, 0xde39, 0xd418, 0x9e02, 0xc203, - 0x4208, 0x4a29, 0x8c31, 0x1042, 0x1e42, 0x186b, 0x9210, 0x9e31 -}; - -static const uint16_t palette_data_0a[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0038, 0x4a29, 0xce39, 0x9452, 0x9218, 0xde7b, - 0xc001, 0xc003, 0xde03, 0x1403, 0xcc01, 0x4a01, 0x0668, 0x4672, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0xde7b, 0x1e00, 0xc003, 0x1042, 0xde03, 0x0000, 0xd65a, - 0xce39, 0x8c31, 0x4a29, 0x0078, 0xc07b, 0x1e02, 0x1e78, 0xc003, - 0x0000, 0x0000, 0x0038, 0x4a29, 0x5401, 0x9c02, 0x9218, 0xde7b, - 0x0003, 0xc003, 0x5e02, 0xde01, 0x5201, 0xd200, 0x0668, 0x4672 -}; - -static const uint16_t palette_data_0b[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0050, 0x8001, 0xc001, 0x0002, 0xc002, 0xd043, 0x9c73, 0x524a, - 0xce39, 0x8c31, 0x4208, 0xde03, 0x9c02, 0x1e60, 0x1a00, 0x1000, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0xde7b, 0x1e00, 0xc003, 0x1042, 0xde03, 0x0000, 0xd65a, - 0xce39, 0x8c31, 0x4a29, 0x0078, 0xc07b, 0x1e02, 0x1e78, 0xc003, - 0x0000, 0x8c01, 0xce01, 0x1002, 0xd62a, 0xde4b, 0x9c73, 0x5202, - 0xce01, 0x8c01, 0x4208, 0xde03, 0x9c02, 0x1e60, 0x1a00, 0x1000 -}; - -static const uint16_t palette_data_0c[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0038, 0x4a29, 0xce39, 0x9452, 0x9218, 0x9e52, - 0xc001, 0xc003, 0x1e00, 0x1400, 0x0c00, 0x4a01, 0x0668, 0x4672, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0xde7b, 0x1e00, 0xc003, 0x1042, 0xde03, 0x0000, 0xd65a, - 0xce39, 0x8c31, 0x4a29, 0x0078, 0xc07b, 0x1e02, 0x1e78, 0xc003, - 0x0000, 0x0000, 0x0038, 0x4a29, 0xce39, 0x9452, 0x9218, 0xde7b, - 0xc001, 0xc003, 0xde03, 0x1403, 0xcc01, 0x4a01, 0x0668, 0x4672 -}; - -static const uint16_t palette_data_0d[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0078, 0x4208, 0x1052, 0x9462, 0x1873, 0x5a73, 0xde7b, 0x1863, - 0x524a, 0xce39, 0x0821, 0x1600, 0x1000, 0xd201, 0xde03, 0x0a42, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0078, 0x4208, 0x1052, 0x9462, 0x1873, 0x5a73, 0xde7b, 0x1863, - 0x524a, 0xce39, 0x0821, 0x1600, 0x1000, 0xd201, 0xde03, 0x0a42, - 0x0000, 0x4208, 0x5029, 0x9431, 0xd839, 0x5a4a, 0x9e52, 0x5862, - 0xde4b, 0x8e39, 0x0821, 0x1600, 0x1000, 0xd201, 0x1e00, 0x0a42 -}; - -static const uint16_t palette_data_0e[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0e01, 0x5001, 0x9201, 0xd401, 0x1602, 0x1200, 0x1600, - 0x4208, 0x0821, 0x8c31, 0x1042, 0x5a6b, 0x8001, 0x0002, 0x9a02, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x4a29, 0xce39, 0xde7b, 0x4001, 0x4002, 0xc003, - 0x9e01, 0x1e00, 0x0078, 0x0e00, 0x5401, 0x0040, 0xde03, 0x1600, - 0x0000, 0x8a21, 0x0a32, 0x4c3a, 0x8e4a, 0x504b, 0xd203, 0xc003, - 0x4208, 0x0821, 0x8c31, 0x1042, 0x5a6b, 0x8001, 0x0002, 0x545b -}; - -static const uint16_t palette_data_0f[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0xc038, 0x4049, 0xc059, 0x406a, 0xc07a, 0x0000, 0x0821, - 0x9c31, 0x1042, 0x9c73, 0x1e02, 0x1a02, 0x0c00, 0x4002, 0xc001, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0xde7b, 0x1e00, 0xc003, 0x1042, 0xde03, 0x0000, 0xd65a, - 0xce39, 0x8c31, 0x4a29, 0x0078, 0xc07b, 0x1e02, 0x1e78, 0xc003, - 0x0000, 0xce00, 0x5201, 0xd601, 0x5a02, 0xde02, 0x0000, 0x0821, - 0x8c31, 0x1042, 0x9c73, 0x1e03, 0x1a02, 0x0c00, 0x9e01, 0x0e00 -}; - -static const uint16_t palette_data_10[0x50] = -{ - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0601, 0x8a09, 0x0e1a, 0x922a, 0x163b, 0xde7b, 0xd65a, - 0xce39, 0x0821, 0x0000, 0x0c00, 0x5208, 0x1a02, 0x9e03, 0xce39, - 0x0000, 0xde7b, 0xde03, 0x5e01, 0x5e02, 0xc07b, 0x0000, 0xde7b, - 0x0058, 0x4079, 0x407a, 0x407b, 0xd47b, 0x0000, 0x0000, 0x0000, - 0x0000, 0x1400, 0x8002, 0x0068, 0x0000, 0x5e01, 0x5e02, 0x1e03, - 0xde03, 0xce39, 0xce39, 0xce39, 0xce39, 0xce39, 0xce39, 0xce39, - 0x0078, 0x4208, 0x1052, 0x9462, 0x1873, 0x5a73, 0xde7b, 0x1863, - 0x524a, 0xce39, 0x0821, 0x1600, 0x1000, 0xd201, 0xde03, 0x0a42 -}; - -static const uint16_t palette_data_11[0x50] = -{ - 0x0000, 0x4a29, 0x8c31, 0xce39, 0x1042, 0x524a, 0x9452, 0xd65a, - 0x1863, 0x0000, 0xde39, 0xde7b, 0xc001, 0x8002, 0x1800, 0x1e00, - 0x0000, 0xde7b, 0x1e00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x1e00, 0x1e00, 0x1e00, 0x1e00, 0x1e00, 0x1e00, 0x1e00, 0x1e00, - 0x1e00, 0x1e00, 0x1e00, 0x1e00, 0x1e00, 0x1e00, 0x1e00, 0x1e00, - 0xde03, 0xde03, 0xde03, 0xde03, 0xde03, 0xde03, 0xde03, 0xde03, - 0xde03, 0xde03, 0xde03, 0xde03, 0xde03, 0xde03, 0xde03, 0xde03, - 0xde03, 0x0e00, 0x9e4a, 0x0000, 0x1042, 0xde7b, 0x9452, 0x4a29, - 0xce39, 0x1c02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -static const uint16_t *const palette_data_lookup[] = -{ - nullptr, - palette_data_01, - palette_data_02, - palette_data_03, - palette_data_04, - palette_data_05, - palette_data_06, - palette_data_07, - palette_data_08, - palette_data_09, - palette_data_0a, - palette_data_0b, - palette_data_0c, - palette_data_0d, - palette_data_0e, - palette_data_0f, - palette_data_10, - palette_data_11 -}; - -void volfied_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - switch (id) - { - case TIMER_VOLFIED: - timer_callback(ptr, param); - break; - default: - assert_always(false, "Unknown id in volfied_state::device_timer"); - } -} - -TIMER_CALLBACK_MEMBER(volfied_state::timer_callback) -{ - // Palette commands - palette data written to bank 0: $10 - $af - if (m_current_cmd >= 0x1 && m_current_cmd < 0x12) - { - const uint16_t* palette_data = palette_data_lookup[m_current_cmd]; - int i; - for (i = 0; i < 0x50; i++) - { - m_cchip_ram[0x10 + i * 2 + 0] = palette_data[i] >> 8; - m_cchip_ram[0x10 + i * 2 + 1] = palette_data[i] & 0xff; - } - } - - // Unknown command - result written to bank 0: $23 - if (m_current_cmd >= 0x81 && m_current_cmd < 0x92) - { - switch (m_current_cmd) - { - case 0x81: m_cchip_ram[0x23] = 0xf; break; - case 0x82: m_cchip_ram[0x23] = 0x1; break; - case 0x83: m_cchip_ram[0x23] = 0x6; break; - case 0x84: m_cchip_ram[0x23] = 0xf; break; - case 0x85: m_cchip_ram[0x23] = 0x9; break; - case 0x86: m_cchip_ram[0x23] = 0x6; break; - case 0x87: m_cchip_ram[0x23] = 0x6; break; - case 0x88: m_cchip_ram[0x23] = 0xf; break; - case 0x89: m_cchip_ram[0x23] = 0x8; break; - case 0x8a: m_cchip_ram[0x23] = 0x1; break; - case 0x8b: m_cchip_ram[0x23] = 0xa; break; - case 0x8c: m_cchip_ram[0x23] = 0x1; break; - case 0x8d: m_cchip_ram[0x23] = 0x1; break; - case 0x8e: m_cchip_ram[0x23] = 0x8; break; - case 0x8f: m_cchip_ram[0x23] = 0x6; break; - case 0x90: m_cchip_ram[0x23] = 0xa; break; - case 0x91: m_cchip_ram[0x23] = 0x0; break; - } - } - - m_current_cmd = 0; -} - -/************************************* - * - * Writes to C-Chip - Important Bits - * - *************************************/ - -WRITE16_MEMBER(volfied_state::cchip_ctrl_w) -{ - /* value 2 is written here */ -} - -WRITE16_MEMBER(volfied_state::cchip_bank_w) -{ - m_current_bank = data & 7; -} - -WRITE16_MEMBER(volfied_state::cchip_ram_w) -{ - m_cchip_ram[(m_current_bank * 0x400) + offset] = data; - - if (m_current_bank == 0) - { - if (offset == 0x008) - { - m_cc_port = data; - - machine().bookkeeping().coin_lockout_w(1, data & 0x80); - machine().bookkeeping().coin_lockout_w(0, data & 0x40); - machine().bookkeeping().coin_counter_w(1, data & 0x20); - machine().bookkeeping().coin_counter_w(0, data & 0x10); - } - - if (offset == 0x3fe) - { - /******************* - (This table stored in ROM at $146a8) - (Level number stored at $100198.b, from $100118.b, from $100098.b) - (Level number at $b34 stored to $100098.b) - - round 01 => data $0A - round 02 => data $01 - round 03 => data $03 - round 04 => data $08 - round 05 => data $05 - round 06 => data $04 - round 07 => data $0B - round 08 => data $09 - round 09 => data $07 - round 10 => data $06 - round 11 => data $0E - round 12 => data $0D - round 13 => data $02 - round 14 => data $0C - round 15 => data $0F - round 16 => data $10 - final => data $11 - - ********************/ - - m_current_cmd = data; - - // Palette request cmd - verified to take around 122242 68000 cycles to complete - if (m_current_cmd >= 0x1 && m_current_cmd < 0x12) - { - m_cchip_timer->adjust(m_maincpu->cycles_to_attotime(122242)); - } - // Unknown cmd - verified to take around 105500 68000 cycles to complete - else if (m_current_cmd >= 0x81 && m_current_cmd < 0x92) - { - m_cchip_timer->adjust(m_maincpu->cycles_to_attotime(105500)); - } - else - { - logerror("unknown cchip cmd %02x\n", data); - m_current_cmd = 0; - } - } - - // Some kind of timer command - if (offset == 0x3ff) - { - m_current_flag = data; - } - } -} - - -/************************************* - * - * Reads from C-Chip - * - *************************************/ - -READ16_MEMBER(volfied_state::cchip_ctrl_r) -{ - /* - Bit 2 = Error signal - Bit 0 = Ready signal - */ - return 0x01; /* Return 0x05 for C-Chip error */ -} - -READ16_MEMBER(volfied_state::cchip_ram_r) -{ - /* Check for input ports */ - if (m_current_bank == 0) - { - switch (offset) - { - case 0x03: return ioport("F00007")->read(); /* STARTn + SERVICE1 */ - case 0x04: return ioport("F00009")->read(); /* COINn */ - case 0x05: return ioport("F0000B")->read(); /* Player controls + TILT */ - case 0x06: return ioport("F0000D")->read(); /* Player controls (cocktail) */ - case 0x08: return m_cc_port; - } - } - - /* Unknown */ - if (m_current_bank == 2 && offset == 0x005) - { - /* Not fully understood - Game writes: - 0001a0c2: volfied c write 0005 00aa - 0001a0ca: volfied c write 0006 0055 - 0001a0d2: volfied c write 0004 0065 - - Then expects 0x7c to replace the 0xaa some time later. - */ - return 0x7c; /* makes worm in round 1 appear */ - } - - /* Unknown - some kind of timer */ - if (m_current_bank == 0 && offset == 0x3ff) - { - return 2 * m_current_flag; /* fixes freeze after shield runs out */ - } - - /* Current command status */ - if (m_current_bank == 0 && offset == 0x3fe) - { - return m_current_cmd; - } - - return m_cchip_ram[(m_current_bank * 0x400) + offset]; -} - - -/************************************* - * - * C-Chip State Saving - * - *************************************/ - -void volfied_state::cchip_init() -{ - m_cchip_timer = timer_alloc(TIMER_VOLFIED); - - m_cchip_ram = make_unique_clear(0x400 * 8); - - save_item(NAME(m_current_bank)); - save_item(NAME(m_current_cmd)); - save_item(NAME(m_current_flag)); - save_item(NAME(m_cc_port)); - save_pointer(NAME(m_cchip_ram.get()), 0x400 * 8); -} - -void volfied_state::cchip_reset() -{ - m_current_bank = 0; - m_current_flag = 0; - m_cc_port = 0; - m_current_cmd = 0; -}