segaybd.cpp: Read inputs through 315-5296

This commit is contained in:
AJR 2017-04-10 13:03:51 -04:00
parent 9791d2fdb6
commit 7330bd8ed9
2 changed files with 65 additions and 129 deletions

View File

@ -62,6 +62,7 @@ MB89372 - Uses 3 serial data transfer protocols: ASYNC, COP & BOP. Has a built
#include "machine/mb8421.h"
#include "machine/nvram.h"
#include "machine/315_5296.h"
#include "sound/segapcm.h"
#include "sound/ym2151.h"
#include "speaker.h"
@ -89,7 +90,7 @@ const uint32_t SOUND_CLOCK = 32215900;
// analog_r - handle analog input reads
//-------------------------------------------------
READ16_MEMBER( segaybd_state::analog_r )
READ16_MEMBER(segaybd_state::analog_r)
{
int result = 0xff;
if (ACCESSING_BITS_0_7)
@ -105,127 +106,62 @@ READ16_MEMBER( segaybd_state::analog_r )
// analog_w - handle analog input control writes
//-------------------------------------------------
WRITE16_MEMBER( segaybd_state::analog_w )
WRITE16_MEMBER(segaybd_state::analog_w)
{
int selected = ((offset & 3) == 3) ? (3 + (m_misc_io_data[0x08/2] & 3)) : (offset & 3);
int selected = ((offset & 3) == 3) ? (3 + (m_misc_io_data & 3)) : (offset & 3);
m_analog_data[offset & 3] = m_adc_ports[selected].read_safe(0xff);
}
//-------------------------------------------------
// io_chip_r - handle reads from the I/O chip
// output1_w - handle writes to I/O port D
//-------------------------------------------------
READ16_MEMBER( segaybd_state::io_chip_r )
WRITE8_MEMBER(segaybd_state::output1_w)
{
offset &= 0x1f/2;
switch (offset)
{
// I/O ports
case 0x00/2:
case 0x02/2:
case 0x04/2:
case 0x06/2:
case 0x08/2:
case 0x0a/2:
case 0x0c/2:
case 0x0e/2:
// if the port is configured as an output, return the last thing written
if (m_misc_io_data[0x1e/2] & (1 << offset))
return m_misc_io_data[offset];
// otherwise, return an input port
return m_digital_ports[offset]->read();
// 'SEGA' protection
case 0x10/2:
return 'S';
case 0x12/2:
return 'E';
case 0x14/2:
return 'G';
case 0x16/2:
return 'A';
// CNT register & mirror
case 0x18/2:
case 0x1c/2:
return m_misc_io_data[0x1c/2];
// port direction register & mirror
case 0x1a/2:
case 0x1e/2:
return m_misc_io_data[0x1e/2];
}
return 0xffff;
if (!m_output_cb1.isnull())
m_output_cb1(data);
}
//-------------------------------------------------
// io_chip_w - handle writes to the I/O chip
// misc_output_w - handle writes to I/O port E
//-------------------------------------------------
WRITE16_MEMBER( segaybd_state::io_chip_w )
WRITE8_MEMBER(segaybd_state::misc_output_w)
{
uint8_t old;
//
// D7 = /KILL
// D6 = CONT
// D5 = /WDCL
// D4 = /SRES
// D3 = XRES
// D2 = YRES
// D1-D0 = ADC0-1
//
m_segaic16vid->set_display_enable(data & 0x80);
if (((m_misc_io_data ^ data) & 0x20) && !(data & 0x20))
m_watchdog->watchdog_reset();
m_soundcpu->set_input_line(INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE);
m_subx->set_input_line(INPUT_LINE_RESET, (data & 0x08) ? ASSERT_LINE : CLEAR_LINE);
m_suby->set_input_line(INPUT_LINE_RESET, (data & 0x04) ? ASSERT_LINE : CLEAR_LINE);
// generic implementation
offset &= 0x1f/2;
old = m_misc_io_data[offset];
m_misc_io_data[offset] = data;
m_misc_io_data = data;
}
switch (offset)
{
// I/O ports
case 0x00/2:
break;
case 0x02/2:
break;
case 0x04/2:
break;
case 0x06/2:
if (!m_output_cb1.isnull())
m_output_cb1(data);
break;
case 0x0a/2:
case 0x0c/2:
break;
// miscellaneous output
case 0x08/2:
//
// D7 = /KILL
// D6 = CONT
// D5 = /WDCL
// D4 = /SRES
// D3 = XRES
// D2 = YRES
// D1-D0 = ADC0-1
//
m_segaic16vid->set_display_enable(data & 0x80);
if (((old ^ data) & 0x20) && !(data & 0x20))
m_watchdog->watchdog_reset();
m_soundcpu->set_input_line(INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE);
m_subx->set_input_line(INPUT_LINE_RESET, (data & 0x08) ? ASSERT_LINE : CLEAR_LINE);
m_suby->set_input_line(INPUT_LINE_RESET, (data & 0x04) ? ASSERT_LINE : CLEAR_LINE);
break;
//-------------------------------------------------
// output2_w - handle writes to I/O port H
//-------------------------------------------------
// mute
WRITE8_MEMBER(segaybd_state::output2_w)
{
if (!m_output_cb2.isnull())
m_output_cb2(data);
case 0x0e/2:
if (!m_output_cb2.isnull())
m_output_cb2(data);
// D7 = /MUTE
// D6-D0 = FLT31-25
machine().sound().system_enable(data & 0x80);
break;
// CNT register
case 0x1c/2:
break;
}
// D7 = /MUTE
// D6-D0 = FLT31-25
machine().sound().system_enable(data & 0x80);
}
@ -234,7 +170,7 @@ WRITE16_MEMBER( segaybd_state::io_chip_w )
// port
//-------------------------------------------------
WRITE16_MEMBER( segaybd_state::sound_data_w )
WRITE16_MEMBER(segaybd_state::sound_data_w)
{
if (ACCESSING_BITS_0_7)
synchronize(TID_SOUND_WRITE, data & 0xff);
@ -250,7 +186,7 @@ WRITE16_MEMBER( segaybd_state::sound_data_w )
// sound_data_r - read latched sound data
//-------------------------------------------------
READ8_MEMBER( segaybd_state::sound_data_r )
READ8_MEMBER(segaybd_state::sound_data_r)
{
m_soundcpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
return m_soundlatch->read(space, 0);
@ -705,7 +641,7 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, segaybd_state )
AM_RANGE(0x084000, 0x08401f) AM_MIRROR(0x001fe0) AM_DEVREADWRITE("divider_main", sega_315_5249_divider_device, read, write)
// AM_RANGE(0x086000, 0x087fff) /DEA0
AM_RANGE(0x0c0000, 0x0cffff) AM_RAM AM_SHARE("shareram")
AM_RANGE(0x100000, 0x10001f) AM_READWRITE(io_chip_r, io_chip_w)
AM_RANGE(0x100000, 0x10001f) AM_DEVREADWRITE8("io", sega_315_5296_device, read, write, 0x00ff)
AM_RANGE(0x100040, 0x100047) AM_READWRITE(analog_r, analog_w)
AM_RANGE(0x1f0000, 0x1fffff) AM_RAM
ADDRESS_MAP_END
@ -860,12 +796,6 @@ static INPUT_PORTS_START( yboard_generic )
PORT_START("LIMITSW")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("PORTD")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("PORTE")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("DSW")
PORT_DIPUNUSED_DIPLOC( 0x01, IP_ACTIVE_LOW, "SWB:1" )
PORT_DIPUNUSED_DIPLOC( 0x02, IP_ACTIVE_LOW, "SWB:2" )
@ -878,9 +808,6 @@ static INPUT_PORTS_START( yboard_generic )
PORT_START("COINAGE")
SEGA_COINAGE_LOC(SWA)
PORT_START("PORTH")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
@ -1413,6 +1340,16 @@ static MACHINE_CONFIG_START( yboard, segaybd_state )
MCFG_WATCHDOG_ADD("watchdog")
MCFG_DEVICE_ADD("io", SEGA_315_5296, 16000000)
MCFG_315_5296_IN_PORTA_CB(IOPORT("P1"))
MCFG_315_5296_IN_PORTB_CB(IOPORT("GENERAL"))
MCFG_315_5296_IN_PORTC_CB(IOPORT("LIMITSW"))
MCFG_315_5296_OUT_PORTD_CB(WRITE8(segaybd_state, output1_w))
MCFG_315_5296_OUT_PORTE_CB(WRITE8(segaybd_state, misc_output_w))
MCFG_315_5296_IN_PORTF_CB(IOPORT("DSW"))
MCFG_315_5296_IN_PORTG_CB(IOPORT("COINAGE"))
MCFG_315_5296_OUT_PORTH_CB(WRITE8(segaybd_state, output2_w))
MCFG_SEGA_315_5248_MULTIPLIER_ADD("multiplier_main")
MCFG_SEGA_315_5248_MULTIPLIER_ADD("multiplier_subx")
MCFG_SEGA_315_5248_MULTIPLIER_ADD("multiplier_suby")

View File

@ -33,36 +33,36 @@ public:
, m_ysprites(*this, "ysprites")
, m_segaic16vid(*this, "segaic16vid")
, m_soundlatch(*this, "soundlatch")
, m_digital_ports(*this, { { "P1", "GENERAL", "LIMITSW", "PORTD", "PORTE", "DSW", "COINAGE", "PORTH" } })
, m_adc_ports(*this, "ADC.%u", 0)
, m_pdrift_bank(0)
, m_scanline_timer(nullptr)
, m_irq2_scanline(0)
, m_timer_irq_state(0)
, m_vblank_irq_state(0)
, m_misc_io_data(0)
, m_tmp_bitmap(512, 512)
{
memset(m_analog_data, 0, sizeof(m_analog_data));
memset(m_misc_io_data, 0, sizeof(m_misc_io_data));
}
// main CPU read/write handlers
DECLARE_READ16_MEMBER( analog_r );
DECLARE_WRITE16_MEMBER( analog_w );
DECLARE_READ16_MEMBER( io_chip_r );
DECLARE_WRITE16_MEMBER( io_chip_w );
DECLARE_WRITE16_MEMBER( sound_data_w );
DECLARE_READ16_MEMBER(analog_r);
DECLARE_WRITE16_MEMBER(analog_w);
DECLARE_WRITE8_MEMBER(output1_w);
DECLARE_WRITE8_MEMBER(misc_output_w);
DECLARE_WRITE8_MEMBER(output2_w);
DECLARE_WRITE16_MEMBER(sound_data_w);
// sound Z80 CPU read/write handlers
DECLARE_READ8_MEMBER( sound_data_r );
DECLARE_READ8_MEMBER(sound_data_r);
// linked cabinet specific handlers
DECLARE_WRITE_LINE_MEMBER( mb8421_intl );
DECLARE_WRITE_LINE_MEMBER( mb8421_intr );
DECLARE_READ16_MEMBER( link_r );
DECLARE_READ16_MEMBER( link2_r );
DECLARE_WRITE16_MEMBER( link2_w );
// DECLARE_READ8_MEMBER( link_portc0_r );
DECLARE_WRITE_LINE_MEMBER(mb8421_intl);
DECLARE_WRITE_LINE_MEMBER(mb8421_intr);
DECLARE_READ16_MEMBER(link_r);
DECLARE_READ16_MEMBER(link2_r);
DECLARE_WRITE16_MEMBER(link2_w);
// DECLARE_READ8_MEMBER(link_portc0_r);
// game-specific output handlers
void gforce2_output_cb1(uint16_t data);
@ -117,7 +117,6 @@ protected:
required_device<generic_latch_8_device> m_soundlatch;
// input ports
required_ioport_array<8> m_digital_ports;
optional_ioport_array<6> m_adc_ports;
// configuration
@ -131,6 +130,6 @@ protected:
int m_irq2_scanline;
uint8_t m_timer_irq_state;
uint8_t m_vblank_irq_state;
uint8_t m_misc_io_data[0x10];
uint8_t m_misc_io_data;
bitmap_ind16 m_tmp_bitmap;
};