From 4973da5f73f86a6090c1ed6e357d5202ec657b32 Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Sat, 10 Mar 2018 18:24:47 +0100 Subject: [PATCH] Remove first_screen from smpc, nw --- src/devices/cpu/nuon/nuon.cpp | 62 ++++++++++++++++++++++++++++++ src/devices/cpu/nuon/nuon.h | 71 +++++++++++++++++++++++++++++++++++ src/devices/machine/smpc.cpp | 6 +-- src/devices/machine/smpc.h | 13 +++++-- src/mame/drivers/saturn.cpp | 3 +- src/mame/drivers/stv.cpp | 1 + 6 files changed, 147 insertions(+), 9 deletions(-) create mode 100644 src/devices/cpu/nuon/nuon.cpp create mode 100644 src/devices/cpu/nuon/nuon.h diff --git a/src/devices/cpu/nuon/nuon.cpp b/src/devices/cpu/nuon/nuon.cpp new file mode 100644 index 00000000000..c9b12b4cacb --- /dev/null +++ b/src/devices/cpu/nuon/nuon.cpp @@ -0,0 +1,62 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + VM Labs Aries 3 "NUON Multi-Media Architecture" simulator + + - Changelist - + 10 Mar. 2018 + - Initial skeleton version. +*/ + +#include "emu.h" +#include "nuon.h" +#include "nuondasm.h" +#include "debugger.h" + +#define VERBOSE_LEVEL (0) + +#define ENABLE_VERBOSE_LOG (0) + +static inline void ATTR_PRINTF(3, 4) verboselogout(device_t &dev, uint32_t pc, const char *s_fmt, ...) +{ + va_list v; + char buf[32768]; + va_start(v, s_fmt); + vsprintf(buf, s_fmt, v); + va_end(v); + dev.logerror("%08x: %s", pc, buf); +} + +#define verboselog(x,y,...) do { if (ENABLE_VERBOSE_LOG && (VERBOSE_LEVEL >= y)) verboselogout(*this, x, __VA_ARGS__); } while (false) + +//************************************************************************** +// DEVICE INTERFACE +//************************************************************************** + +DEFINE_DEVICE_TYPE(NUON, nuon_device, "nuon", "Aries 3 \"Nuon\"") + +//------------------------------------------------- +// nuon_device - constructor +//------------------------------------------------- + +nuon_device::nuon_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : cpu_device(mconfig, NUON, tag, owner, clock) + , m_program_configs{{"program_mpe0", ENDIANNESS_BIG, 32, 32}, + {"program_mpe1", ENDIANNESS_BIG, 32, 32}, + {"program_mpe2", ENDIANNESS_BIG, 32, 32}, + {"program_mpe3", ENDIANNESS_BIG, 32, 32}} +{ +} + +//------------------------------------------------- +// unimplemented_opcode - bail on unspuported +// instruction +//------------------------------------------------- + +void nuon_device::unimplemented_opcode(uint32_t op) +{ +// machine().debug_break(); + fatalerror("Nuon: unknown opcode (%08x) at %08x\n", op, m_pc); +} + + diff --git a/src/devices/cpu/nuon/nuon.h b/src/devices/cpu/nuon/nuon.h new file mode 100644 index 00000000000..14b5e185d4d --- /dev/null +++ b/src/devices/cpu/nuon/nuon.h @@ -0,0 +1,71 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/* + VM Labs Aries 3 "NUON Multi-Media Architecture" simulator + + - Changelist - + 10 Mar. 2018 + - Initial skeleton version. +*/ + +#ifndef MAME_CPU_NUON_NUON_H +#define MAME_CPU_NUON_NUON_H + +#pragma once + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class nuon_device : public cpu_device +{ +public: + nuon_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_execute_interface overrides + virtual uint32_t execute_min_cycles() const override; + virtual uint32_t execute_max_cycles() const override; + virtual uint32_t execute_input_lines() const override; + virtual void execute_run() override; + virtual void execute_set_input(int inputnum, int state) override; + + // device_memory_interface overrides + virtual space_config_vector memory_space_config() const override; + + // device_disasm_interface overrides + virtual util::disasm_interface *create_disassembler() override; + + // device_state_interface overrides + virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; + + // utility functions + void unimplemented_opcode(uint32_t op); + + struct mpe_t + { + // address spaces + const address_space_config m_program_config; + address_space *m_program; + + // registers + uint32_t m_pc; + } + + const address_space_config m_program_configs[4]; + address_space *m_program[4]; + + // registers + uint32_t m_pc[4]; + + // other internal states + int m_icount; +}; + +DECLARE_DEVICE_TYPE(NUON, nuon_device) + +#endif /* MAME_CPU_NUON_NUON_H */ \ No newline at end of file diff --git a/src/devices/machine/smpc.cpp b/src/devices/machine/smpc.cpp index 0f6154a5b60..da92c329237 100644 --- a/src/devices/machine/smpc.cpp +++ b/src/devices/machine/smpc.cpp @@ -219,7 +219,8 @@ smpc_hle_device::smpc_hle_device(const machine_config &mconfig, const char *tag, m_pdr2_write(*this), m_irq_line(*this), m_ctrl1(nullptr), - m_ctrl2(nullptr) + m_ctrl2(nullptr), + m_screen(*this, finder_base::DUMMY_TAG) { m_ctrl1 = nullptr; m_ctrl2 = nullptr; @@ -289,9 +290,6 @@ void smpc_hle_device::device_start() m_intback_timer = timer_alloc(INTBACK_ID); m_sndres_timer = timer_alloc(SNDRES_ID); -// TODO: tag-ify, needed when SCU will be a device - m_screen = machine().first_screen(); - m_rtc_data[0] = DectoBCD(systime.local_time.year / 100); m_rtc_data[1] = DectoBCD(systime.local_time.year % 100); m_rtc_data[2] = (systime.local_time.weekday << 4) | (systime.local_time.month+1); diff --git a/src/devices/machine/smpc.h b/src/devices/machine/smpc.h index ab9fc141097..abdf526c508 100644 --- a/src/devices/machine/smpc.h +++ b/src/devices/machine/smpc.h @@ -23,6 +23,12 @@ #define MCFG_SMPC_HLE_ADD(tag, clock) \ MCFG_DEVICE_ADD((tag), SMPC_HLE, (clock)) +#define MCFG_SMPC_HLE_SCREEN(screen_tag) \ + downcast(*device).set_screen_tag(("^" screen_tag)); + +#define MCFG_SMPC_HLE_CONTROL_PORTS(ctrl1_tag, ctrl2_tag) \ + downcast(*device).set_control_port_tags(ctrl1_tag, ctrl2_tag); + #define MCFG_SMPC_HLE_PDR1_IN_CB(_devcb) \ devcb = &downcast(*device).set_pdr1_in_handler(DEVCB_##_devcb); @@ -139,9 +145,8 @@ public: devcb_base &set_interrupt_handler(Object &&cb) { return m_irq_line.set_callback(std::forward(cb)); } - void set_region_code(uint8_t rgn) - { m_region_code = rgn; } - + void set_region_code(uint8_t rgn) { m_region_code = rgn; } + void set_screen_tag(const char *tag) { m_screen.set_tag(tag); } void set_control_port_tags(const char *tag1, const char *tag2) { m_ctrl1_tag = tag1; @@ -245,7 +250,7 @@ private: saturn_control_port_device *m_ctrl1; saturn_control_port_device *m_ctrl2; - screen_device *m_screen; + required_device m_screen; void smpc_regs(address_map &map); diff --git a/src/mame/drivers/saturn.cpp b/src/mame/drivers/saturn.cpp index 00d6a0d5a4b..d27f87e553a 100644 --- a/src/mame/drivers/saturn.cpp +++ b/src/mame/drivers/saturn.cpp @@ -804,7 +804,8 @@ MACHINE_CONFIG_START(sat_console_state::saturn) // SMPC MCU, running at 4 MHz (+ custom RTC device that runs at 32.768 KHz) MCFG_SMPC_HLE_ADD("smpc", XTAL(4'000'000)) - downcast(*device).set_control_port_tags("ctrl1", "ctrl2"); + MCFG_SMPC_HLE_SCREEN("screen") + MCFG_SMPC_HLE_CONTROL_PORTS("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)) diff --git a/src/mame/drivers/stv.cpp b/src/mame/drivers/stv.cpp index 72cdfaf871a..e183c0743fc 100644 --- a/src/mame/drivers/stv.cpp +++ b/src/mame/drivers/stv.cpp @@ -1079,6 +1079,7 @@ MACHINE_CONFIG_START(stv_state::stv) downcast(*device).set_hostcpu("maincpu"); MCFG_SMPC_HLE_ADD("smpc", XTAL(4'000'000)) + MCFG_SMPC_HLE_SCREEN("screen") downcast(*device).set_region_code(0); MCFG_SMPC_HLE_PDR1_IN_CB(READ8(stv_state, pdr1_input_r)) MCFG_SMPC_HLE_PDR2_IN_CB(READ8(stv_state, pdr2_input_r))