From dff3955a3ae9cb8a4a9d87585ac7df21eea367d2 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 6 May 2023 18:07:17 +0200 Subject: [PATCH] mn1400: add device skeleton --- scripts/src/cpu.lua | 14 ++- src/devices/cpu/mn1400/mn1400.cpp | 62 ++++++++++++ src/devices/cpu/mn1400/mn1400.h | 49 ++++++++++ src/devices/cpu/mn1400/mn1400base.cpp | 131 ++++++++++++++++++++++++++ src/devices/cpu/mn1400/mn1400base.h | 74 +++++++++++++++ src/devices/cpu/mn1400/mn1400d.cpp | 14 +-- src/devices/cpu/mn1400/mn1400d.h | 2 +- src/devices/cpu/mn1400/mn1400op.cpp | 18 ++++ 8 files changed, 355 insertions(+), 9 deletions(-) create mode 100644 src/devices/cpu/mn1400/mn1400.cpp create mode 100644 src/devices/cpu/mn1400/mn1400.h create mode 100644 src/devices/cpu/mn1400/mn1400base.cpp create mode 100644 src/devices/cpu/mn1400/mn1400base.h create mode 100644 src/devices/cpu/mn1400/mn1400op.cpp diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index 66bf5aa2738..efb064491fb 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -2267,10 +2267,20 @@ if opt_tool(CPUS, "RSP") then end -------------------------------------------------- --- Matsushita (Panasonic) MN1400, disassembler only ---@src/devices/cpu/mn1400/mn1400d.h,CPUS["MN1400"] = true +-- Matsushita (Panasonic) MN1400 +--@src/devices/cpu/mn1400/mn1400.h,CPUS["MN1400"] = true -------------------------------------------------- +if CPUS["MN1400"] then + files { + MAME_DIR .. "src/devices/cpu/mn1400/mn1400base.cpp", + MAME_DIR .. "src/devices/cpu/mn1400/mn1400base.h", + MAME_DIR .. "src/devices/cpu/mn1400/mn1400.cpp", + MAME_DIR .. "src/devices/cpu/mn1400/mn1400.h", + MAME_DIR .. "src/devices/cpu/mn1400/mn1400op.cpp", + } +end + if opt_tool(CPUS, "MN1400") then table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/mn1400/mn1400d.cpp") table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/mn1400/mn1400d.h") diff --git a/src/devices/cpu/mn1400/mn1400.cpp b/src/devices/cpu/mn1400/mn1400.cpp new file mode 100644 index 00000000000..e477ffc47fd --- /dev/null +++ b/src/devices/cpu/mn1400/mn1400.cpp @@ -0,0 +1,62 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + Matsushita MN1400 MCU + +TODO: +- stuff + +*/ + +#include "emu.h" +#include "mn1400.h" + +#include "mn1400d.h" + + +DEFINE_DEVICE_TYPE(MN1400, mn1400_cpu_device, "mn1400", "Matsushita MN1400") + + +// constructor +mn1400_cpu_device::mn1400_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data) : + mn1400_base_device(mconfig, type, tag, owner, clock, prgwidth, program, datawidth, data) +{ } + +mn1400_cpu_device::mn1400_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + mn1400_cpu_device(mconfig, MN1400, tag, owner, clock, 10, address_map_constructor(FUNC(mn1400_cpu_device::program_1024x8), this), 6, address_map_constructor(FUNC(mn1400_cpu_device::data_64x4), this)) +{ } + + +// internal memory maps +void mn1400_cpu_device::program_1024x8(address_map &map) +{ + map(0x000, 0x3ff).rom(); +} + +void mn1400_cpu_device::data_64x4(address_map &map) +{ + map(0x00, 0x3f).ram(); +} + + +// disasm +std::unique_ptr mn1400_cpu_device::create_disassembler() +{ + return std::make_unique(); +} + + +//------------------------------------------------- +// execute +//------------------------------------------------- + +bool mn1400_cpu_device::op_has_param(u8 op) +{ + return false; +} + +void mn1400_cpu_device::execute_one() +{ + op_illegal(); +} diff --git a/src/devices/cpu/mn1400/mn1400.h b/src/devices/cpu/mn1400/mn1400.h new file mode 100644 index 00000000000..cfe4536794a --- /dev/null +++ b/src/devices/cpu/mn1400/mn1400.h @@ -0,0 +1,49 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + Matsushita MN1400 MCU + +*/ + +#ifndef MAME_CPU_MN1400_MN1400_H +#define MAME_CPU_MN1400_MN1400_H + +#pragma once + +#include "mn1400base.h" + +// pinout reference + +/* + +*/ + +class mn1400_cpu_device : public mn1400_base_device +{ +public: + mn1400_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +protected: + mn1400_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data); + + // device_disasm_interface overrides + virtual std::unique_ptr create_disassembler() override; + + // device_execute_interface overrides + virtual void execute_one() override; + virtual bool op_has_param(u8 op) override; + + void program_1024x8(address_map &map); + void data_64x4(address_map &map); + + // opcode helpers + void op_illegal(); + + // opcode handlers +}; + + +DECLARE_DEVICE_TYPE(MN1400, mn1400_cpu_device) + +#endif // MAME_CPU_MN1400_MN1400_H diff --git a/src/devices/cpu/mn1400/mn1400base.cpp b/src/devices/cpu/mn1400/mn1400base.cpp new file mode 100644 index 00000000000..b8bd7d3b9d2 --- /dev/null +++ b/src/devices/cpu/mn1400/mn1400base.cpp @@ -0,0 +1,131 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + Matsushita (Panasonic) MN1400 family MCU cores + +x + +*/ + +#include "emu.h" +#include "mn1400base.h" + + +mn1400_base_device::mn1400_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data) : + cpu_device(mconfig, type, tag, owner, clock), + m_program_config("program", ENDIANNESS_LITTLE, 8, prgwidth, 0, program), + m_data_config("data", ENDIANNESS_LITTLE, 8, datawidth, 0, data), + m_prgwidth(prgwidth), + m_datawidth(datawidth) +{ } + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void mn1400_base_device::device_start() +{ + m_program = &space(AS_PROGRAM); + m_data = &space(AS_DATA); + m_prgmask = (1 << m_prgwidth) - 1; + m_datamask = (1 << m_datawidth) - 1; + + // resolve callbacks + + // zerofill + m_pc = 0; + m_prev_pc = 0; + m_op = 0; + m_prev_op = 0; + m_param = 0; + + m_a = 0; + m_x = 0; + m_y = 0; + + // register for savestates + save_item(NAME(m_pc)); + save_item(NAME(m_prev_pc)); + save_item(NAME(m_op)); + save_item(NAME(m_prev_op)); + save_item(NAME(m_param)); + + save_item(NAME(m_a)); + save_item(NAME(m_x)); + save_item(NAME(m_y)); + + // register state for debugger + state_add(STATE_GENPC, "GENPC", m_pc).formatstr("%03X").noshow(); + state_add(STATE_GENPCBASE, "CURPC", m_prev_pc).formatstr("%03X").noshow(); + + m_state_count = 0; + state_add(++m_state_count, "PC", m_pc).formatstr("%03X"); // 1 + state_add(++m_state_count, "A", m_a).formatstr("%01X"); // 2 + state_add(++m_state_count, "X", m_x).formatstr("%01X"); // 3 + state_add(++m_state_count, "Y", m_y).formatstr("%01X"); // 4 + + set_icountptr(m_icount); +} + +device_memory_interface::space_config_vector mn1400_base_device::memory_space_config() const +{ + return space_config_vector { + std::make_pair(AS_PROGRAM, &m_program_config), + std::make_pair(AS_DATA, &m_data_config) + }; +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void mn1400_base_device::device_reset() +{ + m_pc = m_prev_pc = 0; + m_op = m_prev_op = 0; + m_param = 0; +} + + +//------------------------------------------------- +// execute +//------------------------------------------------- + +void mn1400_base_device::cycle() +{ + m_icount--; +} + +void mn1400_base_device::increment_pc() +{ + m_pc = (m_pc + 1) & m_prgmask; +} + +void mn1400_base_device::execute_run() +{ + while (m_icount > 0) + { + // remember previous state + m_prev_op = m_op; + m_prev_pc = m_pc; + + // fetch next opcode + m_op = m_program->read_byte(m_pc); + debugger_instruction_hook(m_pc); + increment_pc(); + cycle(); + + // 2-byte opcodes + if (op_has_param(m_op)) + { + m_param = m_program->read_byte(m_pc); + increment_pc(); + cycle(); + } + + execute_one(); + } +} diff --git a/src/devices/cpu/mn1400/mn1400base.h b/src/devices/cpu/mn1400/mn1400base.h new file mode 100644 index 00000000000..ddaca48c2a1 --- /dev/null +++ b/src/devices/cpu/mn1400/mn1400base.h @@ -0,0 +1,74 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + Matsushita (Panasonic) MN1400 family MCU cores + + Don't include this file, include the specific device header instead, + for example mn1400.h + +*/ + +#ifndef MAME_CPU_MN1400_MN1400BASE_H +#define MAME_CPU_MN1400_MN1400BASE_H + +#pragma once + + +class mn1400_base_device : public cpu_device +{ +public: + // configuration helpers + // I/O ports: + +protected: + // construction/destruction + mn1400_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data); + + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_execute_interface overrides + virtual u64 execute_clocks_to_cycles(u64 clocks) const noexcept override { return (clocks + 3 - 1) / 3; } // 3-phase clock + virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 3); } + virtual u32 execute_min_cycles() const noexcept override { return 1; } + virtual u32 execute_max_cycles() const noexcept override { return 2; } + virtual void execute_run() override; + virtual void execute_one() = 0; + + // device_memory_interface overrides + virtual space_config_vector memory_space_config() const override; + + address_space_config m_program_config; + address_space_config m_data_config; + address_space *m_program; + address_space *m_data; + + int m_icount; + int m_state_count; + + int m_prgwidth; // ROM/RAM address size + int m_datawidth; // " + u16 m_prgmask; // " + u16 m_datamask; // " + + virtual void cycle(); + virtual void increment_pc(); + virtual bool op_has_param(u8 op) = 0; + + u16 m_pc; + u16 m_prev_pc; + u8 m_op; + u8 m_prev_op; + u8 m_param; + + u8 m_a; + u8 m_x; + u8 m_y; + + // i/o handlers +}; + + +#endif // MAME_CPU_MN1400_MN1400BASE_H diff --git a/src/devices/cpu/mn1400/mn1400d.cpp b/src/devices/cpu/mn1400/mn1400d.cpp index 1d3bde6a04a..04410d4e30b 100644 --- a/src/devices/cpu/mn1400/mn1400d.cpp +++ b/src/devices/cpu/mn1400/mn1400d.cpp @@ -11,7 +11,7 @@ const char *const mn1400_disassembler::s_mnemonics[] = { - "?", + "?", "?", "L", "LD", "LI", "LIC", "LDC", "ST", "STD", "STIC", "STDC", "LX", "LY", "TAX", "TAY", "TYA", "TACU", "TACL", "TCAU", "TCAL", "NOP", "AND", "ANDI", "OR", "XOR", "A", "AI", "CPL", "C", "CI", "CY", @@ -27,7 +27,7 @@ const char *const mn1400_disassembler::s_mnemonics[] = // number of bits per opcode parameter const u8 mn1400_disassembler::s_bits[] = { - 0, + 0, 8, 0, 2, 4, 0, 0, 0, 2, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 4, 4, @@ -42,7 +42,7 @@ const u8 mn1400_disassembler::s_bits[] = const u32 mn1400_disassembler::s_flags[] = { - 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -62,7 +62,7 @@ const u8 mn1400_disassembler::mn1400_mnemonic[0x100] = mNOP, mTAX, mTYA, mTAY, mAND, mOR, mXOR, mA, mCPL, mC, mST, mSTIC, mSTDC, mL, mLIC, mLDC, // 0 mOTE, mOTMD, mOTD, mCCO, mINA, mINB, mRCO, mSCO, mTACL, mTACU, mTCAL, mTCAU, mDC, mEC, mSL, mRET, // 1 mLD, mLD, mLD, mLD, mSTD, mSTD, mSTD, mSTD, mRC, mRP, mSC, mSP, mICY, mDCY, mICM, mDCM, // 2 - mLX, mLX, mLX, mLX, mLX, mLX, mLX, mLX, 0, 0, mBSN0, mBS0, mBSN1, mBS1, mBSN01,mBS01, // 3 + mLX, mLX, mLX, mLX, mLX, mLX, mLX, mLX, 1, 1, mBSN0, mBS0, mBSN1, mBS1, mBSN01,mBS01, // 3 mJMP, mJMP, mJMP, mJMP, mJMP, mJMP, mJMP, mJMP, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, mCAL, // 4 mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, mLI, // 5 @@ -76,7 +76,7 @@ const u8 mn1400_disassembler::mn1400_mnemonic[0x100] = mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, mRM, // C mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, mTB, // D - 0, 0, mBNZ, mBZ, mBNC, mBC, mBNCZ, mBCZ, mBNP, mBP, mBNPZ, mBPZ, mBNPC, mBPC, mBNPCZ,mBPCZ, // E + 1, 1, mBNZ, mBZ, mBNC, mBC, mBNCZ, mBCZ, mBNP, mBP, mBNPZ, mBPZ, mBNPC, mBPC, mBNPCZ,mBPCZ, // E mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE, mOTIE // F }; @@ -100,7 +100,9 @@ offs_t mn1400_disassembler::disassemble(std::ostream &stream, offs_t pc, const d param |= (op & ((1 << (bits - 8)) - 1)) << 8; else param |= pc & 0x700; - util::stream_format(stream, "$%03X", param); + + if (instr > 1) + util::stream_format(stream, "$%03X", param); } else { diff --git a/src/devices/cpu/mn1400/mn1400d.h b/src/devices/cpu/mn1400/mn1400d.h index 9e6fbb8fc60..7d3b0af1d28 100644 --- a/src/devices/cpu/mn1400/mn1400d.h +++ b/src/devices/cpu/mn1400/mn1400d.h @@ -25,7 +25,7 @@ public: private: enum e_mnemonics { - mILL, + mILL, mILL2, mL, mLD, mLI, mLIC, mLDC, mST, mSTD, mSTIC, mSTDC, mLX, mLY, mTAX, mTAY, mTYA, mTACU, mTACL, mTCAU, mTCAL, mNOP, mAND, mANDI, mOR, mXOR, mA, mAI, mCPL, mC, mCI, mCY, diff --git a/src/devices/cpu/mn1400/mn1400op.cpp b/src/devices/cpu/mn1400/mn1400op.cpp new file mode 100644 index 00000000000..d5555befe51 --- /dev/null +++ b/src/devices/cpu/mn1400/mn1400op.cpp @@ -0,0 +1,18 @@ +// license:BSD-3-Clause +// copyright-holders:hap + +// MN1400 common opcode handlers + +#include "emu.h" +#include "mn1400.h" + + +// internal helpers + +void mn1400_cpu_device::op_illegal() +{ + logerror("unknown opcode $%02X at $%03X\n", m_op, m_prev_pc); +} + + +// opcodes