diff options
Diffstat (limited to 'src/mame/drivers/saturn.cpp')
-rw-r--r-- | src/mame/drivers/saturn.cpp | 89 |
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 |