From eec313e99d995290f59eabee8a0bfba4a0c3d953 Mon Sep 17 00:00:00 2001 From: AJR Date: Sun, 4 Jun 2017 12:43:57 -0400 Subject: aceattac, aceattaca: First stab at I/O board (nw) --- src/mame/drivers/segas16a.cpp | 31 ++++++++++++++++++++++++++++--- src/mame/drivers/segas16b.cpp | 31 ++++++++++++++++++++++++++++--- src/mame/includes/segas16a.h | 4 ++++ src/mame/includes/segas16b.h | 7 +++++++ 4 files changed, 67 insertions(+), 6 deletions(-) diff --git a/src/mame/drivers/segas16a.cpp b/src/mame/drivers/segas16a.cpp index 6df55e060f2..bcc6c3f6e55 100644 --- a/src/mame/drivers/segas16a.cpp +++ b/src/mame/drivers/segas16a.cpp @@ -258,7 +258,7 @@ READ16_MEMBER( segas16a_state::standard_io_r ) case 0x2000/2: return ioport((offset & 1) ? "DSW2" : "DSW1")->read(); } - //logerror("%06X:standard_io_r - unknown read access to address %04X\n", m_maincpu->pc(), offset * 2); + //logerror("%06X:standard_io_r - unknown read access to address %04X\n", m_maincpu->state_int(STATE_GENPC), offset * 2); return 0xffff; } @@ -279,7 +279,7 @@ WRITE16_MEMBER( segas16a_state::standard_io_w ) synchronize(TID_PPI_WRITE, ((offset & 3) << 8) | (data & 0xff)); return; } - //logerror("%06X:standard_io_w - unknown write access to address %04X = %04X & %04X\n", m_maincpu->pc(), offset * 2, data, mem_mask); + //logerror("%06X:standard_io_w - unknown write access to address %04X = %04X & %04X\n", m_maincpu->state_int(STATE_GENPC), offset * 2, data, mem_mask); } @@ -763,10 +763,30 @@ READ16_MEMBER( segas16a_state::aceattaca_custom_io_r ) } } break; + + case 0x3000/2: + if (BIT(offset, 4)) + return m_cxdio->read(space, offset & 0x0f); + break; } return standard_io_r(space, offset, mem_mask); } +WRITE16_MEMBER( segas16a_state::aceattaca_custom_io_w ) +{ + switch (offset & (0x3000/2)) + { + case 0x3000/2: + if (BIT(offset, 4)) + { + m_cxdio->write(space, offset & 0x0f, data); + return; + } + break; + } + standard_io_w(space, offset, data, mem_mask); +} + //------------------------------------------------- // mjleague_custom_io_r - custom I/O read handler @@ -1947,6 +1967,10 @@ static MACHINE_CONFIG_DERIVED( system16a_fd1094, system16a ) MCFG_CPU_VBLANK_INT_DRIVER("screen", segas16a_state, irq4_line_hold) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( aceattaca_fd1094, system16a_fd1094 ) + MCFG_DEVICE_ADD("cxdio", CXD1095, 0) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( system16a_i8751, system16a ) MCFG_CPU_MODIFY("maincpu") @@ -3644,6 +3668,7 @@ DRIVER_INIT_MEMBER(segas16a_state,aceattaca) { DRIVER_INIT_CALL(generic); m_custom_io_r = read16_delegate(FUNC(segas16a_state::aceattaca_custom_io_r), this); + m_custom_io_w = write16_delegate(FUNC(segas16a_state::aceattaca_custom_io_w), this); } DRIVER_INIT_MEMBER(segas16a_state,dumpmtmt) @@ -3708,7 +3733,7 @@ GAME( 1987, aliensyn5, aliensyn, system16a_fd1089b, aliensyn, segas16a GAME( 1987, aliensyn2, aliensyn, system16a_fd1089a, aliensyn, segas16a_state,generic, ROT0, "Sega", "Alien Syndrome (set 2, System 16A, FD1089A 317-0033)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, aliensynjo, aliensyn, system16a_fd1089a, aliensynj, segas16a_state,generic, ROT0, "Sega", "Alien Syndrome (set 1, Japan, old, System 16A, FD1089A 317-0033)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, aceattaca, aceattac, system16a_fd1094, aceattaca, segas16a_state,aceattaca, ROT270, "Sega", "Ace Attacker (Japan, System 16A, FD1094 317-0060)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, aceattaca, aceattac, aceattaca_fd1094, aceattaca, segas16a_state,aceattaca, ROT270, "Sega", "Ace Attacker (Japan, System 16A, FD1094 317-0060)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, afighter, 0, system16a_fd1089a_no7751, afighter, segas16a_state,generic, ROT270, "Sega", "Action Fighter (FD1089A 317-0018)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/segas16b.cpp b/src/mame/drivers/segas16b.cpp index 12baaafd2a0..69f50ab2f17 100644 --- a/src/mame/drivers/segas16b.cpp +++ b/src/mame/drivers/segas16b.cpp @@ -1520,19 +1520,20 @@ READ16_MEMBER( segas16b_state::aceattac_custom_io_r ) break; case 0x3000/2: + if (BIT(offset, 4)) + return m_cxdio->read(space, offset & 0x0f); + else // TODO: use uPD4701A device switch (offset & 0x1b) { case 0x00: return ioport("TRACKX1")->read() & 0xff; case 0x01: return (ioport("TRACKX1")->read() >> 8 & 0x0f) | (ioport("HANDY1")->read() << 4 & 0xf0); case 0x02: return ioport("TRACKY1")->read(); case 0x03: return ioport("TRACKY1")->read() >> 8 & 0x0f; - case 0x10: return ioport("HANDX1")->read(); case 0x08: return ioport("TRACKX2")->read() & 0xff; case 0x09: return (ioport("TRACKX2")->read() >> 8 & 0x0f) | (ioport("HANDY2")->read() << 4 & 0xf0); case 0x0a: return ioport("TRACKY2")->read(); case 0x0b: return ioport("TRACKY2")->read() >> 8 & 0xff; - case 0x11: return ioport("HANDX2")->read(); } break; } @@ -1540,6 +1541,20 @@ READ16_MEMBER( segas16b_state::aceattac_custom_io_r ) return standard_io_r(space, offset, mem_mask); } +WRITE16_MEMBER( segas16b_state::aceattac_custom_io_w ) +{ + switch (offset & (0x3000/2)) + { + case 0x3000/2: + if (BIT(offset, 4)) + { + m_cxdio->write(space, offset & 0x0f, data); + return; + } + break; + } + standard_io_w(space, offset, data, mem_mask); +} //------------------------------------------------- @@ -3663,6 +3678,15 @@ static MACHINE_CONFIG_DERIVED( system16b_fd1094, system16b ) MCFG_CPU_VBLANK_INT_DRIVER("screen", segas16b_state, irq4_line_hold) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( aceattacb_fd1094, system16b_fd1094 ) + // 834-6602 I/O board + MCFG_DEVICE_ADD("upd4701a1", UPD4701A, 0) + MCFG_DEVICE_ADD("upd4701a2", UPD4701A, 0) + MCFG_DEVICE_ADD("cxdio", CXD1095, 0) + MCFG_CXD1095_IN_PORTA_CB(IOPORT("HANDX1")) + MCFG_CXD1095_IN_PORTB_CB(IOPORT("HANDX2")) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( system16b_i8751, system16b ) MCFG_CPU_MODIFY("maincpu") @@ -8666,6 +8690,7 @@ DRIVER_INIT_MEMBER(segas16b_state,aceattac_5358) { DRIVER_INIT_CALL(generic_5358); m_custom_io_r = read16_delegate(FUNC(segas16b_state::aceattac_custom_io_r), this); + m_custom_io_w = write16_delegate(FUNC(segas16b_state::aceattac_custom_io_w), this); } DRIVER_INIT_MEMBER(segas16b_state,aliensyn7_5358_small) @@ -8812,7 +8837,7 @@ DRIVER_INIT_MEMBER(segas16b_state,snapper) //************************************************************************** // YEAR, NAME, PARENT, MACHINE, INPUT, INIT, MONITOR,COMPANY,FULLNAME,FLAGS -GAME( 1988, aceattac, 0, system16b_fd1094, aceattac, segas16b_state,aceattac_5358, ROT270, "Sega", "Ace Attacker (FD1094 317-0059)", 0 ) +GAME( 1988, aceattac, 0, aceattacb_fd1094, aceattac, segas16b_state,aceattac_5358, ROT270, "Sega", "Ace Attacker (FD1094 317-0059)", 0 ) GAME( 1987, aliensyn, 0, system16b, aliensyn, segas16b_state,generic_5358_small, ROT0, "Sega", "Alien Syndrome (set 4, System 16B, unprotected)", 0 ) GAME( 1987, aliensyn7, aliensyn, system16b_mc8123, aliensyn, segas16b_state,aliensyn7_5358_small, ROT0, "Sega", "Alien Syndrome (set 7, System 16B, MC-8123B 317-00xx)", 0 ) diff --git a/src/mame/includes/segas16a.h b/src/mame/includes/segas16a.h index 61cd8af83e9..688e1400f72 100644 --- a/src/mame/includes/segas16a.h +++ b/src/mame/includes/segas16a.h @@ -10,6 +10,7 @@ #include "cpu/mcs48/mcs48.h" #include "cpu/mcs51/mcs51.h" #include "cpu/z80/z80.h" +#include "machine/cxd1095.h" #include "machine/gen_latch.h" #include "machine/i8255.h" #include "machine/i8243.h" @@ -41,6 +42,7 @@ public: m_segaic16vid(*this, "segaic16vid"), m_soundlatch(*this, "soundlatch"), m_sprites(*this, "sprites"), + m_cxdio(*this, "cxdio"), m_workram(*this, "nvram"), m_sound_decrypted_opcodes(*this, "sound_decrypted_opcodes"), m_video_control(0), @@ -121,6 +123,7 @@ protected: // custom I/O handlers DECLARE_READ16_MEMBER( aceattaca_custom_io_r ); + DECLARE_WRITE16_MEMBER( aceattaca_custom_io_w ); DECLARE_READ16_MEMBER( mjleague_custom_io_r ); DECLARE_READ16_MEMBER( passsht16a_custom_io_r ); DECLARE_READ16_MEMBER( sdi_custom_io_r ); @@ -140,6 +143,7 @@ protected: required_device m_segaic16vid; required_device m_soundlatch; required_device m_sprites; + optional_device m_cxdio; // memory pointers required_shared_ptr m_workram; diff --git a/src/mame/includes/segas16b.h b/src/mame/includes/segas16b.h index 39f6006a6a3..0c078a87cd1 100644 --- a/src/mame/includes/segas16b.h +++ b/src/mame/includes/segas16b.h @@ -9,9 +9,11 @@ #include "cpu/m68000/m68000.h" #include "cpu/mcs51/mcs51.h" #include "cpu/z80/z80.h" +#include "machine/cxd1095.h" #include "machine/gen_latch.h" #include "machine/nvram.h" #include "machine/segaic16.h" +#include "machine/upd4701.h" #include "sound/ym2151.h" #include "sound/ym2413.h" #include "sound/upd7759.h" @@ -41,6 +43,8 @@ public: m_sprites(*this, "sprites"), m_segaic16vid(*this, "segaic16vid"), m_soundlatch(*this, "soundlatch"), + m_cxdio(*this, "cxdio"), + m_upd4701a(*this, {"upd4701a1", "upd4701a2"}), m_workram(*this, "workram"), m_romboard(ROM_BOARD_INVALID), m_tilemap_type(segaic16_video_device::TILEMAP_16B), @@ -177,6 +181,7 @@ protected: // custom I/O handlers DECLARE_READ16_MEMBER( aceattac_custom_io_r ); + DECLARE_WRITE16_MEMBER( aceattac_custom_io_w ); DECLARE_READ16_MEMBER( dunkshot_custom_io_r ); DECLARE_READ16_MEMBER( hwchamp_custom_io_r ); DECLARE_WRITE16_MEMBER( hwchamp_custom_io_w ); @@ -201,6 +206,8 @@ protected: optional_device m_sprites; required_device m_segaic16vid; optional_device m_soundlatch; // not for atomicp + optional_device m_cxdio; // for aceattac + optional_device_array m_upd4701a; // for aceattac // memory pointers required_shared_ptr m_workram; -- cgit v1.2.3