summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/saturn.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/saturn.cpp')
-rw-r--r--src/mame/drivers/saturn.cpp89
1 files changed, 39 insertions, 50 deletions
diff --git a/src/mame/drivers/saturn.cpp b/src/mame/drivers/saturn.cpp
index 183df5ca476..4b4f7e69d4b 100644
--- a/src/mame/drivers/saturn.cpp
+++ b/src/mame/drivers/saturn.cpp
@@ -457,10 +457,10 @@ public:
: saturn_state(mconfig, type, tag)
, m_exp(*this, "exp")
, m_nvram(*this, "nvram")
- , m_smpc_nv(*this, "smpc_nv")
+ , m_ctrl1(*this, "ctrl1")
+ , m_ctrl2(*this, "ctrl2")
{ }
- DECLARE_INPUT_CHANGED_MEMBER(nmi_reset);
DECLARE_INPUT_CHANGED_MEMBER(tray_open);
DECLARE_INPUT_CHANGED_MEMBER(tray_close);
@@ -477,12 +477,23 @@ public:
DECLARE_DRIVER_INIT(saturnus);
DECLARE_DRIVER_INIT(saturneu);
DECLARE_DRIVER_INIT(saturnjp);
-
+ DECLARE_READ8_MEMBER(saturn_pdr1_direct_r);
+ DECLARE_READ8_MEMBER(saturn_pdr2_direct_r);
+ DECLARE_WRITE8_MEMBER(saturn_pdr1_direct_w);
+ DECLARE_WRITE8_MEMBER(saturn_pdr2_direct_w);
+ uint8_t m_direct_mux[2];
+ uint8_t saturn_direct_port_read(bool which);
+ uint8_t smpc_direct_mode(uint16_t in_value, bool which);
+ uint8_t smpc_th_control_mode(uint16_t in_value, bool which);
+
void nvram_init(nvram_device &nvram, void *data, size_t size);
required_device<sat_cart_slot_device> m_exp;
required_device<nvram_device> m_nvram;
- required_device<nvram_device> m_smpc_nv; // TODO: move this in the base class saturn_state and add it to stv in MAME
+
+ required_device<saturn_control_port_device> m_ctrl1;
+ required_device<saturn_control_port_device> m_ctrl2;
+
};
@@ -503,7 +514,7 @@ READ32_MEMBER( sat_console_state::abus_dummy_r )
static ADDRESS_MAP_START( saturn_mem, AS_PROGRAM, 32, sat_console_state )
AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_SHARE("share6") AM_WRITENOP // bios
- AM_RANGE(0x00100000, 0x0010007f) AM_READWRITE8(saturn_SMPC_r, saturn_SMPC_w,0xffffffff)
+ AM_RANGE(0x00100000, 0x0010007f) AM_DEVREADWRITE8("smpc", smpc_hle_device, read, write, 0xffffffff)
AM_RANGE(0x00180000, 0x0018ffff) AM_READWRITE8(saturn_backupram_r, saturn_backupram_w,0xffffffff) AM_SHARE("share1")
AM_RANGE(0x00200000, 0x002fffff) AM_RAM AM_MIRROR(0x20100000) AM_SHARE("workram_l")
AM_RANGE(0x01000000, 0x017fffff) AM_WRITE(saturn_minit_w)
@@ -547,18 +558,6 @@ static ADDRESS_MAP_START( scudsp_data, AS_DATA, 32, sat_console_state )
ADDRESS_MAP_END
-
-INPUT_CHANGED_MEMBER(sat_console_state::nmi_reset)
-{
- /* TODO: correct? */
- if(!m_NMI_reset)
- return;
-
- /* TODO: NMI doesn't stay held on SH-2 core so we can't use ASSERT_LINE/CLEAR_LINE with that yet */
- if(newval)
- m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
-}
-
INPUT_CHANGED_MEMBER(sat_console_state::tray_open)
{
if(newval)
@@ -573,7 +572,7 @@ INPUT_CHANGED_MEMBER(sat_console_state::tray_close)
static INPUT_PORTS_START( saturn )
PORT_START("RESET") /* hardwired buttons */
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, nmi_reset,0) PORT_NAME("Reset Button")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER("smpc", smpc_hle_device, trigger_nmi_r, 0) PORT_NAME("Reset Button")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, tray_open,0) PORT_NAME("Tray Open Button")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, tray_close,0) PORT_NAME("Tray Close")
@@ -663,7 +662,6 @@ MACHINE_START_MEMBER(sat_console_state, saturn)
m_slave->space(AS_PROGRAM).nop_readwrite(0x04000000, 0x047fffff);
m_nvram->set_base(m_backupram.get(), 0x8000);
- m_smpc_nv->set_base(&m_smpc.SMEM, 4);
if (m_exp)
{
@@ -713,25 +711,13 @@ MACHINE_START_MEMBER(sat_console_state, saturn)
// save states
save_pointer(NAME(m_scu_regs.get()), 0x100/4);
save_pointer(NAME(m_scsp_regs.get()), 0x1000/2);
- save_item(NAME(m_NMI_reset));
save_item(NAME(m_en_68k));
-// save_item(NAME(m_smpc.IOSEL1));
-// save_item(NAME(m_smpc.IOSEL2));
-// save_item(NAME(m_smpc.EXLE1));
-// save_item(NAME(m_smpc.EXLE2));
-// save_item(NAME(m_smpc.PDR1));
-// save_item(NAME(m_smpc.PDR2));
-// save_item(NAME(m_port_sel));
-// save_item(NAME(mux_data));
save_item(NAME(m_scsp_last_line));
- save_item(NAME(m_smpc.intback_stage));
- save_item(NAME(m_smpc.pmode));
-// save_item(NAME(m_smpc.SR));
- save_item(NAME(m_smpc.SMEM));
machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(&sat_console_state::stvcd_exit, this));
- m_audiocpu->set_reset_callback(write_line_delegate(FUNC(sat_console_state::m68k_reset_callback),this));
+ // TODO: trampoline
+ m_audiocpu->set_reset_callback(write_line_delegate(FUNC(saturn_state::m68k_reset_callback),this));
}
/* Die Hard Trilogy tests RAM address 0x25e7ffe bit 2 with Slave during FRT minit irq, in-development tool for breaking execution of it? */
@@ -753,13 +739,9 @@ MACHINE_RESET_MEMBER(sat_console_state,saturn)
m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
m_scudsp->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
-// m_smpc.SR = 0x40; // this bit is always on according to docs
-
scu_reset();
m_en_68k = 0;
- m_NMI_reset = 0;
-// m_smpc.slave_on = 0;
//memset(stv_m_workram_l, 0, 0x100000);
//memset(stv_m_workram_h, 0, 0x100000);
@@ -773,27 +755,27 @@ MACHINE_RESET_MEMBER(sat_console_state,saturn)
m_vdp2.old_tvmd = -1;
}
-READ8_MEMBER( saturn_state::saturn_pdr1_direct_r )
+READ8_MEMBER( sat_console_state::saturn_pdr1_direct_r )
{
return saturn_direct_port_read(false);
}
-READ8_MEMBER( saturn_state::saturn_pdr2_direct_r )
+READ8_MEMBER( sat_console_state::saturn_pdr2_direct_r )
{
return saturn_direct_port_read(true);
}
-WRITE8_MEMBER( saturn_state::saturn_pdr1_direct_w )
+WRITE8_MEMBER( sat_console_state::saturn_pdr1_direct_w )
{
m_direct_mux[0] = data;
}
-WRITE8_MEMBER( saturn_state::saturn_pdr2_direct_w )
+WRITE8_MEMBER( sat_console_state::saturn_pdr2_direct_w )
{
m_direct_mux[1] = data;
}
-inline uint8_t saturn_state::saturn_direct_port_read(bool which)
+inline uint8_t sat_console_state::saturn_direct_port_read(bool which)
{
// bail out if direct mode is disabled
if(m_smpc_hle->get_iosel(which) == false)
@@ -818,7 +800,7 @@ inline uint8_t saturn_state::saturn_direct_port_read(bool which)
return res;
}
-uint8_t saturn_state::smpc_th_control_mode(uint16_t in_value, bool which)
+uint8_t sat_console_state::smpc_th_control_mode(uint16_t in_value, bool which)
{
uint8_t res = 0;
uint8_t th = (m_direct_mux[which] >> 5) & 3;
@@ -856,7 +838,7 @@ uint8_t saturn_state::smpc_th_control_mode(uint16_t in_value, bool which)
return res;
}
-uint8_t saturn_state::smpc_direct_mode(uint16_t in_value,bool which)
+uint8_t sat_console_state::smpc_direct_mode(uint16_t in_value,bool which)
{
uint8_t hshake = (m_direct_mux[which] >> 5) & 3;
const int shift_bit[4] = { 4, 12, 8, 0 };
@@ -891,10 +873,11 @@ static MACHINE_CONFIG_START( saturn )
// SMPC MCU, running at 4 MHz (+ custom RTC device that runs at 32.768 KHz)
MCFG_SMPC_HLE_ADD("smpc", XTAL_4MHz)
- MCFG_SMPC_HLE_PDR1_IN_CB(READ8(saturn_state, saturn_pdr1_direct_r))
- MCFG_SMPC_HLE_PDR2_IN_CB(READ8(saturn_state, saturn_pdr2_direct_r))
- MCFG_SMPC_HLE_PDR1_OUT_CB(WRITE8(saturn_state, saturn_pdr1_direct_w))
- MCFG_SMPC_HLE_PDR2_OUT_CB(WRITE8(saturn_state, saturn_pdr2_direct_w))
+ smpc_hle_device::static_set_control_port_tags(*device, "ctrl1", "ctrl2");
+ MCFG_SMPC_HLE_PDR1_IN_CB(READ8(sat_console_state, saturn_pdr1_direct_r))
+ MCFG_SMPC_HLE_PDR2_IN_CB(READ8(sat_console_state, saturn_pdr2_direct_r))
+ MCFG_SMPC_HLE_PDR1_OUT_CB(WRITE8(sat_console_state, saturn_pdr1_direct_w))
+ MCFG_SMPC_HLE_PDR2_OUT_CB(WRITE8(sat_console_state, saturn_pdr2_direct_w))
MCFG_SMPC_HLE_MASTER_RESET_CB(WRITELINE(saturn_state, master_sh2_reset_w))
MCFG_SMPC_HLE_MASTER_NMI_CB(WRITELINE(saturn_state, master_sh2_nmi_w))
MCFG_SMPC_HLE_SLAVE_RESET_CB(WRITELINE(saturn_state, slave_sh2_reset_w))
@@ -908,7 +891,6 @@ static MACHINE_CONFIG_START( saturn )
MCFG_MACHINE_RESET_OVERRIDE(sat_console_state,saturn)
MCFG_NVRAM_ADD_CUSTOM_DRIVER("nvram", sat_console_state, nvram_init)
- MCFG_NVRAM_ADD_0FILL("smpc_nv") // TODO: default for each region (+ move it inside SMPC when converted to device)
MCFG_TIMER_DRIVER_ADD("sector_timer", sat_console_state, stv_sector_cb)
MCFG_TIMER_DRIVER_ADD("sh1_cmd", sat_console_state, stv_sh1_sim)
@@ -961,6 +943,9 @@ MACHINE_CONFIG_DERIVED( saturnus, saturn )
MCFG_SATURN_CARTRIDGE_ADD("exp", saturn_cart, nullptr)
MCFG_SOFTWARE_LIST_ADD("cart_list","sat_cart")
+ MCFG_DEVICE_MODIFY("smpc")
+ smpc_hle_device::static_set_region_code(*device, 4);
+
MACHINE_CONFIG_END
MACHINE_CONFIG_DERIVED( saturneu, saturn )
@@ -974,6 +959,8 @@ MACHINE_CONFIG_DERIVED( saturneu, saturn )
MCFG_SATURN_CARTRIDGE_ADD("exp", saturn_cart, nullptr)
MCFG_SOFTWARE_LIST_ADD("cart_list","sat_cart")
+ MCFG_DEVICE_MODIFY("smpc")
+ smpc_hle_device::static_set_region_code(*device, 12);
MACHINE_CONFIG_END
MACHINE_CONFIG_DERIVED( saturnjp, saturn )
@@ -987,12 +974,14 @@ MACHINE_CONFIG_DERIVED( saturnjp, saturn )
MCFG_SATURN_CARTRIDGE_ADD("exp", saturn_cart, nullptr)
MCFG_SOFTWARE_LIST_ADD("cart_list","sat_cart")
+ MCFG_DEVICE_MODIFY("smpc")
+ smpc_hle_device::static_set_region_code(*device, 1);
MACHINE_CONFIG_END
void sat_console_state::saturn_init_driver(int rgn)
{
- m_saturn_region = rgn;
+// m_saturn_region = rgn;
m_vdp2.pal = (rgn == 12) ? 1 : 0;
// set compatible options