summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2022-10-12 13:22:26 -0400
committer AJR <ajrhacker@users.noreply.github.com>2022-10-12 13:22:26 -0400
commit6c1e5da058b9f355a6e18d80f006352917f15209 (patch)
treea3502c9706e1ca5d20bbaa372aeb2d908d784fb3
parentf04b5e9f23a618b8274d82a6c427d1aed2bfc7bc (diff)
unkts: Hook up new skeleton CPU device
-rw-r--r--scripts/src/cpu.lua9
-rw-r--r--src/devices/cpu/nios2/nios2.cpp62
-rw-r--r--src/devices/cpu/nios2/nios2.h51
-rw-r--r--src/mame/misc/truesys.cpp7
4 files changed, 125 insertions, 4 deletions
diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua
index 224bd8eaa54..7da192d9304 100644
--- a/scripts/src/cpu.lua
+++ b/scripts/src/cpu.lua
@@ -3671,10 +3671,17 @@ if opt_tool(CPUS, "MN1610") then
end
--------------------------------------------------
--- Altera Nios II (disassembler only)
+-- Altera Nios II
--@src/devices/cpu/nios2/nios2.h,CPUS["NIOS2"] = true
--------------------------------------------------
+if CPUS["NIOS2"] then
+ files {
+ MAME_DIR .. "src/devices/cpu/nios2/nios2.cpp",
+ MAME_DIR .. "src/devices/cpu/nios2/nios2.h",
+ }
+end
+
if opt_tool(CPUS, "NIOS2") then
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/nios2/nios2dasm.cpp")
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/nios2/nios2dasm.h")
diff --git a/src/devices/cpu/nios2/nios2.cpp b/src/devices/cpu/nios2/nios2.cpp
new file mode 100644
index 00000000000..39dd0fc6209
--- /dev/null
+++ b/src/devices/cpu/nios2/nios2.cpp
@@ -0,0 +1,62 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+/***************************************************************************
+
+ Altera Nios II soft processor
+
+ Currently this device is just a stub with no actual execution core.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "nios2.h"
+#include "nios2dasm.h"
+
+// device type definition
+DEFINE_DEVICE_TYPE(NIOS2, nios2_device, "nios2", "Altera Nios II Processor")
+
+nios2_device::nios2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : cpu_device(mconfig, NIOS2, tag, owner, clock)
+ , m_program_config("program", ENDIANNESS_LITTLE, 32, 32, 0)
+{
+ std::fill(std::begin(m_gpr), std::end(m_gpr), 0);
+}
+
+std::unique_ptr<util::disasm_interface> nios2_device::create_disassembler()
+{
+ return std::make_unique<nios2_disassembler>();
+}
+
+device_memory_interface::space_config_vector nios2_device::memory_space_config() const
+{
+ return space_config_vector {
+ std::make_pair(AS_PROGRAM, &m_program_config)
+ };
+}
+
+void nios2_device::device_start()
+{
+ space(AS_PROGRAM).cache(m_cache);
+
+ set_icountptr(m_icount);
+
+ state_add(NIOS2_PC, "PC", m_pc);
+ state_add(STATE_GENPC, "GENPC", m_pc).noshow();
+ state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow();
+ for (int i = 1; i < 32; i++)
+ state_add(NIOS2_R1 + i - 1, util::string_format("r%d", i).c_str(), m_gpr[i]);
+
+ save_item(NAME(m_gpr));
+ save_item(NAME(m_pc));
+}
+
+void nios2_device::device_reset()
+{
+ m_pc = 0;
+}
+
+void nios2_device::execute_run()
+{
+ debugger_instruction_hook(m_pc);
+ m_icount = 0;
+}
diff --git a/src/devices/cpu/nios2/nios2.h b/src/devices/cpu/nios2/nios2.h
new file mode 100644
index 00000000000..de2073e0e47
--- /dev/null
+++ b/src/devices/cpu/nios2/nios2.h
@@ -0,0 +1,51 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+
+#ifndef MAME_CPU_NIOS2_NIOS2_H
+#define MAME_CPU_NIOS2_NIOS2_H
+
+#pragma once
+
+class nios2_device : public cpu_device
+{
+public:
+ enum {
+ NIOS2_R1 = 1, NIOS2_R2, NIOS2_R3, NIOS2_R4, NIOS2_R5, NIOS2_R6, NIOS2_R7,
+ NIOS2_R8, NIOS2_R9, NIOS2_R10, NIOS2_R11, NIOS2_R12, NIOS2_R13, NIOS2_R14, NIOS2_R15,
+ NIOS2_R16, NIOS2_R17, NIOS2_R18, NIOS2_R19, NIOS2_R20, NIOS2_R21, NIOS2_R22, NIOS2_R23,
+ NIOS2_R24, NIOS2_R25, NIOS2_R26, NIOS2_R27, NIOS2_R28, NIOS2_R29, NIOS2_R30, NIOS2_R31,
+ NIOS2_PC,
+ };
+
+ // construction/destruction
+ nios2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // device_execute_interface overrides
+ virtual void execute_run() override;
+
+ // device_disasm_interface overrides
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+
+ // device_memory_interface overrides
+ virtual space_config_vector memory_space_config() const override;
+
+private:
+ // address space
+ address_space_config m_program_config;
+ memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache m_cache;
+
+ // internal registers
+ u32 m_gpr[32];
+ u32 m_pc;
+ s32 m_icount;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(NIOS2, nios2_device)
+
+#endif // MAME_CPU_NIOS2_NIOS2_H
diff --git a/src/mame/misc/truesys.cpp b/src/mame/misc/truesys.cpp
index d0833f67556..32e1c522e5b 100644
--- a/src/mame/misc/truesys.cpp
+++ b/src/mame/misc/truesys.cpp
@@ -15,14 +15,14 @@ M4T28 TimeKeeper
IS42S16 SDRAM
2x RAMs (type not readable)
-It seems the game is run by a soft CPU core programmed in the FPGA.
+It seems the game is run by a Nios II soft CPU core programmed in the FPGA.
The main CPU ROMs contains strings in English (system stuff) and Spanish (game strings).
Manufacturer is unknown. There is an Azkoyen string in ROM, but it's probably the bill validator manufacturer.
*/
#include "emu.h"
-#include "cpu/h8/h8s2320.h"
+#include "cpu/nios2/nios2.h"
#include "screen.h"
#include "speaker.h"
@@ -55,6 +55,7 @@ uint32_t truesys_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma
void truesys_state::main_map(address_map &map)
{
+ map(0x00000000, 0x0007ffff).rom().region("maincpu", 0); // also mirrored at 0x00800000, 0x01000000, 0x01800000, etc.?
}
@@ -74,7 +75,7 @@ INPUT_PORTS_END
void truesys_state::unkts(machine_config &config)
{
// basic machine hardware
- H8S2328(config, m_maincpu, 32_MHz_XTAL); // TODO: there's no actual CPU, it appears to be run from the FPGA
+ NIOS2(config, m_maincpu, 32'000'000); // there's no actual CPU, it appears to be run from the FPGA
m_maincpu->set_addrmap(AS_PROGRAM, &truesys_state::main_map);
// PIC16F874. TODO: not emulated