diff options
| author | 2025-11-16 17:19:42 +0100 | |
|---|---|---|
| committer | 2025-11-16 17:19:49 +0100 | |
| commit | 3c38125ab387f16ba3dd083e6be8b398254f0b96 (patch) | |
| tree | b260bd1d94dd3e5190057ba5bd4c90005dba1e89 | |
| parent | 81aaeb52eba8536bac61b138b93728d2b1ecfd32 (diff) | |
machine/smpc.cpp: remove device_memory_interface, fix open bus access, move to sega folder, relicense to BSD-3
| -rw-r--r-- | scripts/src/machine.lua | 11 | ||||
| -rw-r--r-- | src/mame/sega/saturn.cpp | 3 | ||||
| -rw-r--r-- | src/mame/sega/saturn.h | 2 | ||||
| -rw-r--r-- | src/mame/sega/smpc.cpp (renamed from src/devices/machine/smpc.cpp) | 67 | ||||
| -rw-r--r-- | src/mame/sega/smpc.h (renamed from src/devices/machine/smpc.h) | 24 | ||||
| -rw-r--r-- | src/mame/sega/stv.cpp | 3 |
6 files changed, 40 insertions, 70 deletions
diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua index 638c6986b56..8f1722bdd00 100644 --- a/scripts/src/machine.lua +++ b/scripts/src/machine.lua @@ -3423,17 +3423,6 @@ if (MACHINES["SMC91C9X"]~=null) then } end ---------------------------------------------------- --- ---@src/devices/machine/smpc.h,MACHINES["SMPC"] = true ---------------------------------------------------- - -if (MACHINES["SMPC"]~=null) then - files { - MAME_DIR .. "src/devices/machine/smpc.cpp", - MAME_DIR .. "src/devices/machine/smpc.h", - } -end --------------------------------------------------- -- diff --git a/src/mame/sega/saturn.cpp b/src/mame/sega/saturn.cpp index d8dc97c455b..f1c097beab6 100644 --- a/src/mame/sega/saturn.cpp +++ b/src/mame/sega/saturn.cpp @@ -431,7 +431,6 @@ test1f diagnostic hacks: #include "cpu/m68000/m68000.h" #include "cpu/scudsp/scudsp.h" #include "machine/nvram.h" -#include "machine/smpc.h" #include "bus/saturn/bram.h" #include "bus/saturn/dram.h" @@ -547,7 +546,7 @@ uint32_t sat_console_state::abus_dummy_r(offs_t offset) void sat_console_state::saturn_mem(address_map &map) { map(0x00000000, 0x0007ffff).rom().mirror(0x20000000).region("bios", 0).nopw(); // bios - map(0x00100000, 0x0010007f).rw(m_smpc_hle, FUNC(smpc_hle_device::read), FUNC(smpc_hle_device::write)); + map(0x00100000, 0x0010007f).mirror(0x2007ff80).m(m_smpc_hle, FUNC(smpc_hle_device::io_map)); map(0x00180000, 0x0018ffff).rw(FUNC(sat_console_state::backupram_r), FUNC(sat_console_state::backupram_w)).share("share1"); map(0x00200000, 0x002fffff).ram().mirror(0x20100000).share("workram_l"); map(0x01000000, 0x017fffff).w(FUNC(sat_console_state::saturn_minit_w)); diff --git a/src/mame/sega/saturn.h b/src/mame/sega/saturn.h index aeac9234742..617b03154c5 100644 --- a/src/mame/sega/saturn.h +++ b/src/mame/sega/saturn.h @@ -13,8 +13,8 @@ #include "315-5881_crypt.h" #include "315-5838_317-0229_comp.h" +#include "smpc.h" #include "machine/sega_scu.h" -#include "machine/smpc.h" #include "machine/timer.h" #include "sound/scsp.h" diff --git a/src/devices/machine/smpc.cpp b/src/mame/sega/smpc.cpp index e70ab757dc7..9bb34e11838 100644 --- a/src/devices/machine/smpc.cpp +++ b/src/mame/sega/smpc.cpp @@ -1,4 +1,4 @@ -// license:LGPL-2.1+ +// license:BSD-3-Clause // copyright-holders:Angelo Salese, R. Belmont /************************************************************************************ @@ -7,8 +7,6 @@ Sega Saturn SMPC - System Manager and Peripheral Control MCU simulation The SMPC is actually a 4-bit Hitachi HD404920FS MCU, labeled with a Sega custom 315-5744 (that needs decapping) -MCU simulation by Angelo Salese & R. Belmont - TODO: - timings; - fix intback issue with inputs (according to the docs, it should fall in between @@ -165,8 +163,9 @@ SMPC NVRAM contents: #include "screen.h" #include "coreutil.h" +#define LOG_COMMAND (1U << 1) +#define LOG_PAD_CMD (1U << 2) -#define LOG_PAD_CMD (1U << 1) #define VERBOSE (0) #include "logmacro.h" @@ -178,11 +177,12 @@ SMPC NVRAM contents: // device type definition DEFINE_DEVICE_TYPE(SMPC_HLE, smpc_hle_device, "smpc_hle", "Sega Saturn SMPC HLE (HD404920FS)") -// TODO: use DEVICE_ADDRESS_MAP once this fatalerror is fixed: -// "uplift_submaps unhandled case: range straddling slots." -void smpc_hle_device::smpc_regs(address_map &map) +void smpc_hle_device::io_map(address_map &map) { -// map.unmap_value_high(); + map(0x00, 0x7f).lr8(NAME([this] (offs_t offset) { + logerror("%s: Read to [%02x] open bus address\n", machine().describe_context(), offset & 0x7f); + return offset & 1 ? 0x00 : 0xff; + })); map(0x00, 0x0d).w(FUNC(smpc_hle_device::ireg_w)); map(0x1f, 0x1f).w(FUNC(smpc_hle_device::command_register_w)); map(0x20, 0x5f).r(FUNC(smpc_hle_device::oreg_r)); @@ -206,9 +206,7 @@ void smpc_hle_device::smpc_regs(address_map &map) smpc_hle_device::smpc_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, SMPC_HLE, tag, owner, clock) - , device_memory_interface(mconfig, *this) , device_rtc_interface(mconfig, *this) - , m_space_config("regs", ENDIANNESS_LITTLE, 8, 7, 0, address_map_constructor(FUNC(smpc_hle_device::smpc_regs), this)) , m_mini_nvram(*this, "smem") , m_mshres(*this) , m_mshnmi(*this) @@ -292,8 +290,8 @@ void smpc_hle_device::device_reset() m_pdr1_readback = 0; m_pdr2_readback = 0; - memset(m_ireg,0,7); - memset(m_oreg,0,32); + memset(m_ireg, 0, 7); + memset(m_oreg, 0, 32); m_cmd_timer->reset(); m_intback_timer->reset(); @@ -322,13 +320,6 @@ void smpc_hle_device::rtc_clock_updated(int year, int month, int day, int day_of m_rtc_data[6] = DectoBCD(second); } -device_memory_interface::space_config_vector smpc_hle_device::memory_space_config() const -{ - return space_config_vector { - std::make_pair(0, &m_space_config) - }; -} - //************************************************************************** // READ/WRITE HANDLERS @@ -367,8 +358,8 @@ void smpc_hle_device::ireg_w(offs_t offset, uint8_t data) uint8_t smpc_hle_device::oreg_r(offs_t offset) { - if (!(offset & 1)) // avoid reading to even bytes (TODO: is it 0s or 1s?) - return 0x00; + if (!(offset & 1)) + return 0xff; return m_oreg[offset >> 1]; } @@ -381,7 +372,7 @@ uint8_t smpc_hle_device::status_register_r() uint8_t smpc_hle_device::status_flag_r() { // bit 3: CD enable related? - return (m_sf<<0) | (m_cd_sf<<3); + return (m_sf << 0) | (m_cd_sf << 3); } void smpc_hle_device::status_flag_w(uint8_t data) @@ -491,18 +482,6 @@ inline void smpc_hle_device::irq_request() m_irq_line(0); } -// TODO: trampolines that needs to go away - -uint8_t smpc_hle_device::read(offs_t offset) -{ - return this->space().read_byte(offset); -} - -void smpc_hle_device::write(offs_t offset, uint8_t data) -{ - this->space().write_byte(offset,data); -} - //************************************************************************** // Command simulation //************************************************************************** @@ -563,18 +542,21 @@ TIMER_CALLBACK_MEMBER(smpc_hle_device::handle_command) switch(m_comreg) { case 0x00: // MSHON + LOGMASKED(LOG_COMMAND, "SMPC: %02x MSHON\n", m_comreg); // enable Master SH2 m_mshres(m_comreg & 1); break; case 0x02: // SSHON case 0x03: // SSHOFF + LOGMASKED(LOG_COMMAND, "SMPC: %02x SSH%s\n", m_comreg, m_comreg & 1 ? "OFF" : "ON"); // enable or disable Slave SH2 m_sshres(m_comreg & 1); break; case 0x06: // SNDON case 0x07: // SNDOFF + LOGMASKED(LOG_COMMAND, "SMPC: %02x SND%s\n", m_comreg, m_comreg & 1 ? "OFF" : "ON"); // enable or disable 68k m_sndres(m_comreg & 1); break; @@ -582,6 +564,7 @@ TIMER_CALLBACK_MEMBER(smpc_hle_device::handle_command) case 0x08: // CDON case 0x09: // CDOFF // ... + LOGMASKED(LOG_COMMAND, "SMPC: %02x CD%s\n", m_comreg, m_comreg & 1 ? "OFF" : "ON"); m_command_in_progress = false; m_oreg[31] = m_comreg; // TODO: diagnostic also wants this to have bit 3 high @@ -594,9 +577,11 @@ TIMER_CALLBACK_MEMBER(smpc_hle_device::handle_command) popmessage("%s: NetLink enabled", this->tag()); [[fallthrough]]; case 0x0b: // NETLINKOFF + LOGMASKED(LOG_COMMAND, "SMPC: %02x NETLINK%s\n", m_comreg, m_comreg & 1 ? "OFF" : "ON"); break; case 0x0d: // SYSRES + LOGMASKED(LOG_COMMAND, "SMPC: %02x SYSRES\n", m_comreg); // send a 1 -> 0 to device reset lines m_sysres(1); m_sysres(0); @@ -608,6 +593,7 @@ TIMER_CALLBACK_MEMBER(smpc_hle_device::handle_command) case 0x0e: // CKCHG352 case 0x0f: // CKCHG320 + LOGMASKED(LOG_COMMAND, "SMPC: %02x CKCHG%s\n", m_comreg, m_comreg & 1 ? "320" : "352"); m_dotsel(m_comreg & 1); // assert Slave SH2 line @@ -626,19 +612,24 @@ TIMER_CALLBACK_MEMBER(smpc_hle_device::handle_command) break; case 0x10: // INTBACK + // ignore logging, very verbose resolve_intback(); return; case 0x16: // SETTIME { - for(int i=0;i<7;i++) + LOGMASKED(LOG_COMMAND, "SMPC: %02x SETTIME\n", m_comreg); + + for(int i = 0; i < 7; i++) m_rtc_data[i] = m_ireg[i]; break; } case 0x17: // SETSMEM { - for(int i=0;i<4;i++) + LOGMASKED(LOG_COMMAND, "SMPC: %02x SETSMEM\n", m_comreg); + + for(int i = 0; i < 4; i++) m_smem[i] = m_ireg[i]; // clear the SETIME variable, simulate a cr2032 battery alive in the system @@ -647,17 +638,19 @@ TIMER_CALLBACK_MEMBER(smpc_hle_device::handle_command) } case 0x18: // NMIREQ + LOGMASKED(LOG_COMMAND, "SMPC: %02x NMIREQ\n", m_comreg); // NMI is unconditionally requested master_sh2_nmi(); break; case 0x19: // RESENAB case 0x1a: // RESDISA + LOGMASKED(LOG_COMMAND, "SMPC: %02x RES%s\n", m_comreg, m_comreg & 1 ? "DISA" : "ENAB"); m_NMI_reset = m_comreg & 1; break; default: - logerror("%s: unemulated %02x command\n",this->tag(),m_comreg); + popmessage("%s: unemulated %02x command", this->tag(), m_comreg); return; } diff --git a/src/devices/machine/smpc.h b/src/mame/sega/smpc.h index dfe8d541be5..69d0ac4545b 100644 --- a/src/devices/machine/smpc.h +++ b/src/mame/sega/smpc.h @@ -1,20 +1,16 @@ -// license:LGPL-2.1+ +// license:BSD-3-Clause // copyright-holders:Angelo Salese, R. Belmont -// TODO: make separate device when code is decoupled better -//void stv_SMPC_w(offs_t offset, uint8_t data); -//uint8_t stv_SMPC_r(offs_t offset); -//void saturn_SMPC_w(offs_t offset, uint8_t data); -//uint8_t saturn_SMPC_r(offs_t offset); -#ifndef MAME_MACHINE_SMPC_H -#define MAME_MACHINE_SMPC_H +#ifndef MAME_SEGA_SMPC_H +#define MAME_SEGA_SMPC_H #pragma once -#include "screen.h" #include "bus/sat_ctrl/ctrl.h" #include "machine/nvram.h" + #include "dirtc.h" +#include "screen.h" //************************************************************************** @@ -24,7 +20,6 @@ // ======================> smpc_hle_device class smpc_hle_device : public device_t, - public device_memory_interface, public device_rtc_interface { public: @@ -32,9 +27,7 @@ public: smpc_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // I/O operations -// void io_map(address_map &map) ATTR_COLD; - uint8_t read(offs_t offset); - void write(offs_t offset, uint8_t data); + void io_map(address_map &map) ATTR_COLD; DECLARE_INPUT_CHANGED_MEMBER( trigger_nmi_r ); @@ -88,7 +81,6 @@ protected: virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; virtual void device_start() override ATTR_COLD; virtual void device_reset() override ATTR_COLD; - virtual space_config_vector memory_space_config() const override; // device_rtc_interface overrides virtual bool rtc_feature_y2k() const override { return true; } @@ -177,8 +169,6 @@ private: required_device<screen_device> m_screen; - void smpc_regs(address_map &map) ATTR_COLD; - void ireg_w(offs_t offset, uint8_t data); void command_register_w(uint8_t data); uint8_t oreg_r(offs_t offset); @@ -199,4 +189,4 @@ private: // device type definition DECLARE_DEVICE_TYPE(SMPC_HLE, smpc_hle_device) -#endif // MAME_MACHINE_SMPC_H +#endif // MAME_SEGA_SMPC_H diff --git a/src/mame/sega/stv.cpp b/src/mame/sega/stv.cpp index 7c6461c1bea..41b4f1a9ce2 100644 --- a/src/mame/sega/stv.cpp +++ b/src/mame/sega/stv.cpp @@ -31,7 +31,6 @@ TODO: #include "cpu/m68000/m68000.h" #include "cpu/scudsp/scudsp.h" #include "cpu/sh/sh7604.h" -#include "machine/smpc.h" #include "sound/scsp.h" #include "softlist.h" @@ -978,7 +977,7 @@ void stv_state::init_stv_us() void stv_state::stv_mem(address_map &map) { map(0x00000000, 0x0007ffff).rom().mirror(0x20000000).region("bios", 0); // bios - map(0x00100000, 0x0010007f).rw(m_smpc_hle, FUNC(smpc_hle_device::read), FUNC(smpc_hle_device::write)); + map(0x00100000, 0x0010007f).mirror(0x2007ff80).m(m_smpc_hle, FUNC(smpc_hle_device::io_map)); map(0x00180000, 0x0018ffff).rw(FUNC(stv_state::backupram_r), FUNC(stv_state::backupram_w)).share("share1"); map(0x00200000, 0x002fffff).ram().mirror(0x20100000).share("workram_l"); map(0x00400000, 0x0040003f).rw(FUNC(stv_state::ioga_r), FUNC(stv_state::ioga_w)).umask32(0x00ff00ff); |
