From c3a0f06cafed50971f04951deb9807dc99eb0bae Mon Sep 17 00:00:00 2001 From: arbee Date: Wed, 3 Jul 2019 00:00:33 -0400 Subject: [PATCH] f2mc16: start populating the core (nw) --- src/devices/cpu/f2mc16/f2mc16.cpp | 61 +++++++++++++++++++++++++++---- src/devices/cpu/f2mc16/f2mc16.h | 25 ++++++------- 2 files changed, 64 insertions(+), 22 deletions(-) diff --git a/src/devices/cpu/f2mc16/f2mc16.cpp b/src/devices/cpu/f2mc16/f2mc16.cpp index 2f4d44085c8..b27607acdbd 100644 --- a/src/devices/cpu/f2mc16/f2mc16.cpp +++ b/src/devices/cpu/f2mc16/f2mc16.cpp @@ -20,10 +20,14 @@ DEFINE_DEVICE_TYPE(F2MC16, f2mc16_device, "f2mc16", "Fujitsu Micro F2MC-16") // memory accessors #define read_8(addr) m_program->read_byte(addr) #define read_16(addr) m_program->read_word(addr) +#define read_32(addr) m_program->read_dword(addr) #define write_8(addr, data) m_program->write_byte(addr, data) #define write_16(addr, data) m_program->write_word(addr, data) +#define write_32(addr, data) m_program->write_dword(addr, data) #define read_8_vector(addr) m_program->read_byte(addr) +#define read_16_vector(addr) m_program->read_word(addr) +#define read_32_vector(addr) m_program->read_dword(addr) std::unique_ptr f2mc16_device::create_disassembler() { @@ -53,26 +57,67 @@ void f2mc16_device::device_start() set_icountptr(m_icount); - state_add(F2MC16_PC, "PC", m_pc); - state_add(STATE_GENPC, "GENPC", m_pc).callimport().noshow(); - state_add(STATE_GENPCBASE, "CURPC", m_pc).callimport().noshow(); - state_add(F2MC16_ACC, "AL", m_acc); + state_add(F2MC16_PCB, "PCB", m_pcb); + state_add(F2MC16_PC, "PC", m_pc).formatstr("%04X"); + state_add(STATE_GENPC, "GENPC", m_temp).callimport().callexport().noshow(); + state_add(STATE_GENPCBASE, "CURPC", m_temp).callimport().callexport().noshow(); + state_add(F2MC16_PS, "PS", m_ps).formatstr("%04X"); + state_add(F2MC16_PCB, "DTB", m_dtb).formatstr("%02X"); + state_add(F2MC16_PCB, "ADB", m_adb).formatstr("%02X"); + state_add(F2MC16_ACC, "AL", m_acc).formatstr("%08X"); + state_add(F2MC16_USB, "USB", m_usb).formatstr("%02X"); + state_add(F2MC16_USP, "USP", m_usp).formatstr("%04X"); + state_add(F2MC16_SSB, "SSB", m_ssb).formatstr("%02X"); + state_add(F2MC16_SSP, "SSP", m_ssp).formatstr("%04X"); + state_add(F2MC16_DPR, "DPR", m_dpr).formatstr("%02X"); + + set_icountptr(m_icount); } void f2mc16_device::device_reset() { - m_pc = (read_8_vector(0xffffde) << 16) | (read_8_vector(0xffffdd) << 8) | read_8_vector(0xffffdc); - printf("RESET: PC=%x\n", m_pc); + m_usb = m_ssb = 0; + m_usp = m_ssp = 0; + m_ps = 0; + m_acc = 0; + m_dpr = m_dtb = 0; + + m_pc = read_16_vector(0xffffdc); + m_pcb = read_8_vector(0xffffde); +} + +void f2mc16_device::state_import(const device_state_entry &entry) +{ + switch (entry.index()) + { + case STATE_GENPC: + case STATE_GENPCBASE: + m_pc = (m_temp & 0xffff); + m_pcb = (m_temp >> 16) & 0xff; + break; + } +} + +void f2mc16_device::state_export(const device_state_entry &entry) +{ + switch (entry.index()) + { + case STATE_GENPC: + case STATE_GENPCBASE: + m_temp = m_pc; + m_temp |= (m_pcb << 16); + break; + } } void f2mc16_device::execute_run() { - debugger_instruction_hook(m_pc); + debugger_instruction_hook((m_pcb<<16) | m_pc); + printf("Debug hook: %06x\n", (m_pcb<<16) | m_pc); m_icount = 0; } void f2mc16_device::execute_set_input(int inputnum, int state) { - // TODO } diff --git a/src/devices/cpu/f2mc16/f2mc16.h b/src/devices/cpu/f2mc16/f2mc16.h index 117516a2229..b1e37286f31 100644 --- a/src/devices/cpu/f2mc16/f2mc16.h +++ b/src/devices/cpu/f2mc16/f2mc16.h @@ -16,18 +16,11 @@ class f2mc16_device : public cpu_device public: enum { - F2MC16_PC, - F2MC16_S, - F2MC16_SP, - F2MC16_ACC, - F2MC16_R0, - F2MC16_R1, - F2MC16_R2, - F2MC16_R3, - F2MC16_R4, - F2MC16_R5, - F2MC16_R6, - F2MC16_R7 + F2MC16_PC, F2MC16_PS, F2MC16_USP, F2MC16_SSP, F2MC16_ACC, + F2MC16_PCB, F2MC16_DTB, F2MC16_USB, F2MC16_SSB, F2MC16_ADB, F2MC16_DPR, + F2MC16_RW0, F2MC16_RW1, F2MC16_RW2, F2MC16_RW3, + F2MC16_RW4, F2MC16_RW5, F2MC16_RW6, F2MC16_RW7, + F2MC16_RL0, F2MC16_RL1, F2MC16_RL2, F2MC16_RL3 }; // construction/destruction @@ -40,6 +33,9 @@ protected: virtual void device_start() override; virtual void device_reset() override; + virtual void state_import(const device_state_entry &entry) override; + virtual void state_export(const device_state_entry &entry) override; + // device_execute_interface overrides virtual void execute_run() override; virtual void execute_set_input(int inputnum, int state) override; @@ -54,8 +50,9 @@ private: address_space_config m_program_config; address_space *m_program; - u32 m_pc; - u8 m_acc; + u16 m_pc, m_usp, m_ssp, m_ps; + u8 m_pcb, m_dtb, m_usb, m_ssb, m_adb, m_dpr; + u32 m_acc, m_temp; s32 m_icount; };