From 939930817c5aebbda325f0a8f1e5c47e9b8fcce4 Mon Sep 17 00:00:00 2001 From: AJR Date: Mon, 17 Apr 2017 20:50:29 -0400 Subject: [PATCH] segas32.cpp: Input modernization, phase 1 * Use I8255 or MSM6253 devices for most non-JAMMA inputs * Separate service and test inputs in Multi-32 and twin-unit sets arescue: Four coins are recognized, not just two ga2: Use MB8421 device for V25 communications orunners: Assign keys to some 2P inputs --- src/devices/machine/msm6253.cpp | 4 +- src/mame/drivers/segas32.cpp | 571 ++++++++++++++++++-------------- src/mame/includes/segas32.h | 104 ++++-- src/mame/machine/segas32.cpp | 10 - 4 files changed, 403 insertions(+), 286 deletions(-) diff --git a/src/devices/machine/msm6253.cpp b/src/devices/machine/msm6253.cpp index 450b178f701..025e7d0d2d6 100644 --- a/src/devices/machine/msm6253.cpp +++ b/src/devices/machine/msm6253.cpp @@ -116,7 +116,7 @@ bool msm6253_device::shift_out() READ8_MEMBER(msm6253_device::d0_r) { // offset is ignored - return shift_out(); + return shift_out() | (space.unmap() & 0xfe); } //------------------------------------------------- @@ -126,5 +126,5 @@ READ8_MEMBER(msm6253_device::d0_r) READ8_MEMBER(msm6253_device::d7_r) { // offset is ignored - return shift_out() << 7; + return (shift_out() << 7) | (space.unmap() & 0x7f); } diff --git a/src/mame/drivers/segas32.cpp b/src/mame/drivers/segas32.cpp index 64375c2a717..d5f6b29eb59 100644 --- a/src/mame/drivers/segas32.cpp +++ b/src/mame/drivers/segas32.cpp @@ -531,6 +531,9 @@ orunners: Interleaved with the dj and << >> buttons is the data the drives the #include "cpu/nec/v25.h" #include "cpu/upd7725/upd7725.h" #include "machine/eepromser.h" +#include "machine/i8255.h" +#include "machine/mb8421.h" +#include "machine/msm6253.h" #include "sound/2612intf.h" #include "sound/rf5c68.h" @@ -550,16 +553,12 @@ segas32_state::segas32_state(const machine_config &mconfig, const char *tag, dev segas32_state::segas32_state(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : device_t(mconfig, type, name, tag, owner, clock, shortname, source), m_z80_shared_ram(*this,"z80_shared_ram"), - m_ga2_dpram(*this,"ga2_dpram"), m_system32_workram(*this,"workram"), m_system32_videoram(*this,"videoram", 0), m_system32_spriteram(*this,"spriteram", 0), m_system32_paletteram(*this,"paletteram.%u", 0, uint8_t(0)), m_ports_a(*this, {"P1_A", "P2_A", "PORTC_A", "PORTD_A", "SERVICE12_A", "SERVICE34_A", "PORTG_A", "PORTH_A"}), m_ports_b(*this, {"P1_B", "P2_B", "PORTC_B", "PORTD_B", "SERVICE12_B", "SERVICE34_B", "PORTG_B", "PORTH_B"}), - m_analog_ports(*this, {"ANALOG1", "ANALOG2", "ANALOG3", "ANALOG4", "ANALOG5", "ANALOG6", "ANALOG7", "ANALOG8"}), - m_extra_ports(*this, {"EXTRA1", "EXTRA2", "EXTRA3", "EXTRA4"}), - m_track_ports(*this, {"TRACKX1", "TRACKY1", "TRACKX2", "TRACKY2", "TRACKX3", "TRACKY3"}), m_maincpu(*this, "maincpu"), m_soundcpu(*this, "soundcpu"), m_multipcm(*this, "sega"), @@ -609,6 +608,11 @@ void segas32_state::device_start() common_start(0); } +void segas32_trackball_state::device_start() +{ + common_start(0); +} + void segas32_v25_state::device_start() { common_start(0); @@ -624,6 +628,17 @@ void sega_multi32_state::device_start() common_start(1); } +void sega_multi32_analog_state::device_start() +{ + common_start(1); + m_analog_bank = 0; +} + +void sega_multi32_6player_state::device_start() +{ + common_start(1); +} + void segas32_state::device_reset() { /* initialize the interrupt controller */ @@ -986,96 +1001,6 @@ WRITE32_MEMBER(segas32_state::io_chip_1_w) * *************************************/ -READ16_MEMBER(segas32_state::io_expansion_r) -{ - if (!m_custom_io_r[0].isnull()) - return (m_custom_io_r[0])(space, offset, mem_mask); - else - logerror("%06X:io_expansion_r(%X)\n", space.device().safe_pc(), offset); - return 0xffff; -} - - -WRITE16_MEMBER(segas32_state::io_expansion_w) -{ - /* only LSB matters */ - if (!ACCESSING_BITS_0_7) - return; - - if (!m_custom_io_w[0].isnull()) - (m_custom_io_w[0])(space, offset, data, mem_mask); - else - logerror("%06X:io_expansion_w(%X) = %02X\n", space.device().safe_pc(), offset, data & 0xff); -} - - -READ32_MEMBER(segas32_state::io_expansion_0_r) -{ - if (!m_custom_io_r[0].isnull()) - return (m_custom_io_r[0])(space, offset*2+0, mem_mask) | - ((m_custom_io_r[0])(space, offset*2+1, mem_mask >> 16) << 16); - else - logerror("%06X:io_expansion_r(%X)\n", space.device().safe_pc(), offset); - return 0xffffffff; -} - - -WRITE32_MEMBER(segas32_state::io_expansion_0_w) -{ - /* only LSB matters */ - - - if (ACCESSING_BITS_0_7) - { - /* harddunk uses bits 4,5 for output lamps */ - if (m_sw3_output) - (this->*m_sw3_output)(0, data & 0xff); - - if (!m_custom_io_w[0].isnull()) - (m_custom_io_w[0])(space, offset*2+0, data, mem_mask); - else - logerror("%06X:io_expansion_w(%X) = %02X\n", space.device().safe_pc(), offset, data & 0xff); - - } - if (ACCESSING_BITS_16_23) - { - if (!m_custom_io_w[0].isnull()) - (m_custom_io_w[0])(space, offset*2+1, data >> 16, mem_mask >> 16); - else - logerror("%06X:io_expansion_w(%X) = %02X\n", space.device().safe_pc(), offset, data & 0xff); - } -} - - -READ32_MEMBER(segas32_state::io_expansion_1_r) -{ - if (!m_custom_io_r[1].isnull()) - return (m_custom_io_r[1])(space, offset*2+0, mem_mask) | - ((m_custom_io_r[1])(space, offset*2+1, mem_mask >> 16) << 16); - else - logerror("%06X:io_expansion_r(%X)\n", space.device().safe_pc(), offset); - return 0xffffffff; -} - - -WRITE32_MEMBER(segas32_state::io_expansion_1_w) -{ - /* only LSB matters */ - if (ACCESSING_BITS_0_7) - { - if (!m_custom_io_w[1].isnull()) - (m_custom_io_w[1])(space, offset*2+0, data, mem_mask); - else - logerror("%06X:io_expansion_w(%X) = %02X\n", space.device().safe_pc(), offset, data & 0xff); - } - if (ACCESSING_BITS_16_23) - { - if (!m_custom_io_w[1].isnull()) - (m_custom_io_w[1])(space, offset*2+1, data >> 16, mem_mask >> 16); - else - logerror("%06X:io_expansion_w(%X) = %02X\n", space.device().safe_pc(), offset, data & 0xff); - } -} @@ -1085,75 +1010,7 @@ WRITE32_MEMBER(segas32_state::io_expansion_1_w) * *************************************/ -READ16_MEMBER(segas32_state::analog_custom_io_r) -{ - uint16_t result; - switch (offset) - { - case 0x10/2: - case 0x12/2: - case 0x14/2: - case 0x16/2: - result = m_analog_value[offset & 3] | 0x7f; - m_analog_value[offset & 3] <<= 1; - return result; - } - logerror("%06X:unknown analog_custom_io_r(%X) & %04X\n", space.device().safe_pc(), offset*2, mem_mask); - return 0xffff; -} - - -WRITE16_MEMBER(segas32_state::analog_custom_io_w) -{ - switch (offset) - { - case 0x10/2: - case 0x12/2: - case 0x14/2: - case 0x16/2: - m_analog_value[offset & 3] = m_analog_ports[offset & 3].read_safe(0); - return; - } - logerror("%06X:unknown analog_custom_io_w(%X) = %04X & %04X\n", space.device().safe_pc(), offset*2, data, mem_mask); -} - - -READ16_MEMBER(segas32_state::extra_custom_io_r) -{ - switch (offset) - { - case 0x20/2: - case 0x22/2: - case 0x24/2: - case 0x26/2: - return m_extra_ports[offset & 3].read_safe(0xffff); - } - - logerror("%06X:unknown extra_custom_io_r(%X) & %04X\n", space.device().safe_pc(), offset*2, mem_mask); - return 0xffff; -} - - -WRITE16_MEMBER(segas32_state::orunners_custom_io_w) -{ - switch (offset) - { - case 0x10/2: - case 0x12/2: - case 0x14/2: - case 0x16/2: - m_analog_value[offset & 3] = m_analog_ports[m_analog_bank * 4 + (offset & 3)].read_safe(0); - return; - - case 0x20/2: - m_analog_bank = data & 1; - return; - } - logerror("%06X:unknown orunners_custom_io_w(%X) = %04X & %04X\n", space.device().safe_pc(), offset*2, data, mem_mask); -} - - -READ16_MEMBER(segas32_state::sonic_custom_io_r) +READ8_MEMBER(segas32_trackball_state::sonic_custom_io_r) { switch (offset) { @@ -1171,7 +1028,7 @@ READ16_MEMBER(segas32_state::sonic_custom_io_r) } -WRITE16_MEMBER(segas32_state::sonic_custom_io_w) +WRITE8_MEMBER(segas32_trackball_state::sonic_custom_io_w) { switch (offset) { @@ -1407,7 +1264,7 @@ static ADDRESS_MAP_START( system32_map, AS_PROGRAM, 16, segas32_state ) AM_RANGE(0x801000, 0x801001) AM_DEVREADWRITE8("s32comm", s32comm_device, cn_r, cn_w, 0x00ff) AM_RANGE(0x801002, 0x801003) AM_DEVREADWRITE8("s32comm", s32comm_device, fg_r, fg_w, 0x00ff) AM_RANGE(0xc00000, 0xc0001f) AM_MIRROR(0x0fff80) AM_READWRITE(io_chip_r, io_chip_w) - AM_RANGE(0xc00040, 0xc0007f) AM_MIRROR(0x0fff80) AM_READWRITE(io_expansion_r, io_expansion_w) + AM_RANGE(0xc00040, 0xc0007f) AM_MIRROR(0x0fff80) AM_UNMAP // I/O expansion area AM_RANGE(0xd00000, 0xd0000f) AM_MIRROR(0x07fff0) AM_READWRITE(interrupt_control_16_r, interrupt_control_16_w) AM_RANGE(0xd80000, 0xdfffff) AM_READWRITE(random_number_16_r, random_number_16_w) AM_RANGE(0xf00000, 0xffffff) AM_ROM AM_REGION("maincpu", 0) @@ -1431,9 +1288,9 @@ static ADDRESS_MAP_START( multi32_map, AS_PROGRAM, 32, segas32_state ) AM_RANGE(0x801000, 0x801003) AM_DEVREADWRITE8("s32comm", s32comm_device, cn_r, cn_w, 0x000000ff) AM_RANGE(0x801000, 0x801003) AM_DEVREADWRITE8("s32comm", s32comm_device, fg_r, fg_w, 0x00ff0000) AM_RANGE(0xc00000, 0xc0001f) AM_MIRROR(0x07ff80) AM_READWRITE(io_chip_0_r, io_chip_0_w) - AM_RANGE(0xc00040, 0xc0007f) AM_MIRROR(0x07ff80) AM_READWRITE(io_expansion_0_r, io_expansion_0_w) + AM_RANGE(0xc00040, 0xc0007f) AM_MIRROR(0x07ff80) AM_UNMAP // I/O expansion area 0 AM_RANGE(0xc80000, 0xc8001f) AM_MIRROR(0x07ff80) AM_READWRITE(io_chip_1_r, io_chip_1_w) - AM_RANGE(0xc80040, 0xc8007f) AM_MIRROR(0x07ff80) AM_READWRITE(io_expansion_1_r, io_expansion_1_w) + AM_RANGE(0xc80040, 0xc8007f) AM_MIRROR(0x07ff80) AM_UNMAP // I/O expansion area 1 AM_RANGE(0xd00000, 0xd0000f) AM_MIRROR(0x07fff0) AM_READWRITE(interrupt_control_32_r, interrupt_control_32_w) AM_RANGE(0xd80000, 0xdfffff) AM_READWRITE(random_number_32_r, random_number_32_w) AM_RANGE(0xf00000, 0xffffff) AM_ROM AM_REGION("maincpu", 0) @@ -1496,7 +1353,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( ga2_v25_map, AS_PROGRAM, 8, segas32_state ) AM_RANGE(0x00000, 0x0ffff) AM_ROM AM_REGION("mcu", 0) - AM_RANGE(0x10000, 0x1ffff) AM_RAM AM_SHARE("ga2_dpram") + AM_RANGE(0x10000, 0x1ffff) AM_DEVREADWRITE("dpram", mb8421_device, left_r, left_w) AM_RANGE(0xf0000, 0xfffff) AM_ROM AM_REGION("mcu", 0) ADDRESS_MAP_END @@ -1602,8 +1459,8 @@ static INPUT_PORTS_START( system32_generic_slave ) PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("slavepcb:SERVICE12_A") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_SERVICE_NO_TOGGLE( 0x02, IP_ACTIVE_LOW ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_F1) PORT_NAME("slavepcb:Service Mode") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START3 ) @@ -1639,9 +1496,12 @@ static INPUT_PORTS_START( multi32_generic ) PORT_START("mainpcb:PORTD_B") PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_MODIFY("mainpcb:SERVICE12_A") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_START("mainpcb:SERVICE12_B") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_F1) PORT_NAME("Service Mode 2") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) @@ -1676,7 +1536,7 @@ static INPUT_PORTS_START( arescue ) PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_MODIFY("mainpcb:SERVICE12_A") - PORT_BIT( 0x38, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x30, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_MODIFY("mainpcb:SERVICE34_A") PORT_BIT( 0x30, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1701,7 +1561,7 @@ static INPUT_PORTS_START( arescue ) PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_MODIFY("slavepcb:SERVICE12_A") - PORT_BIT( 0x38, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x30, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_MODIFY("slavepcb:SERVICE34_A") PORT_BIT( 0x30, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1802,6 +1662,9 @@ static INPUT_PORTS_START( brival ) PORT_MODIFY("mainpcb:P2_A") PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_START("mainpcb:EXTRA1") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_START("mainpcb:EXTRA2") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) @@ -1811,6 +1674,9 @@ static INPUT_PORTS_START( brival ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) + + PORT_START("mainpcb:EXTRA3") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -1827,6 +1693,9 @@ static INPUT_PORTS_START( darkedge ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_START("mainpcb:EXTRA1") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_START("mainpcb:EXTRA2") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) @@ -1836,6 +1705,9 @@ static INPUT_PORTS_START( darkedge ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) + + PORT_START("mainpcb:EXTRA3") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END @@ -2150,9 +2022,9 @@ static INPUT_PORTS_START( orunners ) PORT_BIT( 0xfc, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_MODIFY("mainpcb:P2_B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) /* DJ/music */ - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) /* << */ - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) /* >> */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_R) /* DJ/music */ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_T) /* << */ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_Y) /* >> */ PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START("mainpcb:ANALOG1") @@ -2556,9 +2428,120 @@ machine_config_constructor segas32_regular_state::device_mconfig_additions() con -static MACHINE_CONFIG_FRAGMENT( system32_v25 ) + +static ADDRESS_MAP_START( system32_analog_map, AS_PROGRAM, 16, segas32_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0xc00050, 0xc00057) AM_DEVREADWRITE8("adc", msm6253_device, d7_r, address_w, 0x00ff) + AM_IMPORT_FROM(system32_map) +ADDRESS_MAP_END + +static MACHINE_CONFIG_FRAGMENT( system32_analog ) MCFG_FRAGMENT_ADD( system32 ) + MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(system32_analog_map) + + MCFG_DEVICE_ADD("adc", MSM6253, 0) + MCFG_MSM6253_IN0_ANALOG_PORT("ANALOG1") + MCFG_MSM6253_IN1_ANALOG_PORT("ANALOG2") + MCFG_MSM6253_IN2_ANALOG_PORT("ANALOG3") + MCFG_MSM6253_IN3_ANALOG_PORT("ANALOG4") +MACHINE_CONFIG_END + +const device_type SEGA_S32_ANALOG_DEVICE = device_creator; + +segas32_analog_state::segas32_analog_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : segas32_state(mconfig, SEGA_S32_ANALOG_DEVICE, "Sega System 32 analog PCB", tag, owner, clock, "sega32_pcb_analog", __FILE__) +{ +} + +machine_config_constructor segas32_analog_state::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( system32_analog ); +} + + + + + +static ADDRESS_MAP_START( system32_trackball_map, AS_PROGRAM, 16, segas32_trackball_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0xc00040, 0xc0005f) AM_READWRITE8(sonic_custom_io_r, sonic_custom_io_w, 0x00ff) + AM_IMPORT_FROM(system32_map) +ADDRESS_MAP_END + +static MACHINE_CONFIG_FRAGMENT( system32_trackball ) + MCFG_FRAGMENT_ADD( system32 ) + + MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(system32_trackball_map) +MACHINE_CONFIG_END + +const device_type SEGA_S32_TRACKBALL_DEVICE = device_creator; + +segas32_trackball_state::segas32_trackball_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : segas32_state(mconfig, SEGA_S32_TRACKBALL_DEVICE, "Sega System 32 trackball PCB", tag, owner, clock, "sega32_pcb_trackball", __FILE__), + m_track_ports(*this, {"TRACKX1", "TRACKY1", "TRACKX2", "TRACKY2", "TRACKX3", "TRACKY3"}) +{ +} + +machine_config_constructor segas32_trackball_state::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( system32_trackball ); +} + + + + + +static ADDRESS_MAP_START( system32_4player_map, AS_PROGRAM, 16, segas32_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0xc00060, 0xc00067) AM_DEVREADWRITE8("ppi", i8255_device, read, write, 0x00ff) + AM_IMPORT_FROM(system32_map) +ADDRESS_MAP_END + +static MACHINE_CONFIG_FRAGMENT( system32_4player ) + MCFG_FRAGMENT_ADD( system32 ) + + MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(system32_4player_map) + + MCFG_DEVICE_ADD("ppi", I8255A, 0) + MCFG_I8255_IN_PORTA_CB(IOPORT("EXTRA1")) + MCFG_I8255_IN_PORTB_CB(IOPORT("EXTRA2")) + MCFG_I8255_IN_PORTC_CB(IOPORT("EXTRA3")) +MACHINE_CONFIG_END + +const device_type SEGA_S32_4PLAYER_DEVICE = device_creator; + +segas32_4player_state::segas32_4player_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : segas32_state(mconfig, SEGA_S32_4PLAYER_DEVICE, "Sega System 32 4 player/fighting PCB", tag, owner, clock, "sega32_pcb_4player", __FILE__) +{ +} + +machine_config_constructor segas32_4player_state::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( system32_4player ); +} + + + + + +static ADDRESS_MAP_START( ga2_main_map, AS_PROGRAM, 16, segas32_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(0xa00000, 0xa00fff) AM_DEVREADWRITE8("dpram", mb8421_device, right_r, right_w, 0x00ff) + AM_IMPORT_FROM(system32_map) +ADDRESS_MAP_END + +static MACHINE_CONFIG_FRAGMENT( system32_v25 ) + MCFG_FRAGMENT_ADD( system32_4player ) + + MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_PROGRAM_MAP(ga2_main_map) + + MCFG_DEVICE_ADD("dpram", MB8421, 0) + /* add a V25 for protection */ MCFG_CPU_ADD("mcu", V25, 10000000) MCFG_CPU_PROGRAM_MAP(ga2_v25_map) @@ -2582,7 +2565,7 @@ machine_config_constructor segas32_v25_state::device_mconfig_additions() const static MACHINE_CONFIG_FRAGMENT( system32_upd7725 ) - MCFG_FRAGMENT_ADD( system32 ) + MCFG_FRAGMENT_ADD( system32_analog ) /* add a upd7725; this is on the 837-8341 daughterboard which plugs into the socket on the master pcb's rom board where an fd1149 could go */ MCFG_CPU_ADD("dsp", UPD7725, 8000000) // TODO: Find real clock speed for the upd7725; this is a canned oscillator on the 837-8341 pcb @@ -2620,7 +2603,6 @@ static MACHINE_CONFIG_FRAGMENT( multi32 ) MCFG_CPU_PROGRAM_MAP(multi32_sound_map) MCFG_CPU_IO_MAP(multi32_sound_portmap) - MCFG_EEPROM_SERIAL_93C46_ADD("eeprom") MCFG_TIMER_DRIVER_ADD("v60_irq0", segas32_state, signal_v60_irq_callback) @@ -2672,6 +2654,88 @@ machine_config_constructor sega_multi32_state::device_mconfig_additions() const } +static ADDRESS_MAP_START( multi32_analog_map, AS_PROGRAM, 32, sega_multi32_analog_state ) + ADDRESS_MAP_UNMAP_HIGH + ADDRESS_MAP_GLOBAL_MASK(0xffffff) + AM_RANGE(0xc00050, 0xc00057) AM_MIRROR(0x07ff80) AM_DEVREADWRITE8("adc", msm6253_device, d7_r, address_w, 0x00ff00ff) + AM_RANGE(0xc00060, 0xc00063) AM_MIRROR(0x07ff80) AM_WRITE8(analog_bank_w, 0x000000ff) + AM_IMPORT_FROM(multi32_map) +ADDRESS_MAP_END + +static MACHINE_CONFIG_FRAGMENT( multi32_analog ) + MCFG_FRAGMENT_ADD(multi32) + + MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(multi32_analog_map) + + MCFG_DEVICE_ADD("adc", MSM6253, 0) + MCFG_MSM6253_IN0_ANALOG_PORT("ANALOG1") + MCFG_MSM6253_IN1_ANALOG_PORT("ANALOG2") + MCFG_MSM6253_IN2_ANALOG_READ(sega_multi32_analog_state, in2_analog_read) + MCFG_MSM6253_IN3_ANALOG_READ(sega_multi32_analog_state, in3_analog_read) +MACHINE_CONFIG_END + +ioport_value sega_multi32_analog_state::in2_analog_read() +{ + return m_analog_ports[m_analog_bank * 4 + 2].read_safe(0); +} + +ioport_value sega_multi32_analog_state::in3_analog_read() +{ + return m_analog_ports[m_analog_bank * 4 + 3].read_safe(0); +} + +WRITE8_MEMBER(sega_multi32_analog_state::analog_bank_w) +{ + m_analog_bank = data & 1; +} + +const device_type SEGA_MULTI32_ANALOG_DEVICE = device_creator; + +sega_multi32_analog_state::sega_multi32_analog_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : segas32_state(mconfig, SEGA_MULTI32_ANALOG_DEVICE, "Sega Multi 32 analog PCB", tag, owner, clock, "sega32_pcb_multi_analog", __FILE__), + m_analog_ports(*this, {"ANALOG1", "ANALOG2", "ANALOG3", "ANALOG4", "ANALOG5", "ANALOG6", "ANALOG7", "ANALOG8"}) +{ +} + +machine_config_constructor sega_multi32_analog_state::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( multi32_analog ); +} + + +static ADDRESS_MAP_START( multi32_6player_map, AS_PROGRAM, 32, segas32_state ) + ADDRESS_MAP_UNMAP_HIGH + ADDRESS_MAP_GLOBAL_MASK(0xffffff) + AM_RANGE(0xc00060, 0xc00067) AM_MIRROR(0x07ff80) AM_DEVREADWRITE8("ppi", i8255_device, read, write, 0x00ff00ff) + AM_IMPORT_FROM(multi32_map) +ADDRESS_MAP_END + +static MACHINE_CONFIG_FRAGMENT( multi32_6player ) + MCFG_FRAGMENT_ADD(multi32) + + MCFG_DEVICE_MODIFY("maincpu") + MCFG_DEVICE_PROGRAM_MAP(multi32_6player_map) + + MCFG_DEVICE_ADD("ppi", I8255A, 0) + MCFG_I8255_IN_PORTA_CB(IOPORT("EXTRA1")) + MCFG_I8255_IN_PORTB_CB(IOPORT("EXTRA2")) + MCFG_I8255_IN_PORTC_CB(IOPORT("EXTRA3")) +MACHINE_CONFIG_END + +const device_type SEGA_MULTI32_6PLAYER_DEVICE = device_creator; + +sega_multi32_6player_state::sega_multi32_6player_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : segas32_state(mconfig, SEGA_MULTI32_6PLAYER_DEVICE, "Sega Multi 32 6 player PCB", tag, owner, clock, "sega32_pcb_multi_6player", __FILE__) +{ +} + +machine_config_constructor sega_multi32_6player_state::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( multi32_6player ); +} + + class segas32_new_state : public driver_device { public: @@ -2723,16 +2787,28 @@ static MACHINE_CONFIG_START( sega_system32, segas32_new_state ) MCFG_DEVICE_ADD("mainpcb", SEGA_S32_REGULAR_DEVICE, 0) MACHINE_CONFIG_END +static MACHINE_CONFIG_START( sega_system32_analog, segas32_new_state ) + MCFG_DEVICE_ADD("mainpcb", SEGA_S32_ANALOG_DEVICE, 0) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_START( sega_system32_track, segas32_new_state ) + MCFG_DEVICE_ADD("mainpcb", SEGA_S32_TRACKBALL_DEVICE, 0) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_START( sega_system32_4p, segas32_new_state ) + MCFG_DEVICE_ADD("mainpcb", SEGA_S32_4PLAYER_DEVICE, 0) +MACHINE_CONFIG_END + // for f1en where there is a sub-board containing shared ram sitting underneath the ROM board bridging 2 PCBs (not a network link) static MACHINE_CONFIG_START( sega_system32_dual_direct, segas32_new_state ) - MCFG_DEVICE_ADD("mainpcb", SEGA_S32_REGULAR_DEVICE, 0) - MCFG_DEVICE_ADD("slavepcb", SEGA_S32_REGULAR_DEVICE, 0) + MCFG_DEVICE_ADD("mainpcb", SEGA_S32_ANALOG_DEVICE, 0) + MCFG_DEVICE_ADD("slavepcb", SEGA_S32_ANALOG_DEVICE, 0) MACHINE_CONFIG_END // air rescue is like f1en above but also has the 837-8341 DSP daughterboard on the mainpcb side only static MACHINE_CONFIG_START( sega_system32_dual_direct_upd7725, segas32_new_state ) MCFG_DEVICE_ADD("mainpcb", SEGA_S32_UPD7725_DEVICE, 0) - MCFG_DEVICE_ADD("slavepcb", SEGA_S32_REGULAR_DEVICE, 0) + MCFG_DEVICE_ADD("slavepcb", SEGA_S32_ANALOG_DEVICE, 0) MACHINE_CONFIG_END static MACHINE_CONFIG_START( sega_system32_v25, segas32_new_state ) @@ -2743,6 +2819,14 @@ static MACHINE_CONFIG_START( sega_multi32, segas32_new_state ) MCFG_DEVICE_ADD("mainpcb", SEGA_MULTI32_DEVICE, 0) MACHINE_CONFIG_END +static MACHINE_CONFIG_START( sega_multi32_analog, segas32_new_state ) + MCFG_DEVICE_ADD("mainpcb", SEGA_MULTI32_ANALOG_DEVICE, 0) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_START( sega_multi32_6p, segas32_new_state ) + MCFG_DEVICE_ADD("mainpcb", SEGA_MULTI32_6PLAYER_DEVICE, 0) +MACHINE_CONFIG_END + /************************************* * * ROM definition(s) @@ -5044,11 +5128,9 @@ ROM_END * *************************************/ -void segas32_state::segas32_common_init(read16_delegate custom_r, write16_delegate custom_w) +void segas32_state::segas32_common_init() { /* reset the custom handlers and other pointers */ - m_custom_io_r[0] = custom_r; - m_custom_io_w[0] = custom_w; m_system32_prot_vblank = nullptr; m_sw1_output = nullptr; m_sw2_output = nullptr; @@ -5322,13 +5404,13 @@ DRIVER_INIT_MEMBER(segas32_new_state,f1lap) void segas32_state::init_alien3(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::analog_custom_io_r), this), write16_delegate(FUNC(segas32_state::analog_custom_io_w), this)); + segas32_common_init(); m_sw1_output = &segas32_state::alien3_sw1_output; } void segas32_state::init_arescue(int m_hasdsp) { - segas32_common_init(read16_delegate(FUNC(segas32_state::analog_custom_io_r),this), write16_delegate(FUNC(segas32_state::analog_custom_io_w),this)); + segas32_common_init(); if (m_hasdsp) m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa00000, 0xa00007, read16_delegate(FUNC(segas32_state::arescue_dsp_r),this), write16_delegate(FUNC(segas32_state::arescue_dsp_w),this)); for (auto & elem : m_arescue_dsp_io) @@ -5360,7 +5442,7 @@ void segas32_state::init_arescue(int m_hasdsp) void segas32_state::init_arabfgt(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::extra_custom_io_r),this), write16_delegate()); + segas32_common_init(); /* install protection handlers */ m_maincpu->space(AS_PROGRAM).install_read_handler(0xa00100, 0xa0011f, read16_delegate(FUNC(segas32_state::arf_wakeup_protection_r),this)); @@ -5370,7 +5452,7 @@ void segas32_state::init_arabfgt(void) void segas32_state::init_brival(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::extra_custom_io_r),this), write16_delegate()); + segas32_common_init(); /* install protection handlers */ m_system32_protram = std::make_unique(0x1000/2); @@ -5381,7 +5463,7 @@ void segas32_state::init_brival(void) void segas32_state::init_darkedge(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::extra_custom_io_r),this), write16_delegate()); + segas32_common_init(); /* install protection handlers */ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa00000, 0xa7ffff, read16_delegate(FUNC(segas32_state::darkedge_protection_r),this), write16_delegate(FUNC(segas32_state::darkedge_protection_w),this)); @@ -5390,7 +5472,7 @@ void segas32_state::init_darkedge(void) void segas32_state::init_dbzvrvs(void) { - segas32_common_init(read16_delegate(), write16_delegate()); + segas32_common_init(); /* install protection handlers */ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa00000, 0xa7ffff, read16_delegate(FUNC(segas32_state::dbzvrvs_protection_r),this), write16_delegate(FUNC(segas32_state::dbzvrvs_protection_w),this)); @@ -5399,7 +5481,7 @@ void segas32_state::init_dbzvrvs(void) void segas32_state::init_f1en(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::analog_custom_io_r),this), write16_delegate(FUNC(segas32_state::analog_custom_io_w),this)); + segas32_common_init(); m_sw1_output = &segas32_state::radm_sw1_output; @@ -5410,7 +5492,7 @@ void segas32_state::init_f1en(void) void segas32_state::init_f1lap(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::analog_custom_io_r),this), write16_delegate(FUNC(segas32_state::analog_custom_io_w),this)); + segas32_common_init(); m_system32_prot_vblank = &segas32_state::f1lap_fd1149_vblank; m_sw1_output = &segas32_state::f1lap_sw1_output; @@ -5421,16 +5503,15 @@ void segas32_state::init_f1lap(void) void segas32_state::init_ga2(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::extra_custom_io_r),this), write16_delegate()); + segas32_common_init(); decrypt_ga2_protrom(); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa00000, 0xa00fff, read16_delegate(FUNC(segas32_state::ga2_dpram_r),this), write16_delegate(FUNC(segas32_state::ga2_dpram_w),this)); } void segas32_state::init_harddunk(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::extra_custom_io_r),this), write16_delegate()); + segas32_common_init(); m_sw1_output = &segas32_state::harddunk_sw1_output; m_sw2_output = &segas32_state::harddunk_sw2_output; m_sw3_output = &segas32_state::harddunk_sw3_output; @@ -5439,7 +5520,7 @@ void segas32_state::init_harddunk(void) void segas32_state::init_holo(void) { - segas32_common_init(read16_delegate(), write16_delegate()); + segas32_common_init(); } @@ -5448,7 +5529,7 @@ void segas32_state::init_jpark(void) /* Temp. Patch until we emulate the 'Drive Board', thanks to Malice */ uint16_t *pROM = (uint16_t *)memregion("maincpu")->base(); - segas32_common_init(read16_delegate(FUNC(segas32_state::analog_custom_io_r),this), write16_delegate(FUNC(segas32_state::analog_custom_io_w),this)); + segas32_common_init(); pROM[0xC15A8/2] = 0xCD70; pROM[0xC15AA/2] = 0xD8CD; @@ -5459,7 +5540,7 @@ void segas32_state::init_jpark(void) void segas32_state::init_orunners(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::analog_custom_io_r),this), write16_delegate(FUNC(segas32_state::orunners_custom_io_w),this)); + segas32_common_init(); m_sw1_output = &segas32_state::orunners_sw1_output; m_sw2_output = &segas32_state::orunners_sw2_output; @@ -5469,7 +5550,7 @@ void segas32_state::init_orunners(void) void segas32_state::init_radm(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::analog_custom_io_r),this), write16_delegate(FUNC(segas32_state::analog_custom_io_w),this)); + segas32_common_init(); m_sw1_output = &segas32_state::radm_sw1_output; m_sw2_output = &segas32_state::radm_sw2_output; } @@ -5477,7 +5558,7 @@ void segas32_state::init_radm(void) void segas32_state::init_radr(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::analog_custom_io_r),this), write16_delegate(FUNC(segas32_state::analog_custom_io_w),this)); + segas32_common_init(); m_sw1_output = &segas32_state::radm_sw1_output; m_sw2_output = &segas32_state::radr_sw2_output; @@ -5487,7 +5568,7 @@ void segas32_state::init_radr(void) void segas32_state::init_scross(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::analog_custom_io_r),this), write16_delegate(FUNC(segas32_state::analog_custom_io_w),this)); + segas32_common_init(); m_soundcpu->space(AS_PROGRAM).install_write_handler(0xb0, 0xbf, write8_delegate(FUNC(segas32_state::scross_bank_w),this)); m_sw1_output = &segas32_state::scross_sw1_output; @@ -5499,13 +5580,13 @@ void segas32_state::init_scross(void) void segas32_state::init_slipstrm(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::analog_custom_io_r),this), write16_delegate(FUNC(segas32_state::analog_custom_io_w),this)); + segas32_common_init(); } void segas32_state::init_sonic(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::sonic_custom_io_r),this), write16_delegate(FUNC(segas32_state::sonic_custom_io_w),this)); + segas32_common_init(); /* install protection handlers */ m_maincpu->space(AS_PROGRAM).install_write_handler(0x20E5C4, 0x20E5C5, write16_delegate(FUNC(segas32_state::sonic_level_load_protection),this)); @@ -5514,32 +5595,32 @@ void segas32_state::init_sonic(void) void segas32_state::init_sonicp(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::sonic_custom_io_r),this), write16_delegate(FUNC(segas32_state::sonic_custom_io_w),this)); + segas32_common_init(); } void segas32_state::init_spidman(void) { - segas32_common_init(read16_delegate(FUNC(segas32_state::extra_custom_io_r),this), write16_delegate()); + segas32_common_init(); } void segas32_state::init_svf(void) { - segas32_common_init(read16_delegate(), write16_delegate()); + segas32_common_init(); } void segas32_state::init_jleague(void) { - segas32_common_init(read16_delegate(), write16_delegate()); + segas32_common_init(); m_maincpu->space(AS_PROGRAM).install_write_handler(0x20F700, 0x20F705, write16_delegate(FUNC(segas32_state::jleague_protection_w),this)); } void segas32_state::init_titlef(void) { - segas32_common_init(read16_delegate(), write16_delegate()); + segas32_common_init(); m_sw1_output = &segas32_state::titlef_sw1_output; m_sw2_output = &segas32_state::titlef_sw2_output; } @@ -5554,18 +5635,18 @@ void segas32_state::init_titlef(void) GAME( 1992, arescue, 0, sega_system32_dual_direct_upd7725, arescue, segas32_new_state, arescue, ROT0, "Sega", "Air Rescue (US)", MACHINE_IMPERFECT_GRAPHICS ) GAME( 1992, arescuej, arescue, sega_system32_dual_direct_upd7725, arescue, segas32_new_state, arescue, ROT0, "Sega", "Air Rescue (Japan)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1993, alien3, 0, sega_system32, alien3, segas32_new_state, alien3, ROT0, "Sega", "Alien3: The Gun (World)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1993, alien3u, alien3, sega_system32, alien3, segas32_new_state, alien3, ROT0, "Sega", "Alien3: The Gun (US)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1993, alien3, 0, sega_system32_analog, alien3, segas32_new_state, alien3, ROT0, "Sega", "Alien3: The Gun (World)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1993, alien3u, alien3, sega_system32_analog, alien3, segas32_new_state, alien3, ROT0, "Sega", "Alien3: The Gun (US)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1991, arabfgt, 0, sega_system32, arabfgt, segas32_new_state, arabfgt, ROT0, "Sega", "Arabian Fight (World)", MACHINE_IMPERFECT_GRAPHICS ) /* Released in 03.1992 */ -GAME( 1991, arabfgtu, arabfgt, sega_system32, arabfgtu, segas32_new_state, arabfgt, ROT0, "Sega", "Arabian Fight (US)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1991, arabfgtj, arabfgt, sega_system32, arabfgt, segas32_new_state, arabfgt, ROT0, "Sega", "Arabian Fight (Japan)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1991, arabfgt, 0, sega_system32_4p, arabfgt, segas32_new_state, arabfgt, ROT0, "Sega", "Arabian Fight (World)", MACHINE_IMPERFECT_GRAPHICS ) /* Released in 03.1992 */ +GAME( 1991, arabfgtu, arabfgt, sega_system32_4p, arabfgtu, segas32_new_state, arabfgt, ROT0, "Sega", "Arabian Fight (US)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1991, arabfgtj, arabfgt, sega_system32_4p, arabfgt, segas32_new_state, arabfgt, ROT0, "Sega", "Arabian Fight (Japan)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, brival, 0, sega_system32, brival, segas32_new_state, brival, ROT0, "Sega", "Burning Rival (World)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, brivalj, brival, sega_system32, brival, segas32_new_state, brival, ROT0, "Sega", "Burning Rival (Japan)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, brival, 0, sega_system32_4p, brival, segas32_new_state, brival, ROT0, "Sega", "Burning Rival (World)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, brivalj, brival, sega_system32_4p, brival, segas32_new_state, brival, ROT0, "Sega", "Burning Rival (Japan)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, darkedge, 0, sega_system32, darkedge, segas32_new_state, darkedge, ROT0, "Sega", "Dark Edge (World)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, darkedgej, darkedge, sega_system32, darkedge, segas32_new_state, darkedge, ROT0, "Sega", "Dark Edge (Japan)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, darkedge, 0, sega_system32_4p, darkedge, segas32_new_state, darkedge, ROT0, "Sega", "Dark Edge (World)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, darkedgej, darkedge, sega_system32_4p, darkedge, segas32_new_state, darkedge, ROT0, "Sega", "Dark Edge (Japan)", MACHINE_IMPERFECT_GRAPHICS ) GAME( 1994, dbzvrvs, 0, sega_system32, dbzvrvs, segas32_new_state, dbzvrvs, ROT0, "Sega / Banpresto", "Dragon Ball Z V.R.V.S. (Japan)", MACHINE_IMPERFECT_GRAPHICS) @@ -5573,8 +5654,8 @@ GAME( 1991, f1en, 0, sega_system32_dual_direct, f1en, segas3 GAME( 1991, f1enu, f1en, sega_system32_dual_direct, f1en, segas32_new_state, f1en, ROT0, "Sega", "F1 Exhaust Note (US)", MACHINE_IMPERFECT_GRAPHICS ) GAME( 1991, f1enj, f1en, sega_system32_dual_direct, f1en, segas32_new_state, f1en, ROT0, "Sega", "F1 Exhaust Note (Japan)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1993, f1lap, 0, sega_system32, f1lap, segas32_new_state, f1lap, ROT0, "Sega", "F1 Super Lap (World)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1993, f1lapj, f1lap, sega_system32, f1lap, segas32_new_state, f1lap, ROT0, "Sega", "F1 Super Lap (Japan)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1993, f1lap, 0, sega_system32_analog, f1lap, segas32_new_state, f1lap, ROT0, "Sega", "F1 Super Lap (World)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1993, f1lapj, f1lap, sega_system32_analog, f1lap, segas32_new_state, f1lap, ROT0, "Sega", "F1 Super Lap (Japan)", MACHINE_IMPERFECT_GRAPHICS ) GAME( 1992, ga2, 0, sega_system32_v25, ga2, segas32_new_state, ga2, ROT0, "Sega", "Golden Axe: The Revenge of Death Adder (World)", MACHINE_IMPERFECT_GRAPHICS ) GAME( 1992, ga2u, ga2, sega_system32_v25, ga2u, segas32_new_state, ga2, ROT0, "Sega", "Golden Axe: The Revenge of Death Adder (US)", MACHINE_IMPERFECT_GRAPHICS ) @@ -5582,29 +5663,29 @@ GAME( 1992, ga2j, ga2, sega_system32_v25, ga2, segas32_new_state, GAME( 1992, holo, 0, sega_system32, holo, segas32_new_state, holo, ORIENTATION_FLIP_Y, "Sega", "Holosseum (US)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1993, jpark, 0, sega_system32, jpark, segas32_new_state, jpark, ROT0, "Sega", "Jurassic Park (World)", MACHINE_IMPERFECT_GRAPHICS ) /* Released in 02.1994 */ -GAME( 1993, jparkj, jpark, sega_system32, jpark, segas32_new_state, jpark, ROT0, "Sega", "Jurassic Park (Japan, Rev A, Deluxe)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1993, jparkja, jpark, sega_system32, jpark, segas32_new_state, jpark, ROT0, "Sega", "Jurassic Park (Japan, Deluxe)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1993, jparkjc, jpark, sega_system32, jpark, segas32_new_state, jpark, ROT0, "Sega", "Jurassic Park (Japan, Rev A, Conversion)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1993, jpark, 0, sega_system32_analog, jpark, segas32_new_state, jpark, ROT0, "Sega", "Jurassic Park (World)", MACHINE_IMPERFECT_GRAPHICS ) /* Released in 02.1994 */ +GAME( 1993, jparkj, jpark, sega_system32_analog, jpark, segas32_new_state, jpark, ROT0, "Sega", "Jurassic Park (Japan, Rev A, Deluxe)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1993, jparkja, jpark, sega_system32_analog, jpark, segas32_new_state, jpark, ROT0, "Sega", "Jurassic Park (Japan, Deluxe)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1993, jparkjc, jpark, sega_system32_analog, jpark, segas32_new_state, jpark, ROT0, "Sega", "Jurassic Park (Japan, Rev A, Conversion)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1994, kokoroj2, 0, sega_system32, radr, segas32_new_state, radr, ROT0, "Sega", "Kokoroji 2", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING) /* uses an Audio CD */ +GAME( 1994, kokoroj2, 0, sega_system32_analog, radr, segas32_new_state, radr, ROT0, "Sega", "Kokoroji 2", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING) /* uses an Audio CD */ -GAME( 1990, radm, 0, sega_system32, radm, segas32_new_state, radm, ROT0, "Sega", "Rad Mobile (World)", MACHINE_IMPERFECT_GRAPHICS ) /* Released in 02.1991 */ -GAME( 1990, radmu, radm, sega_system32, radm, segas32_new_state, radm, ROT0, "Sega", "Rad Mobile (US)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1990, radm, 0, sega_system32_analog, radm, segas32_new_state, radm, ROT0, "Sega", "Rad Mobile (World)", MACHINE_IMPERFECT_GRAPHICS ) /* Released in 02.1991 */ +GAME( 1990, radmu, radm, sega_system32_analog, radm, segas32_new_state, radm, ROT0, "Sega", "Rad Mobile (US)", MACHINE_IMPERFECT_GRAPHICS ) -GAMEL(1991, radr, 0, sega_system32, radr, segas32_new_state, radr, ROT0, "Sega", "Rad Rally (World)", MACHINE_IMPERFECT_GRAPHICS, layout_radr ) -GAMEL(1991, radru, radr, sega_system32, radr, segas32_new_state, radr, ROT0, "Sega", "Rad Rally (US)", MACHINE_IMPERFECT_GRAPHICS, layout_radr ) -GAMEL(1991, radrj, radr, sega_system32, radr, segas32_new_state, radr, ROT0, "Sega", "Rad Rally (Japan)", MACHINE_IMPERFECT_GRAPHICS, layout_radr ) +GAMEL(1991, radr, 0, sega_system32_analog, radr, segas32_new_state, radr, ROT0, "Sega", "Rad Rally (World)", MACHINE_IMPERFECT_GRAPHICS, layout_radr ) +GAMEL(1991, radru, radr, sega_system32_analog, radr, segas32_new_state, radr, ROT0, "Sega", "Rad Rally (US)", MACHINE_IMPERFECT_GRAPHICS, layout_radr ) +GAMEL(1991, radrj, radr, sega_system32_analog, radr, segas32_new_state, radr, ROT0, "Sega", "Rad Rally (Japan)", MACHINE_IMPERFECT_GRAPHICS, layout_radr ) -GAMEL(1995, slipstrm, 0, sega_system32, slipstrm, segas32_new_state, slipstrm, ROT0, "Capcom", "Slip Stream (Brazil 950515)", MACHINE_IMPERFECT_GRAPHICS, layout_radr ) -GAMEL(1995, slipstrmh, slipstrm, sega_system32, slipstrm, segas32_new_state, slipstrm, ROT0, "Capcom", "Slip Stream (Hispanic 950515)", MACHINE_IMPERFECT_GRAPHICS, layout_radr ) +GAMEL(1995, slipstrm, 0, sega_system32_analog, slipstrm, segas32_new_state, slipstrm, ROT0, "Capcom", "Slip Stream (Brazil 950515)", MACHINE_IMPERFECT_GRAPHICS, layout_radr ) +GAMEL(1995, slipstrmh, slipstrm, sega_system32_analog, slipstrm, segas32_new_state, slipstrm, ROT0, "Capcom", "Slip Stream (Hispanic 950515)", MACHINE_IMPERFECT_GRAPHICS, layout_radr ) -GAME( 1992, sonic, 0, sega_system32, sonic, segas32_new_state, sonic, ROT0, "Sega", "SegaSonic The Hedgehog (Japan, rev. C)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, sonicp, sonic, sega_system32, sonic, segas32_new_state, sonicp, ROT0, "Sega", "SegaSonic The Hedgehog (Japan, prototype)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, sonic, 0, sega_system32_track, sonic, segas32_new_state, sonic, ROT0, "Sega", "SegaSonic The Hedgehog (Japan, rev. C)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, sonicp, sonic, sega_system32_track, sonic, segas32_new_state, sonicp, ROT0, "Sega", "SegaSonic The Hedgehog (Japan, prototype)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1991, spidman, 0, sega_system32, spidman, segas32_new_state, spidman, ROT0, "Sega", "Spider-Man: The Videogame (World)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1991, spidmanu, spidman, sega_system32, spidmanu, segas32_new_state, spidman, ROT0, "Sega", "Spider-Man: The Videogame (US)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1991, spidmanj, spidman, sega_system32, spidman, segas32_new_state, spidman, ROT0, "Sega", "Spider-Man: The Videogame (Japan)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1991, spidman, 0, sega_system32_4p, spidman, segas32_new_state, spidman, ROT0, "Sega", "Spider-Man: The Videogame (World)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1991, spidmanu, spidman, sega_system32_4p, spidmanu, segas32_new_state, spidman, ROT0, "Sega", "Spider-Man: The Videogame (US)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1991, spidmanj, spidman, sega_system32_4p, spidman, segas32_new_state, spidman, ROT0, "Sega", "Spider-Man: The Videogame (Japan)", MACHINE_IMPERFECT_GRAPHICS ) GAME( 1994, svf, 0, sega_system32, svf, segas32_new_state, svf, ROT0, "Sega", "Super Visual Football: European Sega Cup (Rev A)", MACHINE_IMPERFECT_GRAPHICS ) GAME( 1994, svfo, svf, sega_system32, svf, segas32_new_state, svf, ROT0, "Sega", "Super Visual Football: European Sega Cup", MACHINE_IMPERFECT_GRAPHICS ) @@ -5613,16 +5694,16 @@ GAME( 1994, jleague, svf, sega_system32, svf, segas32_new_state, GAME( 1994, jleagueo, svf, sega_system32, svf, segas32_new_state, jleague, ROT0, "Sega", "The J.League 1994 (Japan)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1994, harddunk, 0, sega_multi32, harddunk, segas32_new_state, harddunk, ROT0, "Sega", "Hard Dunk (World)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1994, harddunkj, harddunk, sega_multi32, harddunk, segas32_new_state, harddunk, ROT0, "Sega", "Hard Dunk (Japan)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1994, harddunk, 0, sega_multi32_6p, harddunk, segas32_new_state, harddunk, ROT0, "Sega", "Hard Dunk (World)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1994, harddunkj, harddunk, sega_multi32_6p, harddunk, segas32_new_state, harddunk, ROT0, "Sega", "Hard Dunk (Japan)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, orunners, 0, sega_multi32, orunners, segas32_new_state, orunners, ROT0, "Sega", "OutRunners (World)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, orunnersu, orunners, sega_multi32, orunners, segas32_new_state, orunners, ROT0, "Sega", "OutRunners (US)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, orunnersj, orunners, sega_multi32, orunners, segas32_new_state, orunners, ROT0, "Sega", "OutRunners (Japan)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, orunners, 0, sega_multi32_analog, orunners, segas32_new_state, orunners, ROT0, "Sega", "OutRunners (World)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, orunnersu, orunners, sega_multi32_analog, orunners, segas32_new_state, orunners, ROT0, "Sega", "OutRunners (US)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, orunnersj, orunners, sega_multi32_analog, orunners, segas32_new_state, orunners, ROT0, "Sega", "OutRunners (Japan)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, scross, 0, sega_multi32, scross, segas32_new_state, scross, ROT0, "Sega", "Stadium Cross (World)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, scrossa, scross, sega_multi32, scross, segas32_new_state, scross, ROT0, "Sega", "Stadium Cross (World, alt)", MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1992, scrossu, scross, sega_multi32, scross, segas32_new_state, scross, ROT0, "Sega", "Stadium Cross (US)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, scross, 0, sega_multi32_analog, scross, segas32_new_state, scross, ROT0, "Sega", "Stadium Cross (World)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, scrossa, scross, sega_multi32_analog, scross, segas32_new_state, scross, ROT0, "Sega", "Stadium Cross (World, alt)", MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1992, scrossu, scross, sega_multi32_analog, scross, segas32_new_state, scross, ROT0, "Sega", "Stadium Cross (US)", MACHINE_IMPERFECT_GRAPHICS ) GAME( 1992, titlef, 0, sega_multi32, titlef, segas32_new_state, titlef, ROT0, "Sega", "Title Fight (World)", MACHINE_IMPERFECT_GRAPHICS ) GAME( 1992, titlefu, titlef, sega_multi32, titlef, segas32_new_state, titlef, ROT0, "Sega", "Title Fight (US)", MACHINE_IMPERFECT_GRAPHICS ) diff --git a/src/mame/includes/segas32.h b/src/mame/includes/segas32.h index 4aefeed42bd..e1bbb4cf3de 100644 --- a/src/mame/includes/segas32.h +++ b/src/mame/includes/segas32.h @@ -21,7 +21,6 @@ public: segas32_state(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source); required_shared_ptr m_z80_shared_ram; - optional_shared_ptr m_ga2_dpram; optional_shared_ptr m_system32_workram; required_shared_ptr m_system32_videoram; required_shared_ptr m_system32_spriteram; @@ -29,9 +28,6 @@ public: optional_ioport_array<8> m_ports_a; optional_ioport_array<8> m_ports_b; - optional_ioport_array<8> m_analog_ports; - optional_ioport_array<4> m_extra_ports; - optional_ioport_array<6> m_track_ports; required_device m_maincpu; required_device m_soundcpu; @@ -75,11 +71,6 @@ public: uint8_t m_sound_dummy_value; uint16_t m_sound_bank; uint8_t m_misc_io_data[2][0x10]; - read16_delegate m_custom_io_r[2]; - write16_delegate m_custom_io_w[2]; - uint8_t m_analog_bank; - uint8_t m_analog_value[4]; - uint8_t m_sonic_last[6]; sys32_output_callback m_sw1_output; sys32_output_callback m_sw2_output; sys32_output_callback m_sw3_output; @@ -100,8 +91,6 @@ public: typedef void (segas32_state::*prot_vblank_func)(); prot_vblank_func m_system32_prot_vblank; int m_print_count; - DECLARE_WRITE16_MEMBER(ga2_dpram_w); - DECLARE_READ16_MEMBER(ga2_dpram_r); DECLARE_WRITE16_MEMBER(sonic_level_load_protection); DECLARE_READ16_MEMBER(brival_protection_r); DECLARE_WRITE16_MEMBER(brival_protection_w); @@ -147,18 +136,6 @@ public: DECLARE_WRITE32_MEMBER(io_chip_0_w); DECLARE_READ32_MEMBER(io_chip_1_r); DECLARE_WRITE32_MEMBER(io_chip_1_w); - DECLARE_READ16_MEMBER(io_expansion_r); - DECLARE_WRITE16_MEMBER(io_expansion_w); - DECLARE_READ32_MEMBER(io_expansion_0_r); - DECLARE_WRITE32_MEMBER(io_expansion_0_w); - DECLARE_READ32_MEMBER(io_expansion_1_r); - DECLARE_WRITE32_MEMBER(io_expansion_1_w); - DECLARE_READ16_MEMBER(analog_custom_io_r); - DECLARE_WRITE16_MEMBER(analog_custom_io_w); - DECLARE_READ16_MEMBER(extra_custom_io_r); - DECLARE_WRITE16_MEMBER(orunners_custom_io_w); - DECLARE_READ16_MEMBER(sonic_custom_io_r); - DECLARE_WRITE16_MEMBER(sonic_custom_io_w); DECLARE_WRITE16_MEMBER(random_number_16_w); DECLARE_READ16_MEMBER(random_number_16_r); DECLARE_WRITE32_MEMBER(random_number_32_w); @@ -212,7 +189,7 @@ public: uint16_t common_io_chip_r(address_space &space, int which, offs_t offset, uint16_t mem_mask); void common_io_chip_w(address_space &space, int which, offs_t offset, uint16_t data, uint16_t mem_mask); void update_sound_irq_state(); - void segas32_common_init(read16_delegate custom_r, write16_delegate custom_w); + void segas32_common_init(); void radm_sw1_output( int which, uint16_t data ); void radm_sw2_output( int which, uint16_t data ); void radr_sw2_output( int which, uint16_t data ); @@ -278,8 +255,47 @@ public: protected: virtual machine_config_constructor device_mconfig_additions() const override; -// virtual void device_start(); -// virtual void device_reset(); +// virtual void device_start() override; +// virtual void device_reset() override; +}; + +class segas32_analog_state : public segas32_state +{ +public: + segas32_analog_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual machine_config_constructor device_mconfig_additions() const override; +// virtual void device_start() override; +// virtual void device_reset() override; +}; + +class segas32_trackball_state : public segas32_state +{ +public: + segas32_trackball_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + DECLARE_READ8_MEMBER(sonic_custom_io_r); + DECLARE_WRITE8_MEMBER(sonic_custom_io_w); + +protected: + virtual machine_config_constructor device_mconfig_additions() const override; + virtual void device_start() override; + +private: + required_ioport_array<6> m_track_ports; + uint8_t m_sonic_last[6]; +}; + +class segas32_4player_state : public segas32_state +{ +public: + segas32_4player_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual machine_config_constructor device_mconfig_additions() const override; +// virtual void device_start() override; +// virtual void device_reset() override; }; class segas32_v25_state : public segas32_state @@ -290,7 +306,7 @@ public: protected: virtual machine_config_constructor device_mconfig_additions() const override; virtual void device_start() override; -// virtual void device_reset(); +// virtual void device_reset() override; }; class segas32_upd7725_state : public segas32_state @@ -301,7 +317,7 @@ public: protected: virtual machine_config_constructor device_mconfig_additions() const override; virtual void device_start() override; -// virtual void device_reset(); +// virtual void device_reset() override; }; class sega_multi32_state : public segas32_state @@ -312,7 +328,37 @@ public: protected: virtual machine_config_constructor device_mconfig_additions() const override; virtual void device_start() override; -// virtual void device_reset(); +// virtual void device_reset() override; +}; + +class sega_multi32_analog_state : public segas32_state +{ +public: + sega_multi32_analog_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + ioport_value in2_analog_read(); + ioport_value in3_analog_read(); + DECLARE_WRITE8_MEMBER(analog_bank_w); + +protected: + virtual machine_config_constructor device_mconfig_additions() const override; + virtual void device_start() override; +// virtual void device_reset() override; + +private: + optional_ioport_array<8> m_analog_ports; + uint8_t m_analog_bank; +}; + +class sega_multi32_6player_state : public segas32_state +{ +public: + sega_multi32_6player_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual machine_config_constructor device_mconfig_additions() const override; + virtual void device_start() override; +// virtual void device_reset() override; }; /*----------- defined in machine/segas32.c -----------*/ diff --git a/src/mame/machine/segas32.cpp b/src/mame/machine/segas32.cpp index 12286b9e8a3..614608be775 100644 --- a/src/mame/machine/segas32.cpp +++ b/src/mame/machine/segas32.cpp @@ -49,16 +49,6 @@ void segas32_state::decrypt_ga2_protrom() rom[i] = temp[BITSWAP16(i, 14, 11, 15, 12, 13, 4, 3, 7, 5, 10, 2, 8, 9, 6, 1, 0)]; } -WRITE16_MEMBER(segas32_state::ga2_dpram_w) -{ - /* does it ever actually write.. */ -} - -READ16_MEMBER(segas32_state::ga2_dpram_r) -{ - return (m_ga2_dpram[offset])|(m_ga2_dpram[offset+1]<<8); -} - #if 0 // simulation READ16_MEMBER(segas32_state::ga2_sprite_protection_r)