From 112fbd83abe96bb2a6358528087ee35fd511b48e Mon Sep 17 00:00:00 2001 From: AJR Date: Fri, 1 Dec 2017 16:56:20 -0500 Subject: Clones promoted to working -------------------------- SWTPC 6800 Computer System (with MIKBUG) [AJR] --- scripts/src/bus.lua | 2 ++ 1 file changed, 2 insertions(+) (limited to 'scripts/src') diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 85b772ba345..4dbf4fe0ad0 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1400,6 +1400,8 @@ if (BUSES["SS50"]~=null) then files { MAME_DIR .. "src/devices/bus/ss50/interface.cpp", MAME_DIR .. "src/devices/bus/ss50/interface.h", + MAME_DIR .. "src/devices/bus/ss50/mpc.cpp", + MAME_DIR .. "src/devices/bus/ss50/mpc.h", MAME_DIR .. "src/devices/bus/ss50/mps.cpp", MAME_DIR .. "src/devices/bus/ss50/mps.h", } -- cgit v1.2.3-70-g09d2 From 495df453156dd73e6767a04c563011b657406cc1 Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Sun, 19 Nov 2017 14:23:38 +0100 Subject: e132xs: initial drc work, and templated conditional db/b, nw --- scripts/src/cpu.lua | 8 +- src/devices/cpu/e132xs/e132xs.cpp | 151 +++- src/devices/cpu/e132xs/e132xs.h | 390 ++++++---- src/devices/cpu/e132xs/e132xsdefs.h | 79 ++ src/devices/cpu/e132xs/e132xsdrc.cpp | 781 +++++++++++++++++++ src/devices/cpu/e132xs/e132xsdrc_ops.cpp | 1035 ++++++++++++++++++++++++++ src/devices/cpu/e132xs/e132xsfe.cpp | 1198 ++++++++++++++++++++++++++++++ src/devices/cpu/e132xs/e132xsfe.h | 32 + src/devices/cpu/e132xs/e132xsop.hxx | 791 +++++++------------- 9 files changed, 3717 insertions(+), 748 deletions(-) create mode 100644 src/devices/cpu/e132xs/e132xsdefs.h create mode 100644 src/devices/cpu/e132xs/e132xsdrc.cpp create mode 100644 src/devices/cpu/e132xs/e132xsdrc_ops.cpp create mode 100644 src/devices/cpu/e132xs/e132xsfe.cpp create mode 100644 src/devices/cpu/e132xs/e132xsfe.h (limited to 'scripts/src') diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index 35e27b3e97f..dad6fe50a1a 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -13,7 +13,7 @@ -- Dynamic recompiler objects -------------------------------------------------- -if (CPUS["SH"]~=null or CPUS["MIPS"]~=null or CPUS["POWERPC"]~=null or CPUS["RSP"]~=null or CPUS["ARM7"]~=null or CPUS["ADSP21062"]~=null or CPUS["MB86235"]~=null) then +if (CPUS["SH"]~=null or CPUS["MIPS"]~=null or CPUS["POWERPC"]~=null or CPUS["RSP"]~=null or CPUS["ARM7"]~=null or CPUS["ADSP21062"]~=null or CPUS["MB86235"]~=null or CPUS["E1"]~=null) then files { MAME_DIR .. "src/devices/cpu/drcbec.cpp", MAME_DIR .. "src/devices/cpu/drcbec.h", @@ -808,6 +808,10 @@ if (CPUS["E1"]~=null) then files { MAME_DIR .. "src/devices/cpu/e132xs/e132xs.cpp", MAME_DIR .. "src/devices/cpu/e132xs/e132xs.h", + MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.cpp", + MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.h", + MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc.cpp", + MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc_ops.cpp", MAME_DIR .. "src/devices/cpu/e132xs/32xsdefs.h", MAME_DIR .. "src/devices/cpu/e132xs/e132xsop.hxx", } @@ -1016,7 +1020,7 @@ if (CPUS["I86"]~=null) then } end -if (CPUS["SH"]~=null or CPUS["MIPS"]~=null or CPUS["POWERPC"]~=null or CPUS["RSP"]~=null or CPUS["ARM7"]~=null or CPUS["ADSP21062"]~=null or CPUS["MB86235"]~=null or CPUS["I86"]~=null or CPUS["I386"]~=null or _OPTIONS["with-tools"]) then +if (CPUS["E1"]~=null or CPUS["SH"]~=null or CPUS["MIPS"]~=null or CPUS["POWERPC"]~=null or CPUS["RSP"]~=null or CPUS["ARM7"]~=null or CPUS["ADSP21062"]~=null or CPUS["MB86235"]~=null or CPUS["I86"]~=null or CPUS["I386"]~=null or _OPTIONS["with-tools"]) then table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/i386/i386dasm.cpp") table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/i386/i386dasm.h") end diff --git a/src/devices/cpu/e132xs/e132xs.cpp b/src/devices/cpu/e132xs/e132xs.cpp index 73725ec8a25..8c88af94c31 100644 --- a/src/devices/cpu/e132xs/e132xs.cpp +++ b/src/devices/cpu/e132xs/e132xs.cpp @@ -1,3 +1,4 @@ + // license:BSD-3-Clause // copyright-holders:Pierpaolo Prazzoli /******************************************************************** @@ -33,6 +34,7 @@ TODO: - some wrong cycle counts - verify register wrapping with sregf/dregf on hardware + CHANGELOG: Pierpaolo Prazzoli @@ -143,6 +145,7 @@ #include "emu.h" #include "e132xs.h" +#include "e132xsfe.h" #include "debugger.h" @@ -152,6 +155,9 @@ //#define VERBOSE 1 #include "logmacro.h" +/* size of the execution code cache */ +#define CACHE_SIZE (32 * 1024 * 1024) + //************************************************************************** // INTERNAL ADDRESS MAP //************************************************************************** @@ -195,10 +201,31 @@ ADDRESS_MAP_END hyperstone_device::hyperstone_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, uint32_t prg_data_width, uint32_t io_data_width, address_map_constructor internal_map) - : cpu_device(mconfig, type, tag, owner, clock), - m_program_config("program", ENDIANNESS_BIG, prg_data_width, 32, 0, internal_map), - m_io_config("io", ENDIANNESS_BIG, io_data_width, 15), - m_icount(0) + : cpu_device(mconfig, type, tag, owner, clock) + , m_program_config("program", ENDIANNESS_BIG, prg_data_width, 32, 0, internal_map) + , m_io_config("io", ENDIANNESS_BIG, io_data_width, 15) + , m_icount(0) + , m_cache(CACHE_SIZE + sizeof(hyperstone_device)) + , m_drcuml(nullptr) + , m_drcfe(nullptr) + , m_drcoptions(0) + , m_cache_dirty(0) + , m_entry(nullptr) + , m_nocode(nullptr) + , m_out_of_cycles(nullptr) + , m_drc_arg0(0) + , m_drc_arg1(0) + , m_drc_arg2(0) + , m_drc_arg3(0) + , m_mem_read8(nullptr) + , m_mem_write8(nullptr) + , m_mem_read16(nullptr) + , m_mem_write16(nullptr) + , m_mem_read32(nullptr) + , m_mem_write32(nullptr) + , m_io_read32(nullptr) + , m_io_write32(nullptr) + , m_enable_drc(false) { } @@ -777,24 +804,18 @@ void hyperstone_device::execute_br() void hyperstone_device::execute_trap(uint32_t addr) { - uint8_t reg; - uint32_t oldSR; - reg = GET_FP + GET_FL; - + const uint8_t reg = GET_FP + GET_FL; SET_ILC(m_instruction_length); - - oldSR = SR; + const uint32_t oldSR = SR; SET_FL(6); SET_FP(reg); - set_local_register(0, (PC & 0xfffffffe) | GET_S); - set_local_register(1, oldSR); + m_local_regs[(0 + reg) & 0x3f] = (PC & ~1) | GET_S; + m_local_regs[(1 + reg) & 0x3f] = oldSR; - SET_M(0); - SET_T(0); - SET_L(1); - SET_S(1); + SR &= ~(M_MASK | T_MASK); + SR |= (L_MASK | S_MASK); PC = addr; @@ -829,8 +850,8 @@ void hyperstone_device::execute_exception(uint32_t addr) SET_ILC(m_instruction_length); const uint32_t oldSR = SR; - SET_FP(reg); SET_FL(2); + SET_FP(reg); m_local_regs[(0 + reg) & 0x3f] = (PC & ~1) | GET_S; m_local_regs[(1 + reg) & 0x3f] = oldSR; @@ -1008,6 +1029,8 @@ void hyperstone_device::device_start() void hyperstone_device::init(int scale_mask) { + m_enable_drc = false;//allow_drc(); + memset(m_global_regs, 0, sizeof(uint32_t) * 32); memset(m_local_regs, 0, sizeof(uint32_t) * 64); m_op = 0; @@ -1041,6 +1064,38 @@ void hyperstone_device::init(int scale_mask) m_fl_lut[i] = (i ? i : 16); } + uint32_t umlflags = 0; + m_drcuml = std::make_unique(*this, m_cache, umlflags, 1, 32, 1); + + // add UML symbols- + m_drcuml->symbol_add(&m_global_regs[0], sizeof(uint32_t), "pc"); + m_drcuml->symbol_add(&m_global_regs[1], sizeof(uint32_t), "sr"); + m_drcuml->symbol_add(&m_icount, sizeof(m_icount), "icount"); + + char buf[4]; + for (int i=0; i < 32; i++) + { + sprintf(buf, "g%d", i); + m_drcuml->symbol_add(&m_global_regs[i], sizeof(uint32_t), buf); + } + + for (int i=0; i < 64; i++) + { + sprintf(buf, "l%d", i); + m_drcuml->symbol_add(&m_global_regs[i], sizeof(uint32_t), buf); + } + + m_drcuml->symbol_add(&m_drc_arg0, sizeof(uint32_t), "arg0"); + m_drcuml->symbol_add(&m_drc_arg1, sizeof(uint32_t), "arg1"); + m_drcuml->symbol_add(&m_drc_arg2, sizeof(uint32_t), "arg2"); + m_drcuml->symbol_add(&m_drc_arg3, sizeof(uint32_t), "arg3"); + + /* initialize the front-end helper */ + m_drcfe = std::make_unique(this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE); + + /* mark the cache dirty so it is updated on next execute */ + m_cache_dirty = true; + // register our state for the debugger state_add(STATE_GENPC, "GENPC", m_global_regs[0]).noshow(); state_add(STATE_GENPCBASE, "CURPC", m_global_regs[0]).noshow(); @@ -1299,6 +1354,14 @@ void hyperstone_device::device_reset() void hyperstone_device::device_stop() { + if (m_drcfe != nullptr) + { + m_drcfe = nullptr; + } + if (m_drcuml != nullptr) + { + m_drcuml = nullptr; + } } @@ -1499,6 +1562,12 @@ void hyperstone_device::hyperstone_do() void hyperstone_device::execute_run() { + if (m_enable_drc) + { + execute_run_drc(); + return; + } + if (m_intblock < 0) m_intblock = 0; @@ -1741,34 +1810,34 @@ void hyperstone_device::execute_run() case 0xdd: hyperstone_stwp(); break; case 0xde: hyperstone_stdp(); break; case 0xdf: hyperstone_stdp(); break; - case 0xe0: hyperstone_dbv(); break; - case 0xe1: hyperstone_dbnv(); break; - case 0xe2: hyperstone_dbe(); break; - case 0xe3: hyperstone_dbne(); break; - case 0xe4: hyperstone_dbc(); break; - case 0xe5: hyperstone_dbnc(); break; - case 0xe6: hyperstone_dbse(); break; - case 0xe7: hyperstone_dbht(); break; - case 0xe8: hyperstone_dbn(); break; - case 0xe9: hyperstone_dbnn(); break; - case 0xea: hyperstone_dble(); break; - case 0xeb: hyperstone_dbgt(); break; + case 0xe0: hyperstone_db(); break; + case 0xe1: hyperstone_db(); break; + case 0xe2: hyperstone_db(); break; + case 0xe3: hyperstone_db(); break; + case 0xe4: hyperstone_db(); break; + case 0xe5: hyperstone_db(); break; + case 0xe6: hyperstone_db(); break; + case 0xe7: hyperstone_db(); break; + case 0xe8: hyperstone_db(); break; + case 0xe9: hyperstone_db(); break; + case 0xea: hyperstone_db(); break; + case 0xeb: hyperstone_db(); break; case 0xec: hyperstone_dbr(); break; case 0xed: hyperstone_frame(); break; case 0xee: hyperstone_call_global(); break; case 0xef: hyperstone_call_local(); break; - case 0xf0: hyperstone_bv(); break; - case 0xf1: hyperstone_bnv(); break; - case 0xf2: hyperstone_be(); break; - case 0xf3: hyperstone_bne(); break; - case 0xf4: hyperstone_bc(); break; - case 0xf5: hyperstone_bnc(); break; - case 0xf6: hyperstone_bse(); break; - case 0xf7: hyperstone_bht(); break; - case 0xf8: hyperstone_bn(); break; - case 0xf9: hyperstone_bnn(); break; - case 0xfa: hyperstone_ble(); break; - case 0xfb: hyperstone_bgt(); break; + case 0xf0: hyperstone_b(); break; + case 0xf1: hyperstone_b(); break; + case 0xf2: hyperstone_b(); break; + case 0xf3: hyperstone_b(); break; + case 0xf4: hyperstone_b(); break; + case 0xf5: hyperstone_b(); break; + case 0xf6: hyperstone_b(); break; + case 0xf7: hyperstone_b(); break; + case 0xf8: hyperstone_b(); break; + case 0xf9: hyperstone_b(); break; + case 0xfa: hyperstone_b(); break; + case 0xfb: hyperstone_b(); break; case 0xfc: execute_br(); break; case 0xfd: hyperstone_trap(); break; case 0xfe: hyperstone_trap(); break; diff --git a/src/devices/cpu/e132xs/e132xs.h b/src/devices/cpu/e132xs/e132xs.h index 81575c4f0cf..8328215c475 100644 --- a/src/devices/cpu/e132xs/e132xs.h +++ b/src/devices/cpu/e132xs/e132xs.h @@ -5,6 +5,9 @@ #pragma once +#include "cpu/drcfe.h" +#include "cpu/drcuml.h" +#include "cpu/drcumlsh.h" /* A note about clock multipliers and dividers: @@ -22,17 +25,46 @@ -/* Functions */ +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +/* map variables */ +#define MAPVAR_PC M0 +#define MAPVAR_CYCLES M1 + +/* compilation boundaries -- how far back/forward does the analysis extend? */ +#define COMPILE_BACKWARDS_BYTES 128 +#define COMPILE_FORWARDS_BYTES 512 +#define COMPILE_MAX_INSTRUCTIONS ((COMPILE_BACKWARDS_BYTES/4) + (COMPILE_FORWARDS_BYTES/4)) +#define COMPILE_MAX_SEQUENCE 64 + +/* exit codes */ +#define EXECUTE_OUT_OF_CYCLES 0 +#define EXECUTE_MISSING_CODE 1 +#define EXECUTE_UNMAPPED_CODE 2 +#define EXECUTE_RESET_CACHE 3 + +#define E132XS_STRICT_VERIFY 0x0001 /* verify all instructions */ + +#define SINGLE_INSTRUCTION_MODE (1) //************************************************************************** // TYPE DEFINITIONS //************************************************************************** +class e132xs_frontend; + // ======================> hyperstone_device // Used by core CPU interface class hyperstone_device : public cpu_device { + friend class e132xs_frontend; + +public: + inline void ccfunc_unimplemented(); + protected: enum { @@ -114,6 +146,28 @@ protected: IS_SIGNED = 1 }; + enum branch_condition + { + COND_V = 0, + COND_Z = 1, + COND_C = 2, + COND_CZ = 3, + COND_N = 4, + COND_NZ = 5 + }; + + enum condition_set + { + IS_CLEAR = 0, + IS_SET = 1 + }; + + enum + { + EXCEPTION_INTERRUPT = 0, + EXCEPTION_COUNT + }; + // construction/destruction hyperstone_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, uint32_t prg_data_width, uint32_t io_data_width, address_map_constructor internal_map); @@ -183,6 +237,8 @@ protected: uint8_t m_fl_lut[16]; + uint32_t get_trap_addr(uint8_t trapno); + private: // internal functions void check_interrupts(); @@ -192,7 +248,6 @@ private: uint32_t get_global_register(uint8_t code); - uint32_t get_trap_addr(uint8_t trapno); uint32_t get_emu_code_addr(uint8_t num); void hyperstone_set_trap_entry(int which); uint32_t compute_tr(); @@ -276,37 +331,14 @@ private: template void hyperstone_stwp(); template void hyperstone_stdp(); - void hyperstone_dbv(); - void hyperstone_dbnv(); - void hyperstone_dbe(); - void hyperstone_dbne(); - void hyperstone_dbc(); - void hyperstone_dbnc(); - void hyperstone_dbse(); - void hyperstone_dbht(); - void hyperstone_dbn(); - void hyperstone_dbnn(); - void hyperstone_dble(); - void hyperstone_dbgt(); + template void hyperstone_b(); + template void hyperstone_db(); void hyperstone_dbr(); void hyperstone_frame(); void hyperstone_call_global(); void hyperstone_call_local(); - void hyperstone_bv(); - void hyperstone_bnv(); - void hyperstone_be(); - void hyperstone_bne(); - void hyperstone_bc(); - void hyperstone_bnc(); - void hyperstone_bse(); - void hyperstone_bht(); - void hyperstone_bn(); - void hyperstone_bnn(); - void hyperstone_ble(); - void hyperstone_bgt(); - void hyperstone_trap(); void hyperstone_extend(); @@ -316,152 +348,185 @@ private: int32_t decode_pcrel(); void ignore_pcrel(); -#if 0 + drc_cache m_cache; + std::unique_ptr m_drcuml; + std::unique_ptr m_drcfe; + uint32_t m_drcoptions; + uint8_t m_cache_dirty; + + uml::parameter m_regmap[16]; + + uml::code_handle *m_entry; + uml::code_handle *m_nocode; + uml::code_handle *m_out_of_cycles; + + uint32_t m_drc_arg0; + uint32_t m_drc_arg1; + uint32_t m_drc_arg2; + uint32_t m_drc_arg3; + + uml::code_handle *m_mem_read8; + uml::code_handle *m_mem_write8; + uml::code_handle *m_mem_read16; + uml::code_handle *m_mem_write16; + uml::code_handle *m_mem_read32; + uml::code_handle *m_mem_write32; + uml::code_handle *m_io_read32; + uml::code_handle *m_io_write32; + uml::code_handle *m_exception[EXCEPTION_COUNT]; + + bool m_enable_drc; + + /* internal compiler state */ + struct compiler_state + { + uint32_t m_cycles; /* accumulated cycles */ + uint8_t m_checkints; /* need to check interrupts before next instruction */ + uml::code_label m_labelnum; /* index for local labels */ + }; + void execute_run_drc(); void flush_drc_cache(); void code_flush_cache(); void code_compile_block(offs_t pc); - inline void ccfunc_unimplemented(); + //void load_fast_iregs(drcuml_block *block); + //void save_fast_iregs(drcuml_block *block); void static_generate_entry_point(); void static_generate_nocode_handler(); void static_generate_out_of_cycles(); - void static_generate_memory_accessor(int size, int iswrite, const char *name, code_handle *&handleptr); + void static_generate_exception(uint8_t exception, const char *name); + void static_generate_memory_accessor(int size, int iswrite, bool isio, const char *name, uml::code_handle *&handleptr); void generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param, bool allow_exception); void generate_checksum_block(drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast); void generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void log_add_disasm_comment(drcuml_block *block, uint32_t pc, uint32_t op); bool generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); -#endif - -#if 0 - void generate_op00(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op01(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op02(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op03(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op04(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op05(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op06(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op07(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op08(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op09(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op0a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op0b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op0c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op0d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op0e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op0f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op10(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op11(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op12(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op13(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op14(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op15(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op16(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op17(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op18(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op19(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op1a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op1b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op1c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op1d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op1e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op1f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op20(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op21(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op22(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op23(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op24(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op25(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op26(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op27(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op28(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op29(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op2a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op2b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op2c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op2d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op2e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op2f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op30(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op31(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op32(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op33(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op34(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op35(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op36(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op37(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op38(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op39(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op3a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op3b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op3c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op3d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op3e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op3f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op40(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op41(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op42(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op43(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op44(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op45(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op46(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op47(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op48(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op49(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op4a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op4b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op4c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op4d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op4e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op4f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op50(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op51(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op52(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op53(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op54(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op55(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op56(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op57(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op58(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op59(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op5a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op5b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op5c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op5d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op5e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op5f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op60(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op61(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op62(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op63(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op64(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op65(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op66(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op67(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op68(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op69(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op6a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op6b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op6c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op6d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op6e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op6f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op70(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op71(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op72(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op73(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op74(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op75(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op76(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op77(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op78(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op79(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op7a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op7b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op7c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op7d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op7e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op7f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op80(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op81(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op82(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op83(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op84(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op85(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op86(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op87(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op88(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op89(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op8a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op8b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op8c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op8d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op8e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op8f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op90(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op91(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op92(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op93(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op94(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op95(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op96(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op97(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op98(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op99(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op9a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op9b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op9c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op9d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op9e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op9f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opaa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opab(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opac(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opad(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opae(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opaf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opba(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opbb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opbc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opbd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opbe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opbf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opca(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opcb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opcc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opcd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opce(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opcf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opda(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opdb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opdc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opdd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opde(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opdf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opea(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opeb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opec(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_oped(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opee(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opef(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opfa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opfb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opfc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opfd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opfe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opff(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); -#endif + + void generate_op00(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op01(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op02(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op03(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op04(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op05(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op06(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op07(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op08(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op09(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op0a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op0b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op0c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op0d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op0e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op0f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op10(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op11(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op12(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op13(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op14(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op15(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op16(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op17(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op18(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op19(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op1a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op1b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op1c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op1d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op1e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op1f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op20(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op21(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op22(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op23(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op24(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op25(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op26(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op27(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op28(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op29(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op2a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op2b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op2c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op2d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op2e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op2f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op30(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op31(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op32(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op33(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op34(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op35(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op36(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op37(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op38(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op39(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op3a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op3b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op3c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op3d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op3e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op3f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op40(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op41(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op42(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op43(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op44(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op45(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op46(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op47(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op48(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op49(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op4a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op4b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op4c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op4d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op4e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op4f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op50(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op51(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op52(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op53(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op54(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op55(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op56(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op57(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op58(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op59(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op5a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op5b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op5c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op5d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op5e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op5f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op60(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op61(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op62(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op63(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op64(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op65(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op66(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op67(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op68(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op69(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op6a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op6b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op6c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op6d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op6e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op6f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op70(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op71(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op72(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op73(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op74(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op75(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op76(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op77(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op78(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op79(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op7a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op7b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op7c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op7d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op7e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op7f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op80(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op81(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op82(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op83(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op84(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op85(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op86(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op87(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op88(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op89(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op8a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op8b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op8e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op8f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op90(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op91(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op92(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op93(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op94(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op95(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op96(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op97(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op98(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op99(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op9a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op9b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op9c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op9d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_op9e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op9f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opa0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opa2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opa4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opa6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opa8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opaa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opab(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opb0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opb2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opb4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opb6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opb8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opba(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opbb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opbc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opbd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opbe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opbf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opc0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opc4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opc6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opc8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opca(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opcb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opcc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opcd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opce(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opcf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opd0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opd2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opd4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opd6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opd8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opda(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opdb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opdc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opdd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opde(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opdf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_ope0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_ope2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_ope4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_ope6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_ope8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opea(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opeb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opec(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_oped(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opee(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opef(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opf0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opf2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opf4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opf6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opf8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opfa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opfb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opfc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opfd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_opfe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opff(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); }; // device type definition @@ -662,4 +727,5 @@ protected: virtual void device_start() override; }; + #endif // MAME_CPU_E132XS_E132XS_H diff --git a/src/devices/cpu/e132xs/e132xsdefs.h b/src/devices/cpu/e132xs/e132xsdefs.h new file mode 100644 index 00000000000..95a0274ed3a --- /dev/null +++ b/src/devices/cpu/e132xs/e132xsdefs.h @@ -0,0 +1,79 @@ +/* Memory access */ +/* read byte */ +#define READ_B(addr) m_program->read_byte((addr)) +/* read half-word */ +#define READ_HW(addr) m_program->read_word((addr) & ~1) +/* read word */ +#define READ_W(addr) m_program->read_dword((addr) & ~3) + +/* write byte */ +#define WRITE_B(addr, data) m_program->write_byte(addr, data) +/* write half-word */ +#define WRITE_HW(addr, data) m_program->write_word((addr) & ~1, data) +/* write word */ +#define WRITE_W(addr, data) m_program->write_dword((addr) & ~3, data) + + +/* I/O access */ +/* read word */ +#define IO_READ_W(addr) m_io->read_dword(((addr) >> 11) & 0x7ffc) +/* write word */ +#define IO_WRITE_W(addr, data) m_io->write_dword(((addr) >> 11) & 0x7ffc, data) + + +#define READ_OP(addr) m_direct->read_word((addr), m_opcodexor) + +// set C in adds/addsi/subs/sums +#define SETCARRYS 0 +#define MISSIONCRAFT_FLAGS 1 + +/* Registers */ + +/* Internal registers */ + +#define SREG decode.src_value +#define SREGF decode.next_src_value +#define DREG decode.dst_value +#define DREGF decode.next_dst_value +#define EXTRA_U decode.extra.u +#define EXTRA_S decode.extra.s + +#define SET_SREG( _data_ ) (decode.src_is_local ? set_local_register(decode.src, (uint32_t)_data_) : set_global_register(decode.src, (uint32_t)_data_)) +#define SET_SREGF( _data_ ) (decode.src_is_local ? set_local_register(decode.src + 1, (uint32_t)_data_) : set_global_register(decode.src + 1, (uint32_t)_data_)) +#define SET_DREG( _data_ ) (decode.dst_is_local ? set_local_register(decode.dst, (uint32_t)_data_) : set_global_register(decode.dst, (uint32_t)_data_)) +#define SET_DREGF( _data_ ) (decode.dst_is_local ? set_local_register(decode.dst + 1, (uint32_t)_data_) : set_global_register(decode.dst + 1, (uint32_t)_data_)) + +#define SRC_IS_PC (!decode.src_is_local && decode.src == PC_REGISTER) +#define DST_IS_PC (!decode.dst_is_local && decode.dst == PC_REGISTER) +#define SRC_IS_SR (!decode.src_is_local && decode.src == SR_REGISTER) +#define DST_IS_SR (!decode.dst_is_local && decode.dst == SR_REGISTER) +#define SAME_SRC_DST decode.same_src_dst +#define SAME_SRC_DSTF decode.same_src_dstf +#define SAME_SRCF_DST decode.same_srcf_dst + + +/* Memory access */ +/* read byte */ +#define READ_B(addr) m_program->read_byte((addr)) +/* read half-word */ +#define READ_HW(addr) m_program->read_word((addr) & ~1) +/* read word */ +#define READ_W(addr) m_program->read_dword((addr) & ~3) + +/* write byte */ +#define WRITE_B(addr, data) m_program->write_byte(addr, data) +/* write half-word */ +#define WRITE_HW(addr, data) m_program->write_word((addr) & ~1, data) +/* write word */ +#define WRITE_W(addr, data) m_program->write_dword((addr) & ~3, data) + + +/* I/O access */ +/* read word */ +#define IO_READ_W(addr) m_io->read_dword(((addr) >> 11) & 0x7ffc) +/* write word */ +#define IO_WRITE_W(addr, data) m_io->write_dword(((addr) >> 11) & 0x7ffc, data) + + +#define READ_OP(addr) m_direct->read_word((addr), m_opcodexor) + diff --git a/src/devices/cpu/e132xs/e132xsdrc.cpp b/src/devices/cpu/e132xs/e132xsdrc.cpp new file mode 100644 index 00000000000..9e0d7e9ef15 --- /dev/null +++ b/src/devices/cpu/e132xs/e132xsdrc.cpp @@ -0,0 +1,781 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz + +#include "e132xs.h" +#include "e132xsfe.h" +#include "32xsdefs.h" + +using namespace uml; + +void hyperstone_device::execute_run_drc() +{ + drcuml_state *drcuml = m_drcuml.get(); + int execute_result; + + /* reset the cache if dirty */ + if (m_cache_dirty) + { + code_flush_cache(); + m_cache_dirty = false; + } + + /* execute */ + do + { + /* run as much as we can */ + execute_result = drcuml->execute(*m_entry); + + /* if we need to recompile, do it */ + if (execute_result == EXECUTE_MISSING_CODE) + { + code_compile_block(m_global_regs[0]); + } + else if (execute_result == EXECUTE_UNMAPPED_CODE) + { + fatalerror("Attempted to execute unmapped code at PC=%08X\n", m_global_regs[0]); + } + else if (execute_result == EXECUTE_RESET_CACHE) + { + code_flush_cache(); + } + } while (execute_result != EXECUTE_OUT_OF_CYCLES); +} + +/*************************************************************************** + CACHE MANAGEMENT +***************************************************************************/ + +/*------------------------------------------------- + flush_drc_cache - outward-facing accessor to + code_flush_cache +-------------------------------------------------*/ + +void hyperstone_device::flush_drc_cache() +{ + if (!m_enable_drc) + return; + m_cache_dirty = true; +} + +/*------------------------------------------------- + code_flush_cache - flush the cache and + regenerate static code +-------------------------------------------------*/ + +void hyperstone_device::code_flush_cache() +{ + /* empty the transient cache contents */ + m_drcuml->reset(); + + try + { + /* generate the entry point and out-of-cycles handlers */ + static_generate_entry_point(); + static_generate_nocode_handler(); + static_generate_out_of_cycles(); + + /* add subroutines for memory accesses */ + static_generate_memory_accessor(1, false, false, "read8", m_mem_read8); + static_generate_memory_accessor(1, true, false, "write8", m_mem_write8); + static_generate_memory_accessor(2, false, false, "read16", m_mem_read16); + static_generate_memory_accessor(2, true, false, "write16", m_mem_write16); + static_generate_memory_accessor(4, false, false, "read32", m_mem_read32); + static_generate_memory_accessor(4, true, false, "write32", m_mem_write32); + static_generate_memory_accessor(4, false, true, "ioread32", m_io_read32); + static_generate_memory_accessor(4, true, true, "iowrite32", m_io_write32); + } + + catch (drcuml_block::abort_compilation &) + { + fatalerror("Unable to generate static E132XS code\n"); + } +} + +/*------------------------------------------------- + code_compile_block - compile a block of the + given mode at the specified pc +-------------------------------------------------*/ + +void hyperstone_device::code_compile_block(offs_t pc) +{ + drcuml_state *drcuml = m_drcuml.get(); + compiler_state compiler = { 0 }; + const opcode_desc *seqhead, *seqlast; + const opcode_desc *desclist; + int override = false; + drcuml_block *block; + + g_profiler.start(PROFILER_DRC_COMPILE); + + /* get a description of this sequence */ + desclist = m_drcfe->describe_code(pc); + + bool succeeded = false; + while (!succeeded) + { + try + { + /* start the block */ + block = drcuml->begin_block(4096); + + /* loop until we get through all instruction sequences */ + for (seqhead = desclist; seqhead != nullptr; seqhead = seqlast->next()) + { + const opcode_desc *curdesc; + uint32_t nextpc; + + /* add a code log entry */ + if (drcuml->logging()) + block->append_comment("-------------------------"); // comment + + /* determine the last instruction in this sequence */ + for (seqlast = seqhead; seqlast != nullptr; seqlast = seqlast->next()) + if (seqlast->flags & OPFLAG_END_SEQUENCE) + break; + assert(seqlast != nullptr); + + /* if we don't have a hash for this mode/pc, or if we are overriding all, add one */ + if (override || !drcuml->hash_exists(0, seqhead->pc)) + UML_HASH(block, 0, seqhead->pc); // hash mode,pc + + /* if we already have a hash, and this is the first sequence, assume that we */ + /* are recompiling due to being out of sync and allow future overrides */ + else if (seqhead == desclist) + { + override = true; + UML_HASH(block, 0, seqhead->pc); // hash mode,pc + } + + /* otherwise, redispatch to that fixed PC and skip the rest of the processing */ + else + { + UML_LABEL(block, seqhead->pc | 0x80000000); // label seqhead->pc + UML_HASHJMP(block, 0, seqhead->pc, *m_nocode); + // hashjmp <0>,seqhead->pc,nocode + continue; + } + + /* validate this code block if we're not pointing into ROM */ + if (m_program->get_write_ptr(seqhead->physpc) != nullptr) + generate_checksum_block(block, &compiler, seqhead, seqlast); + + /* label this instruction, if it may be jumped to locally */ + if (seqhead->flags & OPFLAG_IS_BRANCH_TARGET) + UML_LABEL(block, seqhead->pc | 0x80000000); // label seqhead->pc + + /* iterate over instructions in the sequence and compile them */ + for (curdesc = seqhead; curdesc != seqlast->next(); curdesc = curdesc->next()) + generate_sequence_instruction(block, &compiler, curdesc); + + /* if we need to return to the start, do it */ + if (seqlast->flags & OPFLAG_RETURN_TO_START) + nextpc = pc; + + /* otherwise we just go to the next instruction */ + else + nextpc = seqlast->pc + (seqlast->skipslots + 1) * 4; + + /* count off cycles and go there */ + generate_update_cycles(block, &compiler, nextpc, true); // + + /* if the last instruction can change modes, use a variable mode; otherwise, assume the same mode */ + if (seqlast->next() == nullptr || seqlast->next()->pc != nextpc) + UML_HASHJMP(block, 0, nextpc, *m_nocode); // hashjmp ,nextpc,nocode + } + + /* end the sequence */ + block->end(); + g_profiler.stop(); + succeeded = true; + } + catch (drcuml_block::abort_compilation &) + { + code_flush_cache(); + } + } +} + +/*************************************************************************** + C FUNCTION CALLBACKS +***************************************************************************/ + +/*------------------------------------------------- + cfunc_unimplemented - handler for + unimplemented opcdes +-------------------------------------------------*/ + +inline void hyperstone_device::ccfunc_unimplemented() +{ + fatalerror("PC=%08X: Unimplemented op %08X\n", PC, m_drc_arg0); +} + +static void cfunc_unimplemented(void *param) +{ + ((hyperstone_device *)param)->ccfunc_unimplemented(); +} + +/*************************************************************************** + STATIC CODEGEN +***************************************************************************/ + +/*------------------------------------------------- + epc - compute the exception PC from a + descriptor +-------------------------------------------------*/ + +static inline uint32_t epc(const opcode_desc *desc) +{ + return (desc->flags & OPFLAG_IN_DELAY_SLOT) ? (desc->pc - 3) : desc->pc; +} + + +/*------------------------------------------------- + alloc_handle - allocate a handle if not + already allocated +-------------------------------------------------*/ + +static inline void alloc_handle(drcuml_state *drcuml, code_handle **handleptr, const char *name) +{ + if (*handleptr == nullptr) + *handleptr = drcuml->handle_alloc(name); +} + + +/*------------------------------------------------- + generate_entry_point - generate a + static entry point +-------------------------------------------------*/ + +void hyperstone_device::static_generate_entry_point() +{ + drcuml_state *drcuml = m_drcuml.get(); + drcuml_block *block; + + /* begin generating */ + block = drcuml->begin_block(20); + + /* forward references */ + alloc_handle(drcuml, &m_nocode, "nocode"); + + alloc_handle(drcuml, &m_entry, "entry"); + UML_HANDLE(block, *m_entry); + + /* load fast integer registers */ + //load_fast_iregs(block); + + /* generate a hash jump via the current mode and PC */ + UML_HASHJMP(block, 0, mem(&m_global_regs[0]), *m_nocode); + block->end(); +} + + +/*------------------------------------------------- + static_generate_nocode_handler - generate an + exception handler for "out of code" +-------------------------------------------------*/ + +void hyperstone_device::static_generate_nocode_handler() +{ + drcuml_state *drcuml = m_drcuml.get(); + drcuml_block *block; + + /* begin generating */ + block = drcuml->begin_block(10); + + /* generate a hash jump via the current mode and PC */ + alloc_handle(drcuml, &m_nocode, "nocode"); + UML_HANDLE(block, *m_nocode); + UML_GETEXP(block, I0); + UML_MOV(block, mem(&PC), I0); + //save_fast_iregs(block); + UML_EXIT(block, EXECUTE_MISSING_CODE); + + block->end(); +} + + +/*------------------------------------------------- + static_generate_out_of_cycles - generate an + out of cycles exception handler +-------------------------------------------------*/ + +void hyperstone_device::static_generate_out_of_cycles() +{ + drcuml_state *drcuml = m_drcuml.get(); + drcuml_block *block; + + /* begin generating */ + block = drcuml->begin_block(10); + + /* generate a hash jump via the current mode and PC */ + alloc_handle(drcuml, &m_out_of_cycles, "out_of_cycles"); + UML_HANDLE(block, *m_out_of_cycles); + UML_GETEXP(block, I0); + UML_MOV(block, mem(&m_global_regs[0]), I0); + //save_fast_iregs(block); + UML_EXIT(block, EXECUTE_OUT_OF_CYCLES); + + block->end(); +} + +/*------------------------------------------------------------------ + static_generate_memory_accessor +------------------------------------------------------------------*/ + +void hyperstone_device::static_generate_memory_accessor(int size, int iswrite, bool isio, const char *name, code_handle *&handleptr) +{ + /* on entry, address is in I0; data for writes is in I1 */ + /* on exit, read result is in I0 */ + /* routine trashes I0-I1 */ + drcuml_state *drcuml = m_drcuml.get(); + drcuml_block *block; + + /* begin generating */ + block = drcuml->begin_block(1024); + + /* add a global entry for this */ + alloc_handle(drcuml, &handleptr, name); + UML_HANDLE(block, *handleptr); + + // write: + switch (size) + { + case 1: + if (iswrite) + UML_WRITE(block, I0, I1, SIZE_BYTE, SPACE_PROGRAM); + else + UML_READ(block, I0, I0, SIZE_BYTE, SPACE_PROGRAM); + break; + + case 2: + if (iswrite) + UML_WRITE(block, I0, I1, SIZE_WORD, SPACE_PROGRAM); + else + UML_READ(block, I0, I0, SIZE_WORD, SPACE_PROGRAM); + break; + + case 4: + if (iswrite) + UML_WRITE(block, I0, I1, SIZE_DWORD, isio ? SPACE_IO : SPACE_PROGRAM); + else + UML_READ(block, I0, I0, SIZE_DWORD, isio ? SPACE_IO : SPACE_PROGRAM); + break; + } + UML_RET(block); + + block->end(); +} + + + +/*************************************************************************** + CODE GENERATION +***************************************************************************/ + +/*------------------------------------------------- + generate_update_cycles - generate code to + subtract cycles from the icount and generate + an exception if out +-------------------------------------------------*/ + +void hyperstone_device::generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param, bool allow_exception) +{ + /* account for cycles */ + if (compiler->m_cycles > 0) + { + UML_SUB(block, mem(&m_icount), mem(&m_icount), MAPVAR_CYCLES); + UML_MAPVAR(block, MAPVAR_CYCLES, 0); + UML_EXHc(block, COND_S, *m_out_of_cycles, param); + } + compiler->m_cycles = 0; +} + +/*------------------------------------------------- + generate_checksum_block - generate code to + validate a sequence of opcodes +-------------------------------------------------*/ + +void hyperstone_device::generate_checksum_block(drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast) +{ + const opcode_desc *curdesc; + if (m_drcuml->logging()) + { + block->append_comment("[Validation for %08X]", seqhead->pc | 0x1000); + } + /* loose verify or single instruction: just compare and fail */ + if (!(m_drcoptions & E132XS_STRICT_VERIFY) || seqhead->next() == nullptr) + { + if (!(seqhead->flags & OPFLAG_VIRTUAL_NOOP)) + { + uint32_t sum = seqhead->opptr.l[0]; + void *base = m_direct->read_ptr(seqhead->physpc | 0x1000); + UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); + + if (seqhead->delay.first() != nullptr && seqhead->physpc != seqhead->delay.first()->physpc) + { + base = m_direct->read_ptr(seqhead->delay.first()->physpc); + assert(base != nullptr); + UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); + UML_ADD(block, I0, I0, I1); + + sum += seqhead->delay.first()->opptr.l[0]; + } + + UML_CMP(block, I0, sum); + UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); + } + } + else /* full verification; sum up everything */ + { + void *base = m_direct->read_ptr(seqhead->physpc); + UML_LOAD(block, I0, base, 0, SIZE_DWORD, SCALE_x4); + uint32_t sum = seqhead->opptr.l[0]; + for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next()) + if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP)) + { + base = m_direct->read_ptr(curdesc->physpc); + assert(base != nullptr); + UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); + UML_ADD(block, I0, I0, I1); + sum += curdesc->opptr.l[0]; + + if (curdesc->delay.first() != nullptr && (curdesc == seqlast || (curdesc->next() != nullptr && curdesc->next()->physpc != curdesc->delay.first()->physpc))) + { + base = m_direct->read_ptr(curdesc->delay.first()->physpc); + assert(base != nullptr); + UML_LOAD(block, I1, base, 0, SIZE_DWORD, SCALE_x4); + UML_ADD(block, I0, I0, I1); + + sum += curdesc->delay.first()->opptr.l[0]; + } + } + UML_CMP(block, I0, sum); + UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); + } +} + + +/*------------------------------------------------- + log_add_disasm_comment - add a comment + including disassembly of a MIPS instruction +-------------------------------------------------*/ + +void hyperstone_device::log_add_disasm_comment(drcuml_block *block, uint32_t pc, uint32_t op) +{ + if (m_drcuml->logging()) + { + block->append_comment("%08X: %08x", pc, op); + } +} + + +/*------------------------------------------------- + generate_sequence_instruction - generate code + for a single instruction in a sequence +-------------------------------------------------*/ + +void hyperstone_device::generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ + offs_t expc; + + /* add an entry for the log */ + if (m_drcuml->logging() && !(desc->flags & OPFLAG_VIRTUAL_NOOP)) + log_add_disasm_comment(block, desc->pc, desc->opptr.l[0]); + + /* set the PC map variable */ + expc = (desc->flags & OPFLAG_IN_DELAY_SLOT) ? desc->pc - 3 : desc->pc; + UML_MAPVAR(block, MAPVAR_PC, expc); + + /* accumulate total cycles */ + compiler->m_cycles += desc->cycles; + + /* update the icount map variable */ + UML_MAPVAR(block, MAPVAR_CYCLES, compiler->m_cycles); + + /* if we are debugging, call the debugger */ + if ((machine().debug_flags & DEBUG_FLAG_ENABLED) != 0) + { + UML_MOV(block, mem(&PC), desc->pc); + //save_fast_iregs(block); + UML_DEBUG(block, desc->pc); + } + + if (!(desc->flags & OPFLAG_VIRTUAL_NOOP)) + { + /* compile the instruction */ + if (!generate_opcode(block, compiler, desc)) + { + UML_MOV(block, mem(&PC), desc->pc); + UML_MOV(block, mem(&m_drc_arg0), desc->opptr.l[0]); + UML_CALLC(block, cfunc_unimplemented, this); + } + } +} + +bool hyperstone_device::generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ + uint32_t op = desc->opptr.l[0]; + uint8_t opswitch = (op & 0x0000ff00) >> 8; + code_label skip; + + switch (opswitch) + { + case 0x00: generate_op00(block, compiler, desc); break; + case 0x01: generate_op01(block, compiler, desc); break; + case 0x02: generate_op02(block, compiler, desc); break; + case 0x03: generate_op03(block, compiler, desc); break; + case 0x04: generate_op04(block, compiler, desc); break; + case 0x05: generate_op05(block, compiler, desc); break; + case 0x06: generate_op06(block, compiler, desc); break; + case 0x07: generate_op07(block, compiler, desc); break; + case 0x08: generate_op08(block, compiler, desc); break; + case 0x09: generate_op09(block, compiler, desc); break; + case 0x0a: generate_op0a(block, compiler, desc); break; + case 0x0b: generate_op0b(block, compiler, desc); break; + case 0x0c: generate_op0c(block, compiler, desc); break; + case 0x0d: generate_op0d(block, compiler, desc); break; + case 0x0e: generate_op0e(block, compiler, desc); break; + case 0x0f: generate_op0f(block, compiler, desc); break; + case 0x10: generate_op10(block, compiler, desc); break; + case 0x11: generate_op11(block, compiler, desc); break; + case 0x12: generate_op12(block, compiler, desc); break; + case 0x13: generate_op13(block, compiler, desc); break; + case 0x14: generate_op14(block, compiler, desc); break; + case 0x15: generate_op15(block, compiler, desc); break; + case 0x16: generate_op16(block, compiler, desc); break; + case 0x17: generate_op17(block, compiler, desc); break; + case 0x18: generate_op18(block, compiler, desc); break; + case 0x19: generate_op19(block, compiler, desc); break; + case 0x1a: generate_op1a(block, compiler, desc); break; + case 0x1b: generate_op1b(block, compiler, desc); break; + case 0x1c: generate_op1c(block, compiler, desc); break; + case 0x1d: generate_op1d(block, compiler, desc); break; + case 0x1e: generate_op1e(block, compiler, desc); break; + case 0x1f: generate_op1f(block, compiler, desc); break; + case 0x20: generate_op20(block, compiler, desc); break; + case 0x21: generate_op21(block, compiler, desc); break; + case 0x22: generate_op22(block, compiler, desc); break; + case 0x23: generate_op23(block, compiler, desc); break; + case 0x24: generate_op24(block, compiler, desc); break; + case 0x25: generate_op25(block, compiler, desc); break; + case 0x26: generate_op26(block, compiler, desc); break; + case 0x27: generate_op27(block, compiler, desc); break; + case 0x28: generate_op28(block, compiler, desc); break; + case 0x29: generate_op29(block, compiler, desc); break; + case 0x2a: generate_op2a(block, compiler, desc); break; + case 0x2b: generate_op2b(block, compiler, desc); break; + case 0x2c: generate_op2c(block, compiler, desc); break; + case 0x2d: generate_op2d(block, compiler, desc); break; + case 0x2e: generate_op2e(block, compiler, desc); break; + case 0x2f: generate_op2f(block, compiler, desc); break; + case 0x30: generate_op30(block, compiler, desc); break; + case 0x31: generate_op31(block, compiler, desc); break; + case 0x32: generate_op32(block, compiler, desc); break; + case 0x33: generate_op33(block, compiler, desc); break; + case 0x34: generate_op34(block, compiler, desc); break; + case 0x35: generate_op35(block, compiler, desc); break; + case 0x36: generate_op36(block, compiler, desc); break; + case 0x37: generate_op37(block, compiler, desc); break; + case 0x38: generate_op38(block, compiler, desc); break; + case 0x39: generate_op39(block, compiler, desc); break; + case 0x3a: generate_op3a(block, compiler, desc); break; + case 0x3b: generate_op3b(block, compiler, desc); break; + case 0x3c: generate_op3c(block, compiler, desc); break; + case 0x3d: generate_op3d(block, compiler, desc); break; + case 0x3e: generate_op3e(block, compiler, desc); break; + case 0x3f: generate_op3f(block, compiler, desc); break; + case 0x40: generate_op40(block, compiler, desc); break; + case 0x41: generate_op41(block, compiler, desc); break; + case 0x42: generate_op42(block, compiler, desc); break; + case 0x43: generate_op43(block, compiler, desc); break; + case 0x44: generate_op44(block, compiler, desc); break; + case 0x45: generate_op45(block, compiler, desc); break; + case 0x46: generate_op46(block, compiler, desc); break; + case 0x47: generate_op47(block, compiler, desc); break; + case 0x48: generate_op48(block, compiler, desc); break; + case 0x49: generate_op49(block, compiler, desc); break; + case 0x4a: generate_op4a(block, compiler, desc); break; + case 0x4b: generate_op4b(block, compiler, desc); break; + case 0x4c: generate_op4c(block, compiler, desc); break; + case 0x4d: generate_op4d(block, compiler, desc); break; + case 0x4e: generate_op4e(block, compiler, desc); break; + case 0x4f: generate_op4f(block, compiler, desc); break; + case 0x50: generate_op50(block, compiler, desc); break; + case 0x51: generate_op51(block, compiler, desc); break; + case 0x52: generate_op52(block, compiler, desc); break; + case 0x53: generate_op53(block, compiler, desc); break; + case 0x54: generate_op54(block, compiler, desc); break; + case 0x55: generate_op55(block, compiler, desc); break; + case 0x56: generate_op56(block, compiler, desc); break; + case 0x57: generate_op57(block, compiler, desc); break; + case 0x58: generate_op58(block, compiler, desc); break; + case 0x59: generate_op59(block, compiler, desc); break; + case 0x5a: generate_op5a(block, compiler, desc); break; + case 0x5b: generate_op5b(block, compiler, desc); break; + case 0x5c: generate_op5c(block, compiler, desc); break; + case 0x5d: generate_op5d(block, compiler, desc); break; + case 0x5e: generate_op5e(block, compiler, desc); break; + case 0x5f: generate_op5f(block, compiler, desc); break; + case 0x60: generate_op60(block, compiler, desc); break; + case 0x61: generate_op61(block, compiler, desc); break; + case 0x62: generate_op62(block, compiler, desc); break; + case 0x63: generate_op63(block, compiler, desc); break; + case 0x64: generate_op64(block, compiler, desc); break; + case 0x65: generate_op65(block, compiler, desc); break; + case 0x66: generate_op66(block, compiler, desc); break; + case 0x67: generate_op67(block, compiler, desc); break; + case 0x68: generate_op68(block, compiler, desc); break; + case 0x69: generate_op69(block, compiler, desc); break; + case 0x6a: generate_op6a(block, compiler, desc); break; + case 0x6b: generate_op6b(block, compiler, desc); break; + case 0x6c: generate_op6c(block, compiler, desc); break; + case 0x6d: generate_op6d(block, compiler, desc); break; + case 0x6e: generate_op6e(block, compiler, desc); break; + case 0x6f: generate_op6f(block, compiler, desc); break; + case 0x70: generate_op70(block, compiler, desc); break; + case 0x71: generate_op71(block, compiler, desc); break; + case 0x72: generate_op72(block, compiler, desc); break; + case 0x73: generate_op73(block, compiler, desc); break; + case 0x74: generate_op74(block, compiler, desc); break; + case 0x75: generate_op75(block, compiler, desc); break; + case 0x76: generate_op76(block, compiler, desc); break; + case 0x77: generate_op77(block, compiler, desc); break; + case 0x78: generate_op78(block, compiler, desc); break; + case 0x79: generate_op79(block, compiler, desc); break; + case 0x7a: generate_op7a(block, compiler, desc); break; + case 0x7b: generate_op7b(block, compiler, desc); break; + case 0x7c: generate_op7c(block, compiler, desc); break; + case 0x7d: generate_op7d(block, compiler, desc); break; + case 0x7e: generate_op7e(block, compiler, desc); break; + case 0x7f: generate_op7f(block, compiler, desc); break; + case 0x80: generate_op80(block, compiler, desc); break; + case 0x81: generate_op81(block, compiler, desc); break; + case 0x82: generate_op82(block, compiler, desc); break; + case 0x83: generate_op83(block, compiler, desc); break; + case 0x84: generate_op84(block, compiler, desc); break; + case 0x85: generate_op85(block, compiler, desc); break; + case 0x86: generate_op86(block, compiler, desc); break; + case 0x87: generate_op87(block, compiler, desc); break; + case 0x88: generate_op88(block, compiler, desc); break; + case 0x89: generate_op89(block, compiler, desc); break; + case 0x8a: generate_op8a(block, compiler, desc); break; + case 0x8b: generate_op8b(block, compiler, desc); break; + case 0x8c: + case 0x8d: return false; + case 0x8e: generate_op8e(block, compiler, desc); break; + case 0x8f: generate_op8f(block, compiler, desc); break; + case 0x90: generate_op90(block, compiler, desc); break; + case 0x91: generate_op91(block, compiler, desc); break; + case 0x92: generate_op92(block, compiler, desc); break; + case 0x93: generate_op93(block, compiler, desc); break; + case 0x94: generate_op94(block, compiler, desc); break; + case 0x95: generate_op95(block, compiler, desc); break; + case 0x96: generate_op96(block, compiler, desc); break; + case 0x97: generate_op97(block, compiler, desc); break; + case 0x98: generate_op98(block, compiler, desc); break; + case 0x99: generate_op99(block, compiler, desc); break; + case 0x9a: generate_op9a(block, compiler, desc); break; + case 0x9b: generate_op9b(block, compiler, desc); break; + case 0x9c: generate_op9c(block, compiler, desc); break; + case 0x9d: generate_op9d(block, compiler, desc); break; + case 0x9e: generate_op9e(block, compiler, desc); break; + case 0x9f: generate_op9f(block, compiler, desc); break; + case 0xa0: generate_opa0(block, compiler, desc); break; + case 0xa1: generate_opa1(block, compiler, desc); break; + case 0xa2: generate_opa2(block, compiler, desc); break; + case 0xa3: generate_opa3(block, compiler, desc); break; + case 0xa4: generate_opa4(block, compiler, desc); break; + case 0xa5: generate_opa5(block, compiler, desc); break; + case 0xa6: generate_opa6(block, compiler, desc); break; + case 0xa7: generate_opa7(block, compiler, desc); break; + case 0xa8: generate_opa8(block, compiler, desc); break; + case 0xa9: generate_opa9(block, compiler, desc); break; + case 0xaa: generate_opaa(block, compiler, desc); break; + case 0xab: generate_opab(block, compiler, desc); break; + case 0xac: + case 0xad: + case 0xae: + case 0xaf: return false; + case 0xb0: generate_opb0(block, compiler, desc); break; + case 0xb1: generate_opb1(block, compiler, desc); break; + case 0xb2: generate_opb2(block, compiler, desc); break; + case 0xb3: generate_opb3(block, compiler, desc); break; + case 0xb4: generate_opb4(block, compiler, desc); break; + case 0xb5: generate_opb5(block, compiler, desc); break; + case 0xb6: generate_opb6(block, compiler, desc); break; + case 0xb7: generate_opb7(block, compiler, desc); break; + case 0xb8: generate_opb8(block, compiler, desc); break; + case 0xb9: generate_opb9(block, compiler, desc); break; + case 0xba: generate_opba(block, compiler, desc); break; + case 0xbb: generate_opbb(block, compiler, desc); break; + case 0xbc: generate_opbc(block, compiler, desc); break; + case 0xbd: generate_opbd(block, compiler, desc); break; + case 0xbe: generate_opbe(block, compiler, desc); break; + case 0xbf: generate_opbf(block, compiler, desc); break; + case 0xc0: generate_opc0(block, compiler, desc); break; + case 0xc1: generate_opc1(block, compiler, desc); break; + case 0xc2: generate_opc2(block, compiler, desc); break; + case 0xc3: generate_opc3(block, compiler, desc); break; + case 0xc4: generate_opc4(block, compiler, desc); break; + case 0xc5: generate_opc5(block, compiler, desc); break; + case 0xc6: generate_opc6(block, compiler, desc); break; + case 0xc7: generate_opc7(block, compiler, desc); break; + case 0xc8: generate_opc8(block, compiler, desc); break; + case 0xc9: generate_opc9(block, compiler, desc); break; + case 0xca: generate_opca(block, compiler, desc); break; + case 0xcb: generate_opcb(block, compiler, desc); break; + case 0xcc: generate_opcc(block, compiler, desc); break; + case 0xcd: generate_opcd(block, compiler, desc); break; + case 0xce: generate_opce(block, compiler, desc); break; + case 0xcf: generate_opcf(block, compiler, desc); break; + case 0xd0: generate_opd0(block, compiler, desc); break; + case 0xd1: generate_opd1(block, compiler, desc); break; + case 0xd2: generate_opd2(block, compiler, desc); break; + case 0xd3: generate_opd3(block, compiler, desc); break; + case 0xd4: generate_opd4(block, compiler, desc); break; + case 0xd5: generate_opd5(block, compiler, desc); break; + case 0xd6: generate_opd6(block, compiler, desc); break; + case 0xd7: generate_opd7(block, compiler, desc); break; + case 0xd8: generate_opd8(block, compiler, desc); break; + case 0xd9: generate_opd9(block, compiler, desc); break; + case 0xda: generate_opda(block, compiler, desc); break; + case 0xdb: generate_opdb(block, compiler, desc); break; + case 0xdc: generate_opdc(block, compiler, desc); break; + case 0xdd: generate_opdd(block, compiler, desc); break; + case 0xde: generate_opde(block, compiler, desc); break; + case 0xdf: generate_opdf(block, compiler, desc); break; + case 0xe0: generate_ope0(block, compiler, desc); break; + case 0xe1: generate_ope1(block, compiler, desc); break; + case 0xe2: generate_ope2(block, compiler, desc); break; + case 0xe3: generate_ope3(block, compiler, desc); break; + case 0xe4: generate_ope4(block, compiler, desc); break; + case 0xe5: generate_ope5(block, compiler, desc); break; + case 0xe6: generate_ope6(block, compiler, desc); break; + case 0xe7: generate_ope7(block, compiler, desc); break; + case 0xe8: generate_ope8(block, compiler, desc); break; + case 0xe9: generate_ope9(block, compiler, desc); break; + case 0xea: generate_opea(block, compiler, desc); break; + case 0xeb: generate_opeb(block, compiler, desc); break; + case 0xec: generate_opec(block, compiler, desc); break; + case 0xed: generate_oped(block, compiler, desc); break; + case 0xee: generate_opee(block, compiler, desc); break; + case 0xef: generate_opef(block, compiler, desc); break; + case 0xf0: generate_opf0(block, compiler, desc); break; + case 0xf1: generate_opf1(block, compiler, desc); break; + case 0xf2: generate_opf2(block, compiler, desc); break; + case 0xf3: generate_opf3(block, compiler, desc); break; + case 0xf4: generate_opf4(block, compiler, desc); break; + case 0xf5: generate_opf5(block, compiler, desc); break; + case 0xf6: generate_opf6(block, compiler, desc); break; + case 0xf7: generate_opf7(block, compiler, desc); break; + case 0xf8: generate_opf8(block, compiler, desc); break; + case 0xf9: generate_opf9(block, compiler, desc); break; + case 0xfa: generate_opfa(block, compiler, desc); break; + case 0xfb: generate_opfb(block, compiler, desc); break; + case 0xfc: generate_opfc(block, compiler, desc); break; + case 0xfd: generate_opfd(block, compiler, desc); break; + case 0xfe: generate_opfe(block, compiler, desc); break; + case 0xff: generate_opff(block, compiler, desc); break; + } + return true; +} \ No newline at end of file diff --git a/src/devices/cpu/e132xs/e132xsdrc_ops.cpp b/src/devices/cpu/e132xs/e132xsdrc_ops.cpp new file mode 100644 index 00000000000..7c421f5af7a --- /dev/null +++ b/src/devices/cpu/e132xs/e132xsdrc_ops.cpp @@ -0,0 +1,1035 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz + +#include "e132xs.h" + +void hyperstone_device::generate_op00(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op01(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op02(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op03(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op04(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op05(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op06(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op07(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op08(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op09(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op0a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op0b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op0c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op0d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op0e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op0f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_op10(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op11(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op12(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op13(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op14(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op15(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op16(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op17(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op18(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op19(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op1a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op1b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op1c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op1d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op1e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op1f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_op20(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op21(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op22(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op23(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op24(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op25(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op26(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op27(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op28(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op29(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op2a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op2b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op2c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op2d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op2e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op2f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_op30(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op31(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op32(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op33(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op34(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op35(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op36(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op37(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op38(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op39(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op3a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op3b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op3c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op3d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op3e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op3f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_op40(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op41(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op42(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op43(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op44(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op45(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op46(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op47(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op48(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op49(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op4a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op4b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op4c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op4d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op4e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op4f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_op50(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op51(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op52(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op53(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op54(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op55(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op56(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op57(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op58(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op59(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op5a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op5b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op5c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op5d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op5e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op5f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_op60(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op61(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op62(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op63(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op64(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op65(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op66(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op67(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op68(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op69(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op6a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op6b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op6c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op6d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op6e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op6f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_op70(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op71(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op72(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op73(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op74(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op75(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op76(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op77(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op78(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op79(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op7a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op7b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op7c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op7d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op7e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op7f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_op80(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op81(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op82(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op83(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op84(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op85(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op86(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op87(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op88(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op89(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op8a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op8b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op8e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op8f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_op90(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op91(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op92(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op93(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op94(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op95(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op96(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op97(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op98(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op99(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op9a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op9b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op9c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op9d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op9e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_op9f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_opa0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opa1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opa2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opa3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opa4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opa5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opa6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opa7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opa8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opa9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opaa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opab(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + + +void hyperstone_device::generate_opb0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opb1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opb2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opb3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opb4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opb5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opb6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opb7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opb8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opb9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opba(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opbb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opbc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opbd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opbe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opbf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_opc0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opc1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opc3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opc4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opc5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opc6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opc7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opc8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opc9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opca(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opcb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opcc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opcd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opce(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opcf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_opd0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opd1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opd2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opd3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opd4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opd5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opd6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opd7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opd8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opd9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opda(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opdb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opdc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opdd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opde(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opdf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_ope0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_ope1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_ope2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_ope3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_ope4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_ope5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_ope6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_ope7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_ope8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_ope9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opea(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opeb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opec(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_oped(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opee(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opef(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + + +void hyperstone_device::generate_opf0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opf1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opf2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opf3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opf4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opf5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opf6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opf7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opf8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opf9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opfa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opfb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opfc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opfd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opfe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_opff(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} diff --git a/src/devices/cpu/e132xs/e132xsfe.cpp b/src/devices/cpu/e132xs/e132xsfe.cpp new file mode 100644 index 00000000000..b0ece09d68f --- /dev/null +++ b/src/devices/cpu/e132xs/e132xsfe.cpp @@ -0,0 +1,1198 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + e132xsfe.cpp + + Front end for Hyperstone recompiler + +***************************************************************************/ + +#include "emu.h" +#include "e132xsfe.h" + +#define FE_FP ((m_cpu->m_global_regs[1] & 0xfe000000) >> 25) +#define FE_FL (m_cpu->m_fl_lut[((m_cpu->m_global_regs[1] >> 21) & 0xf)]) +#define DST_CODE ((op & 0xf0) >> 4) +#define SRC_CODE (op & 0x0f) +#define SR_CODE (1 << 1) + +/*************************************************************************** + INSTRUCTION PARSERS +***************************************************************************/ + +e132xs_frontend::e132xs_frontend(hyperstone_device *e132xs, uint32_t window_start, uint32_t window_end, uint32_t max_sequence) + : drc_frontend(*e132xs, window_start, window_end, max_sequence) + , m_cpu(e132xs) +{ +} + +/*------------------------------------------------- + describe_instruction - build a description + of a single instruction +-------------------------------------------------*/ + +inline uint16_t e132xs_frontend::read_word(opcode_desc &desc) +{ + return m_cpu->m_direct->read_word(desc.physpc, m_cpu->m_opcodexor); +} + +inline uint16_t e132xs_frontend::read_imm1(opcode_desc &desc) +{ + return m_cpu->m_direct->read_word(desc.physpc + 2, m_cpu->m_opcodexor); +} + +inline uint16_t e132xs_frontend::read_imm2(opcode_desc &desc) +{ + return m_cpu->m_direct->read_word(desc.physpc + 4, m_cpu->m_opcodexor); +} + +inline uint32_t e132xs_frontend::read_ldstxx_imm(opcode_desc &desc) +{ + const uint16_t imm1 = read_imm1(desc); + uint32_t extra_s; + if (imm1 & 0x8000) + { + extra_s = read_imm2(desc); + extra_s |= ((imm1 & 0xfff) << 16); + + if (imm1 & 0x4000) + extra_s |= 0xf0000000; + } + else + { + extra_s = imm1 & 0xfff; + + if (imm1 & 0x4000) + extra_s |= 0xfffff000; + } + return extra_s; +} + +inline int32_t e132xs_frontend::decode_pcrel(opcode_desc &desc, uint16_t op) +{ + if (op & 0x80) + { + uint16_t next = read_imm1(desc); + + desc.length = 4; + + int32_t offset = (op & 0x7f) << 16; + offset |= (next & 0xfffe); + + if (next & 1) + offset |= 0xff800000; + + return offset; + } + else + { + int32_t offset = op & 0x7e; + if (op & 1) + offset |= 0xffffff80; + return offset; + } +} + +inline int32_t e132xs_frontend::decode_call(opcode_desc &desc) +{ + const uint16_t imm_1 = read_imm1(desc); + int32_t extra_s = 0; + if (imm_1 & 0x8000) + { + desc.length = 6; + extra_s = read_imm2(desc); + extra_s |= ((imm_1 & 0x3fff) << 16); + + if (imm_1 & 0x4000) + extra_s |= 0xc0000000; + } + else + { + desc.length = 4; + extra_s = imm_1 & 0x3fff; + if (imm_1 & 0x4000) + extra_s |= 0xffffc000; + } + return extra_s; +} + +bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) +{ + uint16_t op = read_word(desc); + + /* most instructions are 2 bytes and a single cycle */ + desc.length = 2; + desc.cycles = m_cpu->m_clock_cycles_1; + + const uint32_t fp = FE_FP; + const uint32_t gdst_code = DST_CODE; + const uint32_t gdstf_code = gdst_code + 1; + const uint32_t gsrc_code = SRC_CODE; + const uint32_t gsrcf_code = gsrc_code + 1; + const uint32_t ldst_code = (gdst_code + fp) & 0x1f; + const uint32_t ldstf_code = (gdstf_code + fp) & 0x1f; + const uint32_t lsrc_code = (gsrc_code + fp) & 0x1f; + const uint32_t lsrcf_code = (gsrcf_code + fp) & 0x1f; + const uint32_t ldst_group = 1 + (((DST_CODE + fp) & 0x20) >> 5); + const uint32_t ldstf_group = 1 + (((DST_CODE + fp + 1) & 0x20) >> 5); + const uint32_t lsrc_group = 1 + (((SRC_CODE + fp) & 0x20) >> 5); + const uint32_t lsrcf_group = 1 + ((SRC_CODE + fp + 1) >> 5); + + switch (op >> 8) + { + case 0x00: // chk global,global + desc.regin[0] |= 1 << gdst_code; + desc.regin[0] |= 1 << gsrc_code; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + break; + case 0x01: // chk global,local + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gdst_code; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + break; + case 0x02: // chk local,global + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regin[0] |= 1 << gsrc_code; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + break; + case 0x03: // chk local,local + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + break; + case 0x04: // movd global,global + desc.regin[0] |= 1 << gsrc_code; + desc.regin[0] |= 1 << gsrcf_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdstf_code; + if (gdst_code == 0) + { + desc.regout[1] = 0xffffffff; + desc.regout[2] = 0xffffffff; + desc.targetpc = BRANCH_TARGET_DYNAMIC; + desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE | OPFLAG_CAN_CAUSE_EXCEPTION; + } + else + { + desc.cycles = m_cpu->m_clock_cycles_2; + } + desc.regout[0] |= SR_CODE; + break; + case 0x05: // movd global,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[lsrcf_group] |= 1 << lsrcf_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdstf_code; + if (gdst_code == 0) + { + desc.regout[1] = 0xffffffff; + desc.regout[2] = 0xffffffff; + desc.targetpc = BRANCH_TARGET_DYNAMIC; + desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE | OPFLAG_CAN_CAUSE_EXCEPTION; + } + else + { + desc.cycles = m_cpu->m_clock_cycles_2; + } + desc.regout[0] |= SR_CODE; + break; + case 0x06: // movd local,global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regin[0] |= 1 << gsrcf_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[ldstf_group] |= 1 << ldstf_code; + desc.regout[0] |= SR_CODE; + desc.cycles = m_cpu->m_clock_cycles_2; + break; + case 0x07: // movd local,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[lsrcf_group] |= 1 << lsrcf_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[ldstf_group] |= 1 << ldstf_code; + desc.regout[0] |= SR_CODE; + desc.cycles = m_cpu->m_clock_cycles_2; + break; + case 0x08: // divu global,global + case 0x0c: // divs global,global + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + desc.regin[0] |= 1 << gsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regin[0] |= 1 << gdstf_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdstf_code; + desc.regout[0] |= SR_CODE; + desc.cycles = 36 << m_cpu->m_clck_scale; + break; + case 0x09: // divu global,local + case 0x0d: // divs global,local + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regin[0] |= 1 << gdstf_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdstf_code; + desc.regout[0] |= SR_CODE; + desc.cycles = 36 << m_cpu->m_clck_scale; + break; + case 0x0a: // divu local,global + case 0x0e: // divs local,global + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regin[ldstf_group] |= 1 << ldstf_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[ldstf_group] |= 1 << ldstf_code; + desc.regout[0] |= SR_CODE; + desc.cycles = 36 << m_cpu->m_clck_scale; + break; + case 0x0b: // divu local,local + case 0x0f: // divs local,local + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regin[ldstf_group] |= 1 << ldstf_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[ldstf_group] |= 1 << ldstf_code; + desc.regout[0] |= SR_CODE; + desc.cycles = 36 << m_cpu->m_clck_scale; + break; + case 0x10: // xm global,global + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + desc.regin[0] |= 1 << gsrc_code; + desc.regout[0] |= 1 << gdst_code; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x11: // xm global,local + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[0] |= 1 << gdst_code; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x12: // xm local,global + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x13: // xm local,local + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x14: // mask global,global + desc.regin[0] |= 1 << gsrc_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x15: // mask global,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x16: // mask local,global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x17: // mask local,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x18: // sum global,global + case 0x1c: // sums global,global + desc.regin[0] |= 1 << gsrc_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x19: // sum global,local + case 0x1d: // sums global,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x1a: // sum local,global + case 0x1e: // sums local,global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x1b: // sum local,local + case 0x1f: // sums local,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x20: // cmp global,global + case 0x30: // cmpb global,global + desc.regin[0] |= 1 << gsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x21: // cmp global,local + case 0x31: // cmpb global,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x22: // cmp local,global + case 0x32: // cmpb local,global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x23: // cmp local,local + case 0x33: // cmpb local,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x24: // mov global,global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regin[0] |= 1 << (gsrc_code + 16); + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x25: // mov global,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x26: // mov local,global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regin[0] |= 1 << (gsrc_code + 16); + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x27: // mov local,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x28: // add global,global + case 0x2c: // adds global,global + case 0x48: // sub global,global + case 0x4c: // subs global,global + desc.regin[0] |= 1 << gsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // adds, subs + break; + case 0x29: // add global,local + case 0x2d: // adds global,local + case 0x49: // sub global,local + case 0x4d: // subs global,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // adds, subs + break; + case 0x2a: // add local,global + case 0x2e: // adds local,global + case 0x4a: // sub local,global + case 0x4e: // subs local,global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // adds, subs + break; + case 0x2b: // add local,local + case 0x2f: // adds local,local + case 0x4b: // sub local,local + case 0x4f: // subs local,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // adds, subs + break; + case 0x34: // andn global,global + case 0x38: // or global,global + case 0x3c: // xor global,global + case 0x54: // and global,global + desc.regin[0] |= 1 << gsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x35: // andn global,local + case 0x39: // or global,local + case 0x3d: // xor global,local + case 0x55: // and global,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x36: // andn local,global + case 0x3a: // or local,global + case 0x3e: // xor local,global + case 0x56: // and local,global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x37: // andn local,local + case 0x3b: // or local,local + case 0x3f: // xor local,local + case 0x57: // and local,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x40: // subc global,global + case 0x50: // addc global,global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x41: // subc global,local + case 0x51: // addc global,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x42: // subc local,global + case 0x52: // addc local,global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x43: // subc local,local + case 0x53: // addc local,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x44: // not global,global + case 0x58: // neg global,global + desc.regin[0] |= 1 << gsrc_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x45: // not global,local + case 0x59: // neg global,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x46: // not local,global + case 0x5a: // neg local,global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x47: // not local,local + case 0x5b: // neg local,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x5c: // negs global,global + desc.regin[0] |= 1 << gsrc_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x5d: // negs global,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x5e: // negs local,global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x5f: // negs local,local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x60: // cmpi global,simm + case 0x70: // cmpbi global,simm + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x61: // cmpi global,limm + case 0x71: // cmpbi global,limm + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x62: // cmpi local,simm + case 0x72: // cmpbi local,simm + desc.regin[0] |= SR_CODE; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x63: // cmpi local,limm + case 0x73: // cmpbi local,limm + desc.regin[0] |= SR_CODE; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x64: // movi global,simm + desc.regin[0] |= SR_CODE; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << (gdst_code + 16); + desc.regout[0] |= SR_CODE; + break; + case 0x65: // movi global,limm + desc.regin[0] |= SR_CODE; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << (gdst_code + 16); + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x66: // movi local,simm + desc.regin[0] |= SR_CODE; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x67: // movi local,limm + desc.regin[0] |= SR_CODE; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x68: // addi global,simm + case 0x6c: // addsi global,simm + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi + break; + case 0x69: // addi global,limm + case 0x6d: // addsi global,limm + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi + break; + case 0x6a: // addi local,simm + case 0x6e: // addsi local,simm + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi + break; + case 0x6b: // addi local,limm + case 0x6f: // addsi local,limm + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi + break; + case 0x74: // andni global,simm + case 0x78: // ori global,simm + case 0x7c: // xori global,simm + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x75: // andni global,limm + case 0x79: // ori global,limm + case 0x7d: // xori global,limm + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x76: // andni local,simm + case 0x7a: // ori local,simm + case 0x7e: // xori local,simm + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x77: // andni local,limm + case 0x7b: // ori local,limm + case 0x7f: // xori local,limm + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + break; + case 0x80: case 0x81: // shrdi + case 0x84: case 0x85: // sardi + case 0x88: case 0x89: // shldi + desc.regin[0] |= SR_CODE; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[ldstf_group] |= 1 << ldstf_code; + desc.regout[0] |= SR_CODE; + desc.cycles = m_cpu->m_clock_cycles_2; + break; + case 0x82: // shrd + case 0x86: // sard + case 0x8a: // shld + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[ldstf_group] |= 1 << ldstf_code; + desc.regout[0] |= SR_CODE; + desc.cycles = m_cpu->m_clock_cycles_2; + break; + case 0x83: // shr + case 0x87: // sar + case 0x8b: // shl + case 0x8f: // rol + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0x8c: case 0x8d: // reserved + return false; + case 0x8e: // testlz + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + break; + case 0x90: // ldxx1 global,global + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_READS_MEMORY; + break; + } + case 0x91: // ldxx1 global,local + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gdst_code; + desc.regout[lsrc_group] |= 1 << lsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_READS_MEMORY; + break; + } + case 0x92: // ldxx1 local,global + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= 1 << gsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_READS_MEMORY; + break; + } + case 0x93: // ldxx1 local,local + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[lsrc_group] |= 1 << lsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_READS_MEMORY; + break; + } + case 0x94: // ldxx2 global,global + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_READS_MEMORY; + break; + } + case 0x95: // ldxx2 global,local + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[lsrc_group] |= 1 << lsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_READS_MEMORY; + break; + } + case 0x96: // ldxx2 local,global + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= 1 << gsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_READS_MEMORY; + break; + } + case 0x97: // ldxx2 local,local + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[lsrc_group] |= 1 << lsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_READS_MEMORY; + break; + } + case 0x98: // stxx1 global,global + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= 1 << gdst_code; + desc.regin[0] |= 1 << gsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_WRITES_MEMORY; + break; + } + case 0x99: // stxx1 global,local + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gdst_code; + desc.regin[lsrc_group] |= 1 << lsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_WRITES_MEMORY; + break; + } + case 0x9a: // stxx1 local,global + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regin[0] |= 1 << gsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_WRITES_MEMORY; + break; + } + case 0x9b: // stxx1 local,local + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regin[lsrc_group] |= 1 << lsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_WRITES_MEMORY; + break; + } + case 0x9c: // stxx2 global,global + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= 1 << gdst_code; + desc.regin[0] |= 1 << gsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code; + desc.regout[0] |= 1 << gdst_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_WRITES_MEMORY; + break; + } + case 0x9d: // stxx2 global,local + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gdst_code; + desc.regin[lsrc_group] |= 1 << lsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code; + desc.regout[0] |= 1 << gdst_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_WRITES_MEMORY; + break; + } + case 0x9e: // stxx2 local,global + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regin[0] |= 1 << gsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code; + desc.regout[ldst_group] |= 1 << ldst_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_WRITES_MEMORY; + break; + } + case 0x9f: // stxx2 local,local + { + const uint16_t imm1 = read_imm1(desc); + const uint32_t extra_s = read_ldstxx_imm(desc); + + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regin[lsrc_group] |= 1 << lsrc_code; + if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code; + desc.regout[ldst_group] |= 1 << ldst_code; + + desc.length = (imm1 & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_WRITES_MEMORY; + break; + } + case 0xa0: // shri global (lo n) + case 0xa1: // shri global (hi n) + case 0xa4: // sari global (lo n) + case 0xa5: // sari global (hi n) + case 0xa8: // shli global (lo n) + case 0xa9: // shli global (hi n) + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + break; + case 0xa2: // shri local (lo n) + case 0xa3: // shri local (hi n) + case 0xa6: // sari local (lo n) + case 0xa7: // sari local (hi n) + case 0xaa: // shli local (lo n) + case 0xab: // shli local (hi n) + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + break; + case 0xac: case 0xad: case 0xae: case 0xaf: // reserved + return false; + case 0xb0: // mulu global,global + case 0xb4: // muls global,global + desc.regin[0] |= 1 << gsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdstf_code; + desc.regout[0] |= SR_CODE; + desc.cycles = m_cpu->m_clock_cycles_4; + break; + case 0xb1: // mulu global,local + case 0xb5: // muls global,local + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdstf_code; + desc.regout[0] |= SR_CODE; + desc.cycles = m_cpu->m_clock_cycles_4; + break; + case 0xb2: // mulu local,global + case 0xb6: // muls local,global + desc.regin[0] |= 1 << gsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[ldstf_group] |= 1 << ldstf_code; + desc.regout[0] |= SR_CODE; + desc.cycles = m_cpu->m_clock_cycles_4; + break; + case 0xb3: // mulu local,local + case 0xb7: // muls local,local + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[ldstf_group] |= 1 << ldstf_code; + desc.regout[0] |= SR_CODE; + desc.cycles = m_cpu->m_clock_cycles_4; + break; + case 0xb8: // set global (lo n) + case 0xb9: // set global (hi n) + desc.regin[0] |= SR_CODE; + desc.regout[0] |= 1 << gdst_code; + break; + case 0xba: // set local (lo n) + case 0xbb: // set local (hi n) + desc.regout[ldst_group] |= 1 << ldst_code; + break; + case 0xbc: // mul global,global + desc.regin[0] |= 1 << gsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + desc.cycles = 3 << m_cpu->m_clck_scale; + break; + case 0xbd: // muls global,local + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[0] |= 1 << gdst_code; + desc.regout[0] |= 1 << gdst_code; + desc.regout[0] |= SR_CODE; + desc.cycles = 3 << m_cpu->m_clck_scale; + break; + case 0xbe: // muls local,global + desc.regin[0] |= 1 << gsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + desc.cycles = 3 << m_cpu->m_clck_scale; + break; + case 0xbf: // mulu local,local + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= SR_CODE; + desc.cycles = 3 << m_cpu->m_clck_scale; + break; + case 0xc0: case 0xc1: case 0xc2: case 0xc3: // software + case 0xc4: case 0xc5: case 0xc6: case 0xc7: // software + case 0xc8: case 0xc9: case 0xca: case 0xcb: // software + case 0xcc: case 0xcd: // software + { + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[lsrcf_group] |= 1 << lsrcf_code; + + const uint32_t reg = FE_FP + FE_FL; + desc.regout[1 + (((reg + 0) & 0x20) >> 5)] |= 1 << ((reg + 0) & 0x1f); + desc.regout[1 + (((reg + 1) & 0x20) >> 5)] |= 1 << ((reg + 1) & 0x1f); + desc.regout[1 + (((reg + 2) & 0x20) >> 5)] |= 1 << ((reg + 2) & 0x1f); + desc.regout[1 + (((reg + 3) & 0x20) >> 5)] |= 1 << ((reg + 3) & 0x1f); + desc.regout[1 + (((reg + 4) & 0x20) >> 5)] |= 1 << ((reg + 4) & 0x1f); + + desc.regout[0] |= SR_CODE; + + desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; + break; + } + case 0xce: // extend - 4 bytes + desc.regin[0] |= SR_CODE; + desc.regin[0] |= (3 << 14); // global regs 14, 15 + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= (3 << 14); // global regs 14, 15 + break; + case 0xcf: // do + return false; + case 0xd0: // ldwr global + case 0xd4: // ldwp global + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= 1 << gsrc_code; + if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; + desc.flags |= OPFLAG_READS_MEMORY; + break; + case 0xd1: // ldwr local + case 0xd5: // ldwp local + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[lsrc_group] |= 1 << lsrc_code; + if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; + desc.flags |= OPFLAG_READS_MEMORY; + break; + case 0xd2: // lddr global + case 0xd6: // lddp global + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[0] |= 1 << gsrc_code; + desc.regout[0] |= 1 << gsrcf_code; + if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; + desc.flags |= OPFLAG_READS_MEMORY; + break; + case 0xd3: // lddr local + case 0xd7: // lddp local + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regout[lsrc_group] |= 1 << lsrc_code; + desc.regout[lsrcf_group] |= 1 << lsrcf_code; + if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; + desc.flags |= OPFLAG_READS_MEMORY; + break; + case 0xd8: // stwr global + case 0xdc: // stwp global + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regin[0] |= 1 << gsrc_code; + if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; + desc.flags |= OPFLAG_WRITES_MEMORY; + break; + case 0xd9: // stwr local + case 0xdd: // stwp local + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regin[lsrc_group] |= 1 << lsrc_code; + if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; + desc.flags |= OPFLAG_WRITES_MEMORY; + break; + case 0xda: // stdr global + case 0xde: // stdp global + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regin[0] |= 1 << gsrc_code; + desc.regin[0] |= 1 << gsrcf_code; + if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; + desc.flags |= OPFLAG_WRITES_MEMORY; + break; + case 0xdb: // stdr local + case 0xdf: // stdp local + desc.regin[0] |= SR_CODE; + desc.regin[ldst_group] |= 1 << ldst_code; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regin[lsrcf_group] |= 1 << lsrcf_code; + if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; + desc.flags |= OPFLAG_WRITES_MEMORY; + break; + case 0xe0: case 0xe1: case 0xe2: case 0xe3: // dbv, dbnv, dbe, dbne - could be 4 bytes (pcrel) + case 0xe4: case 0xe5: case 0xe6: case 0xe7: // dbc, dbnc, dbse, dbht - could be 4 bytes (pcrel) + case 0xe8: case 0xe9: case 0xea: case 0xeb: // dbn, dbnn, dblt, dbgt - could be 4 bytes (pcrel) + desc.regin[0] |= SR_CODE; + desc.targetpc = desc.pc + decode_pcrel(desc, op); + desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH; + desc.delayslots = 1; + break; + case 0xec: // dbr - could be 4 bytes (pcrel) + desc.targetpc = desc.pc + decode_pcrel(desc, op); + desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; + desc.delayslots = 1; + break; + case 0xed: // frame + desc.regin[0] |= SR_CODE; + desc.regin[1] = 0xffffffff; + desc.regin[2] = 0xffffffff; + desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION | OPFLAG_END_SEQUENCE; + break; + case 0xee: // call global + desc.regin[0] |= SR_CODE; + desc.regin[0] |= 1 << gsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[ldstf_group] |= 1 << ldstf_code; + desc.targetpc = desc.pc + decode_call(desc); + desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; + break; + case 0xef: // call local + desc.regin[0] |= SR_CODE; + desc.regin[lsrc_group] |= 1 << lsrc_code; + desc.regout[ldst_group] |= 1 << ldst_code; + desc.regout[ldstf_group] |= 1 << ldstf_code; + desc.targetpc = desc.pc + decode_call(desc); + desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; + break; + case 0xf0: case 0xf1: case 0xf2: case 0xf3: // bv, bnv, be, bne + case 0xf4: case 0xf5: case 0xf6: case 0xf7: // bc, bnc, bse, bht + case 0xf8: case 0xf9: case 0xfa: case 0xfb: // bn, bnn, blt, bgt + desc.regin[0] |= SR_CODE; + desc.targetpc = desc.pc + decode_pcrel(desc, op); + desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH; + break; + case 0xfc: // br + desc.targetpc = desc.pc + decode_pcrel(desc, op); + desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; + break; + case 0xfd: case 0xfe: case 0xff: // trap + desc.regin[0] |= SR_CODE; + desc.targetpc = BRANCH_TARGET_DYNAMIC; + desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE | OPFLAG_CAN_CAUSE_EXCEPTION; + break; + } + return true; +} diff --git a/src/devices/cpu/e132xs/e132xsfe.h b/src/devices/cpu/e132xs/e132xsfe.h new file mode 100644 index 00000000000..1d42177110a --- /dev/null +++ b/src/devices/cpu/e132xs/e132xsfe.h @@ -0,0 +1,32 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +#ifndef MAME_CPU_E132XS_E132XSFE_H +#define MAME_CPU_E132XS_E132XSFE_H + +#pragma once + +#include "e132xs.h" +#include "cpu/drcfe.h" + +class e132xs_frontend : public drc_frontend +{ +public: + e132xs_frontend(hyperstone_device *e132xs, uint32_t window_start, uint32_t window_end, uint32_t max_sequence); + void flush(); + +protected: + // required overrides + virtual bool describe(opcode_desc &desc, const opcode_desc *prev) override; + +private: + inline uint16_t read_word(opcode_desc &desc); + inline uint16_t read_imm1(opcode_desc &desc); + inline uint16_t read_imm2(opcode_desc &desc); + inline uint32_t read_ldstxx_imm(opcode_desc &desc); + inline int32_t decode_pcrel(opcode_desc &desc, uint16_t op); + inline int32_t decode_call(opcode_desc &desc); + + hyperstone_device *m_cpu; +}; + +#endif /* MAME_CPU_E132XS_E132XSFE_H */ diff --git a/src/devices/cpu/e132xs/e132xsop.hxx b/src/devices/cpu/e132xs/e132xsop.hxx index acaa1d99aa9..e9290ea4ab1 100644 --- a/src/devices/cpu/e132xs/e132xsop.hxx +++ b/src/devices/cpu/e132xs/e132xsop.hxx @@ -81,6 +81,8 @@ void hyperstone_device::hyperstone_movd() } else if (SRC_GLOBAL && (src_code == SR_REGISTER)) // Rd doesn't denote PC and Rs denotes SR { + SR |= Z_MASK; + SR &= ~N_MASK; if (DST_GLOBAL) { set_global_register(dst_code, 0); @@ -91,13 +93,16 @@ void hyperstone_device::hyperstone_movd() m_local_regs[dst_code] = 0; m_local_regs[dstf_code] = 0; } - SR |= Z_MASK; - SR &= ~N_MASK; m_icount -= m_clock_cycles_2; } else // Rd doesn't denote PC and Rs doesn't denote SR { + SR &= ~(Z_MASK | N_MASK); + if (concat_64(sreg, sregf) == 0) + SR |= Z_MASK; + SR |= SIGN_TO_N(sreg); + if (DST_GLOBAL) { set_global_register(dst_code, sreg); @@ -109,11 +114,6 @@ void hyperstone_device::hyperstone_movd() m_local_regs[dstf_code] = sregf; } - SR &= ~(Z_MASK | N_MASK); - if (concat_64(sreg, sregf) == 0) - SR |= Z_MASK; - SR |= SIGN_TO_N(sreg); - m_icount -= m_clock_cycles_2; } } @@ -152,12 +152,12 @@ void hyperstone_device::hyperstone_divsu() { /* TODO: add quotient overflow */ const uint32_t quotient = SIGNED ? (uint32_t)((int64_t)dividend / (int32_t)sreg) : (dividend / sreg); - (DST_GLOBAL ? m_global_regs : m_local_regs)[dst_code] = SIGNED ? (uint32_t)((int64_t)dividend % (int32_t)sreg) : (dividend % sreg); - (DST_GLOBAL ? m_global_regs : m_local_regs)[dstf_code] = (uint32_t)quotient; SR &= ~(V_MASK | Z_MASK | N_MASK); if (quotient == 0) SR |= Z_MASK; SR |= SIGN_TO_N(quotient); + (DST_GLOBAL ? m_global_regs : m_local_regs)[dst_code] = SIGNED ? (uint32_t)((int64_t)dividend % (int32_t)sreg) : (dividend % sreg); + (DST_GLOBAL ? m_global_regs : m_local_regs)[dstf_code] = (uint32_t)quotient; } m_icount -= 36 << m_clck_scale; @@ -219,20 +219,19 @@ template > 32; SR |= ((sreg ^ tmp) & (extra_u ^ tmp) & 0x80000000) >> 28; const uint32_t dreg = sreg + extra_u; + + if (dreg == 0) + SR |= Z_MASK; + SR |= SIGN_TO_N(dreg); + if (DST_GLOBAL) set_global_register(DST_CODE, dreg); else m_local_regs[(DST_CODE + fp) & 0x3f] = dreg; - if (dreg == 0) - SR |= Z_MASK; - SR |= SIGN_TO_N(dreg); m_icount -= m_clock_cycles_1; } @@ -285,15 +284,16 @@ void hyperstone_device::hyperstone_sums() //#endif const int32_t res = sreg + extra_s; - if (DST_GLOBAL) - set_global_register(DST_CODE, res); - else - m_local_regs[(DST_CODE + fp) & 0x3f] = res; if (res == 0) SR |= Z_MASK; SR |= SIGN_TO_N(res); + if (DST_GLOBAL) + set_global_register(DST_CODE, res); + else + m_local_regs[(DST_CODE + fp) & 0x3f] = res; + m_icount -= m_clock_cycles_1; if ((SR & V_MASK) && src_code != SR_REGISTER) @@ -346,6 +346,11 @@ void hyperstone_device::hyperstone_mov() const uint32_t src_code = SRC_GLOBAL ? (SRC_CODE + (h ? 16 : 0)) : ((SRC_CODE + fp) & 0x3f); const uint32_t sreg = SRC_GLOBAL ? ((WRITE_ONLY_REGMASK & (1 << src_code)) ? 0 : get_global_register(src_code)) : m_local_regs[src_code]; + SR &= ~(Z_MASK | N_MASK); + if (sreg == 0) + SR |= Z_MASK; + SR |= SIGN_TO_N(sreg); + if (DST_GLOBAL) { const uint32_t dst_code = DST_CODE + (h ? 16 : 0); @@ -358,11 +363,6 @@ void hyperstone_device::hyperstone_mov() { m_local_regs[(DST_CODE + fp) & 0x3f] = sreg; } - - SR &= ~(Z_MASK | N_MASK); - if (sreg == 0) - SR |= Z_MASK; - SR |= SIGN_TO_N(sreg); } m_icount -= m_clock_cycles_1; @@ -388,6 +388,11 @@ void hyperstone_device::hyperstone_add() SR |= ((sreg ^ tmp) & (dreg ^ tmp) & 0x80000000) >> 28; dreg += sreg; + + if (dreg == 0) + SR |= Z_MASK; + SR |= SIGN_TO_N(dreg); + if (DST_GLOBAL) { set_global_register(dst_code, dreg); @@ -400,10 +405,6 @@ void hyperstone_device::hyperstone_add() m_local_regs[dst_code] = dreg; } - if (dreg == 0) - SR |= Z_MASK; - SR |= SIGN_TO_N(dreg); - m_icount -= m_clock_cycles_1; } @@ -428,15 +429,16 @@ void hyperstone_device::hyperstone_adds() //#endif const int32_t res = sreg + dreg; - if (DST_GLOBAL) - set_global_register(dst_code, res); - else - m_local_regs[dst_code] = res; if (res == 0) SR |= Z_MASK; SR |= SIGN_TO_N(res); + if (DST_GLOBAL) + set_global_register(dst_code, res); + else + m_local_regs[dst_code] = res; + m_icount -= m_clock_cycles_1; if (SR & V_MASK) @@ -473,16 +475,17 @@ void hyperstone_device::hyperstone_andn() const uint32_t dst_code = DST_GLOBAL ? DST_CODE : ((DST_CODE + GET_FP) & 0x3f); const uint32_t sreg = SRC_GLOBAL ? m_global_regs[SRC_CODE] : m_local_regs[(SRC_CODE + GET_FP) & 0x3f]; const uint32_t dreg = (DST_GLOBAL ? m_global_regs : m_local_regs)[dst_code] & ~sreg; - if (DST_GLOBAL) - set_global_register(dst_code, dreg); - else - m_local_regs[dst_code] = dreg; if (dreg == 0) SR |= Z_MASK; else SR &= ~Z_MASK; + if (DST_GLOBAL) + set_global_register(dst_code, dreg); + else + m_local_regs[dst_code] = dreg; + m_icount -= m_clock_cycles_1; } @@ -494,16 +497,17 @@ void hyperstone_device::hyperstone_or() const uint32_t dst_code = DST_GLOBAL ? DST_CODE : ((DST_CODE + GET_FP) & 0x3f); const uint32_t sreg = SRC_GLOBAL ? m_global_regs[SRC_CODE] : m_local_regs[(SRC_CODE + GET_FP) & 0x3f]; const uint32_t dreg = (DST_GLOBAL ? m_global_regs : m_local_regs)[dst_code] | sreg; - if (DST_GLOBAL) - set_global_register(dst_code, dreg); - else - m_local_regs[dst_code] = dreg; if (dreg == 0) SR |= Z_MASK; else SR &= ~Z_MASK; + if (DST_GLOBAL) + set_global_register(dst_code, dreg); + else + m_local_regs[dst_code] = dreg; + m_icount -= m_clock_cycles_1; } @@ -515,16 +519,17 @@ void hyperstone_device::hyperstone_xor() const uint32_t dst_code = DST_GLOBAL ? DST_CODE : ((DST_CODE + GET_FP) & 0x3f); const uint32_t sreg = SRC_GLOBAL ? m_global_regs[SRC_CODE] : m_local_regs[(SRC_CODE + GET_FP) & 0x3f]; const uint32_t dreg = (DST_GLOBAL ? m_global_regs : m_local_regs)[dst_code] ^ sreg; - if (DST_GLOBAL) - set_global_register(dst_code, dreg); - else - m_local_regs[dst_code] = dreg; if (dreg == 0) SR |= Z_MASK; else SR &= ~Z_MASK; + if (DST_GLOBAL) + set_global_register(dst_code, dreg); + else + m_local_regs[dst_code] = dreg; + m_icount -= m_clock_cycles_1; } @@ -563,15 +568,15 @@ void hyperstone_device::hyperstone_subc() dreg -= sreg_c; } + if (old_z && dreg == 0) + SR |= Z_MASK; + SR |= SIGN_TO_N(dreg); + if (DST_GLOBAL) set_global_register(DST_CODE, dreg); else m_local_regs[dst_code] = dreg; - if (old_z && dreg == 0) - SR |= Z_MASK; - SR |= SIGN_TO_N(dreg); - m_icount -= m_clock_cycles_1; } @@ -581,16 +586,17 @@ void hyperstone_device::hyperstone_not() check_delay_PC(); const uint32_t dreg = ~(SRC_GLOBAL ? m_global_regs[SRC_CODE] : m_local_regs[(SRC_CODE + GET_FP) & 0x3f]); - if (DST_GLOBAL) - set_global_register(DST_CODE, dreg); - else - m_local_regs[(DST_CODE + GET_FP) & 0x3f] = dreg; if (dreg == 0) SR |= Z_MASK; else SR &= ~Z_MASK; + if (DST_GLOBAL) + set_global_register(DST_CODE, dreg); + else + m_local_regs[(DST_CODE + GET_FP) & 0x3f] = dreg; + m_icount -= m_clock_cycles_1; } @@ -609,11 +615,15 @@ void hyperstone_device::hyperstone_sub() const uint64_t tmp = uint64_t(dreg) - uint64_t(sreg); SR &= ~(C_MASK | V_MASK | Z_MASK | N_MASK); - SR |= (tmp & 0x100000000) >> 32; SR |= ((tmp ^ dreg) & (dreg ^ sreg) & 0x80000000) >> 28; dreg -= sreg; + + if (dreg == 0) + SR |= Z_MASK; + SR |= SIGN_TO_N(dreg); + if (DST_GLOBAL) { set_global_register(dst_code, dreg); @@ -626,10 +636,6 @@ void hyperstone_device::hyperstone_sub() m_local_regs[dst_code] = dreg; } - if (dreg == 0) - SR |= Z_MASK; - SR |= SIGN_TO_N(dreg); - m_icount -= m_clock_cycles_1; } @@ -655,15 +661,16 @@ void hyperstone_device::hyperstone_subs() SR |= ((tmp ^ dreg) & (dreg ^ sreg) & 0x80000000) >> 28; const int32_t res = dreg - sreg; - if (DST_GLOBAL) - set_global_register(dst_code, res); - else - m_local_regs[dst_code] = res; if (res == 0) SR |= Z_MASK; SR |= SIGN_TO_N(res); + if (DST_GLOBAL) + set_global_register(dst_code, res); + else + m_local_regs[dst_code] = res; + m_icount -= m_clock_cycles_1; if (SR & V_MASK) @@ -705,15 +712,15 @@ void hyperstone_device::hyperstone_addc() SR |= (tmp & 0x100000000) >> 32; + if (dreg == 0 && old_z) + SR |= Z_MASK; + SR |= SIGN_TO_N(dreg); + if (DST_GLOBAL) set_global_register(dst_code, dreg); else m_local_regs[dst_code] = dreg; - if (dreg == 0 && old_z) - SR |= Z_MASK; - SR |= SIGN_TO_N(dreg); - m_icount -= m_clock_cycles_1; } @@ -725,16 +732,17 @@ void hyperstone_device::hyperstone_and() const uint32_t dst_code = DST_GLOBAL ? DST_CODE : ((DST_CODE + GET_FP) & 0x3f); const uint32_t sreg = SRC_GLOBAL ? m_global_regs[SRC_CODE] : m_local_regs[(SRC_CODE + GET_FP) & 0x3f]; const uint32_t dreg = (DST_GLOBAL ? m_global_regs : m_local_regs)[dst_code] & sreg; - if (DST_GLOBAL) - set_global_register(dst_code, dreg); - else - m_local_regs[dst_code] = dreg; if (dreg == 0) SR |= Z_MASK; else SR &= ~Z_MASK; + if (DST_GLOBAL) + set_global_register(dst_code, dreg); + else + m_local_regs[dst_code] = dreg; + m_icount -= m_clock_cycles_1; } @@ -754,15 +762,16 @@ void hyperstone_device::hyperstone_neg() SR |= (tmp & sreg & 0x80000000) >> 28; const uint32_t dreg = -sreg; - if (DST_GLOBAL) - set_global_register(DST_CODE, dreg); - else - m_local_regs[(DST_CODE + fp) & 0x3f] = dreg; if (dreg == 0) SR |= Z_MASK; SR |= SIGN_TO_N(dreg); + if (DST_GLOBAL) + set_global_register(DST_CODE, dreg); + else + m_local_regs[(DST_CODE + fp) & 0x3f] = dreg; + m_icount -= m_clock_cycles_1; } @@ -787,15 +796,16 @@ void hyperstone_device::hyperstone_negs() //#endif const int32_t res = -sreg; - if (DST_GLOBAL) - set_global_register(DST_CODE, res); - else - m_local_regs[(DST_CODE + fp) & 0x3f] = res; if (res == 0) SR |= Z_MASK; SR |= SIGN_TO_N(res); + if (DST_GLOBAL) + set_global_register(DST_CODE, res); + else + m_local_regs[(DST_CODE + fp) & 0x3f] = res; + m_icount -= m_clock_cycles_1; if (GET_V) @@ -853,6 +863,15 @@ void hyperstone_device::hyperstone_movi() } else { + SR &= ~(Z_MASK | N_MASK); + if (imm == 0) + SR |= Z_MASK; + SR |= SIGN_TO_N(imm); + +#if MISSIONCRAFT_FLAGS + SR &= ~V_MASK; // or V undefined ? +#endif + if (DST_GLOBAL) { const uint32_t dst_code = DST_CODE + (h ? 16 : 0); @@ -865,15 +884,6 @@ void hyperstone_device::hyperstone_movi() { m_local_regs[(DST_CODE + GET_FP) & 0x3f] = imm; } - - SR &= ~(Z_MASK | N_MASK); - if (imm == 0) - SR |= Z_MASK; - SR |= SIGN_TO_N(imm); - -#if MISSIONCRAFT_FLAGS - SR &= ~V_MASK; // or V undefined ? -#endif } m_icount -= m_clock_cycles_1; @@ -903,6 +913,11 @@ void hyperstone_device::hyperstone_addi() SR |= ((imm ^ tmp) & (dreg ^ tmp) & 0x80000000) >> 28; dreg += imm; + + if (dreg == 0) + SR |= Z_MASK; + SR |= SIGN_TO_N(dreg); + if (DST_GLOBAL) { set_global_register(dst_code, dreg); @@ -915,10 +930,6 @@ void hyperstone_device::hyperstone_addi() m_local_regs[dst_code] = dreg; } - if (dreg == 0) - SR |= Z_MASK; - SR |= SIGN_TO_N(dreg); - m_icount -= m_clock_cycles_1; } @@ -965,15 +976,15 @@ void hyperstone_device::hyperstone_addsi() const int32_t res = imm + (int32_t)dreg; + if (res == 0) + SR |= Z_MASK; + SR |= SIGN_TO_N(res); + if (DST_GLOBAL) set_global_register(dst_code, res); else m_local_regs[dst_code] = res; - if (res == 0) - SR |= Z_MASK; - SR |= SIGN_TO_N(res); - m_icount -= m_clock_cycles_1; if (SR & V_MASK) @@ -1056,6 +1067,12 @@ void hyperstone_device::hyperstone_andni() { const uint32_t dst_code = DST_CODE; dreg = m_global_regs[dst_code] & ~imm; + + if (dreg == 0) + SR |= Z_MASK; + else + SR &= ~Z_MASK; + set_global_register(dst_code, dreg); } else @@ -1063,12 +1080,12 @@ void hyperstone_device::hyperstone_andni() const uint32_t dst_code = (DST_CODE + GET_FP) & 0x3f; dreg = m_local_regs[dst_code] & ~imm; m_local_regs[dst_code] = dreg; - } - if (dreg == 0) - SR |= Z_MASK; - else - SR &= ~Z_MASK; + if (dreg == 0) + SR |= Z_MASK; + else + SR &= ~Z_MASK; + } m_icount -= m_clock_cycles_1; } @@ -1089,18 +1106,24 @@ void hyperstone_device::hyperstone_ori() { const uint32_t dst_code = DST_CODE; dreg = m_global_regs[dst_code] | imm; + + if (dreg) + SR &= ~Z_MASK; + else + SR |= Z_MASK; + set_global_register(dst_code, dreg); } else { const uint32_t dst_code = (DST_CODE + GET_FP) & 0x3f; dreg = m_local_regs[dst_code] |= imm; - } - if (dreg) - SR &= ~Z_MASK; - else - SR |= Z_MASK; + if (dreg) + SR &= ~Z_MASK; + else + SR |= Z_MASK; + } m_icount -= m_clock_cycles_1; } @@ -1121,18 +1144,24 @@ void hyperstone_device::hyperstone_xori() { const uint32_t dst_code = DST_CODE; dreg = m_global_regs[dst_code] ^ imm; + + if (dreg) + SR &= ~Z_MASK; + else + SR |= Z_MASK; + set_global_register(dst_code, dreg); } else { const uint32_t dst_code = (DST_CODE + GET_FP) & 0x3f; dreg = m_local_regs[dst_code] ^= imm; - } - if (dreg) - SR &= ~Z_MASK; - else - SR |= Z_MASK; + if (dreg) + SR &= ~Z_MASK; + else + SR |= Z_MASK; + } m_icount -= m_clock_cycles_1; } @@ -1164,13 +1193,13 @@ void hyperstone_device::hyperstone_shrdi() high_order = extract_64hi(val); - m_local_regs[dst_code] = high_order; - m_local_regs[dstf_code] = extract_64lo(val); - if (val == 0) SR |= Z_MASK; SR |= SIGN_TO_N(high_order); + m_local_regs[dst_code] = high_order; + m_local_regs[dstf_code] = extract_64lo(val); + m_icount -= m_clock_cycles_2; } @@ -1203,13 +1232,13 @@ void hyperstone_device::hyperstone_shrd() val >>= n; } - m_local_regs[dst_code] = (uint32_t)(val >> 32); - m_local_regs[dstf_code] = (uint32_t)val; - if (val == 0) SR |= Z_MASK; SR |= SIGN_TO_N(m_local_regs[dst_code]); + m_local_regs[dst_code] = (uint32_t)(val >> 32); + m_local_regs[dstf_code] = (uint32_t)val; + m_icount -= m_clock_cycles_2; } @@ -1229,11 +1258,12 @@ void hyperstone_device::hyperstone_shr() dreg >>= n; - m_local_regs[dst_code] = dreg; if (dreg == 0) SR |= Z_MASK; SR |= SIGN_TO_N(dreg); + m_local_regs[dst_code] = dreg; + m_icount -= m_clock_cycles_1; } @@ -1261,13 +1291,13 @@ void hyperstone_device::hyperstone_sardi() val |= 0xffffffff00000000U << (32 - n); } - m_local_regs[dst_code] = (uint32_t)(val >> 32); - m_local_regs[dstf_code] = (uint32_t)val; - if (val == 0) SR |= Z_MASK; SR |= SIGN_TO_N(m_local_regs[dst_code]); + m_local_regs[dst_code] = (uint32_t)(val >> 32); + m_local_regs[dstf_code] = (uint32_t)val; + m_icount -= m_clock_cycles_2; } @@ -1306,12 +1336,13 @@ void hyperstone_device::hyperstone_sard() } } - m_local_regs[dst_code] = (uint32_t)(val >> 32); - m_local_regs[dstf_code] = (uint32_t)val; if (val == 0) SR |= Z_MASK; SR |= SIGN_TO_N(m_local_regs[dst_code]); + m_local_regs[dst_code] = (uint32_t)(val >> 32); + m_local_regs[dstf_code] = (uint32_t)val; + m_icount -= m_clock_cycles_2; } @@ -1339,12 +1370,12 @@ void hyperstone_device::hyperstone_sar() ret |= 0xffffffff << (32 - n); } - m_local_regs[dst_code] = ret; - if (ret == 0) SR |= Z_MASK; SR |= SIGN_TO_N(ret); + m_local_regs[dst_code] = ret; + m_icount -= m_clock_cycles_1; } @@ -1378,13 +1409,13 @@ void hyperstone_device::hyperstone_shldi() high_order = extract_64hi(val); - m_local_regs[dst_code] = high_order; - m_local_regs[dstf_code] = extract_64lo(val); - if (val == 0) SR |= Z_MASK; SR |= SIGN_TO_N(high_order); + m_local_regs[dst_code] = high_order; + m_local_regs[dstf_code] = extract_64lo(val); + m_icount -= m_clock_cycles_2; } @@ -1423,13 +1454,13 @@ void hyperstone_device::hyperstone_shld() val <<= n; - m_local_regs[dst_code] = extract_64hi(val); - m_local_regs[dstf_code] = extract_64lo(val); - if (val == 0) SR |= Z_MASK; SR |= SIGN_TO_N(m_local_regs[dst_code]); + m_local_regs[dst_code] = extract_64hi(val); + m_local_regs[dstf_code] = extract_64lo(val); + m_icount -= m_clock_cycles_2; } @@ -1453,12 +1484,12 @@ void hyperstone_device::hyperstone_shl() if (((base & mask) && (!(ret & 0x80000000))) || (((base & mask) ^ mask) && (ret & 0x80000000))) SR |= V_MASK; - m_local_regs[dst_code & 0x3f] = ret; - if (ret == 0) SR |= Z_MASK; SR |= SIGN_TO_N(ret); + m_local_regs[dst_code & 0x3f] = ret; + m_icount -= m_clock_cycles_1; } @@ -1508,12 +1539,12 @@ void hyperstone_device::hyperstone_rol() SR &= ~(Z_MASK | C_MASK | N_MASK); #endif - m_local_regs[dst_code] = val; - if (val == 0) SR |= Z_MASK; SR |= SIGN_TO_N(val); + m_local_regs[dst_code] = val; + m_icount -= m_clock_cycles_1; } @@ -2129,15 +2160,15 @@ void hyperstone_device::hyperstone_shri() val >>= n; + if (val == 0) + SR |= Z_MASK; + SR |= SIGN_TO_N(val); + if (DST_GLOBAL) set_global_register(dst_code, val); else m_local_regs[dst_code] = val; - if (val == 0) - SR |= Z_MASK; - SR |= SIGN_TO_N(val); - m_icount -= m_clock_cycles_1; } @@ -2163,15 +2194,15 @@ void hyperstone_device::hyperstone_sari() val |= 0xffffffff << (32 - n); } + if (val == 0) + SR |= Z_MASK; + SR |= SIGN_TO_N(val); + if (DST_GLOBAL) set_global_register(dst_code, val); else m_local_regs[dst_code] = val; - if (val == 0) - SR |= Z_MASK; - SR |= SIGN_TO_N(val); - m_icount -= m_clock_cycles_1; } @@ -2192,15 +2223,15 @@ void hyperstone_device::hyperstone_shli() if (((val & mask) && (!(val2 & 0x80000000))) || (((val & mask) ^ mask) && (val2 & 0x80000000))) SR |= V_MASK; + if (val2 == 0) + SR |= Z_MASK; + SR |= SIGN_TO_N(val2); + if (DST_GLOBAL) set_global_register(dst_code, val2); else m_local_regs[dst_code] = val2; - if (val2 == 0) - SR |= Z_MASK; - SR |= SIGN_TO_N(val2); - m_icount -= m_clock_cycles_1; } @@ -2226,14 +2257,14 @@ void hyperstone_device::hyperstone_mulsu() const uint32_t high_order = (uint32_t)(double_word >> 32); - (DST_GLOBAL ? m_global_regs : m_local_regs)[dst_code] = high_order; - (DST_GLOBAL ? m_global_regs : m_local_regs)[dstf_code] = (uint32_t)double_word; - SR &= ~(Z_MASK | N_MASK); if (double_word == 0) SR |= Z_MASK; SR |= SIGN_TO_N(high_order); + (DST_GLOBAL ? m_global_regs : m_local_regs)[dst_code] = high_order; + (DST_GLOBAL ? m_global_regs : m_local_regs)[dstf_code] = (uint32_t)double_word; + if(SIGNED == IS_SIGNED && (sreg >= 0xffff8000 && sreg <= 0x7fff) && (dreg >= 0xffff8000 && dreg <= 0x7fff)) m_icount -= m_clock_cycles_4; else if(SIGNED == IS_UNSIGNED && sreg <= 0xffff && dreg <= 0xffff) @@ -2321,13 +2352,13 @@ void hyperstone_device::hyperstone_mul() const uint32_t sreg = (SRC_GLOBAL ? m_global_regs : m_local_regs)[src_code]; const uint32_t result = sreg * dreg; - (DST_GLOBAL ? m_global_regs : m_local_regs)[dst_code] = result; - SR &= ~(Z_MASK | N_MASK); if (result == 0) SR |= Z_MASK; SR |= SIGN_TO_N(result); + (DST_GLOBAL ? m_global_regs : m_local_regs)[dst_code] = result; + if ((sreg >= 0xffff8000 && sreg <= 0x7fff) && (dreg >= 0xffff8000 && dreg <= 0x7fff)) m_icount -= 3 << m_clck_scale; else @@ -2636,228 +2667,41 @@ void hyperstone_device::hyperstone_stdp() m_icount -= m_clock_cycles_2; } -void hyperstone_device::hyperstone_dbv() -{ - if (SR & V_MASK) - { - const int32_t offset = decode_pcrel(); - check_delay_PC(); - m_delay_slot = true; - m_delay_pc = PC + offset; - m_intblock = 3; - } - else - { - ignore_pcrel(); - check_delay_PC(); - } - - m_icount -= m_clock_cycles_1; -} - -void hyperstone_device::hyperstone_dbnv() -{ - if (SR & V_MASK) - { - ignore_pcrel(); - check_delay_PC(); - } - else - { - const int32_t offset = decode_pcrel(); - check_delay_PC(); - m_delay_slot = true; - m_delay_pc = PC + offset; - m_intblock = 3; - } - - m_icount -= m_clock_cycles_1; -} - -void hyperstone_device::hyperstone_dbe() -{ - if (SR & Z_MASK) - { - const int32_t offset = decode_pcrel(); - check_delay_PC(); - m_delay_slot = true; - m_delay_pc = PC + offset; - m_intblock = 3; - } - else - { - ignore_pcrel(); - check_delay_PC(); - } - - m_icount -= m_clock_cycles_1; -} - -void hyperstone_device::hyperstone_dbne() -{ - if (SR & Z_MASK) - { - ignore_pcrel(); - check_delay_PC(); - } - else - { - const int32_t offset = decode_pcrel(); - check_delay_PC(); - m_delay_slot = true; - m_delay_pc = PC + offset; - m_intblock = 3; - } - m_icount -= m_clock_cycles_1; -} - -void hyperstone_device::hyperstone_dbc() -{ - if (SR & C_MASK) - { - const int32_t offset = decode_pcrel(); - check_delay_PC(); - m_delay_slot = true; - m_delay_pc = PC + offset; - m_intblock = 3; - } - else - { - ignore_pcrel(); - check_delay_PC(); - } - - m_icount -= m_clock_cycles_1; -} - -void hyperstone_device::hyperstone_dbnc() -{ - if (SR & C_MASK) - { - ignore_pcrel(); - check_delay_PC(); - } - else - { - const int32_t offset = decode_pcrel(); - check_delay_PC(); - m_delay_slot = true; - m_delay_pc = PC + offset; - m_intblock = 3; - } - - m_icount -= m_clock_cycles_1; -} - -void hyperstone_device::hyperstone_dbse() -{ - if (SR & (C_MASK | Z_MASK)) - { - const int32_t offset = decode_pcrel(); - check_delay_PC(); - m_delay_slot = true; - m_delay_pc = PC + offset; - m_intblock = 3; - } - else - { - ignore_pcrel(); - check_delay_PC(); - } - - m_icount -= m_clock_cycles_1; -} - -void hyperstone_device::hyperstone_dbht() -{ - if (SR & (C_MASK | Z_MASK)) - { - ignore_pcrel(); - check_delay_PC(); - } - else - { - const int32_t offset = decode_pcrel(); - check_delay_PC(); - m_delay_slot = true; - m_delay_pc = PC + offset; - m_intblock = 3; - } - - m_icount -= m_clock_cycles_1; -} - -void hyperstone_device::hyperstone_dbn() -{ - if (SR & N_MASK) - { - const int32_t offset = decode_pcrel(); - check_delay_PC(); - m_delay_slot = true; - m_delay_pc = PC + offset; - m_intblock = 3; - } - else - { - ignore_pcrel(); - check_delay_PC(); - } - - m_icount -= m_clock_cycles_1; -} - -void hyperstone_device::hyperstone_dbnn() +template +void hyperstone_device::hyperstone_db() { - if (SR & N_MASK) + static const uint32_t condition_masks[6] = { V_MASK, Z_MASK, C_MASK, C_MASK | Z_MASK, N_MASK, N_MASK | Z_MASK }; + if (COND_SET) { - ignore_pcrel(); - check_delay_PC(); - } - else - { - const int32_t offset = decode_pcrel(); - check_delay_PC(); - m_delay_slot = true; - m_delay_pc = PC + offset; - m_intblock = 3; - } - - m_icount -= m_clock_cycles_1; -} - -void hyperstone_device::hyperstone_dble() -{ - if (SR & (N_MASK | Z_MASK)) - { - const int32_t offset = decode_pcrel(); - check_delay_PC(); - m_delay_slot = true; - m_delay_pc = PC + offset; - m_intblock = 3; - } - else - { - ignore_pcrel(); - check_delay_PC(); - } - - m_icount -= m_clock_cycles_1; -} - -void hyperstone_device::hyperstone_dbgt() -{ - if (SR & (N_MASK | Z_MASK)) - { - ignore_pcrel(); - check_delay_PC(); + if (SR & condition_masks[CONDITION]) + { + const int32_t offset = decode_pcrel(); + check_delay_PC(); + m_delay_slot = true; + m_delay_pc = PC + offset; + m_intblock = 3; + } + else + { + ignore_pcrel(); + check_delay_PC(); + } } else { - const int32_t offset = decode_pcrel(); - check_delay_PC(); - m_delay_slot = true; - m_delay_pc = PC + offset; - m_intblock = 3; + if (SR & condition_masks[CONDITION]) + { + ignore_pcrel(); + check_delay_PC(); + } + else + { + const int32_t offset = decode_pcrel(); + check_delay_PC(); + m_delay_slot = true; + m_delay_pc = PC + offset; + m_intblock = 3; + } } m_icount -= m_clock_cycles_1; @@ -2904,8 +2748,7 @@ void hyperstone_device::hyperstone_frame() if (tmp_flag) { - uint32_t addr = get_trap_addr(TRAPNO_FRAME_ERROR); - execute_exception(addr); + execute_exception(get_trap_addr(TRAPNO_FRAME_ERROR)); } } @@ -2920,7 +2763,7 @@ void hyperstone_device::hyperstone_call_global() int32_t extra_s = 0; - if (E_BIT(imm_1)) + if (imm_1 & 0x8000) { uint16_t imm_2 = READ_OP(PC); @@ -2930,7 +2773,7 @@ void hyperstone_device::hyperstone_call_global() extra_s = imm_2; extra_s |= ((imm_1 & 0x3fff) << 16); - if (S_BIT_CONST(imm_1)) + if (imm_1 & 0x4000) extra_s |= 0xc0000000; } else @@ -2939,7 +2782,7 @@ void hyperstone_device::hyperstone_call_global() SET_ILC(2<<19); - if (S_BIT_CONST(imm_1)) + if (imm_1 & 0x4000) extra_s |= 0xffffc000; } @@ -2982,7 +2825,7 @@ void hyperstone_device::hyperstone_call_local() int32_t extra_s = 0; - if (E_BIT(imm_1)) + if (imm_1 & 0x8000) { uint16_t imm_2 = READ_OP(PC); @@ -2992,7 +2835,7 @@ void hyperstone_device::hyperstone_call_local() extra_s = imm_2; extra_s |= ((imm_1 & 0x3fff) << 16); - if (S_BIT_CONST(imm_1)) + if (imm_1 & 0x4000) extra_s |= 0xc0000000; } else @@ -3001,7 +2844,7 @@ void hyperstone_device::hyperstone_call_local() SET_ILC(2<<19); - if (S_BIT_CONST(imm_1)) + if (imm_1 & 0x4000) extra_s |= 0xffffc000; } @@ -3034,172 +2877,34 @@ void hyperstone_device::hyperstone_call_local() m_icount -= m_clock_cycles_1; } - - -void hyperstone_device::hyperstone_bv() -{ - if (SR & V_MASK) - { - execute_br(); - } - else - { - ignore_pcrel(); - check_delay_PC(); - m_icount -= m_clock_cycles_1; - } -} - -void hyperstone_device::hyperstone_bnv() -{ - if (SR & V_MASK) - { - ignore_pcrel(); - check_delay_PC(); - m_icount -= m_clock_cycles_1; - } - else - { - execute_br(); - } -} - -void hyperstone_device::hyperstone_be() -{ - if (SR & Z_MASK) - { - execute_br(); - } - else - { - ignore_pcrel(); - check_delay_PC(); - m_icount -= m_clock_cycles_1; - } -} - -void hyperstone_device::hyperstone_bne() -{ - if (SR & Z_MASK) - { - ignore_pcrel(); - check_delay_PC(); - m_icount -= m_clock_cycles_1; - } - else - { - execute_br(); - } -} - -void hyperstone_device::hyperstone_bc() -{ - if (SR & C_MASK) - { - execute_br(); - } - else - { - ignore_pcrel(); - check_delay_PC(); - m_icount -= m_clock_cycles_1; - } -} - -void hyperstone_device::hyperstone_bnc() -{ - if (SR & C_MASK) - { - ignore_pcrel(); - check_delay_PC(); - m_icount -= m_clock_cycles_1; - } - else - { - execute_br(); - } -} - -void hyperstone_device::hyperstone_bse() -{ - if (SR & (C_MASK | Z_MASK)) - { - execute_br(); - } - else - { - ignore_pcrel(); - check_delay_PC(); - m_icount -= m_clock_cycles_1; - } -} - -void hyperstone_device::hyperstone_bht() -{ - if (SR & (C_MASK | Z_MASK)) - { - ignore_pcrel(); - check_delay_PC(); - m_icount -= m_clock_cycles_1; - } - else - { - execute_br(); - } -} - -void hyperstone_device::hyperstone_bn() -{ - if (SR & N_MASK) - { - execute_br(); - } - else - { - ignore_pcrel(); - check_delay_PC(); - m_icount -= m_clock_cycles_1; - } -} - -void hyperstone_device::hyperstone_bnn() +template +void hyperstone_device::hyperstone_b() { - if (SR & N_MASK) + static const uint32_t condition_masks[6] = { V_MASK, Z_MASK, C_MASK, C_MASK | Z_MASK, N_MASK, N_MASK | Z_MASK }; + if (COND_SET) { - ignore_pcrel(); - check_delay_PC(); - m_icount -= m_clock_cycles_1; - } - else - { - execute_br(); - } -} - -void hyperstone_device::hyperstone_ble() -{ - if (SR & (N_MASK | Z_MASK)) - { - execute_br(); - } - else - { - ignore_pcrel(); - check_delay_PC(); - m_icount -= m_clock_cycles_1; - } -} - -void hyperstone_device::hyperstone_bgt() -{ - if (SR & (N_MASK | Z_MASK)) - { - ignore_pcrel(); - check_delay_PC(); - m_icount -= m_clock_cycles_1; + if (SR & condition_masks[CONDITION]) + { + execute_br(); + } + else + { + ignore_pcrel(); + check_delay_PC(); + m_icount -= m_clock_cycles_1; + } } else { - execute_br(); + if (SR & condition_masks[CONDITION]) + { + ignore_pcrel(); + check_delay_PC(); + m_icount -= m_clock_cycles_1; + } + else + { + execute_br(); + } } } -- cgit v1.2.3-70-g09d2 From bccc962b69ea4f5db5ff4ae912db233775cecd00 Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Thu, 23 Nov 2017 15:14:13 +0100 Subject: e132xs: initial work on drc, nw --- scripts/src/cpu.lua | 2 +- src/devices/cpu/e132xs/32xsdasm.cpp | 20 +- src/devices/cpu/e132xs/32xsdefs.h | 30 +- src/devices/cpu/e132xs/e132xs.cpp | 23 +- src/devices/cpu/e132xs/e132xs.h | 248 ++++--- src/devices/cpu/e132xs/e132xsdefs.h | 79 --- src/devices/cpu/e132xs/e132xsdrc.cpp | 691 ++++++++++++-------- src/devices/cpu/e132xs/e132xsdrc_ops.cpp | 1035 ------------------------------ src/devices/cpu/e132xs/e132xsdrc_ops.hxx | 575 +++++++++++++++++ src/devices/cpu/e132xs/e132xsfe.cpp | 49 +- src/devices/cpu/e132xs/e132xsfe.h | 1 + src/devices/cpu/e132xs/e132xsop.hxx | 58 +- 12 files changed, 1206 insertions(+), 1605 deletions(-) delete mode 100644 src/devices/cpu/e132xs/e132xsdefs.h delete mode 100644 src/devices/cpu/e132xs/e132xsdrc_ops.cpp create mode 100644 src/devices/cpu/e132xs/e132xsdrc_ops.hxx (limited to 'scripts/src') diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index dad6fe50a1a..69d70d8b237 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -811,7 +811,7 @@ if (CPUS["E1"]~=null) then MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.cpp", MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.h", MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc.cpp", - MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc_ops.cpp", + MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc_ops.hxx", MAME_DIR .. "src/devices/cpu/e132xs/32xsdefs.h", MAME_DIR .. "src/devices/cpu/e132xs/e132xsop.hxx", } diff --git a/src/devices/cpu/e132xs/32xsdasm.cpp b/src/devices/cpu/e132xs/32xsdasm.cpp index 2060350c5b8..aa4dcc912eb 100644 --- a/src/devices/cpu/e132xs/32xsdasm.cpp +++ b/src/devices/cpu/e132xs/32xsdasm.cpp @@ -396,27 +396,25 @@ u32 hyperstone_disassembler::opcode_alignment() const /*****************************/ offs_t hyperstone_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { - uint16_t op; - uint8_t op_num; - - uint8_t source_code, dest_code, source_bit, dest_bit; - char source[5] = "\0", dest[5] = "\0"; uint32_t flags = 0; - op = opcodes.r16(pc); + base_pc = pc; + base_oprom = oprom; + + uint16_t op = READ_OP_DASM(pc); size = 2; - source_code = SOURCECODE(op); - dest_code = DESTCODE(op); - source_bit = SOURCEBIT(op); - dest_bit = DESTBIT(op); + uint8_t source_code = SOURCECODE(op); + uint8_t dest_code = DESTCODE(op); + uint8_t source_bit = SOURCEBIT(op); + uint8_t dest_bit = DESTBIT(op); global_fp = 0; int h_flag = 0; - op_num = (op & 0xff00) >> 8; + uint8_t op_num = (op & 0xff00) >> 8; switch( op_num ) { diff --git a/src/devices/cpu/e132xs/32xsdefs.h b/src/devices/cpu/e132xs/32xsdefs.h index a4a5ff876df..943bb4911e6 100644 --- a/src/devices/cpu/e132xs/32xsdefs.h +++ b/src/devices/cpu/e132xs/32xsdefs.h @@ -125,27 +125,6 @@ /* Internal registers */ -#define SREG decode.src_value -#define SREGF decode.next_src_value -#define DREG decode.dst_value -#define DREGF decode.next_dst_value -#define EXTRA_U decode.extra.u -#define EXTRA_S decode.extra.s - -#define SET_SREG( _data_ ) (decode.src_is_local ? set_local_register(decode.src, (uint32_t)_data_) : set_global_register(decode.src, (uint32_t)_data_)) -#define SET_SREGF( _data_ ) (decode.src_is_local ? set_local_register(decode.src + 1, (uint32_t)_data_) : set_global_register(decode.src + 1, (uint32_t)_data_)) -#define SET_DREG( _data_ ) (decode.dst_is_local ? set_local_register(decode.dst, (uint32_t)_data_) : set_global_register(decode.dst, (uint32_t)_data_)) -#define SET_DREGF( _data_ ) (decode.dst_is_local ? set_local_register(decode.dst + 1, (uint32_t)_data_) : set_global_register(decode.dst + 1, (uint32_t)_data_)) - -#define SRC_IS_PC (!decode.src_is_local && decode.src == PC_REGISTER) -#define DST_IS_PC (!decode.dst_is_local && decode.dst == PC_REGISTER) -#define SRC_IS_SR (!decode.src_is_local && decode.src == SR_REGISTER) -#define DST_IS_SR (!decode.dst_is_local && decode.dst == SR_REGISTER) -#define SAME_SRC_DST decode.same_src_dst -#define SAME_SRC_DSTF decode.same_src_dstf -#define SAME_SRCF_DST decode.same_srcf_dst - - #define OP m_op #define PC m_global_regs[0] //Program Counter #define SR m_global_regs[1] //Status Register @@ -175,6 +154,7 @@ #define T_MASK 0x00010000 #define P_MASK 0x00020000 #define S_MASK 0x00040000 +#define ILC_MASK 0x00180000 /* SR flags */ #define GET_C ( SR & C_MASK) // bit 0 //CARRY @@ -220,17 +200,11 @@ #define SET_LOW_SR(val) (SR = (SR & 0xffff0000) | ((val) & 0x0000ffff)) // when SR is addressed, only low 16 bits can be changed -#define CHECK_C(x) (SR = (SR & ~0x00000001) | (uint32_t)((x & 0x100000000L) >> 32)) -#define CHECK_VADD(x,y,z) (SR = (SR & ~0x00000008) | ((((x) ^ (z)) & ((y) ^ (z)) & 0x80000000) >> 29)) -#define CHECK_VADD3(x,y,w,z) (SR = (SR & ~0x00000008) | ((((x) ^ (z)) & ((y) ^ (z)) & ((w) ^ (z)) & 0x80000000) >> 29)) -#define CHECK_VSUB(x,y,z) (SR = (SR & ~0x00000008) | (((z ^ y) & (y ^ x) & 0x80000000) >> 29)) - - /* FER flags */ #define GET_ACCRUED (FER & 0x0000001f) //bits 4 - 0 //Floating-Point Accrued Exceptions #define GET_ACTUAL (FER & 0x00001f00) //bits 12 - 8 //Floating-Point Actual Exceptions //other bits are reversed, in particular 7 - 5 for the operating system. -//the user program can only changes the above 2 flags +//the user program can only change the above 2 flags #endif // MAME_CPU_E132XS_XS32DEFS_H diff --git a/src/devices/cpu/e132xs/e132xs.cpp b/src/devices/cpu/e132xs/e132xs.cpp index 8c88af94c31..3a31e93a2a9 100644 --- a/src/devices/cpu/e132xs/e132xs.cpp +++ b/src/devices/cpu/e132xs/e132xs.cpp @@ -661,10 +661,8 @@ void hyperstone_device::set_global_register(uint8_t code, uint32_t val) #define SIGN_BIT(val) ((val & 0x80000000) >> 31) #define SIGN_TO_N(val) ((val & 0x80000000) >> 29) -static constexpr int32_t immediate_values[32] = +/*static*/ const int32_t hyperstone_device::s_immediate_values[16] = { - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 32, 64, 128, int32_t(0x80000000), -8, -7, -6, -5, -4, -3, -2, -1 }; @@ -678,7 +676,7 @@ do if (m_delay_slot) \ { \ PC = m_delay_pc; \ - m_delay_slot = false; \ + m_delay_slot = 0; \ } \ } while (0) @@ -697,8 +695,7 @@ uint32_t hyperstone_device::decode_immediate_s() switch (nybble) { case 0: - default: - return immediate_values[0x10 + nybble]; + return 16; case 1: { m_instruction_length = (3<<19); @@ -720,6 +717,8 @@ uint32_t hyperstone_device::decode_immediate_s() PC += 2; return extra_u; } + default: + return s_immediate_values[nybble]; } } @@ -791,7 +790,7 @@ void hyperstone_device::ignore_pcrel() } } -void hyperstone_device::execute_br() +void hyperstone_device::hyperstone_br() { const int32_t offset = decode_pcrel(); check_delay_PC(); @@ -1029,7 +1028,7 @@ void hyperstone_device::device_start() void hyperstone_device::init(int scale_mask) { - m_enable_drc = false;//allow_drc(); + m_enable_drc = allow_drc(); memset(m_global_regs, 0, sizeof(uint32_t) * 32); memset(m_local_regs, 0, sizeof(uint32_t) * 64); @@ -1584,7 +1583,7 @@ void hyperstone_device::execute_run() m_instruction_length = (1<<19); - switch ((OP >> 8) & 0x00ff) + switch (m_op >> 8) { case 0x00: hyperstone_chk(); break; case 0x01: hyperstone_chk(); break; @@ -1798,8 +1797,8 @@ void hyperstone_device::execute_run() case 0xd1: hyperstone_ldwr(); break; case 0xd2: hyperstone_lddr(); break; case 0xd3: hyperstone_lddr(); break; - case 0xd4: hypesrtone_ldwp(); break; - case 0xd5: hypesrtone_ldwp(); break; + case 0xd4: hyperstone_ldwp(); break; + case 0xd5: hyperstone_ldwp(); break; case 0xd6: hyperstone_lddp(); break; case 0xd7: hyperstone_lddp(); break; case 0xd8: hyperstone_stwr(); break; @@ -1838,7 +1837,7 @@ void hyperstone_device::execute_run() case 0xf9: hyperstone_b(); break; case 0xfa: hyperstone_b(); break; case 0xfb: hyperstone_b(); break; - case 0xfc: execute_br(); break; + case 0xfc: hyperstone_br(); break; case 0xfd: hyperstone_trap(); break; case 0xfe: hyperstone_trap(); break; case 0xff: hyperstone_trap(); break; diff --git a/src/devices/cpu/e132xs/e132xs.h b/src/devices/cpu/e132xs/e132xs.h index 8328215c475..93247a4bbc1 100644 --- a/src/devices/cpu/e132xs/e132xs.h +++ b/src/devices/cpu/e132xs/e132xs.h @@ -64,6 +64,7 @@ class hyperstone_device : public cpu_device public: inline void ccfunc_unimplemented(); + inline void ccfunc_print(); protected: enum @@ -165,6 +166,8 @@ protected: enum { EXCEPTION_INTERRUPT = 0, + EXCEPTION_PRIVILEGE_ERROR, + EXCEPTION_TRACE, EXCEPTION_COUNT }; @@ -225,7 +228,7 @@ protected: emu_timer *m_timer; uint32_t m_delay_pc; - bool m_delay_slot; + uint32_t m_delay_slot; uint32_t m_opcodexor; @@ -236,6 +239,7 @@ protected: int m_icount; uint8_t m_fl_lut[16]; + static const int32_t s_immediate_values[16]; uint32_t get_trap_addr(uint8_t trapno); @@ -256,16 +260,18 @@ private: TIMER_CALLBACK_MEMBER(timer_callback); - void execute_br(); + uint32_t decode_const(); + uint32_t decode_immediate_s(); + void ignore_immediate_s(); + int32_t decode_pcrel(); + void ignore_pcrel(); + + void hyperstone_br(); void execute_trap(uint32_t addr); void execute_int(uint32_t addr); void execute_exception(uint32_t addr); void execute_software(); - void ignore_immediate_s(); - uint32_t decode_immediate_s(); - uint32_t decode_const(); - template void hyperstone_chk(); template void hyperstone_movd(); template void hyperstone_divsu(); @@ -323,7 +329,7 @@ private: template void hyperstone_ldwr(); template void hyperstone_lddr(); - template void hypesrtone_ldwp(); + template void hyperstone_ldwp(); template void hyperstone_lddp(); template void hyperstone_stwr(); @@ -345,9 +351,6 @@ private: void hyperstone_reserved(); void hyperstone_do(); - int32_t decode_pcrel(); - void ignore_pcrel(); - drc_cache m_cache; std::unique_ptr m_drcuml; std::unique_ptr m_drcfe; @@ -364,6 +367,7 @@ private: uint32_t m_drc_arg1; uint32_t m_drc_arg2; uint32_t m_drc_arg3; + uint32_t m_branch_dest; uml::code_handle *m_mem_read8; uml::code_handle *m_mem_write8; @@ -394,139 +398,109 @@ private: void static_generate_entry_point(); void static_generate_nocode_handler(); void static_generate_out_of_cycles(); - void static_generate_exception(uint8_t exception, const char *name); + void static_generate_exception(uint32_t exception, const char *name); void static_generate_memory_accessor(int size, int iswrite, bool isio, const char *name, uml::code_handle *&handleptr); - void generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param, bool allow_exception); + void generate_delay_slot_and_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param); void generate_checksum_block(drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast); void generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void log_add_disasm_comment(drcuml_block *block, uint32_t pc, uint32_t op); bool generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op00(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op01(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op02(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op03(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op04(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op05(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op06(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op07(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op08(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op09(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op0a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op0b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op0c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op0d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op0e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op0f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op10(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op11(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op12(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op13(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op14(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op15(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op16(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op17(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op18(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op19(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op1a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op1b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op1c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op1d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op1e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op1f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op20(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op21(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op22(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op23(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op24(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op25(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op26(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op27(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op28(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op29(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op2a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op2b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op2c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op2d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op2e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op2f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op30(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op31(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op32(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op33(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op34(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op35(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op36(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op37(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op38(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op39(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op3a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op3b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op3c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op3d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op3e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op3f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op40(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op41(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op42(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op43(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op44(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op45(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op46(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op47(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op48(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op49(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op4a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op4b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op4c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op4d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op4e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op4f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op50(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op51(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op52(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op53(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op54(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op55(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op56(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op57(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op58(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op59(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op5a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op5b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op5c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op5d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op5e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op5f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op60(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op61(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op62(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op63(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op64(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op65(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op66(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op67(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op68(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op69(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op6a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op6b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op6c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op6d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op6e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op6f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op70(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op71(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op72(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op73(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op74(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op75(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op76(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op77(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op78(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op79(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op7a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op7b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op7c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op7d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op7e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op7f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op80(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op81(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op82(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op83(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op84(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op85(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op86(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op87(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op88(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op89(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op8a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op8b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op8e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op8f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op90(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op91(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op92(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op93(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op94(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op95(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op96(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op97(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op98(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op99(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op9a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op9b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op9c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op9d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_op9e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_op9f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opa8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opa9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opaa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opab(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opb8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opb9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opba(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opbb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opbc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opbd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opbe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opbf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opc8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opc9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opca(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opcb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opcc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opcd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opce(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opcf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opd8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opd9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opda(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opdb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opdc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opdd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opde(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opdf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ope8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_ope9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opea(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opeb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opec(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_oped(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opee(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opef(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opf8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opf9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opfa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opfb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opfc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opfd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_opfe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); void generate_opff(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + int generate_get_trap_addr(drcuml_block *block, int label, uint32_t trapno); + void generate_check_delay_pc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_decode_const(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + int generate_decode_immediate_s(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_ignore_immediate_s(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_decode_pcrel(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_ignore_pcrel(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + int generate_set_global_register(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, int label); + + void generate_trap(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr); + void generate_int(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr); + void generate_exception(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr); + void generate_software(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + template void generate_chk(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_movd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_divsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_xm(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_mask(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_sum(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_sums(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_cmp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_mov(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_add(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_adds(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_cmpb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_subc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_sub(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_subs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_addc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_neg(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_negs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_and(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_andn(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_or(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_xor(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_not(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_cmpi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template int generate_movi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_addi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_addsi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_cmpbi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_andni(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_ori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_xori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_shrdi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_shrd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_shr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_shri(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_sardi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_sard(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_sar(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_sari(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_shldi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_shld(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_shl(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_shli(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_testlz(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_rol(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_ldxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_ldxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_stxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_stxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + template void generate_mulsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_mul(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + template void generate_set(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + template void generate_ldwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_lddr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_ldwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_lddp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + template void generate_stwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_stdr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_stwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_stdp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + template void generate_b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_br(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + template void generate_db(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_dbr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + void generate_frame(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_call_global(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_call_local(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + void generate_trap_op(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_extend(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + + void generate_reserved(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); + void generate_do(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); }; // device type definition diff --git a/src/devices/cpu/e132xs/e132xsdefs.h b/src/devices/cpu/e132xs/e132xsdefs.h deleted file mode 100644 index 95a0274ed3a..00000000000 --- a/src/devices/cpu/e132xs/e132xsdefs.h +++ /dev/null @@ -1,79 +0,0 @@ -/* Memory access */ -/* read byte */ -#define READ_B(addr) m_program->read_byte((addr)) -/* read half-word */ -#define READ_HW(addr) m_program->read_word((addr) & ~1) -/* read word */ -#define READ_W(addr) m_program->read_dword((addr) & ~3) - -/* write byte */ -#define WRITE_B(addr, data) m_program->write_byte(addr, data) -/* write half-word */ -#define WRITE_HW(addr, data) m_program->write_word((addr) & ~1, data) -/* write word */ -#define WRITE_W(addr, data) m_program->write_dword((addr) & ~3, data) - - -/* I/O access */ -/* read word */ -#define IO_READ_W(addr) m_io->read_dword(((addr) >> 11) & 0x7ffc) -/* write word */ -#define IO_WRITE_W(addr, data) m_io->write_dword(((addr) >> 11) & 0x7ffc, data) - - -#define READ_OP(addr) m_direct->read_word((addr), m_opcodexor) - -// set C in adds/addsi/subs/sums -#define SETCARRYS 0 -#define MISSIONCRAFT_FLAGS 1 - -/* Registers */ - -/* Internal registers */ - -#define SREG decode.src_value -#define SREGF decode.next_src_value -#define DREG decode.dst_value -#define DREGF decode.next_dst_value -#define EXTRA_U decode.extra.u -#define EXTRA_S decode.extra.s - -#define SET_SREG( _data_ ) (decode.src_is_local ? set_local_register(decode.src, (uint32_t)_data_) : set_global_register(decode.src, (uint32_t)_data_)) -#define SET_SREGF( _data_ ) (decode.src_is_local ? set_local_register(decode.src + 1, (uint32_t)_data_) : set_global_register(decode.src + 1, (uint32_t)_data_)) -#define SET_DREG( _data_ ) (decode.dst_is_local ? set_local_register(decode.dst, (uint32_t)_data_) : set_global_register(decode.dst, (uint32_t)_data_)) -#define SET_DREGF( _data_ ) (decode.dst_is_local ? set_local_register(decode.dst + 1, (uint32_t)_data_) : set_global_register(decode.dst + 1, (uint32_t)_data_)) - -#define SRC_IS_PC (!decode.src_is_local && decode.src == PC_REGISTER) -#define DST_IS_PC (!decode.dst_is_local && decode.dst == PC_REGISTER) -#define SRC_IS_SR (!decode.src_is_local && decode.src == SR_REGISTER) -#define DST_IS_SR (!decode.dst_is_local && decode.dst == SR_REGISTER) -#define SAME_SRC_DST decode.same_src_dst -#define SAME_SRC_DSTF decode.same_src_dstf -#define SAME_SRCF_DST decode.same_srcf_dst - - -/* Memory access */ -/* read byte */ -#define READ_B(addr) m_program->read_byte((addr)) -/* read half-word */ -#define READ_HW(addr) m_program->read_word((addr) & ~1) -/* read word */ -#define READ_W(addr) m_program->read_dword((addr) & ~3) - -/* write byte */ -#define WRITE_B(addr, data) m_program->write_byte(addr, data) -/* write half-word */ -#define WRITE_HW(addr, data) m_program->write_word((addr) & ~1, data) -/* write word */ -#define WRITE_W(addr, data) m_program->write_dword((addr) & ~3, data) - - -/* I/O access */ -/* read word */ -#define IO_READ_W(addr) m_io->read_dword(((addr) >> 11) & 0x7ffc) -/* write word */ -#define IO_WRITE_W(addr, data) m_io->write_dword(((addr) >> 11) & 0x7ffc, data) - - -#define READ_OP(addr) m_direct->read_word((addr), m_opcodexor) - diff --git a/src/devices/cpu/e132xs/e132xsdrc.cpp b/src/devices/cpu/e132xs/e132xsdrc.cpp index 9e0d7e9ef15..43dc59dd016 100644 --- a/src/devices/cpu/e132xs/e132xsdrc.cpp +++ b/src/devices/cpu/e132xs/e132xsdrc.cpp @@ -7,6 +7,8 @@ using namespace uml; +#define DRC_SR mem(&m_global_regs[1]) + void hyperstone_device::execute_run_drc() { drcuml_state *drcuml = m_drcuml.get(); @@ -19,6 +21,7 @@ void hyperstone_device::execute_run_drc() m_cache_dirty = false; } + /* execute */ do { @@ -74,6 +77,10 @@ void hyperstone_device::code_flush_cache() static_generate_nocode_handler(); static_generate_out_of_cycles(); + static_generate_exception(EXCEPTION_INTERRUPT, "interrupt"); + static_generate_exception(EXCEPTION_PRIVILEGE_ERROR, "privilege_error"); + static_generate_exception(EXCEPTION_TRACE, "trace"); + /* add subroutines for memory accesses */ static_generate_memory_accessor(1, false, false, "read8", m_mem_read8); static_generate_memory_accessor(1, true, false, "write8", m_mem_write8); @@ -87,10 +94,25 @@ void hyperstone_device::code_flush_cache() catch (drcuml_block::abort_compilation &) { - fatalerror("Unable to generate static E132XS code\n"); + fatalerror("Unable to generate static E132XS code\n"); fflush(stdout); } } +/* Return the entry point for a determinated trap */ +int hyperstone_device::generate_get_trap_addr(drcuml_block *block, int label, uint32_t trapno) +{ + int no_mem3; + UML_MOV(block, I0, trapno); + UML_CMP(block, mem(&m_trap_entry), 0xffffff00); + UML_JMPc(block, uml::COND_NE, no_mem3 = label++); + UML_SUB(block, I0, 63, I0); + + UML_LABEL(block, no_mem3); + UML_SHL(block, I0, I0, 2); + UML_OR(block, I0, I0, mem(&m_trap_entry)); + return label; +} + /*------------------------------------------------- code_compile_block - compile a block of the given mode at the specified pc @@ -126,7 +148,7 @@ void hyperstone_device::code_compile_block(offs_t pc) /* add a code log entry */ if (drcuml->logging()) - block->append_comment("-------------------------"); // comment + block->append_comment("-------------------------"); /* determine the last instruction in this sequence */ for (seqlast = seqhead; seqlast != nullptr; seqlast = seqlast->next()) @@ -136,22 +158,21 @@ void hyperstone_device::code_compile_block(offs_t pc) /* if we don't have a hash for this mode/pc, or if we are overriding all, add one */ if (override || !drcuml->hash_exists(0, seqhead->pc)) - UML_HASH(block, 0, seqhead->pc); // hash mode,pc + UML_HASH(block, 0, seqhead->pc); /* if we already have a hash, and this is the first sequence, assume that we */ /* are recompiling due to being out of sync and allow future overrides */ else if (seqhead == desclist) { override = true; - UML_HASH(block, 0, seqhead->pc); // hash mode,pc + UML_HASH(block, 0, seqhead->pc); } /* otherwise, redispatch to that fixed PC and skip the rest of the processing */ else { - UML_LABEL(block, seqhead->pc | 0x80000000); // label seqhead->pc + UML_LABEL(block, seqhead->pc | 0x80000000); UML_HASHJMP(block, 0, seqhead->pc, *m_nocode); - // hashjmp <0>,seqhead->pc,nocode continue; } @@ -161,11 +182,13 @@ void hyperstone_device::code_compile_block(offs_t pc) /* label this instruction, if it may be jumped to locally */ if (seqhead->flags & OPFLAG_IS_BRANCH_TARGET) - UML_LABEL(block, seqhead->pc | 0x80000000); // label seqhead->pc + UML_LABEL(block, seqhead->pc | 0x80000000); /* iterate over instructions in the sequence and compile them */ for (curdesc = seqhead; curdesc != seqlast->next(); curdesc = curdesc->next()) + { generate_sequence_instruction(block, &compiler, curdesc); + } /* if we need to return to the start, do it */ if (seqlast->flags & OPFLAG_RETURN_TO_START) @@ -173,14 +196,16 @@ void hyperstone_device::code_compile_block(offs_t pc) /* otherwise we just go to the next instruction */ else - nextpc = seqlast->pc + (seqlast->skipslots + 1) * 4; + nextpc = seqlast->pc + (seqlast->skipslots + 1) * 2; /* count off cycles and go there */ - generate_update_cycles(block, &compiler, nextpc, true); // + generate_update_cycles(block, &compiler, nextpc); // /* if the last instruction can change modes, use a variable mode; otherwise, assume the same mode */ if (seqlast->next() == nullptr || seqlast->next()->pc != nextpc) + { UML_HASHJMP(block, 0, nextpc, *m_nocode); // hashjmp ,nextpc,nocode + } } /* end the sequence */ @@ -209,11 +234,23 @@ inline void hyperstone_device::ccfunc_unimplemented() fatalerror("PC=%08X: Unimplemented op %08X\n", PC, m_drc_arg0); } +inline void hyperstone_device::ccfunc_print() +{ + printf("%c: %08X\n", (char)m_drc_arg0, m_drc_arg1); +} + static void cfunc_unimplemented(void *param) { ((hyperstone_device *)param)->ccfunc_unimplemented(); } +#if 0 +static void cfunc_print(void *param) +{ + ((hyperstone_device *)param)->ccfunc_print(); +} +#endif + /*************************************************************************** STATIC CODEGEN ***************************************************************************/ @@ -241,6 +278,59 @@ static inline void alloc_handle(drcuml_state *drcuml, code_handle **handleptr, c } + +/*------------------------------------------------- + static_generate_exception - generate an + exception handler +-------------------------------------------------*/ + +void hyperstone_device::static_generate_exception(uint32_t exception, const char *name) +{ + code_handle *&exception_handle = m_exception[exception]; + drcuml_state *drcuml = m_drcuml.get(); + drcuml_block *block = drcuml->begin_block(1024); + + /* add a global entry for this */ + alloc_handle(drcuml, &exception_handle, name); + UML_HANDLE(block, *exception_handle); + + generate_get_trap_addr(block, 1, exception); + UML_ROLAND(block, I1, DRC_SR, 7, 0x7f); + UML_ROLAND(block, I2, DRC_SR, 11, 0xf); + UML_TEST(block, I2, 0xf); + UML_MOVc(block, uml::COND_Z, I2, 16); + UML_ADD(block, I1, I1, I2); + + UML_AND(block, DRC_SR, DRC_SR, 0xffe7ffff); + UML_OR(block, DRC_SR, DRC_SR, mem(&m_instruction_length)); + + UML_MOV(block, I4, DRC_SR); + UML_ROLINS(block, DRC_SR, 2, 21, 0x01e00000); + UML_ROLINS(block, DRC_SR, I1, 25, 0xfe000000); + + UML_AND(block, I3, I1, 0x3f); + UML_AND(block, I1, mem(m_global_regs), ~1); + UML_ROLAND(block, I2, DRC_SR, 14, 1); + UML_OR(block, I1, I1, I2); + UML_STORE(block, (void *)m_local_regs, I3, I1, SIZE_DWORD, SCALE_x4); + UML_ADD(block, I3, I3, 1); + UML_AND(block, I3, I3, 0x3f); + UML_STORE(block, (void *)m_local_regs, I3, I4, SIZE_DWORD, SCALE_x4); + + UML_AND(block, DRC_SR, DRC_SR, ~(M_MASK | T_MASK)); + UML_OR(block, DRC_SR, DRC_SR, (L_MASK | S_MASK)); + + UML_MOV(block, mem(m_global_regs), I0); + UML_SUB(block, mem(&m_icount), mem(&m_icount), 2); + UML_EXHc(block, COND_S, *m_out_of_cycles, 0); + + UML_HASHJMP(block, 0, I0, *m_nocode);// hashjmp ,i0,nocode + + block->end(); +} + + + /*------------------------------------------------- generate_entry_point - generate a static entry point @@ -378,7 +468,7 @@ void hyperstone_device::static_generate_memory_accessor(int size, int iswrite, b an exception if out -------------------------------------------------*/ -void hyperstone_device::generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param, bool allow_exception) +void hyperstone_device::generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param) { /* account for cycles */ if (compiler->m_cycles > 0) @@ -469,6 +559,43 @@ void hyperstone_device::log_add_disasm_comment(drcuml_block *block, uint32_t pc, } +/*------------------------------------------------------------------ + generate_delay_slot_and_branch +------------------------------------------------------------------*/ + +void hyperstone_device::generate_delay_slot_and_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ + compiler_state compiler_temp = *compiler; + + /* fetch the target register if dynamic, in case it is modified by the delay slot */ + if (desc->targetpc == BRANCH_TARGET_DYNAMIC) + { + UML_MOV(block, mem(&m_branch_dest), I0); + } + + /* update the cycles and jump through the hash table to the target */ + if (desc->targetpc != BRANCH_TARGET_DYNAMIC) + { + generate_update_cycles(block, &compiler_temp, desc->targetpc); + if (desc->flags & OPFLAG_INTRABLOCK_BRANCH) + UML_JMP(block, desc->targetpc | 0x80000000); + else + UML_HASHJMP(block, 0, desc->targetpc, *m_nocode); + } + else + { + generate_update_cycles(block, &compiler_temp, mem(&m_branch_dest)); + UML_HASHJMP(block, 0, mem(&m_branch_dest), *m_nocode); + } + + /* update the label */ + compiler->m_labelnum = compiler_temp.m_labelnum; + + /* reset the mapvar to the current cycles */ + UML_MAPVAR(block, MAPVAR_CYCLES, compiler->m_cycles); +} + + /*------------------------------------------------- generate_sequence_instruction - generate code for a single instruction in a sequence @@ -495,7 +622,7 @@ void hyperstone_device::generate_sequence_instruction(drcuml_block *block, compi /* if we are debugging, call the debugger */ if ((machine().debug_flags & DEBUG_FLAG_ENABLED) != 0) { - UML_MOV(block, mem(&PC), desc->pc); + UML_MOV(block, mem(m_global_regs), desc->pc); //save_fast_iregs(block); UML_DEBUG(block, desc->pc); } @@ -505,277 +632,297 @@ void hyperstone_device::generate_sequence_instruction(drcuml_block *block, compi /* compile the instruction */ if (!generate_opcode(block, compiler, desc)) { - UML_MOV(block, mem(&PC), desc->pc); + UML_MOV(block, mem(m_global_regs), desc->pc); UML_MOV(block, mem(&m_drc_arg0), desc->opptr.l[0]); UML_CALLC(block, cfunc_unimplemented, this); } } } +#include "e132xsdrc_ops.hxx" + bool hyperstone_device::generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) { - uint32_t op = desc->opptr.l[0]; - uint8_t opswitch = (op & 0x0000ff00) >> 8; - code_label skip; + uint32_t op = (uint32_t)desc->opptr.w[0]; + printf("op:%04x\n", op); + printf("pc:%08x\n", desc->pc); + + UML_MOV(block, I0, op); + UML_AND(block, I7, DRC_SR, H_MASK); + UML_ADD(block, mem(m_global_regs), mem(m_global_regs), 2); + UML_MOV(block, mem(&m_instruction_length), (1 << 19)); - switch (opswitch) + int label = 1; + switch (op >> 8) { - case 0x00: generate_op00(block, compiler, desc); break; - case 0x01: generate_op01(block, compiler, desc); break; - case 0x02: generate_op02(block, compiler, desc); break; - case 0x03: generate_op03(block, compiler, desc); break; - case 0x04: generate_op04(block, compiler, desc); break; - case 0x05: generate_op05(block, compiler, desc); break; - case 0x06: generate_op06(block, compiler, desc); break; - case 0x07: generate_op07(block, compiler, desc); break; - case 0x08: generate_op08(block, compiler, desc); break; - case 0x09: generate_op09(block, compiler, desc); break; - case 0x0a: generate_op0a(block, compiler, desc); break; - case 0x0b: generate_op0b(block, compiler, desc); break; - case 0x0c: generate_op0c(block, compiler, desc); break; - case 0x0d: generate_op0d(block, compiler, desc); break; - case 0x0e: generate_op0e(block, compiler, desc); break; - case 0x0f: generate_op0f(block, compiler, desc); break; - case 0x10: generate_op10(block, compiler, desc); break; - case 0x11: generate_op11(block, compiler, desc); break; - case 0x12: generate_op12(block, compiler, desc); break; - case 0x13: generate_op13(block, compiler, desc); break; - case 0x14: generate_op14(block, compiler, desc); break; - case 0x15: generate_op15(block, compiler, desc); break; - case 0x16: generate_op16(block, compiler, desc); break; - case 0x17: generate_op17(block, compiler, desc); break; - case 0x18: generate_op18(block, compiler, desc); break; - case 0x19: generate_op19(block, compiler, desc); break; - case 0x1a: generate_op1a(block, compiler, desc); break; - case 0x1b: generate_op1b(block, compiler, desc); break; - case 0x1c: generate_op1c(block, compiler, desc); break; - case 0x1d: generate_op1d(block, compiler, desc); break; - case 0x1e: generate_op1e(block, compiler, desc); break; - case 0x1f: generate_op1f(block, compiler, desc); break; - case 0x20: generate_op20(block, compiler, desc); break; - case 0x21: generate_op21(block, compiler, desc); break; - case 0x22: generate_op22(block, compiler, desc); break; - case 0x23: generate_op23(block, compiler, desc); break; - case 0x24: generate_op24(block, compiler, desc); break; - case 0x25: generate_op25(block, compiler, desc); break; - case 0x26: generate_op26(block, compiler, desc); break; - case 0x27: generate_op27(block, compiler, desc); break; - case 0x28: generate_op28(block, compiler, desc); break; - case 0x29: generate_op29(block, compiler, desc); break; - case 0x2a: generate_op2a(block, compiler, desc); break; - case 0x2b: generate_op2b(block, compiler, desc); break; - case 0x2c: generate_op2c(block, compiler, desc); break; - case 0x2d: generate_op2d(block, compiler, desc); break; - case 0x2e: generate_op2e(block, compiler, desc); break; - case 0x2f: generate_op2f(block, compiler, desc); break; - case 0x30: generate_op30(block, compiler, desc); break; - case 0x31: generate_op31(block, compiler, desc); break; - case 0x32: generate_op32(block, compiler, desc); break; - case 0x33: generate_op33(block, compiler, desc); break; - case 0x34: generate_op34(block, compiler, desc); break; - case 0x35: generate_op35(block, compiler, desc); break; - case 0x36: generate_op36(block, compiler, desc); break; - case 0x37: generate_op37(block, compiler, desc); break; - case 0x38: generate_op38(block, compiler, desc); break; - case 0x39: generate_op39(block, compiler, desc); break; - case 0x3a: generate_op3a(block, compiler, desc); break; - case 0x3b: generate_op3b(block, compiler, desc); break; - case 0x3c: generate_op3c(block, compiler, desc); break; - case 0x3d: generate_op3d(block, compiler, desc); break; - case 0x3e: generate_op3e(block, compiler, desc); break; - case 0x3f: generate_op3f(block, compiler, desc); break; - case 0x40: generate_op40(block, compiler, desc); break; - case 0x41: generate_op41(block, compiler, desc); break; - case 0x42: generate_op42(block, compiler, desc); break; - case 0x43: generate_op43(block, compiler, desc); break; - case 0x44: generate_op44(block, compiler, desc); break; - case 0x45: generate_op45(block, compiler, desc); break; - case 0x46: generate_op46(block, compiler, desc); break; - case 0x47: generate_op47(block, compiler, desc); break; - case 0x48: generate_op48(block, compiler, desc); break; - case 0x49: generate_op49(block, compiler, desc); break; - case 0x4a: generate_op4a(block, compiler, desc); break; - case 0x4b: generate_op4b(block, compiler, desc); break; - case 0x4c: generate_op4c(block, compiler, desc); break; - case 0x4d: generate_op4d(block, compiler, desc); break; - case 0x4e: generate_op4e(block, compiler, desc); break; - case 0x4f: generate_op4f(block, compiler, desc); break; - case 0x50: generate_op50(block, compiler, desc); break; - case 0x51: generate_op51(block, compiler, desc); break; - case 0x52: generate_op52(block, compiler, desc); break; - case 0x53: generate_op53(block, compiler, desc); break; - case 0x54: generate_op54(block, compiler, desc); break; - case 0x55: generate_op55(block, compiler, desc); break; - case 0x56: generate_op56(block, compiler, desc); break; - case 0x57: generate_op57(block, compiler, desc); break; - case 0x58: generate_op58(block, compiler, desc); break; - case 0x59: generate_op59(block, compiler, desc); break; - case 0x5a: generate_op5a(block, compiler, desc); break; - case 0x5b: generate_op5b(block, compiler, desc); break; - case 0x5c: generate_op5c(block, compiler, desc); break; - case 0x5d: generate_op5d(block, compiler, desc); break; - case 0x5e: generate_op5e(block, compiler, desc); break; - case 0x5f: generate_op5f(block, compiler, desc); break; - case 0x60: generate_op60(block, compiler, desc); break; - case 0x61: generate_op61(block, compiler, desc); break; - case 0x62: generate_op62(block, compiler, desc); break; - case 0x63: generate_op63(block, compiler, desc); break; - case 0x64: generate_op64(block, compiler, desc); break; - case 0x65: generate_op65(block, compiler, desc); break; - case 0x66: generate_op66(block, compiler, desc); break; - case 0x67: generate_op67(block, compiler, desc); break; - case 0x68: generate_op68(block, compiler, desc); break; - case 0x69: generate_op69(block, compiler, desc); break; - case 0x6a: generate_op6a(block, compiler, desc); break; - case 0x6b: generate_op6b(block, compiler, desc); break; - case 0x6c: generate_op6c(block, compiler, desc); break; - case 0x6d: generate_op6d(block, compiler, desc); break; - case 0x6e: generate_op6e(block, compiler, desc); break; - case 0x6f: generate_op6f(block, compiler, desc); break; - case 0x70: generate_op70(block, compiler, desc); break; - case 0x71: generate_op71(block, compiler, desc); break; - case 0x72: generate_op72(block, compiler, desc); break; - case 0x73: generate_op73(block, compiler, desc); break; - case 0x74: generate_op74(block, compiler, desc); break; - case 0x75: generate_op75(block, compiler, desc); break; - case 0x76: generate_op76(block, compiler, desc); break; - case 0x77: generate_op77(block, compiler, desc); break; - case 0x78: generate_op78(block, compiler, desc); break; - case 0x79: generate_op79(block, compiler, desc); break; - case 0x7a: generate_op7a(block, compiler, desc); break; - case 0x7b: generate_op7b(block, compiler, desc); break; - case 0x7c: generate_op7c(block, compiler, desc); break; - case 0x7d: generate_op7d(block, compiler, desc); break; - case 0x7e: generate_op7e(block, compiler, desc); break; - case 0x7f: generate_op7f(block, compiler, desc); break; - case 0x80: generate_op80(block, compiler, desc); break; - case 0x81: generate_op81(block, compiler, desc); break; - case 0x82: generate_op82(block, compiler, desc); break; - case 0x83: generate_op83(block, compiler, desc); break; - case 0x84: generate_op84(block, compiler, desc); break; - case 0x85: generate_op85(block, compiler, desc); break; - case 0x86: generate_op86(block, compiler, desc); break; - case 0x87: generate_op87(block, compiler, desc); break; - case 0x88: generate_op88(block, compiler, desc); break; - case 0x89: generate_op89(block, compiler, desc); break; - case 0x8a: generate_op8a(block, compiler, desc); break; - case 0x8b: generate_op8b(block, compiler, desc); break; - case 0x8c: - case 0x8d: return false; - case 0x8e: generate_op8e(block, compiler, desc); break; - case 0x8f: generate_op8f(block, compiler, desc); break; - case 0x90: generate_op90(block, compiler, desc); break; - case 0x91: generate_op91(block, compiler, desc); break; - case 0x92: generate_op92(block, compiler, desc); break; - case 0x93: generate_op93(block, compiler, desc); break; - case 0x94: generate_op94(block, compiler, desc); break; - case 0x95: generate_op95(block, compiler, desc); break; - case 0x96: generate_op96(block, compiler, desc); break; - case 0x97: generate_op97(block, compiler, desc); break; - case 0x98: generate_op98(block, compiler, desc); break; - case 0x99: generate_op99(block, compiler, desc); break; - case 0x9a: generate_op9a(block, compiler, desc); break; - case 0x9b: generate_op9b(block, compiler, desc); break; - case 0x9c: generate_op9c(block, compiler, desc); break; - case 0x9d: generate_op9d(block, compiler, desc); break; - case 0x9e: generate_op9e(block, compiler, desc); break; - case 0x9f: generate_op9f(block, compiler, desc); break; - case 0xa0: generate_opa0(block, compiler, desc); break; - case 0xa1: generate_opa1(block, compiler, desc); break; - case 0xa2: generate_opa2(block, compiler, desc); break; - case 0xa3: generate_opa3(block, compiler, desc); break; - case 0xa4: generate_opa4(block, compiler, desc); break; - case 0xa5: generate_opa5(block, compiler, desc); break; - case 0xa6: generate_opa6(block, compiler, desc); break; - case 0xa7: generate_opa7(block, compiler, desc); break; - case 0xa8: generate_opa8(block, compiler, desc); break; - case 0xa9: generate_opa9(block, compiler, desc); break; - case 0xaa: generate_opaa(block, compiler, desc); break; - case 0xab: generate_opab(block, compiler, desc); break; - case 0xac: - case 0xad: - case 0xae: - case 0xaf: return false; - case 0xb0: generate_opb0(block, compiler, desc); break; - case 0xb1: generate_opb1(block, compiler, desc); break; - case 0xb2: generate_opb2(block, compiler, desc); break; - case 0xb3: generate_opb3(block, compiler, desc); break; - case 0xb4: generate_opb4(block, compiler, desc); break; - case 0xb5: generate_opb5(block, compiler, desc); break; - case 0xb6: generate_opb6(block, compiler, desc); break; - case 0xb7: generate_opb7(block, compiler, desc); break; - case 0xb8: generate_opb8(block, compiler, desc); break; - case 0xb9: generate_opb9(block, compiler, desc); break; - case 0xba: generate_opba(block, compiler, desc); break; - case 0xbb: generate_opbb(block, compiler, desc); break; - case 0xbc: generate_opbc(block, compiler, desc); break; - case 0xbd: generate_opbd(block, compiler, desc); break; - case 0xbe: generate_opbe(block, compiler, desc); break; - case 0xbf: generate_opbf(block, compiler, desc); break; - case 0xc0: generate_opc0(block, compiler, desc); break; - case 0xc1: generate_opc1(block, compiler, desc); break; - case 0xc2: generate_opc2(block, compiler, desc); break; - case 0xc3: generate_opc3(block, compiler, desc); break; - case 0xc4: generate_opc4(block, compiler, desc); break; - case 0xc5: generate_opc5(block, compiler, desc); break; - case 0xc6: generate_opc6(block, compiler, desc); break; - case 0xc7: generate_opc7(block, compiler, desc); break; - case 0xc8: generate_opc8(block, compiler, desc); break; - case 0xc9: generate_opc9(block, compiler, desc); break; - case 0xca: generate_opca(block, compiler, desc); break; - case 0xcb: generate_opcb(block, compiler, desc); break; - case 0xcc: generate_opcc(block, compiler, desc); break; - case 0xcd: generate_opcd(block, compiler, desc); break; - case 0xce: generate_opce(block, compiler, desc); break; - case 0xcf: generate_opcf(block, compiler, desc); break; - case 0xd0: generate_opd0(block, compiler, desc); break; - case 0xd1: generate_opd1(block, compiler, desc); break; - case 0xd2: generate_opd2(block, compiler, desc); break; - case 0xd3: generate_opd3(block, compiler, desc); break; - case 0xd4: generate_opd4(block, compiler, desc); break; - case 0xd5: generate_opd5(block, compiler, desc); break; - case 0xd6: generate_opd6(block, compiler, desc); break; - case 0xd7: generate_opd7(block, compiler, desc); break; - case 0xd8: generate_opd8(block, compiler, desc); break; - case 0xd9: generate_opd9(block, compiler, desc); break; - case 0xda: generate_opda(block, compiler, desc); break; - case 0xdb: generate_opdb(block, compiler, desc); break; - case 0xdc: generate_opdc(block, compiler, desc); break; - case 0xdd: generate_opdd(block, compiler, desc); break; - case 0xde: generate_opde(block, compiler, desc); break; - case 0xdf: generate_opdf(block, compiler, desc); break; - case 0xe0: generate_ope0(block, compiler, desc); break; - case 0xe1: generate_ope1(block, compiler, desc); break; - case 0xe2: generate_ope2(block, compiler, desc); break; - case 0xe3: generate_ope3(block, compiler, desc); break; - case 0xe4: generate_ope4(block, compiler, desc); break; - case 0xe5: generate_ope5(block, compiler, desc); break; - case 0xe6: generate_ope6(block, compiler, desc); break; - case 0xe7: generate_ope7(block, compiler, desc); break; - case 0xe8: generate_ope8(block, compiler, desc); break; - case 0xe9: generate_ope9(block, compiler, desc); break; - case 0xea: generate_opea(block, compiler, desc); break; - case 0xeb: generate_opeb(block, compiler, desc); break; - case 0xec: generate_opec(block, compiler, desc); break; - case 0xed: generate_oped(block, compiler, desc); break; - case 0xee: generate_opee(block, compiler, desc); break; - case 0xef: generate_opef(block, compiler, desc); break; - case 0xf0: generate_opf0(block, compiler, desc); break; - case 0xf1: generate_opf1(block, compiler, desc); break; - case 0xf2: generate_opf2(block, compiler, desc); break; - case 0xf3: generate_opf3(block, compiler, desc); break; - case 0xf4: generate_opf4(block, compiler, desc); break; - case 0xf5: generate_opf5(block, compiler, desc); break; - case 0xf6: generate_opf6(block, compiler, desc); break; - case 0xf7: generate_opf7(block, compiler, desc); break; - case 0xf8: generate_opf8(block, compiler, desc); break; - case 0xf9: generate_opf9(block, compiler, desc); break; - case 0xfa: generate_opfa(block, compiler, desc); break; - case 0xfb: generate_opfb(block, compiler, desc); break; - case 0xfc: generate_opfc(block, compiler, desc); break; - case 0xfd: generate_opfd(block, compiler, desc); break; - case 0xfe: generate_opfe(block, compiler, desc); break; - case 0xff: generate_opff(block, compiler, desc); break; + case 0x00: generate_chk(block, compiler, desc); break; + case 0x01: generate_chk(block, compiler, desc); break; + case 0x02: generate_chk(block, compiler, desc); break; + case 0x03: generate_chk(block, compiler, desc); break; + case 0x04: generate_movd(block, compiler, desc); break; + case 0x05: generate_movd(block, compiler, desc); break; + case 0x06: generate_movd(block, compiler, desc); break; + case 0x07: generate_movd(block, compiler, desc); break; + case 0x08: generate_divsu(block, compiler, desc); break; + case 0x09: generate_divsu(block, compiler, desc); break; + case 0x0a: generate_divsu(block, compiler, desc); break; + case 0x0b: generate_divsu(block, compiler, desc); break; + case 0x0c: generate_divsu(block, compiler, desc); break; + case 0x0d: generate_divsu(block, compiler, desc); break; + case 0x0e: generate_divsu(block, compiler, desc); break; + case 0x0f: generate_divsu(block, compiler, desc); break; + case 0x10: generate_xm(block, compiler, desc); break; + case 0x11: generate_xm(block, compiler, desc); break; + case 0x12: generate_xm(block, compiler, desc); break; + case 0x13: generate_xm(block, compiler, desc); break; + case 0x14: generate_mask(block, compiler, desc); break; + case 0x15: generate_mask(block, compiler, desc); break; + case 0x16: generate_mask(block, compiler, desc); break; + case 0x17: generate_mask(block, compiler, desc); break; + case 0x18: generate_sum(block, compiler, desc); break; + case 0x19: generate_sum(block, compiler, desc); break; + case 0x1a: generate_sum(block, compiler, desc); break; + case 0x1b: generate_sum(block, compiler, desc); break; + case 0x1c: generate_sums(block, compiler, desc); break; + case 0x1d: generate_sums(block, compiler, desc); break; + case 0x1e: generate_sums(block, compiler, desc); break; + case 0x1f: generate_sums(block, compiler, desc); break; + case 0x20: generate_cmp(block, compiler, desc); break; + case 0x21: generate_cmp(block, compiler, desc); break; + case 0x22: generate_cmp(block, compiler, desc); break; + case 0x23: generate_cmp(block, compiler, desc); break; + case 0x24: generate_mov(block, compiler, desc); break; + case 0x25: generate_mov(block, compiler, desc); break; + case 0x26: generate_mov(block, compiler, desc); break; + case 0x27: generate_mov(block, compiler, desc); break; + case 0x28: generate_add(block, compiler, desc); break; + case 0x29: generate_add(block, compiler, desc); break; + case 0x2a: generate_add(block, compiler, desc); break; + case 0x2b: generate_add(block, compiler, desc); break; + case 0x2c: generate_adds(block, compiler, desc); break; + case 0x2d: generate_adds(block, compiler, desc); break; + case 0x2e: generate_adds(block, compiler, desc); break; + case 0x2f: generate_adds(block, compiler, desc); break; + case 0x30: generate_cmpb(block, compiler, desc); break; + case 0x31: generate_cmpb(block, compiler, desc); break; + case 0x32: generate_cmpb(block, compiler, desc); break; + case 0x33: generate_cmpb(block, compiler, desc); break; + case 0x34: generate_andn(block, compiler, desc); break; + case 0x35: generate_andn(block, compiler, desc); break; + case 0x36: generate_andn(block, compiler, desc); break; + case 0x37: generate_andn(block, compiler, desc); break; + case 0x38: generate_or(block, compiler, desc); break; + case 0x39: generate_or(block, compiler, desc); break; + case 0x3a: generate_or(block, compiler, desc); break; + case 0x3b: generate_or(block, compiler, desc); break; + case 0x3c: generate_xor(block, compiler, desc); break; + case 0x3d: generate_xor(block, compiler, desc); break; + case 0x3e: generate_xor(block, compiler, desc); break; + case 0x3f: generate_xor(block, compiler, desc); break; + case 0x40: generate_subc(block, compiler, desc); break; + case 0x41: generate_subc(block, compiler, desc); break; + case 0x42: generate_subc(block, compiler, desc); break; + case 0x43: generate_subc(block, compiler, desc); break; + case 0x44: generate_not(block, compiler, desc); break; + case 0x45: generate_not(block, compiler, desc); break; + case 0x46: generate_not(block, compiler, desc); break; + case 0x47: generate_not(block, compiler, desc); break; + case 0x48: generate_sub(block, compiler, desc); break; + case 0x49: generate_sub(block, compiler, desc); break; + case 0x4a: generate_sub(block, compiler, desc); break; + case 0x4b: generate_sub(block, compiler, desc); break; + case 0x4c: generate_subs(block, compiler, desc); break; + case 0x4d: generate_subs(block, compiler, desc); break; + case 0x4e: generate_subs(block, compiler, desc); break; + case 0x4f: generate_subs(block, compiler, desc); break; + case 0x50: generate_addc(block, compiler, desc); break; + case 0x51: generate_addc(block, compiler, desc); break; + case 0x52: generate_addc(block, compiler, desc); break; + case 0x53: generate_addc(block, compiler, desc); break; + case 0x54: generate_and(block, compiler, desc); break; + case 0x55: generate_and(block, compiler, desc); break; + case 0x56: generate_and(block, compiler, desc); break; + case 0x57: generate_and(block, compiler, desc); break; + case 0x58: generate_neg(block, compiler, desc); break; + case 0x59: generate_neg(block, compiler, desc); break; + case 0x5a: generate_neg(block, compiler, desc); break; + case 0x5b: generate_neg(block, compiler, desc); break; + case 0x5c: generate_negs(block, compiler, desc); break; + case 0x5d: generate_negs(block, compiler, desc); break; + case 0x5e: generate_negs(block, compiler, desc); break; + case 0x5f: generate_negs(block, compiler, desc); break; + case 0x60: generate_cmpi(block, compiler, desc); break; + case 0x61: generate_cmpi(block, compiler, desc); break; + case 0x62: generate_cmpi(block, compiler, desc); break; + case 0x63: generate_cmpi(block, compiler, desc); break; + case 0x64: label = generate_movi(block, compiler, desc); break; + case 0x65: label = generate_movi(block, compiler, desc); break; + case 0x66: label = generate_movi(block, compiler, desc); break; + case 0x67: label = generate_movi(block, compiler, desc); break; + case 0x68: generate_addi(block, compiler, desc); break; + case 0x69: generate_addi(block, compiler, desc); break; + case 0x6a: generate_addi(block, compiler, desc); break; + case 0x6b: generate_addi(block, compiler, desc); break; + case 0x6c: generate_addsi(block, compiler, desc); break; + case 0x6d: generate_addsi(block, compiler, desc); break; + case 0x6e: generate_addsi(block, compiler, desc); break; + case 0x6f: generate_addsi(block, compiler, desc); break; + case 0x70: generate_cmpbi(block, compiler, desc); break; + case 0x71: generate_cmpbi(block, compiler, desc); break; + case 0x72: generate_cmpbi(block, compiler, desc); break; + case 0x73: generate_cmpbi(block, compiler, desc); break; + case 0x74: generate_andni(block, compiler, desc); break; + case 0x75: generate_andni(block, compiler, desc); break; + case 0x76: generate_andni(block, compiler, desc); break; + case 0x77: generate_andni(block, compiler, desc); break; + case 0x78: generate_ori(block, compiler, desc); break; + case 0x79: generate_ori(block, compiler, desc); break; + case 0x7a: generate_ori(block, compiler, desc); break; + case 0x7b: generate_ori(block, compiler, desc); break; + case 0x7c: generate_xori(block, compiler, desc); break; + case 0x7d: generate_xori(block, compiler, desc); break; + case 0x7e: generate_xori(block, compiler, desc); break; + case 0x7f: generate_xori(block, compiler, desc); break; + case 0x80: generate_shrdi(block, compiler, desc); break; + case 0x81: generate_shrdi(block, compiler, desc); break; + case 0x82: generate_shrd(block, compiler, desc); break; + case 0x83: generate_shr(block, compiler, desc); break; + case 0x84: generate_sardi(block, compiler, desc); break; + case 0x85: generate_sardi(block, compiler, desc); break; + case 0x86: generate_sard(block, compiler, desc); break; + case 0x87: generate_sar(block, compiler, desc); break; + case 0x88: generate_shldi(block, compiler, desc); break; + case 0x89: generate_shldi(block, compiler, desc); break; + case 0x8a: generate_shld(block, compiler, desc); break; + case 0x8b: generate_shl(block, compiler, desc); break; + case 0x8c: generate_reserved(block, compiler, desc); break; + case 0x8d: generate_reserved(block, compiler, desc); break; + case 0x8e: generate_testlz(block, compiler, desc); break; + case 0x8f: generate_rol(block, compiler, desc); break; + case 0x90: generate_ldxx1(block, compiler, desc); break; + case 0x91: generate_ldxx1(block, compiler, desc); break; + case 0x92: generate_ldxx1(block, compiler, desc); break; + case 0x93: generate_ldxx1(block, compiler, desc); break; + case 0x94: generate_ldxx2(block, compiler, desc); break; + case 0x95: generate_ldxx2(block, compiler, desc); break; + case 0x96: generate_ldxx2(block, compiler, desc); break; + case 0x97: generate_ldxx2(block, compiler, desc); break; + case 0x98: generate_stxx1(block, compiler, desc); break; + case 0x99: generate_stxx1(block, compiler, desc); break; + case 0x9a: generate_stxx1(block, compiler, desc); break; + case 0x9b: generate_stxx1(block, compiler, desc); break; + case 0x9c: generate_stxx2(block, compiler, desc); break; + case 0x9d: generate_stxx2(block, compiler, desc); break; + case 0x9e: generate_stxx2(block, compiler, desc); break; + case 0x9f: generate_stxx2(block, compiler, desc); break; + case 0xa0: generate_shri(block, compiler, desc); break; + case 0xa1: generate_shri(block, compiler, desc); break; + case 0xa2: generate_shri(block, compiler, desc); break; + case 0xa3: generate_shri(block, compiler, desc); break; + case 0xa4: generate_sari(block, compiler, desc); break; + case 0xa5: generate_sari(block, compiler, desc); break; + case 0xa6: generate_sari(block, compiler, desc); break; + case 0xa7: generate_sari(block, compiler, desc); break; + case 0xa8: generate_shli(block, compiler, desc); break; + case 0xa9: generate_shli(block, compiler, desc); break; + case 0xaa: generate_shli(block, compiler, desc); break; + case 0xab: generate_shli(block, compiler, desc); break; + case 0xac: generate_reserved(block, compiler, desc); break; + case 0xad: generate_reserved(block, compiler, desc); break; + case 0xae: generate_reserved(block, compiler, desc); break; + case 0xaf: generate_reserved(block, compiler, desc); break; + case 0xb0: generate_mulsu(block, compiler, desc); break; + case 0xb1: generate_mulsu(block, compiler, desc); break; + case 0xb2: generate_mulsu(block, compiler, desc); break; + case 0xb3: generate_mulsu(block, compiler, desc); break; + case 0xb4: generate_mulsu(block, compiler, desc); break; + case 0xb5: generate_mulsu(block, compiler, desc); break; + case 0xb6: generate_mulsu(block, compiler, desc); break; + case 0xb7: generate_mulsu(block, compiler, desc); break; + case 0xb8: generate_set(block, compiler, desc); break; + case 0xb9: generate_set(block, compiler, desc); break; + case 0xba: generate_set(block, compiler, desc); break; + case 0xbb: generate_set(block, compiler, desc); break; + case 0xbc: generate_mul(block, compiler, desc); break; + case 0xbd: generate_mul(block, compiler, desc); break; + case 0xbe: generate_mul(block, compiler, desc); break; + case 0xbf: generate_mul(block, compiler, desc); break; + case 0xc0: generate_software(block, compiler, desc); break; // fadd + case 0xc1: generate_software(block, compiler, desc); break; // faddd + case 0xc2: generate_software(block, compiler, desc); break; // fsub + case 0xc3: generate_software(block, compiler, desc); break; // fsubd + case 0xc4: generate_software(block, compiler, desc); break; // fmul + case 0xc5: generate_software(block, compiler, desc); break; // fmuld + case 0xc6: generate_software(block, compiler, desc); break; // fdiv + case 0xc7: generate_software(block, compiler, desc); break; // fdivd + case 0xc8: generate_software(block, compiler, desc); break; // fcmp + case 0xc9: generate_software(block, compiler, desc); break; // fcmpd + case 0xca: generate_software(block, compiler, desc); break; // fcmpu + case 0xcb: generate_software(block, compiler, desc); break; // fcmpud + case 0xcc: generate_software(block, compiler, desc); break; // fcvt + case 0xcd: generate_software(block, compiler, desc); break; // fcvtd + case 0xce: generate_extend(block, compiler, desc); break; + case 0xcf: generate_do(block, compiler, desc); break; + case 0xd0: generate_ldwr(block, compiler, desc); break; + case 0xd1: generate_ldwr(block, compiler, desc); break; + case 0xd2: generate_lddr(block, compiler, desc); break; + case 0xd3: generate_lddr(block, compiler, desc); break; + case 0xd4: generate_ldwp(block, compiler, desc); break; + case 0xd5: generate_ldwp(block, compiler, desc); break; + case 0xd6: generate_lddp(block, compiler, desc); break; + case 0xd7: generate_lddp(block, compiler, desc); break; + case 0xd8: generate_stwr(block, compiler, desc); break; + case 0xd9: generate_stwr(block, compiler, desc); break; + case 0xda: generate_stdr(block, compiler, desc); break; + case 0xdb: generate_stdr(block, compiler, desc); break; + case 0xdc: generate_stwp(block, compiler, desc); break; + case 0xdd: generate_stwp(block, compiler, desc); break; + case 0xde: generate_stdp(block, compiler, desc); break; + case 0xdf: generate_stdp(block, compiler, desc); break; + case 0xe0: generate_db(block, compiler, desc); break; + case 0xe1: generate_db(block, compiler, desc); break; + case 0xe2: generate_db(block, compiler, desc); break; + case 0xe3: generate_db(block, compiler, desc); break; + case 0xe4: generate_db(block, compiler, desc); break; + case 0xe5: generate_db(block, compiler, desc); break; + case 0xe6: generate_db(block, compiler, desc); break; + case 0xe7: generate_db(block, compiler, desc); break; + case 0xe8: generate_db(block, compiler, desc); break; + case 0xe9: generate_db(block, compiler, desc); break; + case 0xea: generate_db(block, compiler, desc); break; + case 0xeb: generate_db(block, compiler, desc); break; + case 0xec: generate_dbr(block, compiler, desc); break; + case 0xed: generate_frame(block, compiler, desc); break; + case 0xee: generate_call_global(block, compiler, desc); break; + case 0xef: generate_call_local(block, compiler, desc); break; + case 0xf0: generate_b(block, compiler, desc); break; + case 0xf1: generate_b(block, compiler, desc); break; + case 0xf2: generate_b(block, compiler, desc); break; + case 0xf3: generate_b(block, compiler, desc); break; + case 0xf4: generate_b(block, compiler, desc); break; + case 0xf5: generate_b(block, compiler, desc); break; + case 0xf6: generate_b(block, compiler, desc); break; + case 0xf7: generate_b(block, compiler, desc); break; + case 0xf8: generate_b(block, compiler, desc); break; + case 0xf9: generate_b(block, compiler, desc); break; + case 0xfa: generate_b(block, compiler, desc); break; + case 0xfb: generate_b(block, compiler, desc); break; + case 0xfc: generate_br(block, compiler, desc); break; + case 0xfd: generate_trap_op(block, compiler, desc); break; + case 0xfe: generate_trap_op(block, compiler, desc); break; + case 0xff: generate_trap_op(block, compiler, desc); break; } + + UML_AND(block, DRC_SR, DRC_SR, ~ILC_MASK); + UML_OR(block, DRC_SR, DRC_SR, mem(&m_instruction_length)); + + int done; + UML_AND(block, I0, DRC_SR, (T_MASK | P_MASK)); + UML_CMP(block, I0, (T_MASK | P_MASK)); + UML_JMPc(block, uml::COND_NE, done = label++); + UML_TEST(block, mem(&m_delay_slot), 1); + UML_EXHc(block, uml::COND_E, *m_exception[EXCEPTION_TRACE], 0); + + UML_LABEL(block, done); return true; } \ No newline at end of file diff --git a/src/devices/cpu/e132xs/e132xsdrc_ops.cpp b/src/devices/cpu/e132xs/e132xsdrc_ops.cpp deleted file mode 100644 index 7c421f5af7a..00000000000 --- a/src/devices/cpu/e132xs/e132xsdrc_ops.cpp +++ /dev/null @@ -1,1035 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz - -#include "e132xs.h" - -void hyperstone_device::generate_op00(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op01(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op02(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op03(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op04(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op05(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op06(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op07(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op08(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op09(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op0a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op0b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op0c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op0d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op0e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op0f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op10(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op11(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op12(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op13(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op14(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op15(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op16(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op17(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op18(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op19(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op1a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op1b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op1c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op1d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op1e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op1f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op20(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op21(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op22(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op23(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op24(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op25(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op26(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op27(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op28(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op29(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op2a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op2b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op2c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op2d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op2e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op2f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op30(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op31(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op32(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op33(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op34(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op35(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op36(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op37(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op38(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op39(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op3a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op3b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op3c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op3d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op3e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op3f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op40(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op41(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op42(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op43(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op44(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op45(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op46(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op47(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op48(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op49(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op4a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op4b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op4c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op4d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op4e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op4f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op50(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op51(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op52(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op53(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op54(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op55(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op56(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op57(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op58(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op59(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op5a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op5b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op5c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op5d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op5e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op5f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op60(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op61(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op62(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op63(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op64(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op65(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op66(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op67(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op68(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op69(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op6a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op6b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op6c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op6d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op6e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op6f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op70(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op71(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op72(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op73(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op74(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op75(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op76(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op77(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op78(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op79(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op7a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op7b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op7c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op7d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op7e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op7f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op80(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op81(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op82(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op83(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op84(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op85(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op86(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op87(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op88(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op89(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op8a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op8b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op8e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op8f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_op90(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op91(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op92(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op93(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op94(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op95(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op96(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op97(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op98(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op99(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op9a(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op9b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op9c(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op9d(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op9e(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_op9f(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_opa0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opa9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opaa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opab(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - - -void hyperstone_device::generate_opb0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opb9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opba(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opbb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opbc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opbd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opbe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opbf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_opc0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opc9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opca(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opcb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opcc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opcd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opce(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opcf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_opd0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opd9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opda(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opdb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opdc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opdd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opde(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opdf(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_ope0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_ope9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opea(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opeb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opec(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_oped(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opee(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opef(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - - - -void hyperstone_device::generate_opf0(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf3(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf4(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf5(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf6(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf7(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf8(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opf9(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opfa(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opfb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opfc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opfd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opfe(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} - -void hyperstone_device::generate_opff(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ -} diff --git a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx new file mode 100644 index 00000000000..4da04f7588d --- /dev/null +++ b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx @@ -0,0 +1,575 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz + +#include "e132xs.h" + +void hyperstone_device::generate_check_delay_pc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ + /* if PC is used in a delay instruction, the delayed PC should be used */ + UML_TEST(block, mem(&m_delay_slot), 1); + UML_MOVc(block, COND_E, mem(m_global_regs), mem(&m_delay_pc)); + UML_MOVc(block, COND_E, mem(&m_delay_slot), 0); +} + +void hyperstone_device::generate_decode_const(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +int hyperstone_device::generate_decode_immediate_s(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ + static int32_t immediate_values[16] = + { + 16, 0, 0, 0, 32, 64, 128, int32_t(0x80000000), + -8, -7, -6, -5, -4, -3, -2, -1 + }; + + int label = 1; + int nolut, done, zero_or_one, three; + + UML_AND(block, I1, I0, 0x0f); + UML_CMP(block, I1, 4); + UML_JMPc(block, COND_L, nolut = label++); + + // 4..f, immediate lookup + UML_LOAD(block, I1, (void *)immediate_values, I1, SIZE_DWORD, SCALE_x4); + UML_JMP(block, done = label++); + + UML_LABEL(block, nolut); + UML_CMP(block, I1, 2); + UML_JMPc(block, COND_L, zero_or_one = label++); + UML_JMPc(block, COND_G, three = label++); + + // 2 + UML_MOV(block, mem(&m_instruction_length), (2<<19)); + UML_READ(block, I1, mem(m_global_regs), SIZE_WORD, SPACE_PROGRAM); + UML_JMP(block, done); + + // 0..1 + UML_LABEL(block, zero_or_one); + UML_TEST(block, I1, 1); + UML_MOVc(block, COND_E, I1, 16); // 0 + UML_JMPc(block, COND_E, done); // if 0, we exit here. if 1, we fall through. + + // 1 + UML_MOV(block, mem(&m_instruction_length), (3<<19)); + UML_READ(block, I1, mem(m_global_regs), SIZE_WORD, SPACE_PROGRAM); + UML_SHL(block, I1, I1, 16); + UML_ADD(block, mem(m_global_regs), mem(m_global_regs), 2); + UML_READ(block, I2, mem(m_global_regs), SIZE_WORD, SPACE_PROGRAM); + UML_ADD(block, mem(m_global_regs), mem(m_global_regs), 2); + UML_JMP(block, done); + + // 3 + UML_LABEL(block, three); + UML_MOV(block, mem(&m_instruction_length), (2<<19)); + UML_READ(block, I1, mem(m_global_regs), SIZE_WORD, SPACE_PROGRAM); + UML_SEXT(block, I1, I1, SIZE_WORD); + // fall through to done + + UML_LABEL(block, done); + return label; +} + +void hyperstone_device::generate_ignore_immediate_s(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_decode_pcrel(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_ignore_pcrel(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +int hyperstone_device::generate_set_global_register(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, int label) +{ + // Expects register index in I0, value in I1 + return label; +} + +void hyperstone_device::generate_trap(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr) +{ +} + +void hyperstone_device::generate_int(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr) +{ +} + +void hyperstone_device::generate_exception(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr) +{ +} + +void hyperstone_device::generate_software(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_chk(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_movd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_divsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_xm(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_mask(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_sum(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_sums(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_cmp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_mov(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_add(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_adds(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_cmpb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_subc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_sub(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_subs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_addc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_neg(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_negs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_and(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_andn(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_or(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_xor(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_not(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_cmpi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +int hyperstone_device::generate_movi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ + int label = 1; + if (IMM_LONG) + { + label = generate_decode_immediate_s(block, compiler, desc); // I1 <-- imm32 + } + else + { + UML_AND(block, I1, I0, 0xf); + } + + int done = label++; + if (DST_GLOBAL) + { + UML_AND(block, I2, mem(&m_global_regs[1]), H_MASK); + UML_TEST(block, mem(&m_global_regs[1]), S_MASK); + UML_EXHc(block, uml::COND_Z, *m_exception[EXCEPTION_PRIVILEGE_ERROR], 0); + UML_JMPc(block, uml::COND_Z, done); + } + + UML_AND(block, DRC_SR, DRC_SR, ~(Z_MASK | N_MASK)); + + int no_z; + UML_TEST(block, I1, ~0); + UML_JMPc(block, uml::COND_NZ, no_z = label++); + UML_OR(block, DRC_SR, DRC_SR, Z_MASK); + UML_LABEL(block, no_z); + + int no_n; + UML_TEST(block, I1, 0x80000000); + UML_JMPc(block, uml::COND_Z, no_n = label++); + UML_OR(block, DRC_SR, DRC_SR, N_MASK); + UML_LABEL(block, no_n); + +#if MISSIONCRAFT_FLAGS + UML_AND(block, DRC_SR, DRC_SR, ~V_MASK); +#endif + + UML_ROLAND(block, I0, I0, 30, 0x3c); + + if (DST_GLOBAL) + { + int no_pc; + UML_TEST(block, I0, 0xf0); + UML_JMPc(block, uml::COND_NZ, no_pc = label++); + UML_AND(block, mem(m_global_regs), I1, ~1); + UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); + generate_delay_slot_and_branch(block, compiler, desc); + UML_JMP(block, done); + + UML_LABEL(block, no_pc); + + // TODO + UML_JMP(block, done); + } + else + { + UML_ROLAND(block, I2, DRC_SR, 7, 0x7f); + UML_ADD(block, I0, I0, I2); + UML_AND(block, I0, I0, 0x3f); + UML_STORE(block, (void *)m_local_regs, I0, I1, SIZE_DWORD, SCALE_x4); + } + + UML_LABEL(block, done); + return label; +} + + +template +void hyperstone_device::generate_addi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_addsi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_cmpbi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_andni(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_ori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_xori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_shrdi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_shrd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_shr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_shri(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_sardi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_sard(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_sar(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_sari(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_shldi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_shld(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_shl(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_shli(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_testlz(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_rol(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_ldxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_ldxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_stxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_stxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_mulsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_mul(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_set(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_ldwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_lddr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_ldwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_lddp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_stwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_stdr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_stwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_stdp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_br(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +template +void hyperstone_device::generate_db(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_dbr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_frame(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_call_global(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_call_local(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_trap_op(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_extend(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + + +void hyperstone_device::generate_reserved(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + +void hyperstone_device::generate_do(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) +{ +} + diff --git a/src/devices/cpu/e132xs/e132xsfe.cpp b/src/devices/cpu/e132xs/e132xsfe.cpp index b0ece09d68f..c13e72f8e89 100644 --- a/src/devices/cpu/e132xs/e132xsfe.cpp +++ b/src/devices/cpu/e132xs/e132xsfe.cpp @@ -10,6 +10,7 @@ #include "emu.h" #include "e132xsfe.h" +#include "32xsdefs.h" #define FE_FP ((m_cpu->m_global_regs[1] & 0xfe000000) >> 25) #define FE_FL (m_cpu->m_fl_lut[((m_cpu->m_global_regs[1] >> 21) & 0xf)]) @@ -69,6 +70,30 @@ inline uint32_t e132xs_frontend::read_ldstxx_imm(opcode_desc &desc) return extra_s; } +inline uint32_t e132xs_frontend::read_limm(opcode_desc &desc, uint16_t op) +{ + static const int32_t immediate_values[16] = + { + 16, 0, 0, 0, 32, 64, 128, int32_t(0x80000000), + -8, -7, -6, -5, -4, -3, -2, -1 + }; + + uint8_t nybble = op & 0xf; + switch (nybble) + { + case 0: + return 16; + case 1: + return (read_imm1(desc) << 16) | read_imm2(desc); + case 2: + return read_imm1(desc); + case 3: + return 0xffff0000 | read_imm1(desc); + default: + return immediate_values[nybble]; + } +} + inline int32_t e132xs_frontend::decode_pcrel(opcode_desc &desc, uint16_t op) { if (op & 0x80) @@ -119,7 +144,7 @@ inline int32_t e132xs_frontend::decode_call(opcode_desc &desc) bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) { - uint16_t op = read_word(desc); + uint16_t op = desc.opptr.w[0] = read_word(desc); /* most instructions are 2 bytes and a single cycle */ desc.length = 2; @@ -326,6 +351,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + if (op & 0x4 && gsrc_code != SR_REGISTER) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x19: // sum global,local case 0x1d: // sums global,local @@ -334,6 +360,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + if (op & 0x4) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x1a: // sum local,global case 0x1e: // sums local,global @@ -342,6 +369,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[ldst_group] |= 1 << ldst_code; desc.regout[0] |= SR_CODE; desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + if (op & 0x4 && gsrc_code != SR_REGISTER) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x1b: // sum local,local case 0x1f: // sums local,local @@ -350,6 +378,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[ldst_group] |= 1 << ldst_code; desc.regout[0] |= SR_CODE; desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + if (op & 0x4) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x20: // cmp global,global case 0x30: // cmpb global,global @@ -384,12 +413,14 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regin[0] |= 1 << (gsrc_code + 16); desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x25: // mov global,local desc.regin[0] |= SR_CODE; desc.regin[lsrc_group] |= 1 << lsrc_code; desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x26: // mov local,global desc.regin[0] |= SR_CODE; @@ -549,24 +580,28 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regin[0] |= 1 << gsrc_code; desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x5d: // negs global,local desc.regin[0] |= SR_CODE; desc.regin[lsrc_group] |= 1 << lsrc_code; desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x5e: // negs local,global desc.regin[0] |= SR_CODE; desc.regin[0] |= 1 << gsrc_code; desc.regout[ldst_group] |= 1 << ldst_code; desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x5f: // negs local,local desc.regin[0] |= SR_CODE; desc.regin[lsrc_group] |= 1 << lsrc_code; desc.regout[ldst_group] |= 1 << ldst_code; desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; break; case 0x60: // cmpi global,simm case 0x70: // cmpbi global,simm @@ -597,6 +632,12 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= 1 << (gdst_code + 16); desc.regout[0] |= SR_CODE; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + if (gdst_code == PC_REGISTER) + { + desc.targetpc = op & 0xf; + desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; + } break; case 0x65: // movi global,limm desc.regin[0] |= SR_CODE; @@ -604,6 +645,12 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[0] |= 1 << (gdst_code + 16); desc.regout[0] |= SR_CODE; desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; + desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; + if (gdst_code == PC_REGISTER) + { + desc.targetpc = read_limm(desc, op); + desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; + } break; case 0x66: // movi local,simm desc.regin[0] |= SR_CODE; diff --git a/src/devices/cpu/e132xs/e132xsfe.h b/src/devices/cpu/e132xs/e132xsfe.h index 1d42177110a..1cac61a08cd 100644 --- a/src/devices/cpu/e132xs/e132xsfe.h +++ b/src/devices/cpu/e132xs/e132xsfe.h @@ -23,6 +23,7 @@ private: inline uint16_t read_imm1(opcode_desc &desc); inline uint16_t read_imm2(opcode_desc &desc); inline uint32_t read_ldstxx_imm(opcode_desc &desc); + inline uint32_t read_limm(opcode_desc &desc, uint16_t op); inline int32_t decode_pcrel(opcode_desc &desc, uint16_t op); inline int32_t decode_call(opcode_desc &desc); diff --git a/src/devices/cpu/e132xs/e132xsop.hxx b/src/devices/cpu/e132xs/e132xsop.hxx index e9290ea4ab1..22b39a70818 100644 --- a/src/devices/cpu/e132xs/e132xsop.hxx +++ b/src/devices/cpu/e132xs/e132xsop.hxx @@ -277,10 +277,12 @@ void hyperstone_device::hyperstone_sums() const int32_t sreg = int32_t(SRC_GLOBAL ? ((src_code == SR_REGISTER) ? GET_C : m_global_regs[src_code]) : m_local_regs[src_code]); const int64_t tmp = int64_t(sreg) + int64_t(extra_s); + + SR &= ~(Z_MASK | N_MASK | V_MASK); SR |= ((sreg ^ tmp) & (extra_s ^ tmp) & 0x80000000) >> 28; //#if SETCARRYS -// CHECK_C(tmp); +// SR |= (tmp & 0x100000000) >> 32; //#endif const int32_t res = sreg + extra_s; @@ -318,15 +320,14 @@ void hyperstone_device::hyperstone_cmp() SR &= ~(Z_MASK | N_MASK | V_MASK | C_MASK); SR |= ((tmp ^ dreg) & (dreg ^ sreg) & 0x80000000) >> 28; - if (dreg == sreg) + if (dreg < sreg) + SR |= C_MASK; + else if (dreg == sreg) SR |= Z_MASK; if (int32_t(dreg) < int32_t(sreg)) SR |= N_MASK; - if (dreg < sreg) - SR |= C_MASK; - m_icount -= m_clock_cycles_1; } @@ -425,7 +426,7 @@ void hyperstone_device::hyperstone_adds() SR |= ((sreg ^ tmp) & (dreg ^ tmp) & 0x80000000) >> 28; //#if SETCARRYS -// CHECK_C(tmp); +// SR |= (tmp & 0x100000000) >> 32; //#endif const int32_t res = sreg + dreg; @@ -655,7 +656,7 @@ void hyperstone_device::hyperstone_subs() SR &= ~(V_MASK | Z_MASK | N_MASK); //#ifdef SETCARRYS -// CHECK_C(tmp); +// SR |= (tmp & 0x100000000) >> 32; //#endif SR |= ((tmp ^ dreg) & (dreg ^ sreg) & 0x80000000) >> 28; @@ -700,13 +701,13 @@ void hyperstone_device::hyperstone_addc() if (SRC_GLOBAL && (src_code == SR_REGISTER)) { tmp = uint64_t(dreg) + uint64_t(c); - SR |= ((dreg ^ tmp) & (c ^ tmp) & 0x80000000) >> 28; + SR |= ((dreg ^ tmp) & tmp & 0x80000000) >> 28; dreg += c; } else { tmp = uint64_t(sreg) + uint64_t(dreg) + uint64_t(c); - SR |= ((sreg ^ tmp) & (dreg ^ tmp) & (c ^ tmp) & 0x80000000) >> 28; + SR |= ((sreg ^ tmp) & (dreg ^ tmp) & tmp & 0x80000000) >> 28; dreg += sreg + c; } @@ -792,7 +793,7 @@ void hyperstone_device::hyperstone_negs() SR |= V_MASK; //#if SETCARRYS -// CHECK_C(tmp); +// SR |= (tmp & 0x100000000) >> 32; //#endif const int32_t res = -sreg; @@ -824,7 +825,7 @@ void hyperstone_device::hyperstone_cmpi() check_delay_PC(); if (!IMM_LONG) - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; const uint32_t dst_code = DST_GLOBAL ? DST_CODE : ((DST_CODE + GET_FP) & 0x3f); const uint32_t dreg = (DST_GLOBAL ? m_global_regs : m_local_regs)[dst_code]; @@ -833,15 +834,14 @@ void hyperstone_device::hyperstone_cmpi() uint64_t tmp = (uint64_t)dreg - (uint64_t)imm; SR |= ((tmp ^ dreg) & (dreg ^ imm) & 0x80000000) >> 28; - if (dreg == imm) + if (dreg < imm) + SR |= C_MASK; + else if (dreg == imm) SR |= Z_MASK; if ((int32_t)dreg < (int32_t)imm) SR |= N_MASK; - if (dreg < imm) - SR |= C_MASK; - m_icount -= m_clock_cycles_1; } @@ -854,7 +854,7 @@ void hyperstone_device::hyperstone_movi() check_delay_PC(); if (!IMM_LONG) - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; const bool h = (SR & H_MASK) != 0; if (DST_GLOBAL && h && !(SR & S_MASK)) @@ -903,7 +903,7 @@ void hyperstone_device::hyperstone_addi() if (!N_OP_MASK) imm = GET_C & (((SR & Z_MASK) ? 0 : 1) | (dreg & 0x01)); else if (!IMM_LONG) - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; SR &= ~(C_MASK | V_MASK | Z_MASK | N_MASK); @@ -952,7 +952,7 @@ void hyperstone_device::hyperstone_addsi() } else { - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; } } else @@ -971,7 +971,7 @@ void hyperstone_device::hyperstone_addsi() SR |= ((imm ^ tmp) & (dreg ^ tmp) & 0x80000000) >> 28; //#if SETCARRYS -// CHECK_C(tmp); +// SR |= (tmp & 0x100000000) >> 32; //#endif const int32_t res = imm + (int32_t)dreg; @@ -1023,7 +1023,7 @@ void hyperstone_device::hyperstone_cmpbi() } else { - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; } } @@ -1060,7 +1060,7 @@ void hyperstone_device::hyperstone_andni() if (N_OP_MASK == 0x10f) imm = 0x7fffffff; // bit 31 = 0, others = 1 else if (!IMM_LONG) - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; uint32_t dreg; if (DST_GLOBAL) @@ -1100,7 +1100,7 @@ void hyperstone_device::hyperstone_ori() check_delay_PC(); if (!IMM_LONG) - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; uint32_t dreg; if (DST_GLOBAL) { @@ -1138,7 +1138,7 @@ void hyperstone_device::hyperstone_xori() check_delay_PC(); if (!IMM_LONG) - imm = immediate_values[m_op & 0x0f]; + imm = m_op & 0x0f; uint32_t dreg; if (DST_GLOBAL) { @@ -2535,7 +2535,7 @@ void hyperstone_device::hyperstone_lddr() } template -void hyperstone_device::hypesrtone_ldwp() +void hyperstone_device::hyperstone_ldwp() { check_delay_PC(); @@ -2677,7 +2677,7 @@ void hyperstone_device::hyperstone_db() { const int32_t offset = decode_pcrel(); check_delay_PC(); - m_delay_slot = true; + m_delay_slot = 1; m_delay_pc = PC + offset; m_intblock = 3; } @@ -2698,7 +2698,7 @@ void hyperstone_device::hyperstone_db() { const int32_t offset = decode_pcrel(); check_delay_PC(); - m_delay_slot = true; + m_delay_slot = 1; m_delay_pc = PC + offset; m_intblock = 3; } @@ -2712,7 +2712,7 @@ void hyperstone_device::hyperstone_dbr() const int32_t offset = decode_pcrel(); check_delay_PC(); - m_delay_slot = true; + m_delay_slot = 1; m_delay_pc = PC + offset; m_intblock = 3; } @@ -2885,7 +2885,7 @@ void hyperstone_device::hyperstone_b() { if (SR & condition_masks[CONDITION]) { - execute_br(); + hyperstone_br(); } else { @@ -2904,7 +2904,7 @@ void hyperstone_device::hyperstone_b() } else { - execute_br(); + hyperstone_br(); } } } -- cgit v1.2.3-70-g09d2 From ad9b6fe4e53fcf7037463500e42a4a458c9e670f Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Wed, 6 Dec 2017 18:58:55 +0700 Subject: dp8510: new device An implementation of the National Semiconductor DP8510 BITBLT Processing Unit. This is used on the InterPro GT family graphics boards, and this implementation seems to be correct enough to enable me to progress there, hence the PR. While I'd love to have another system to test against, I'm not aware of any other systems that ever used this device other than some NatSemi reference designs, which are not (yet) in MAME. --- scripts/src/video.lua | 12 +++ scripts/target/mame/mess.lua | 1 + src/devices/video/dp8510.cpp | 211 +++++++++++++++++++++++++++++++++++++++++++ src/devices/video/dp8510.h | 88 ++++++++++++++++++ 4 files changed, 312 insertions(+) create mode 100644 src/devices/video/dp8510.cpp create mode 100644 src/devices/video/dp8510.h (limited to 'scripts/src') diff --git a/scripts/src/video.lua b/scripts/src/video.lua index 59ed7ef18f8..035717a2da1 100644 --- a/scripts/src/video.lua +++ b/scripts/src/video.lua @@ -1033,3 +1033,15 @@ if (VIDEOS["I4100"]~=null) then MAME_DIR .. "src/devices/video/imagetek_i4100.h", } end + +-------------------------------------------------- +-- +--@src/devices/video/dp8510.h,VIDEOS["DP8510"] = true +-------------------------------------------------- + +if (VIDEOS["DP8510"]~=null) then + files { + MAME_DIR .. "src/devices/video/dp8510.cpp", + MAME_DIR .. "src/devices/video/dp8510.h", + } +end diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 3814eb5d019..65c89bc15ce 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -353,6 +353,7 @@ VIDEOS["GB_LCD"] = true VIDEOS["GBA_LCD"] = true VIDEOS["MGA2064W"] = true VIDEOS["PPU2C0X"] = true +VIDEOS["DP8510"] = true -------------------------------------------------- -- specify available machine cores diff --git a/src/devices/video/dp8510.cpp b/src/devices/video/dp8510.cpp new file mode 100644 index 00000000000..d0e64deb307 --- /dev/null +++ b/src/devices/video/dp8510.cpp @@ -0,0 +1,211 @@ +// license:BSD-3-Clause +// copyright-holders:Patrick Mackinlay + +/* + * An implementation of the National Semiconductor DP8510 BITBLT Processing Unit. + * + * This device is designed to perform shifting, masking and logic operations on + * source and destination video memory data values. The device relies on + * external logic to drive the system video memory, and to control input lines + * on the device to enable it to read or write its inputs and outputs on the + * data bus. The device has a 16 bit data bus, as well as a 16 slot internal + * fifo, which enables it to work with up to 16 words containing 16 bits of + * pixel data at a time. The expected design was that a single BPU would handle + * each video bitplane, with multiple devices being used in parallel to handle + * multiple planes. + * + * This device is used in the InterPro GT family graphics, which do not make + * use of the line drawing mode, and is therefore currently unimplemented. + * + * Reference: http://bitsavers.org/components/national/_dataBooks/1988_National_Graphics_Handbook.pdf + * + * TODO + * - line drawing mode + */ + +#include "emu.h" +#include "dp8510.h" + +#define VERBOSE 0 +#include "logmacro.h" + +DEFINE_DEVICE_TYPE(DP8510, dp8510_device, "dp8510", "National Semiconductor BITBLT Processing Unit") + +const char *const dp8510_device::BITBLT_OP[] = { + "0", "~s & ~d", "~s & d", "~s", "s & ~d", "~d", "s ^ d", "~s | ~d", + "s & d", "~s ^ ~d", "d", "~s | d", "s", "s | ~d", "s | d", "1" +}; + +dp8510_device::dp8510_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, DP8510, tag, owner, clock) + , m_line_drawing(CLEAR_LINE) + , m_barrel_input_select(CLEAR_LINE) + , m_pixel_data_input(CLEAR_LINE) + , m_data_output_select(CLEAR_LINE) + , m_left_mask(CLEAR_LINE) + , m_right_mask(CLEAR_LINE) +{ +} + +void dp8510_device::device_start() +{ + // input lines + save_item(NAME(m_line_drawing)); + save_item(NAME(m_barrel_input_select)); + save_item(NAME(m_pixel_data_input)); + save_item(NAME(m_data_output_select)); + save_item(NAME(m_left_mask)); + save_item(NAME(m_right_mask)); + + // registers and latches + save_item(NAME(m_control)); + save_item(NAME(m_barrel_input_latch)); + save_item(NAME(m_logic_output)); + save_item(NAME(m_fifo_output_latch)); + + // fifo + save_item(NAME(m_fifo[FIFO_SIZE])); + save_item(NAME(m_fifo_head)); + save_item(NAME(m_fifo_tail)); + + // helper internal state + save_item(NAME(m_f0)); + save_item(NAME(m_f1)); + save_item(NAME(m_f2)); + save_item(NAME(m_f3)); +} + +void dp8510_device::device_reset() +{ + m_fifo_head = 0; + m_fifo_tail = 0; +} + +void dp8510_device::control_w(const u16 data) +{ + LOG("control_w function select %d shift number %d left mask %d right mask %d (%s)\n", + (data & CONTROL_FS) >> 12, + (data & CONTROL_SN) >> 8, + (data & CONTROL_LM) >> 4, + (data & CONTROL_RM) >> 0, + machine().describe_context()); + + m_control = data; + + // expand function select bits to 16 bit size for convenience + m_f0 = (data & FS_0) ? ~u16(0) : 0; + m_f1 = (data & FS_1) ? ~u16(0) : 0; + m_f2 = (data & FS_2) ? ~u16(0) : 0; + m_f3 = (data & FS_3) ? ~u16(0) : 0; +} + +void dp8510_device::source_w(const u16 data, const bool fifo_write) +{ + if (fifo_write) + { + // execute barrel shift + const u8 shift_amount = (m_control & CONTROL_SN) >> 8; + const u16 shift_result = m_barrel_input_select + ? (data << shift_amount) | (m_barrel_input_latch >> (16 - shift_amount)) + : (m_barrel_input_latch << shift_amount) | (data >> (16 - shift_amount)); + + LOG("source_w 0x%04x shifted data 0x%04x written to fifo\n", data, shift_result); + + // write result to fifo + fifo_w(shift_result); + } + else + LOG("source_w barrel input latch 0x%04x\n", data); + + // save data in input latch + m_barrel_input_latch = data; +} + +u16 dp8510_device::logic_unit(const u16 src, const u16 dst) const +{ + // compute logic unit result + const u16 result = + (m_f3 & src & dst) + + (m_f2 & src & ~dst) + + (m_f1 & ~src & dst) + + (m_f0 & ~src & ~dst); + + LOG("logic_unit operation %s source 0x%04x destination 0x%04x result 0x%04x\n", + BITBLT_OP[(m_control & CONTROL_FS) >> 12], src, dst, result); + + return result; +} + +void dp8510_device::destination_w(const u16 data, const bool fifo_write) +{ + // fetch the source from the pixel data input or fifo + const u16 source = m_line_drawing ? m_pixel_data_input ? 0xffff : 0 : m_fifo_output_latch = fifo_r(); + + // compute the result + u16 result = logic_unit(source, data); + + // apply left mask + if (m_left_mask) + { + const u16 left_mask = 0xffffU >> ((m_control & CONTROL_LM) >> 4); + if (left_mask != 0xffff) + LOG("destination_w left mask 0x%04x applied\n", left_mask); + + result = (result & left_mask) | (data & ~left_mask); + } + + // apply right mask + if (m_right_mask) + { + const u16 right_mask = s16(0x8000) >> (m_control & CONTROL_RM); + if (right_mask != 0xffff) + LOG("destination_w right mask 0x%04x applied\n", right_mask); + + result = (result & right_mask) | (data & ~right_mask); + } + + // latch output + m_logic_output = result; + + // write the result back to the fifo + if (fifo_write) + { + LOG("destination_w masked data 0x%04x written to fifo\n", m_logic_output); + fifo_w(m_logic_output); + } + else + LOG("destination_w masked data 0x%04x latched\n", m_logic_output); +} + +u16 dp8510_device::output_r() const +{ + // return output from fifo or logic unit + if (m_data_output_select) + return m_fifo_output_latch; + else + return m_logic_output; +} + +u8 dp8510_device::pixel_r(const offs_t pixel_address) const +{ + return (m_logic_output >> (~pixel_address & 0xf)) & 0x1; +} + +u16 dp8510_device::fifo_r() +{ + const u16 data = m_fifo[m_fifo_head++]; + + m_fifo_head %= FIFO_SIZE; + + return data; +} + +void dp8510_device::fifo_w(const u16 data) +{ + m_fifo[m_fifo_tail++] = data; + + m_fifo_tail %= FIFO_SIZE; + + if (m_fifo_tail == m_fifo_head) + logerror("fifo_w warning fifo full (%s)\n", machine().describe_context()); +} diff --git a/src/devices/video/dp8510.h b/src/devices/video/dp8510.h new file mode 100644 index 00000000000..946dd0d8c15 --- /dev/null +++ b/src/devices/video/dp8510.h @@ -0,0 +1,88 @@ +// license:BSD-3-Clause +// copyright-holders:Patrick Mackinlay +#ifndef MAME_VIDEO_DP8510_H +#define MAME_VIDEO_DP8510_H + +#pragma once + +#include "video/dp8510.h" + +class dp8510_device : public device_t +{ +public: + dp8510_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + static const char *const BITBLT_OP[]; + static const int FIFO_SIZE = 16; + + DECLARE_WRITE_LINE_MEMBER(line_drawing) { m_line_drawing = state; } + DECLARE_WRITE_LINE_MEMBER(barrel_input_select) { m_barrel_input_select = state; } + DECLARE_WRITE_LINE_MEMBER(pixel_data_input) { m_pixel_data_input = state; } + DECLARE_WRITE_LINE_MEMBER(data_output_select) { m_data_output_select = state; } + DECLARE_WRITE_LINE_MEMBER(left_mask_enable) { m_left_mask = state; } + DECLARE_WRITE_LINE_MEMBER(right_mask_enable) { m_right_mask = state; } + + enum control_mask : u16 + { + CONTROL_RM = 0x000f, // right mask + CONTROL_LM = 0x00f0, // left mask + CONTROL_SN = 0x0f00, // shift number + CONTROL_FS = 0xf000 // function select + }; + + enum control_fs_mask : u16 + { + FS_0 = 0x1000, + FS_1 = 0x2000, + FS_2 = 0x4000, + FS_3 = 0x8000 + }; + + void control_w(const u16 data); + + void source_w(const u16 data, const bool fifo_write = true); + void destination_w(const u16 data, const bool fifo_write = false); + + u16 output_r() const; + u8 pixel_r(const offs_t pixel_address) const; + +protected: + virtual void device_start() override; + virtual void device_reset() override; + + u16 logic_unit(const u16 src, const u16 dst) const; + + u16 fifo_r(); + void fifo_w(const u16 data); + +private: + // input lines + int m_line_drawing; + int m_barrel_input_select; + int m_pixel_data_input; + int m_data_output_select; + int m_left_mask; + int m_right_mask; + + // registers and latches + u16 m_control; + u16 m_barrel_input_latch; + u16 m_logic_output; + u16 m_fifo_output_latch; + + // fifo + u16 m_fifo[FIFO_SIZE]; + u8 m_fifo_head; + u8 m_fifo_tail; + + // helper internal state + u16 m_f0; + u16 m_f1; + u16 m_f2; + u16 m_f3; +}; + +// device type definition +DECLARE_DEVICE_TYPE(DP8510, dp8510_device) + +#endif // MAME_VIDEO_DP8510_H -- cgit v1.2.3-70-g09d2 From 5d51e9110027e4aff1f9d3f109cee4278a0847e8 Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Wed, 6 Dec 2017 21:51:16 +0100 Subject: no help = no hyperstone drc, nw --- scripts/src/cpu.lua | 6 +- src/devices/cpu/e132xs/e132xs.cpp | 77 - src/devices/cpu/e132xs/e132xs.h | 179 --- src/devices/cpu/e132xs/e132xsdrc.cpp | 983 ------------ src/devices/cpu/e132xs/e132xsdrc_ops.hxx | 2438 ------------------------------ src/devices/cpu/e132xs/e132xsfe.cpp | 1303 ---------------- src/devices/cpu/e132xs/e132xsfe.h | 34 - 7 files changed, 1 insertion(+), 5019 deletions(-) delete mode 100644 src/devices/cpu/e132xs/e132xsdrc.cpp delete mode 100644 src/devices/cpu/e132xs/e132xsdrc_ops.hxx delete mode 100644 src/devices/cpu/e132xs/e132xsfe.cpp delete mode 100644 src/devices/cpu/e132xs/e132xsfe.h (limited to 'scripts/src') diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index 69d70d8b237..97c0ee7e384 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -13,7 +13,7 @@ -- Dynamic recompiler objects -------------------------------------------------- -if (CPUS["SH"]~=null or CPUS["MIPS"]~=null or CPUS["POWERPC"]~=null or CPUS["RSP"]~=null or CPUS["ARM7"]~=null or CPUS["ADSP21062"]~=null or CPUS["MB86235"]~=null or CPUS["E1"]~=null) then +if (CPUS["SH"]~=null or CPUS["MIPS"]~=null or CPUS["POWERPC"]~=null or CPUS["RSP"]~=null or CPUS["ARM7"]~=null or CPUS["ADSP21062"]~=null or CPUS["MB86235"]~=null) then files { MAME_DIR .. "src/devices/cpu/drcbec.cpp", MAME_DIR .. "src/devices/cpu/drcbec.h", @@ -808,10 +808,6 @@ if (CPUS["E1"]~=null) then files { MAME_DIR .. "src/devices/cpu/e132xs/e132xs.cpp", MAME_DIR .. "src/devices/cpu/e132xs/e132xs.h", - MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.cpp", - MAME_DIR .. "src/devices/cpu/e132xs/e132xsfe.h", - MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc.cpp", - MAME_DIR .. "src/devices/cpu/e132xs/e132xsdrc_ops.hxx", MAME_DIR .. "src/devices/cpu/e132xs/32xsdefs.h", MAME_DIR .. "src/devices/cpu/e132xs/e132xsop.hxx", } diff --git a/src/devices/cpu/e132xs/e132xs.cpp b/src/devices/cpu/e132xs/e132xs.cpp index 7f3d8c2efcc..3793e351b73 100644 --- a/src/devices/cpu/e132xs/e132xs.cpp +++ b/src/devices/cpu/e132xs/e132xs.cpp @@ -144,7 +144,6 @@ #include "emu.h" #include "e132xs.h" -#include "e132xsfe.h" #include "debugger.h" @@ -153,9 +152,6 @@ //#define VERBOSE 1 #include "logmacro.h" -/* size of the execution code cache */ -#define CACHE_SIZE (32 * 1024 * 1024) - //************************************************************************** // INTERNAL ADDRESS MAP //************************************************************************** @@ -203,27 +199,6 @@ hyperstone_device::hyperstone_device(const machine_config &mconfig, const char * , m_program_config("program", ENDIANNESS_BIG, prg_data_width, 32, 0, internal_map) , m_io_config("io", ENDIANNESS_BIG, io_data_width, 15) , m_icount(0) - , m_cache(CACHE_SIZE + sizeof(hyperstone_device)) - , m_drcuml(nullptr) - , m_drcfe(nullptr) - , m_drcoptions(0) - , m_cache_dirty(0) - , m_entry(nullptr) - , m_nocode(nullptr) - , m_out_of_cycles(nullptr) - , m_drc_arg0(0) - , m_drc_arg1(0) - , m_drc_arg2(0) - , m_drc_arg3(0) - , m_mem_read8(nullptr) - , m_mem_write8(nullptr) - , m_mem_read16(nullptr) - , m_mem_write16(nullptr) - , m_mem_read32(nullptr) - , m_mem_write32(nullptr) - , m_io_read32(nullptr) - , m_io_write32(nullptr) - , m_enable_drc(false) { } @@ -1017,12 +992,6 @@ void hyperstone_device::device_start() void hyperstone_device::init(int scale_mask) { -#if ENABLE_E132XS_DRC - m_enable_drc = allow_drc(); -#else - m_enable_drc = false; -#endif - memset(m_global_regs, 0, sizeof(uint32_t) * 32); memset(m_local_regs, 0, sizeof(uint32_t) * 64); m_op = 0; @@ -1057,38 +1026,6 @@ void hyperstone_device::init(int scale_mask) m_fl_lut[i] = (i ? i : 16); } - uint32_t umlflags = 0; - m_drcuml = std::make_unique(*this, m_cache, umlflags, 1, 32, 1); - - // add UML symbols- - m_drcuml->symbol_add(&m_global_regs[0], sizeof(uint32_t), "pc"); - m_drcuml->symbol_add(&m_global_regs[1], sizeof(uint32_t), "sr"); - m_drcuml->symbol_add(&m_icount, sizeof(m_icount), "icount"); - - char buf[4]; - for (int i=0; i < 32; i++) - { - sprintf(buf, "g%d", i); - m_drcuml->symbol_add(&m_global_regs[i], sizeof(uint32_t), buf); - } - - for (int i=0; i < 64; i++) - { - sprintf(buf, "l%d", i); - m_drcuml->symbol_add(&m_local_regs[i], sizeof(uint32_t), buf); - } - - m_drcuml->symbol_add(&m_drc_arg0, sizeof(uint32_t), "arg0"); - m_drcuml->symbol_add(&m_drc_arg1, sizeof(uint32_t), "arg1"); - m_drcuml->symbol_add(&m_drc_arg2, sizeof(uint32_t), "arg2"); - m_drcuml->symbol_add(&m_drc_arg3, sizeof(uint32_t), "arg3"); - - /* initialize the front-end helper */ - m_drcfe = std::make_unique(this, COMPILE_BACKWARDS_BYTES, COMPILE_FORWARDS_BYTES, SINGLE_INSTRUCTION_MODE ? 1 : COMPILE_MAX_SEQUENCE); - - /* mark the cache dirty so it is updated on next execute */ - m_cache_dirty = true; - // register our state for the debugger state_add(STATE_GENPC, "GENPC", m_global_regs[0]).noshow(); state_add(STATE_GENPCBASE, "CURPC", m_global_regs[0]).noshow(); @@ -1347,14 +1284,6 @@ void hyperstone_device::device_reset() void hyperstone_device::device_stop() { - if (m_drcfe != nullptr) - { - m_drcfe = nullptr; - } - if (m_drcuml != nullptr) - { - m_drcuml = nullptr; - } } @@ -1521,12 +1450,6 @@ void hyperstone_device::hyperstone_do() void hyperstone_device::execute_run() { - if (m_enable_drc) - { - execute_run_drc(); - return; - } - if (m_intblock < 0) m_intblock = 0; diff --git a/src/devices/cpu/e132xs/e132xs.h b/src/devices/cpu/e132xs/e132xs.h index 73e2fe74e77..4ccc09de6ff 100644 --- a/src/devices/cpu/e132xs/e132xs.h +++ b/src/devices/cpu/e132xs/e132xs.h @@ -5,9 +5,6 @@ #pragma once -#include "cpu/drcfe.h" -#include "cpu/drcuml.h" -#include "cpu/drcumlsh.h" #include "32xsdasm.h" /* @@ -26,32 +23,6 @@ -/*************************************************************************** - CONSTANTS -***************************************************************************/ - -/* map variables */ -#define MAPVAR_PC M0 -#define MAPVAR_CYCLES M1 - -/* compilation boundaries -- how far back/forward does the analysis extend? */ -#define COMPILE_BACKWARDS_BYTES 128 -#define COMPILE_FORWARDS_BYTES 512 -#define COMPILE_MAX_INSTRUCTIONS ((COMPILE_BACKWARDS_BYTES/4) + (COMPILE_FORWARDS_BYTES/4)) -#define COMPILE_MAX_SEQUENCE 64 - -/* exit codes */ -#define EXECUTE_OUT_OF_CYCLES 0 -#define EXECUTE_MISSING_CODE 1 -#define EXECUTE_UNMAPPED_CODE 2 -#define EXECUTE_RESET_CACHE 3 - -#define E132XS_STRICT_VERIFY 0x0001 /* verify all instructions */ - -#define SINGLE_INSTRUCTION_MODE (1) - -#define ENABLE_E132XS_DRC (0) - //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -374,156 +345,6 @@ private: void hyperstone_reserved(); void hyperstone_do(); - - drc_cache m_cache; - std::unique_ptr m_drcuml; - std::unique_ptr m_drcfe; - uint32_t m_drcoptions; - uint8_t m_cache_dirty; - - uml::parameter m_regmap[16]; - - uml::code_handle *m_entry; - uml::code_handle *m_nocode; - uml::code_handle *m_out_of_cycles; - - uint32_t m_drc_arg0; - uint32_t m_drc_arg1; - uint32_t m_drc_arg2; - uint32_t m_drc_arg3; - uint32_t m_branch_dest; - - uml::code_handle *m_mem_read8; - uml::code_handle *m_mem_write8; - uml::code_handle *m_mem_read16; - uml::code_handle *m_mem_write16; - uml::code_handle *m_mem_read32; - uml::code_handle *m_mem_write32; - uml::code_handle *m_io_read32; - uml::code_handle *m_io_write32; - uml::code_handle *m_exception[EXCEPTION_COUNT]; - - bool m_enable_drc; - - /* internal compiler state */ - struct compiler_state - { - uint32_t m_cycles; /* accumulated cycles */ - uint8_t m_checkints; /* need to check interrupts before next instruction */ - uml::code_label m_labelnum; /* index for local labels */ - }; - - void execute_run_drc(); - void flush_drc_cache(); - void code_flush_cache(); - void code_compile_block(offs_t pc); - //void load_fast_iregs(drcuml_block *block); - //void save_fast_iregs(drcuml_block *block); - void static_generate_entry_point(); - void static_generate_nocode_handler(); - void static_generate_out_of_cycles(); - void static_generate_exception(uint32_t exception, const char *name); - void static_generate_memory_accessor(int size, int iswrite, bool isio, const char *name, uml::code_handle *&handleptr); - void generate_delay_slot_and_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param); - void generate_checksum_block(drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast); - void generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void log_add_disasm_comment(drcuml_block *block, uint32_t pc, uint32_t op); - bool generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - void generate_get_trap_addr(drcuml_block *block, uml::code_label &label, uint32_t trapno); - void generate_check_delay_pc(drcuml_block *block); - void generate_decode_const(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_decode_immediate_s(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_ignore_immediate_s(drcuml_block *block, const opcode_desc *desc); - void generate_decode_pcrel(drcuml_block *block, const opcode_desc *desc); - void generate_ignore_pcrel(drcuml_block *block, const opcode_desc *desc); - - void generate_set_global_register(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - void generate_trap(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr); - void generate_int(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr); - void generate_exception(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr); - void generate_software(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - template void generate_chk(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_movd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_divsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_xm(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_mask(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_sum(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_sums(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_cmp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_mov(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_add(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_adds(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_cmpb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_subc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_sub(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_subs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_addc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_neg(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_negs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_and(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_andn(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_or(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_xor(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_not(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_cmpi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_movi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_addi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_addsi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_cmpbi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_andni(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_ori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_xori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_shrdi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_shrd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_shr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_shri(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_sardi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_sard(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_sar(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_sari(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_shldi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_shld(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_shl(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_shli(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_testlz(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_rol(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_ldxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_ldxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_stxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_stxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - template void generate_mulsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_mul(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - template void generate_set(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - template void generate_ldwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_lddr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_ldwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_lddp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - template void generate_stwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_stdr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_stwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_stdp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - template void generate_b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_br(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_db(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_dbr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - void generate_frame(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - template void generate_call(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - void generate_trap_op(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_extend(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - - void generate_reserved(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); - void generate_do(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); }; // device type definition diff --git a/src/devices/cpu/e132xs/e132xsdrc.cpp b/src/devices/cpu/e132xs/e132xsdrc.cpp deleted file mode 100644 index 8f0d44fad1d..00000000000 --- a/src/devices/cpu/e132xs/e132xsdrc.cpp +++ /dev/null @@ -1,983 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz - -#include "emu.h" -#include "e132xs.h" -#include "e132xsfe.h" -#include "32xsdefs.h" - -using namespace uml; - -#define DRC_PC mem(m_global_regs) -#define DRC_SR mem(&m_global_regs[1]) - -void hyperstone_device::execute_run_drc() -{ - drcuml_state *drcuml = m_drcuml.get(); - int execute_result; - - /* reset the cache if dirty */ - if (m_cache_dirty) - { - code_flush_cache(); - m_cache_dirty = false; - } - - - /* execute */ - do - { - /* run as much as we can */ - execute_result = drcuml->execute(*m_entry); - - /* if we need to recompile, do it */ - if (execute_result == EXECUTE_MISSING_CODE) - { - code_compile_block(m_global_regs[0]); - } - else if (execute_result == EXECUTE_UNMAPPED_CODE) - { - fatalerror("Attempted to execute unmapped code at PC=%08X\n", m_global_regs[0]); - } - else if (execute_result == EXECUTE_RESET_CACHE) - { - code_flush_cache(); - } - } while (execute_result != EXECUTE_OUT_OF_CYCLES); -} - - -/*************************************************************************** - C FUNCTION CALLBACKS -***************************************************************************/ - -/*------------------------------------------------- - cfunc_unimplemented - handler for - unimplemented opcdes --------------------------------------------------*/ - -inline void hyperstone_device::ccfunc_unimplemented() -{ - fatalerror("PC=%08X: Unimplemented op %08X\n", PC, m_drc_arg0); -} - -inline void hyperstone_device::ccfunc_print() -{ - printf("%c: %08X\n", (char)m_drc_arg0, m_drc_arg1); -} - -static void cfunc_unimplemented(void *param) -{ - ((hyperstone_device *)param)->ccfunc_unimplemented(); -} - -static void cfunc_adjust_timer_interrupt(void *param) -{ - ((hyperstone_device *)param)->adjust_timer_interrupt(); -} - -static void cfunc_compute_tr(void *param) -{ - ((hyperstone_device *)param)->compute_tr(); -} - -static void cfunc_update_timer_prescale(void *param) -{ - ((hyperstone_device *)param)->update_timer_prescale(); -} - -#if 0 -static void cfunc_print(void *param) -{ - ((hyperstone_device *)param)->ccfunc_print(); -} -#endif - -/*------------------------------------------------- - ccfunc_total_cycles - compute the total number - of cycles executed so far --------------------------------------------------*/ - -void hyperstone_device::ccfunc_total_cycles() -{ - m_numcycles = total_cycles(); -} - -static void cfunc_total_cycles(void *param) -{ - ((hyperstone_device *)param)->ccfunc_total_cycles(); -} - -/*************************************************************************** - CACHE MANAGEMENT -***************************************************************************/ - -/*------------------------------------------------- - flush_drc_cache - outward-facing accessor to - code_flush_cache --------------------------------------------------*/ - -void hyperstone_device::flush_drc_cache() -{ - if (!m_enable_drc) - return; - m_cache_dirty = true; -} - -/*------------------------------------------------- - code_flush_cache - flush the cache and - regenerate static code --------------------------------------------------*/ - -void hyperstone_device::code_flush_cache() -{ - /* empty the transient cache contents */ - m_drcuml->reset(); - - try - { - /* generate the entry point and out-of-cycles handlers */ - static_generate_entry_point(); - static_generate_nocode_handler(); - static_generate_out_of_cycles(); - - static_generate_exception(EXCEPTION_IO2, "io2"); - static_generate_exception(EXCEPTION_IO1, "io1"); - static_generate_exception(EXCEPTION_INT4, "int4"); - static_generate_exception(EXCEPTION_INT3, "int3"); - static_generate_exception(EXCEPTION_INT2, "int2"); - static_generate_exception(EXCEPTION_INT1, "int1"); - static_generate_exception(EXCEPTION_IO3, "io3"); - static_generate_exception(EXCEPTION_TIMER, "timer"); - static_generate_exception(EXCEPTION_RESERVED1, "reserved1"); - static_generate_exception(EXCEPTION_TRACE, "trace"); - static_generate_exception(EXCEPTION_PARITY_ERROR, "parity_error"); - static_generate_exception(EXCEPTION_EXTENDED_OVERFLOW, "extended_overflow"); - static_generate_exception(EXCEPTION_RANGE_ERROR, "range_error"); - static_generate_exception(EXCEPTION_RESERVED2, "reserved2"); - static_generate_exception(EXCEPTION_RESET, "reset"); - static_generate_exception(EXCEPTION_ERROR_ENTRY, "error_entry"); - - /* add subroutines for memory accesses */ - static_generate_memory_accessor(1, false, false, "read8", m_mem_read8); - static_generate_memory_accessor(1, true, false, "write8", m_mem_write8); - static_generate_memory_accessor(2, false, false, "read16", m_mem_read16); - static_generate_memory_accessor(2, true, false, "write16", m_mem_write16); - static_generate_memory_accessor(4, false, false, "read32", m_mem_read32); - static_generate_memory_accessor(4, true, false, "write32", m_mem_write32); - static_generate_memory_accessor(4, false, true, "ioread32", m_io_read32); - static_generate_memory_accessor(4, true, true, "iowrite32", m_io_write32); - } - - catch (drcuml_block::abort_compilation &) - { - fatalerror("Unable to generate static E132XS code\n"); fflush(stdout); - } -} - -/* Return the entry point for a determinated trap */ -void hyperstone_device::generate_get_trap_addr(drcuml_block *block, uml::code_label &label, uint32_t trapno) -{ - int no_mem3; - UML_MOV(block, I0, trapno); - UML_CMP(block, mem(&m_trap_entry), 0xffffff00); - UML_JMPc(block, uml::COND_NE, no_mem3 = label++); - UML_SUB(block, I0, 63, I0); - - UML_LABEL(block, no_mem3); - UML_SHL(block, I0, I0, 2); - UML_OR(block, I0, I0, mem(&m_trap_entry)); -} - -/*------------------------------------------------- - code_compile_block - compile a block of the - given mode at the specified pc --------------------------------------------------*/ - -void hyperstone_device::code_compile_block(offs_t pc) -{ - drcuml_state *drcuml = m_drcuml.get(); - compiler_state compiler = { 0 }; - const opcode_desc *seqhead, *seqlast; - const opcode_desc *desclist; - int override = false; - drcuml_block *block; - - g_profiler.start(PROFILER_DRC_COMPILE); - - /* get a description of this sequence */ - desclist = m_drcfe->describe_code(pc); - - bool succeeded = false; - while (!succeeded) - { - try - { - /* start the block */ - block = drcuml->begin_block(4096); - - /* loop until we get through all instruction sequences */ - for (seqhead = desclist; seqhead != nullptr; seqhead = seqlast->next()) - { - const opcode_desc *curdesc; - uint32_t nextpc; - - /* add a code log entry */ - if (drcuml->logging()) - block->append_comment("-------------------------"); - - /* determine the last instruction in this sequence */ - for (seqlast = seqhead; seqlast != nullptr; seqlast = seqlast->next()) - if (seqlast->flags & OPFLAG_END_SEQUENCE) - break; - assert(seqlast != nullptr); - - /* if we don't have a hash for this mode/pc, or if we are overriding all, add one */ - if (override || !drcuml->hash_exists(0, seqhead->pc)) - UML_HASH(block, 0, seqhead->pc); - - /* if we already have a hash, and this is the first sequence, assume that we */ - /* are recompiling due to being out of sync and allow future overrides */ - else if (seqhead == desclist) - { - override = true; - UML_HASH(block, 0, seqhead->pc); - } - - /* otherwise, redispatch to that fixed PC and skip the rest of the processing */ - else - { - UML_LABEL(block, seqhead->pc | 0x80000000); - UML_HASHJMP(block, 0, seqhead->pc, *m_nocode); - continue; - } - - /* validate this code block if we're not pointing into ROM */ - if (m_program->get_write_ptr(seqhead->physpc) != nullptr) - generate_checksum_block(block, &compiler, seqhead, seqlast); - - /* label this instruction, if it may be jumped to locally */ - if (seqhead->flags & OPFLAG_IS_BRANCH_TARGET) - UML_LABEL(block, seqhead->pc | 0x80000000); - - /* iterate over instructions in the sequence and compile them */ - for (curdesc = seqhead; curdesc != seqlast->next(); curdesc = curdesc->next()) - { - generate_sequence_instruction(block, &compiler, curdesc); - } - - /* if we need to return to the start, do it */ - if (seqlast->flags & OPFLAG_RETURN_TO_START) - nextpc = pc; - - /* otherwise we just go to the next instruction */ - else - { - nextpc = seqlast->pc + seqlast->length; - } - - /* count off cycles and go there */ - generate_update_cycles(block, &compiler, nextpc); // - - /* if the last instruction can change modes, use a variable mode; otherwise, assume the same mode */ - if (seqlast->next() == nullptr || seqlast->next()->pc != nextpc) - { - UML_HASHJMP(block, 0, nextpc, *m_nocode); // hashjmp ,nextpc,nocode - } - } - - /* end the sequence */ - block->end(); - g_profiler.stop(); - succeeded = true; - } - catch (drcuml_block::abort_compilation &) - { - code_flush_cache(); - } - } -} - -/*************************************************************************** - STATIC CODEGEN -***************************************************************************/ - -/*------------------------------------------------- - epc - compute the exception PC from a - descriptor --------------------------------------------------*/ - -static inline uint32_t epc(const opcode_desc *desc) -{ - return (desc->flags & OPFLAG_IN_DELAY_SLOT) ? (desc->pc - 3) : desc->pc; -} - - -/*------------------------------------------------- - alloc_handle - allocate a handle if not - already allocated --------------------------------------------------*/ - -static inline void alloc_handle(drcuml_state *drcuml, code_handle **handleptr, const char *name) -{ - if (*handleptr == nullptr) - *handleptr = drcuml->handle_alloc(name); -} - - - -/*------------------------------------------------- - static_generate_exception - generate an - exception handler --------------------------------------------------*/ - -void hyperstone_device::static_generate_exception(uint32_t exception, const char *name) -{ - code_handle *&exception_handle = m_exception[exception]; - drcuml_state *drcuml = m_drcuml.get(); - drcuml_block *block = drcuml->begin_block(1024); - - /* add a global entry for this */ - alloc_handle(drcuml, &exception_handle, name); - UML_HANDLE(block, *exception_handle); - - uml::code_label label = 1; - generate_get_trap_addr(block, label, exception); - UML_ROLAND(block, I1, DRC_SR, 7, 0x7f); - UML_ROLAND(block, I2, DRC_SR, 11, 0xf); - UML_TEST(block, I2, 0xf); - UML_MOVc(block, uml::COND_Z, I2, 16); - UML_ADD(block, I1, I1, I2); - - UML_AND(block, DRC_SR, DRC_SR, 0xffe7ffff); - UML_OR(block, DRC_SR, DRC_SR, mem(&m_instruction_length)); - - UML_MOV(block, I4, DRC_SR); - UML_ROLINS(block, DRC_SR, 2, 21, 0x01e00000); - UML_ROLINS(block, DRC_SR, I1, 25, 0xfe000000); - - UML_AND(block, I3, I1, 0x3f); - UML_AND(block, I1, DRC_PC, ~1); - UML_ROLAND(block, I2, DRC_SR, 14, 1); - UML_OR(block, I1, I1, I2); - UML_STORE(block, (void *)m_local_regs, I3, I1, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I3, I3, 1); - UML_AND(block, I3, I3, 0x3f); - UML_STORE(block, (void *)m_local_regs, I3, I4, SIZE_DWORD, SCALE_x4); - - UML_AND(block, DRC_SR, DRC_SR, ~(M_MASK | T_MASK)); - UML_OR(block, DRC_SR, DRC_SR, (L_MASK | S_MASK)); - - UML_MOV(block, DRC_PC, I0); - UML_SUB(block, mem(&m_icount), mem(&m_icount), 2); - UML_EXHc(block, COND_S, *m_out_of_cycles, 0); - - UML_HASHJMP(block, 0, I0, *m_nocode);// hashjmp ,i0,nocode - - block->end(); -} - - - -/*------------------------------------------------- - generate_entry_point - generate a - static entry point --------------------------------------------------*/ - -void hyperstone_device::static_generate_entry_point() -{ - drcuml_state *drcuml = m_drcuml.get(); - drcuml_block *block; - - /* begin generating */ - block = drcuml->begin_block(20); - - /* forward references */ - alloc_handle(drcuml, &m_nocode, "nocode"); - - alloc_handle(drcuml, &m_entry, "entry"); - UML_HANDLE(block, *m_entry); - - /* load fast integer registers */ - //load_fast_iregs(block); - - /* generate a hash jump via the current mode and PC */ - UML_HASHJMP(block, 0, mem(&m_global_regs[0]), *m_nocode); - block->end(); -} - - -/*------------------------------------------------- - static_generate_nocode_handler - generate an - exception handler for "out of code" --------------------------------------------------*/ - -void hyperstone_device::static_generate_nocode_handler() -{ - drcuml_state *drcuml = m_drcuml.get(); - drcuml_block *block; - - /* begin generating */ - block = drcuml->begin_block(10); - - /* generate a hash jump via the current mode and PC */ - alloc_handle(drcuml, &m_nocode, "nocode"); - UML_HANDLE(block, *m_nocode); - UML_GETEXP(block, I0); - UML_MOV(block, mem(&PC), I0); - //save_fast_iregs(block); - UML_EXIT(block, EXECUTE_MISSING_CODE); - - block->end(); -} - - -/*------------------------------------------------- - static_generate_out_of_cycles - generate an - out of cycles exception handler --------------------------------------------------*/ - -void hyperstone_device::static_generate_out_of_cycles() -{ - drcuml_state *drcuml = m_drcuml.get(); - drcuml_block *block; - - /* begin generating */ - block = drcuml->begin_block(10); - - /* generate a hash jump via the current mode and PC */ - alloc_handle(drcuml, &m_out_of_cycles, "out_of_cycles"); - UML_HANDLE(block, *m_out_of_cycles); - UML_GETEXP(block, I0); - UML_MOV(block, mem(&m_global_regs[0]), I0); - //save_fast_iregs(block); - UML_EXIT(block, EXECUTE_OUT_OF_CYCLES); - - block->end(); -} - -/*------------------------------------------------------------------ - static_generate_memory_accessor -------------------------------------------------------------------*/ - -void hyperstone_device::static_generate_memory_accessor(int size, int iswrite, bool isio, const char *name, code_handle *&handleptr) -{ - /* on entry, address is in I0; data for writes is in I1 */ - /* on exit, read result is in I1 */ - /* routine trashes I0-I1 */ - drcuml_state *drcuml = m_drcuml.get(); - drcuml_block *block; - - /* begin generating */ - block = drcuml->begin_block(1024); - - /* add a global entry for this */ - alloc_handle(drcuml, &handleptr, name); - UML_HANDLE(block, *handleptr); - - // write: - switch (size) - { - case 1: - if (iswrite) - UML_WRITE(block, I0, I1, SIZE_BYTE, SPACE_PROGRAM); - else - UML_READ(block, I1, I0, SIZE_BYTE, SPACE_PROGRAM); - break; - - case 2: - if (iswrite) - UML_WRITE(block, I0, I1, SIZE_WORD, SPACE_PROGRAM); - else - UML_READ(block, I1, I0, SIZE_WORD, SPACE_PROGRAM); - break; - - case 4: - if (iswrite) - UML_WRITE(block, I0, I1, SIZE_DWORD, isio ? SPACE_IO : SPACE_PROGRAM); - else - UML_READ(block, I1, I0, SIZE_DWORD, isio ? SPACE_IO : SPACE_PROGRAM); - break; - } - UML_RET(block); - - block->end(); -} - - - -/*************************************************************************** - CODE GENERATION -***************************************************************************/ - -/*------------------------------------------------- - generate_update_cycles - generate code to - subtract cycles from the icount and generate - an exception if out --------------------------------------------------*/ - -void hyperstone_device::generate_update_cycles(drcuml_block *block, compiler_state *compiler, uml::parameter param) -{ - /* account for cycles */ - if (compiler->m_cycles > 0) - { - UML_SUB(block, mem(&m_icount), mem(&m_icount), MAPVAR_CYCLES); - UML_MAPVAR(block, MAPVAR_CYCLES, 0); - UML_EXHc(block, COND_S, *m_out_of_cycles, param); - } - compiler->m_cycles = 0; -} - -/*------------------------------------------------- - generate_checksum_block - generate code to - validate a sequence of opcodes --------------------------------------------------*/ - -void hyperstone_device::generate_checksum_block(drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast) -{ - const opcode_desc *curdesc; - if (m_drcuml->logging()) - { - block->append_comment("[Validation for %08X]", seqhead->pc); - } - /* loose verify or single instruction: just compare and fail */ - if (!(m_drcoptions & E132XS_STRICT_VERIFY) || seqhead->next() == nullptr) - { - if (!(seqhead->flags & OPFLAG_VIRTUAL_NOOP)) - { - uint32_t sum = seqhead->opptr.w[0]; - void *base = m_direct->read_ptr(seqhead->physpc); - UML_LOAD(block, I0, base, 0, SIZE_WORD, SCALE_x2); - - if (seqhead->delay.first() != nullptr && seqhead->physpc != seqhead->delay.first()->physpc) - { - base = m_direct->read_ptr(seqhead->delay.first()->physpc); - assert(base != nullptr); - UML_LOAD(block, I1, base, 0, SIZE_WORD, SCALE_x2); - UML_ADD(block, I0, I0, I1); - - sum += seqhead->delay.first()->opptr.w[0]; - } - - UML_CMP(block, I0, sum); - UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); - } - } - else /* full verification; sum up everything */ - { - void *base = m_direct->read_ptr(seqhead->physpc); - UML_LOAD(block, I0, base, 0, SIZE_WORD, SCALE_x2); - uint32_t sum = seqhead->opptr.w[0]; - for (curdesc = seqhead->next(); curdesc != seqlast->next(); curdesc = curdesc->next()) - if (!(curdesc->flags & OPFLAG_VIRTUAL_NOOP)) - { - base = m_direct->read_ptr(curdesc->physpc); - assert(base != nullptr); - UML_LOAD(block, I1, base, 0, SIZE_WORD, SCALE_x2); - UML_ADD(block, I0, I0, I1); - sum += curdesc->opptr.w[0]; - - if (curdesc->delay.first() != nullptr && (curdesc == seqlast || (curdesc->next() != nullptr && curdesc->next()->physpc != curdesc->delay.first()->physpc))) - { - base = m_direct->read_ptr(curdesc->delay.first()->physpc); - assert(base != nullptr); - UML_LOAD(block, I1, base, 0, SIZE_WORD, SCALE_x2); - UML_ADD(block, I0, I0, I1); - - sum += curdesc->delay.first()->opptr.w[0]; - } - } - UML_CMP(block, I0, sum); - UML_EXHc(block, COND_NE, *m_nocode, epc(seqhead)); - } -} - - -/*------------------------------------------------- - log_add_disasm_comment - add a comment - including disassembly of a MIPS instruction --------------------------------------------------*/ - -void hyperstone_device::log_add_disasm_comment(drcuml_block *block, uint32_t pc, uint32_t op) -{ - if (m_drcuml->logging()) - { - block->append_comment("%08X: %08x", pc, op); - } -} - - -/*------------------------------------------------------------------ - generate_delay_slot_and_branch -------------------------------------------------------------------*/ - -void hyperstone_device::generate_delay_slot_and_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - compiler_state compiler_temp = *compiler; - - /* fetch the target register if dynamic, in case it is modified by the delay slot */ - if (desc->targetpc == BRANCH_TARGET_DYNAMIC) - { - UML_MOV(block, mem(&m_branch_dest), DRC_PC); - } - - if (desc->delayslots) - { - /* compile the delay slot using temporary compiler state */ - assert(desc->delay.first() != nullptr); - generate_sequence_instruction(block, &compiler_temp, desc->delay.first()); // - UML_MOV(block, mem(&m_branch_dest), DRC_PC); - } - - /* update the cycles and jump through the hash table to the target */ - if (desc->targetpc != BRANCH_TARGET_DYNAMIC) - { - generate_update_cycles(block, &compiler_temp, desc->targetpc); - if (desc->flags & OPFLAG_INTRABLOCK_BRANCH) - UML_JMP(block, desc->targetpc | 0x80000000); - else - UML_HASHJMP(block, 0, desc->targetpc, *m_nocode); - } - else - { - generate_update_cycles(block, &compiler_temp, mem(&m_branch_dest)); - UML_HASHJMP(block, 0, mem(&m_branch_dest), *m_nocode); - } - - /* update the label */ - compiler->m_labelnum = compiler_temp.m_labelnum; - - /* reset the mapvar to the current cycles */ - UML_MAPVAR(block, MAPVAR_CYCLES, compiler->m_cycles); -} - - -/*------------------------------------------------- - generate_sequence_instruction - generate code - for a single instruction in a sequence --------------------------------------------------*/ - -void hyperstone_device::generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - offs_t expc; - - /* add an entry for the log */ - if (m_drcuml->logging() && !(desc->flags & OPFLAG_VIRTUAL_NOOP)) - log_add_disasm_comment(block, desc->pc, desc->opptr.w[0]); - - /* set the PC map variable */ - expc = (desc->flags & OPFLAG_IN_DELAY_SLOT) ? desc->pc - 3 : desc->pc; - UML_MAPVAR(block, MAPVAR_PC, expc); - - /* accumulate total cycles */ - compiler->m_cycles += desc->cycles; - - /* update the icount map variable */ - UML_MAPVAR(block, MAPVAR_CYCLES, compiler->m_cycles); - - /* if we are debugging, call the debugger */ - if ((machine().debug_flags & DEBUG_FLAG_ENABLED) != 0) - { - UML_MOV(block, DRC_PC, desc->pc); - //save_fast_iregs(block); - UML_DEBUG(block, desc->pc); - } - - if (!(desc->flags & OPFLAG_VIRTUAL_NOOP)) - { - /* compile the instruction */ - if (!generate_opcode(block, compiler, desc)) - { - UML_MOV(block, DRC_PC, desc->pc); - UML_MOV(block, mem(&m_drc_arg0), desc->opptr.w[0]); - UML_CALLC(block, cfunc_unimplemented, this); - } - } -} - -#include "e132xsdrc_ops.hxx" - -bool hyperstone_device::generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint32_t op = (uint32_t)desc->opptr.w[0]; - - UML_MOV(block, I0, op); - UML_AND(block, I7, DRC_SR, H_MASK); - UML_ADD(block, DRC_PC, DRC_PC, 2); - UML_MOV(block, mem(&m_instruction_length), (1 << 19)); - - switch (op >> 8) - { - case 0x00: generate_chk(block, compiler, desc); break; - case 0x01: generate_chk(block, compiler, desc); break; - case 0x02: generate_chk(block, compiler, desc); break; - case 0x03: generate_chk(block, compiler, desc); break; - case 0x04: generate_movd(block, compiler, desc); break; - case 0x05: generate_movd(block, compiler, desc); break; - case 0x06: generate_movd(block, compiler, desc); break; - case 0x07: generate_movd(block, compiler, desc); break; - case 0x08: generate_divsu(block, compiler, desc); break; - case 0x09: generate_divsu(block, compiler, desc); break; - case 0x0a: generate_divsu(block, compiler, desc); break; - case 0x0b: generate_divsu(block, compiler, desc); break; - case 0x0c: generate_divsu(block, compiler, desc); break; - case 0x0d: generate_divsu(block, compiler, desc); break; - case 0x0e: generate_divsu(block, compiler, desc); break; - case 0x0f: generate_divsu(block, compiler, desc); break; - case 0x10: generate_xm(block, compiler, desc); break; - case 0x11: generate_xm(block, compiler, desc); break; - case 0x12: generate_xm(block, compiler, desc); break; - case 0x13: generate_xm(block, compiler, desc); break; - case 0x14: generate_mask(block, compiler, desc); break; - case 0x15: generate_mask(block, compiler, desc); break; - case 0x16: generate_mask(block, compiler, desc); break; - case 0x17: generate_mask(block, compiler, desc); break; - case 0x18: generate_sum(block, compiler, desc); break; - case 0x19: generate_sum(block, compiler, desc); break; - case 0x1a: generate_sum(block, compiler, desc); break; - case 0x1b: generate_sum(block, compiler, desc); break; - case 0x1c: generate_sums(block, compiler, desc); break; - case 0x1d: generate_sums(block, compiler, desc); break; - case 0x1e: generate_sums(block, compiler, desc); break; - case 0x1f: generate_sums(block, compiler, desc); break; - case 0x20: generate_cmp(block, compiler, desc); break; - case 0x21: generate_cmp(block, compiler, desc); break; - case 0x22: generate_cmp(block, compiler, desc); break; - case 0x23: generate_cmp(block, compiler, desc); break; - case 0x24: generate_mov(block, compiler, desc); break; - case 0x25: generate_mov(block, compiler, desc); break; - case 0x26: generate_mov(block, compiler, desc); break; - case 0x27: generate_mov(block, compiler, desc); break; - case 0x28: generate_add(block, compiler, desc); break; - case 0x29: generate_add(block, compiler, desc); break; - case 0x2a: generate_add(block, compiler, desc); break; - case 0x2b: generate_add(block, compiler, desc); break; - case 0x2c: generate_adds(block, compiler, desc); break; - case 0x2d: generate_adds(block, compiler, desc); break; - case 0x2e: generate_adds(block, compiler, desc); break; - case 0x2f: generate_adds(block, compiler, desc); break; - case 0x30: generate_cmpb(block, compiler, desc); break; - case 0x31: generate_cmpb(block, compiler, desc); break; - case 0x32: generate_cmpb(block, compiler, desc); break; - case 0x33: generate_cmpb(block, compiler, desc); break; - case 0x34: generate_andn(block, compiler, desc); break; - case 0x35: generate_andn(block, compiler, desc); break; - case 0x36: generate_andn(block, compiler, desc); break; - case 0x37: generate_andn(block, compiler, desc); break; - case 0x38: generate_or(block, compiler, desc); break; - case 0x39: generate_or(block, compiler, desc); break; - case 0x3a: generate_or(block, compiler, desc); break; - case 0x3b: generate_or(block, compiler, desc); break; - case 0x3c: generate_xor(block, compiler, desc); break; - case 0x3d: generate_xor(block, compiler, desc); break; - case 0x3e: generate_xor(block, compiler, desc); break; - case 0x3f: generate_xor(block, compiler, desc); break; - case 0x40: generate_subc(block, compiler, desc); break; - case 0x41: generate_subc(block, compiler, desc); break; - case 0x42: generate_subc(block, compiler, desc); break; - case 0x43: generate_subc(block, compiler, desc); break; - case 0x44: generate_not(block, compiler, desc); break; - case 0x45: generate_not(block, compiler, desc); break; - case 0x46: generate_not(block, compiler, desc); break; - case 0x47: generate_not(block, compiler, desc); break; - case 0x48: generate_sub(block, compiler, desc); break; - case 0x49: generate_sub(block, compiler, desc); break; - case 0x4a: generate_sub(block, compiler, desc); break; - case 0x4b: generate_sub(block, compiler, desc); break; - case 0x4c: generate_subs(block, compiler, desc); break; - case 0x4d: generate_subs(block, compiler, desc); break; - case 0x4e: generate_subs(block, compiler, desc); break; - case 0x4f: generate_subs(block, compiler, desc); break; - case 0x50: generate_addc(block, compiler, desc); break; - case 0x51: generate_addc(block, compiler, desc); break; - case 0x52: generate_addc(block, compiler, desc); break; - case 0x53: generate_addc(block, compiler, desc); break; - case 0x54: generate_and(block, compiler, desc); break; - case 0x55: generate_and(block, compiler, desc); break; - case 0x56: generate_and(block, compiler, desc); break; - case 0x57: generate_and(block, compiler, desc); break; - case 0x58: generate_neg(block, compiler, desc); break; - case 0x59: generate_neg(block, compiler, desc); break; - case 0x5a: generate_neg(block, compiler, desc); break; - case 0x5b: generate_neg(block, compiler, desc); break; - case 0x5c: generate_negs(block, compiler, desc); break; - case 0x5d: generate_negs(block, compiler, desc); break; - case 0x5e: generate_negs(block, compiler, desc); break; - case 0x5f: generate_negs(block, compiler, desc); break; - case 0x60: generate_cmpi(block, compiler, desc); break; - case 0x61: generate_cmpi(block, compiler, desc); break; - case 0x62: generate_cmpi(block, compiler, desc); break; - case 0x63: generate_cmpi(block, compiler, desc); break; - case 0x64: generate_movi(block, compiler, desc); break; - case 0x65: generate_movi(block, compiler, desc); break; - case 0x66: generate_movi(block, compiler, desc); break; - case 0x67: generate_movi(block, compiler, desc); break; - case 0x68: generate_addi(block, compiler, desc); break; - case 0x69: generate_addi(block, compiler, desc); break; - case 0x6a: generate_addi(block, compiler, desc); break; - case 0x6b: generate_addi(block, compiler, desc); break; - case 0x6c: generate_addsi(block, compiler, desc); break; - case 0x6d: generate_addsi(block, compiler, desc); break; - case 0x6e: generate_addsi(block, compiler, desc); break; - case 0x6f: generate_addsi(block, compiler, desc); break; - case 0x70: generate_cmpbi(block, compiler, desc); break; - case 0x71: generate_cmpbi(block, compiler, desc); break; - case 0x72: generate_cmpbi(block, compiler, desc); break; - case 0x73: generate_cmpbi(block, compiler, desc); break; - case 0x74: generate_andni(block, compiler, desc); break; - case 0x75: generate_andni(block, compiler, desc); break; - case 0x76: generate_andni(block, compiler, desc); break; - case 0x77: generate_andni(block, compiler, desc); break; - case 0x78: generate_ori(block, compiler, desc); break; - case 0x79: generate_ori(block, compiler, desc); break; - case 0x7a: generate_ori(block, compiler, desc); break; - case 0x7b: generate_ori(block, compiler, desc); break; - case 0x7c: generate_xori(block, compiler, desc); break; - case 0x7d: generate_xori(block, compiler, desc); break; - case 0x7e: generate_xori(block, compiler, desc); break; - case 0x7f: generate_xori(block, compiler, desc); break; - case 0x80: generate_shrdi(block, compiler, desc); break; - case 0x81: generate_shrdi(block, compiler, desc); break; - case 0x82: generate_shrd(block, compiler, desc); break; - case 0x83: generate_shr(block, compiler, desc); break; - case 0x84: generate_sardi(block, compiler, desc); break; - case 0x85: generate_sardi(block, compiler, desc); break; - case 0x86: generate_sard(block, compiler, desc); break; - case 0x87: generate_sar(block, compiler, desc); break; - case 0x88: generate_shldi(block, compiler, desc); break; - case 0x89: generate_shldi(block, compiler, desc); break; - case 0x8a: generate_shld(block, compiler, desc); break; - case 0x8b: generate_shl(block, compiler, desc); break; - case 0x8c: generate_reserved(block, compiler, desc); break; - case 0x8d: generate_reserved(block, compiler, desc); break; - case 0x8e: generate_testlz(block, compiler, desc); break; - case 0x8f: generate_rol(block, compiler, desc); break; - case 0x90: generate_ldxx1(block, compiler, desc); break; - case 0x91: generate_ldxx1(block, compiler, desc); break; - case 0x92: generate_ldxx1(block, compiler, desc); break; - case 0x93: generate_ldxx1(block, compiler, desc); break; - case 0x94: generate_ldxx2(block, compiler, desc); break; - case 0x95: generate_ldxx2(block, compiler, desc); break; - case 0x96: generate_ldxx2(block, compiler, desc); break; - case 0x97: generate_ldxx2(block, compiler, desc); break; - case 0x98: generate_stxx1(block, compiler, desc); break; - case 0x99: generate_stxx1(block, compiler, desc); break; - case 0x9a: generate_stxx1(block, compiler, desc); break; - case 0x9b: generate_stxx1(block, compiler, desc); break; - case 0x9c: generate_stxx2(block, compiler, desc); break; - case 0x9d: generate_stxx2(block, compiler, desc); break; - case 0x9e: generate_stxx2(block, compiler, desc); break; - case 0x9f: generate_stxx2(block, compiler, desc); break; - case 0xa0: generate_shri(block, compiler, desc); break; - case 0xa1: generate_shri(block, compiler, desc); break; - case 0xa2: generate_shri(block, compiler, desc); break; - case 0xa3: generate_shri(block, compiler, desc); break; - case 0xa4: generate_sari(block, compiler, desc); break; - case 0xa5: generate_sari(block, compiler, desc); break; - case 0xa6: generate_sari(block, compiler, desc); break; - case 0xa7: generate_sari(block, compiler, desc); break; - case 0xa8: generate_shli(block, compiler, desc); break; - case 0xa9: generate_shli(block, compiler, desc); break; - case 0xaa: generate_shli(block, compiler, desc); break; - case 0xab: generate_shli(block, compiler, desc); break; - case 0xac: generate_reserved(block, compiler, desc); break; - case 0xad: generate_reserved(block, compiler, desc); break; - case 0xae: generate_reserved(block, compiler, desc); break; - case 0xaf: generate_reserved(block, compiler, desc); break; - case 0xb0: generate_mulsu(block, compiler, desc); break; - case 0xb1: generate_mulsu(block, compiler, desc); break; - case 0xb2: generate_mulsu(block, compiler, desc); break; - case 0xb3: generate_mulsu(block, compiler, desc); break; - case 0xb4: generate_mulsu(block, compiler, desc); break; - case 0xb5: generate_mulsu(block, compiler, desc); break; - case 0xb6: generate_mulsu(block, compiler, desc); break; - case 0xb7: generate_mulsu(block, compiler, desc); break; - case 0xb8: generate_set(block, compiler, desc); break; - case 0xb9: generate_set(block, compiler, desc); break; - case 0xba: generate_set(block, compiler, desc); break; - case 0xbb: generate_set(block, compiler, desc); break; - case 0xbc: generate_mul(block, compiler, desc); break; - case 0xbd: generate_mul(block, compiler, desc); break; - case 0xbe: generate_mul(block, compiler, desc); break; - case 0xbf: generate_mul(block, compiler, desc); break; - case 0xc0: generate_software(block, compiler, desc); break; // fadd - case 0xc1: generate_software(block, compiler, desc); break; // faddd - case 0xc2: generate_software(block, compiler, desc); break; // fsub - case 0xc3: generate_software(block, compiler, desc); break; // fsubd - case 0xc4: generate_software(block, compiler, desc); break; // fmul - case 0xc5: generate_software(block, compiler, desc); break; // fmuld - case 0xc6: generate_software(block, compiler, desc); break; // fdiv - case 0xc7: generate_software(block, compiler, desc); break; // fdivd - case 0xc8: generate_software(block, compiler, desc); break; // fcmp - case 0xc9: generate_software(block, compiler, desc); break; // fcmpd - case 0xca: generate_software(block, compiler, desc); break; // fcmpu - case 0xcb: generate_software(block, compiler, desc); break; // fcmpud - case 0xcc: generate_software(block, compiler, desc); break; // fcvt - case 0xcd: generate_software(block, compiler, desc); break; // fcvtd - case 0xce: generate_extend(block, compiler, desc); break; - case 0xcf: generate_do(block, compiler, desc); break; - case 0xd0: generate_ldwr(block, compiler, desc); break; - case 0xd1: generate_ldwr(block, compiler, desc); break; - case 0xd2: generate_lddr(block, compiler, desc); break; - case 0xd3: generate_lddr(block, compiler, desc); break; - case 0xd4: generate_ldwp(block, compiler, desc); break; - case 0xd5: generate_ldwp(block, compiler, desc); break; - case 0xd6: generate_lddp(block, compiler, desc); break; - case 0xd7: generate_lddp(block, compiler, desc); break; - case 0xd8: generate_stwr(block, compiler, desc); break; - case 0xd9: generate_stwr(block, compiler, desc); break; - case 0xda: generate_stdr(block, compiler, desc); break; - case 0xdb: generate_stdr(block, compiler, desc); break; - case 0xdc: generate_stwp(block, compiler, desc); break; - case 0xdd: generate_stwp(block, compiler, desc); break; - case 0xde: generate_stdp(block, compiler, desc); break; - case 0xdf: generate_stdp(block, compiler, desc); break; - case 0xe0: generate_db(block, compiler, desc); break; - case 0xe1: generate_db(block, compiler, desc); break; - case 0xe2: generate_db(block, compiler, desc); break; - case 0xe3: generate_db(block, compiler, desc); break; - case 0xe4: generate_db(block, compiler, desc); break; - case 0xe5: generate_db(block, compiler, desc); break; - case 0xe6: generate_db(block, compiler, desc); break; - case 0xe7: generate_db(block, compiler, desc); break; - case 0xe8: generate_db(block, compiler, desc); break; - case 0xe9: generate_db(block, compiler, desc); break; - case 0xea: generate_db(block, compiler, desc); break; - case 0xeb: generate_db(block, compiler, desc); break; - case 0xec: generate_dbr(block, compiler, desc); break; - case 0xed: generate_frame(block, compiler, desc); break; - case 0xee: generate_call(block, compiler, desc); break; - case 0xef: generate_call(block, compiler, desc); break; - case 0xf0: generate_b(block, compiler, desc); break; - case 0xf1: generate_b(block, compiler, desc); break; - case 0xf2: generate_b(block, compiler, desc); break; - case 0xf3: generate_b(block, compiler, desc); break; - case 0xf4: generate_b(block, compiler, desc); break; - case 0xf5: generate_b(block, compiler, desc); break; - case 0xf6: generate_b(block, compiler, desc); break; - case 0xf7: generate_b(block, compiler, desc); break; - case 0xf8: generate_b(block, compiler, desc); break; - case 0xf9: generate_b(block, compiler, desc); break; - case 0xfa: generate_b(block, compiler, desc); break; - case 0xfb: generate_b(block, compiler, desc); break; - case 0xfc: generate_br(block, compiler, desc); break; - case 0xfd: generate_trap_op(block, compiler, desc); break; - case 0xfe: generate_trap_op(block, compiler, desc); break; - case 0xff: generate_trap_op(block, compiler, desc); break; - } - - UML_AND(block, DRC_SR, DRC_SR, ~ILC_MASK); - UML_OR(block, DRC_SR, DRC_SR, mem(&m_instruction_length)); - - int done; - UML_AND(block, I0, DRC_SR, (T_MASK | P_MASK)); - UML_CMP(block, I0, (T_MASK | P_MASK)); - UML_JMPc(block, uml::COND_NE, done = compiler->m_labelnum++); - UML_TEST(block, mem(&m_delay_slot), 1); - UML_EXHc(block, uml::COND_E, *m_exception[EXCEPTION_TRACE], 0); - - UML_LABEL(block, done); - UML_XOR(block, DRC_SR, DRC_SR, I7); - - return true; -} \ No newline at end of file diff --git a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx deleted file mode 100644 index 45677280d2d..00000000000 --- a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx +++ /dev/null @@ -1,2438 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz - -#include "e132xs.h" - -constexpr uint32_t WRITE_ONLY_REGMASK = (1 << BCR_REGISTER) | (1 << TPR_REGISTER) | (1 << FCR_REGISTER) | (1 << MCR_REGISTER); - -void hyperstone_device::generate_check_delay_pc(drcuml_block *block) -{ - /* if PC is used in a delay instruction, the delayed PC should be used */ - UML_TEST(block, mem(&m_delay_slot), 1); - UML_MOVc(block, uml::COND_NZ, DRC_PC, mem(&m_delay_pc)); - UML_MOVc(block, uml::COND_NZ, mem(&m_delay_slot), 0); -} - -void hyperstone_device::generate_decode_const(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t imm_1 = READ_OP(desc->pc + 2); - - if (imm_1 & 0x8000) - { - const uint16_t imm_2 = READ_OP(desc->pc + 4); - - uint32_t imm = imm_2; - imm |= ((imm_1 & 0x3fff) << 16); - - if (imm_1 & 0x4000) - imm |= 0xc0000000; - - UML_MOV(block, mem(&m_instruction_length), (3<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 4); - UML_MOV(block, I1, imm); - } - else - { - uint32_t imm = imm_1 & 0x3fff; - - if (imm_1 & 0x4000) - imm |= 0xffffc000; - - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - UML_MOV(block, I1, imm); - } -} - -void hyperstone_device::generate_decode_immediate_s(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - - switch (op & 0xf) - { - case 0: - UML_MOV(block, I1, 16); - return; - case 1: - { - uint32_t extra_u = (READ_OP(desc->pc + 2) << 16) | READ_OP(desc->pc + 4); - UML_MOV(block, mem(&m_instruction_length), (3<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 4); - UML_MOV(block, I1, extra_u); - return; - } - case 2: - { - uint32_t extra_u = READ_OP(desc->pc + 2); - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - UML_MOV(block, I1, extra_u); - return; - } - case 3: - { - uint32_t extra_u = 0xffff0000 | READ_OP(desc->pc + 2); - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - UML_MOV(block, I1, extra_u); - return; - } - default: - UML_MOV(block, I1, s_immediate_values[op & 0xf]); - return; - } -} - -void hyperstone_device::generate_ignore_immediate_s(drcuml_block *block, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - - static const uint32_t lengths[16] = { 1<<19, 3<<19, 2<<19, 2<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19, 1<<19 }; - static const uint32_t offsets[16] = { 0, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - const uint8_t nybble = op & 0x0f; - - UML_MOV(block, mem(&m_instruction_length), lengths[nybble]); - UML_ADD(block, DRC_PC, DRC_PC, offsets[nybble]); -} - -void hyperstone_device::generate_decode_pcrel(drcuml_block *block, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - - int32_t offset; - if (op & 0x80) - { - uint16_t next = READ_OP(desc->pc + 2); - - offset = (op & 0x7f) << 16; - offset |= (next & 0xfffe); - - if (next & 1) - offset |= 0xff800000; - - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - } - else - { - offset = op & 0x7e; - - if (op & 1) - offset |= 0xffffff80; - } - - UML_MOV(block, I1, offset); -} - -void hyperstone_device::generate_ignore_pcrel(drcuml_block *block, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - - if (op & 0x80) - { - UML_ADD(block, DRC_PC, DRC_PC, 2); - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - } -} - -void hyperstone_device::generate_set_global_register(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - // Expects register index in I4, value in I5, clobbers I6 - int extended; - UML_CMP(block, I4, 16); - UML_JMPc(block, uml::COND_AE, extended = compiler->m_labelnum++); - - int generic_store, set_sr, done; - UML_CMP(block, I4, 1); - UML_JMPc(block, uml::COND_A, generic_store = compiler->m_labelnum++); - UML_JMPc(block, uml::COND_E, set_sr = compiler->m_labelnum++); - UML_AND(block, DRC_PC, I5, ~1); - generate_delay_slot_and_branch(block, compiler, desc); - UML_JMP(block, done = compiler->m_labelnum++); - - UML_LABEL(block, set_sr); - UML_ROLINS(block, DRC_SR, I5, 0, 0x0000ffff); - UML_AND(block, DRC_SR, DRC_SR, ~0x40); - UML_TEST(block, mem(&m_intblock), ~0); - UML_MOVc(block, uml::COND_Z, mem(&m_intblock), 1); - UML_JMP(block, done); - - UML_LABEL(block, generic_store); - UML_STORE(block, (void *)m_global_regs, I4, I5, SIZE_DWORD, SCALE_x4); - UML_JMP(block, done); - - int above_bcr; - UML_LABEL(block, extended); - UML_CMP(block, I4, 17); - UML_JMPc(block, uml::COND_BE, generic_store); - UML_CMP(block, I4, BCR_REGISTER); - UML_JMPc(block, uml::COND_A, above_bcr = compiler->m_labelnum++); - UML_JMPc(block, uml::COND_E, generic_store); - - // SP or UB - UML_AND(block, I5, I5, ~3); - UML_JMP(block, generic_store); - - int set_tpr, set_tcr, set_tr, set_fcr; - UML_LABEL(block, above_bcr); - UML_CMP(block, I4, TCR_REGISTER); - UML_JMPc(block, uml::COND_B, set_tpr = compiler->m_labelnum++); - UML_JMPc(block, uml::COND_E, set_tcr = compiler->m_labelnum++); - // Above TCR - UML_CMP(block, I4, WCR_REGISTER); - UML_JMPc(block, uml::COND_B, set_tr = compiler->m_labelnum++); - UML_JMPc(block, uml::COND_E, generic_store); // WCR - // Above WCR - UML_CMP(block, I4, FCR_REGISTER); - UML_JMPc(block, uml::COND_B, done); // ISR - read only - UML_JMPc(block, uml::COND_E, set_fcr = compiler->m_labelnum++); - UML_CMP(block, I4, MCR_REGISTER); - UML_JMPc(block, uml::COND_A, generic_store); // regs 28..31 - // Set MCR - UML_ROLAND(block, I6, I5, 20, 0x7); - UML_LOAD(block, I6, (void *)s_trap_entries, I6, SIZE_DWORD, SCALE_x4); - UML_MOV(block, mem(&m_trap_entry), I6); - UML_JMP(block, generic_store); - - int skip_compute_tr; - UML_LABEL(block, set_tpr); - UML_STORE(block, (void *)m_global_regs, I4, I5, SIZE_DWORD, SCALE_x4); - UML_TEST(block, I5, 0x80000000); - UML_JMPc(block, uml::COND_NZ, skip_compute_tr = compiler->m_labelnum++); - UML_CALLC(block, cfunc_compute_tr, this); - UML_CALLC(block, cfunc_update_timer_prescale, this); - UML_LABEL(block, skip_compute_tr); - UML_CALLC(block, cfunc_adjust_timer_interrupt, this); - UML_JMP(block, done); - - UML_LABEL(block, set_tcr); - UML_LOAD(block, I6, (void *)m_global_regs, I4, SIZE_DWORD, SCALE_x4); - UML_CMP(block, I6, I5); - UML_JMPc(block, uml::COND_E, done); - UML_STORE(block, (void *)m_global_regs, I4, I5, SIZE_DWORD, SCALE_x4); - UML_CALLC(block, cfunc_adjust_timer_interrupt, this); - UML_CMP(block, mem(&m_intblock), 1); - UML_MOVc(block, uml::COND_L, mem(&m_intblock), 1); - UML_JMP(block, done); - - UML_LABEL(block, set_tr); - UML_STORE(block, (void *)m_global_regs, I4, I5, SIZE_DWORD, SCALE_x4); - UML_MOV(block, mem(&m_tr_base_value), I5); - UML_CALLC(block, cfunc_total_cycles, this); - UML_DMOV(block, mem(&m_tr_base_cycles), mem(&m_numcycles)); - UML_CALLC(block, cfunc_adjust_timer_interrupt, this); - UML_JMP(block, done); - - int skip_adjust_timer; - UML_LABEL(block, set_fcr); - UML_LOAD(block, I6, (void *)m_global_regs, I4, SIZE_DWORD, SCALE_x4); - UML_XOR(block, I6, I6, I5); - UML_TEST(block, I6, 0x80000000); - UML_JMPc(block, uml::COND_Z, skip_adjust_timer = compiler->m_labelnum++); - UML_CALLC(block, cfunc_adjust_timer_interrupt, this); - UML_LABEL(block, skip_adjust_timer); - UML_STORE(block, (void *)m_global_regs, I4, I5, SIZE_DWORD, SCALE_x4); - UML_CMP(block, mem(&m_intblock), 1); - UML_MOVc(block, uml::COND_L, mem(&m_intblock), 1); - // Fall through to done - - UML_LABEL(block, done); -} - -void hyperstone_device::generate_trap(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr) -{ - printf("Unimplemented: generate_trap (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - -void hyperstone_device::generate_int(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr) -{ - printf("Unimplemented: generate_int (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - -void hyperstone_device::generate_exception(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, uint32_t addr) -{ - printf("Unimplemented: generate_exception (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - -void hyperstone_device::generate_software(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_software (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_chk(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_chk (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_movd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - generate_check_delay_pc(block); - - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t srcf_code = src_code + 1; - const uint32_t dst_code = (op & 0xf0) >> 4; - const uint32_t dstf_code = dst_code + 1; - - int done = compiler->m_labelnum++; - if (DST_GLOBAL && (dst_code == PC_REGISTER)) - { - if (SRC_GLOBAL && src_code < 2) - { - printf("Denoted PC or SR in RET instruction. PC = %08X\n", desc->pc); - return; - } - - UML_AND(block, I1, DRC_SR, (S_MASK | L_MASK)); - if (SRC_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - UML_LOAD(block, I3, (void *)m_global_regs, srcf_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I5, DRC_SR, 7, 0x7f); - UML_ADD(block, I3, I5, src_code); - UML_AND(block, I4, I3, 0x3f); - UML_LOAD(block, I2, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - - UML_ADD(block, I6, I5, srcf_code); - UML_AND(block, I5, I6, 0x3f); - UML_LOAD(block, I3, (void *)m_local_regs, I5, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, DRC_PC, I2, ~1); - - UML_AND(block, DRC_SR, I3, 0xffe3ffff); - UML_ROLINS(block, DRC_SR, I2, S_SHIFT, S_MASK); - - UML_TEST(block, mem(&m_intblock), ~0); - UML_MOVc(block, uml::COND_Z, mem(&m_intblock), 1); - - UML_MOV(block, mem(&m_instruction_length), 0); - - int no_exception; - UML_AND(block, I2, DRC_SR, (S_MASK | L_MASK)); - UML_AND(block, I3, I1, I2); - UML_TEST(block, I3, S_MASK); - UML_JMPc(block, uml::COND_NZ, no_exception = compiler->m_labelnum++); // If S is set and unchanged, there won't be an exception. - - UML_XOR(block, I3, I1, I2); - UML_AND(block, I4, I3, I2); - UML_TEST(block, I4, S_MASK); - UML_EXHc(block, uml::COND_NZ, *m_exception[EXCEPTION_PRIVILEGE_ERROR], 0); // If S is newly set, it's a privilege error. - - UML_TEST(block, I3, L_MASK); - UML_JMPc(block, uml::COND_Z, no_exception); // If L is unchanged, there won't be an exception. - UML_TEST(block, I1, L_MASK); - UML_JMPc(block, uml::COND_NZ, no_exception); // If L was previously set, there won't be an exception. - UML_TEST(block, I2, S_MASK); - UML_EXHc(block, uml::COND_Z, *m_exception[EXCEPTION_PRIVILEGE_ERROR], 0); // If L is newly set and we are not in Supervisor mode, it's a privilege error. - - int diff_in_range; - UML_LABEL(block, no_exception); - UML_MOV(block, I0, mem(&SP)); - UML_ROLAND(block, I1, I0, 30, 0x7f); - UML_ROLAND(block, I2, DRC_SR, 7, 0x7f); - UML_SUB(block, I3, I2, I1); - UML_CMP(block, I3, -64); - UML_JMPc(block, uml::COND_L, done); - UML_CMP(block, I3, 64); - UML_JMPc(block, uml::COND_L, diff_in_range = compiler->m_labelnum++); - UML_OR(block, I3, I3, 0x80); - UML_SEXT(block, I3, I3, SIZE_BYTE); - UML_LABEL(block, diff_in_range); - - int pop_next, done_ret; - UML_LABEL(block, pop_next = compiler->m_labelnum++); - UML_CMP(block, I3, 0); - UML_JMPc(block, uml::COND_GE, done_ret = compiler->m_labelnum++); - UML_SUB(block, I0, I0, 4); - UML_CALLH(block, *m_mem_read32); - UML_ROLAND(block, I2, I0, 30, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I3, I3, 1); - UML_TEST(block, I3, ~0); - UML_JMP(block, pop_next); - - UML_LABEL(block, done_ret); - generate_delay_slot_and_branch(block, compiler, desc); - } - else if (SRC_GLOBAL && (src_code == SR_REGISTER)) // Rd doesn't denote PC and Rs denotes SR - { - UML_OR(block, DRC_SR, DRC_SR, Z_MASK); - UML_AND(block, DRC_SR, DRC_SR, ~N_MASK); - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - UML_MOV(block, I5, 0); - generate_set_global_register(block, compiler, desc); - UML_MOV(block, I4, dstf_code); - UML_MOV(block, I5, 0); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I0, I0, dst_code); - UML_AND(block, I0, I0, 0x3f); - UML_STORE(block, (void *)m_local_regs, I0, 0, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I0, I0, 1); - UML_AND(block, I0, I0, 0x3f); - UML_STORE(block, (void *)m_local_regs, I0, 0, SIZE_DWORD, SCALE_x4); - } - } - else // Rd doesn't denote PC and Rs doesn't denote SR - { - if (!SRC_GLOBAL || !DST_GLOBAL) - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - } - - if (SRC_GLOBAL) - { - UML_LOAD(block, I0, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - UML_LOAD(block, I1, (void *)m_global_regs, srcf_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I0, I3, src_code); - UML_AND(block, I0, I0, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I0, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I1, I3, srcf_code); - UML_AND(block, I1, I1, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I0, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, DRC_SR, DRC_SR, ~(Z_MASK | N_MASK)); - - UML_OR(block, I2, I0, I1); - UML_TEST(block, I2, ~0); - UML_SETc(block, uml::COND_Z, I2); - UML_ROLINS(block, DRC_SR, I2, Z_SHIFT, Z_MASK); - - UML_TEST(block, I0, 0x80000000); - UML_SETc(block, uml::COND_NZ, I2); - UML_ROLINS(block, DRC_SR, I2, N_SHIFT, N_MASK); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - UML_MOV(block, I5, I0); - generate_set_global_register(block, compiler, desc); - UML_MOV(block, I4, dstf_code); - UML_MOV(block, I5, I1); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I0, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I2, I3, dstf_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - } - - UML_LABEL(block, done); -} - - -template -void hyperstone_device::generate_divsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_divsu (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_xm(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - const uint32_t next = READ_OP(desc->pc + 2); - const uint8_t sub_type = (next & 0x7000) >> 12; - - uint32_t extra_u = next & 0xfff; - if (next & 0x8000) - { - extra_u = ((extra_u & 0xfff) << 16) | READ_OP(desc->pc + 4); - UML_MOV(block, mem(&m_instruction_length), (3<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 4); - } - else - { - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - } - - UML_MOV(block, I1, extra_u); - - generate_check_delay_pc(block); - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_AND(block, I0, DRC_SR, C_MASK); - else - UML_LOAD(block, I0, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - if ((SRC_GLOBAL && (src_code == SR_REGISTER)) || (DST_GLOBAL && (dst_code < 2))) - { - return; - } - - if (sub_type < 4) - { - UML_CMP(block, I0, I1); - int skip, done; - if (SRC_GLOBAL && (src_code == PC_REGISTER)) - { - UML_JMPc(block, uml::COND_B, skip = compiler->m_labelnum++); - UML_EXH(block, *m_exception[EXCEPTION_RANGE_ERROR], 0); - UML_JMP(block, done = compiler->m_labelnum++); - } - else - { - UML_JMPc(block, uml::COND_BE, skip = compiler->m_labelnum++); - UML_EXH(block, *m_exception[EXCEPTION_RANGE_ERROR], 0); - UML_JMP(block, done = compiler->m_labelnum++); - } - - UML_LABEL(block, skip); - UML_SHL(block, I5, I0, sub_type); - - UML_LABEL(block, done); - } - else - { - UML_SHL(block, I5, I0, sub_type - 4); - } - - if (DST_GLOBAL) - { - UML_STORE(block, (void *)m_global_regs, dst_code, I5, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I6, I3, dst_code); - UML_AND(block, I4, I6, 0x3f); - UML_STORE(block, (void *)m_local_regs, I6, I5, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_mask(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - generate_decode_const(block, compiler, desc); - generate_check_delay_pc(block); - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_LOAD(block, I2, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, I1, I2, I1); - - int skip_mask; - UML_AND(block, DRC_SR, DRC_SR, ~Z_MASK); - UML_TEST(block, I1, ~0); - UML_JMPc(block, uml::COND_NZ, skip_mask = compiler->m_labelnum++); - UML_OR(block, DRC_SR, DRC_SR, Z_MASK); - UML_LABEL(block, skip_mask); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - UML_MOV(block, I5, I2); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I0, I3, dst_code); - UML_AND(block, I0, I0, 0x3f); - UML_STORE(block, (void *)m_local_regs, I0, I1, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_sum(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - generate_decode_const(block, compiler, desc); - generate_check_delay_pc(block); - - if (!SRC_GLOBAL || !DST_GLOBAL) - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - } - - if (SRC_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_LOAD(block, I2, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_DADD(block, I5, I1, I2); - - UML_AND(block, DRC_SR, DRC_SR, ~(C_MASK | V_MASK | Z_MASK | N_MASK)); - UML_DTEST(block, I5, 0x100000000U); - UML_SETc(block, uml::COND_NZ, I6); - UML_ROLINS(block, DRC_SR, I6, C_SHIFT, C_MASK); - - UML_XOR(block, I1, I5, I2); - UML_XOR(block, I6, I5, I1); - UML_AND(block, I1, I1, I6); - UML_TEST(block, I1, 0x80000000); - UML_ROLINS(block, DRC_SR, I1, 4, V_MASK); - - UML_TEST(block, I5, ~0); - UML_SETc(block, uml::COND_Z, I6); - UML_ROLINS(block, DRC_SR, I6, Z_SHIFT, Z_MASK); - - UML_ROLINS(block, DRC_SR, I5, 3, N_MASK); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I0, I3, dst_code); - UML_AND(block, I2, I0, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I5, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_sums(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_sums (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_cmp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - generate_check_delay_pc(block); - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_AND(block, I0, DRC_SR, C_MASK); - else - UML_LOAD(block, I0, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - if (DST_GLOBAL) - { - UML_LOAD(block, I1, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - UML_DSUB(block, I2, I1, I0); // tmp - - UML_AND(block, DRC_SR, DRC_SR, ~(Z_MASK | N_MASK | V_MASK | C_MASK)); - UML_XOR(block, I4, I1, I2); - UML_XOR(block, I5, I1, I0); - UML_AND(block, I6, I4, I5); - UML_ROLINS(block, DRC_SR, I6, 4, V_MASK); - - UML_CMP(block, I1, I0); - UML_SETc(block, uml::COND_B, I3); - UML_ROLINS(block, DRC_SR, I3, C_SHIFT, C_MASK); - - UML_CMP(block, I1, I0); - UML_SETc(block, uml::COND_E, I4); - UML_ROLINS(block, DRC_SR, I4, Z_SHIFT, Z_MASK); - - UML_CMP(block, I1, I0); - UML_SETc(block, uml::COND_L, I5); - UML_ROLINS(block, DRC_SR, I5, N_SHIFT, N_MASK); -} - - -template -void hyperstone_device::generate_mov(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - generate_check_delay_pc(block); - - if (DST_GLOBAL) - { - int no_exception; - UML_TEST(block, DRC_SR, H_MASK); - UML_JMPc(block, uml::COND_Z, no_exception = compiler->m_labelnum++); - UML_TEST(block, DRC_SR, S_MASK); - UML_JMPc(block, uml::COND_NZ, no_exception); - UML_EXH(block, *m_exception[EXCEPTION_PRIVILEGE_ERROR], 0); - UML_LABEL(block, no_exception); - } - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I1, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - UML_TEST(block, DRC_SR, H_MASK); - UML_MOVc(block, uml::COND_NZ, I1, 16 + src_code); - UML_MOVc(block, uml::COND_Z, I1, src_code); - UML_LOAD(block, I5, (void *)m_global_regs, I1, SIZE_DWORD, SCALE_x4); - UML_SHL(block, I2, 1, I1); - UML_TEST(block, I2, WRITE_ONLY_REGMASK); - UML_MOVc(block, uml::COND_NZ, I5, 0); - } - else - { - UML_ADD(block, I2, I1, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_LOAD(block, I5, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, DRC_SR, DRC_SR, ~(Z_MASK | N_MASK)); - UML_TEST(block, I3, ~0); - UML_SETc(block, uml::COND_Z, I2); - UML_ROLINS(block, DRC_SR, I2, Z_SHIFT, Z_MASK); - UML_ROLINS(block, DRC_SR, I5, 3, N_MASK); - - if (DST_GLOBAL) - { - UML_TEST(block, DRC_SR, H_MASK); - UML_MOVc(block, uml::COND_NZ, I4, 16 + dst_code); - UML_MOVc(block, uml::COND_Z, I4, dst_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I1, dst_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I5, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_add(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - generate_check_delay_pc(block); - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - UML_LOAD(block, I0, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - if (DST_GLOBAL) - { - UML_LOAD(block, I1, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - UML_DADD(block, I2, I0, I1); - - UML_AND(block, DRC_SR, DRC_SR, ~(C_MASK | V_MASK | Z_MASK | N_MASK)); - - UML_DTEST(block, I2, 0x100000000U); - UML_SETc(block, uml::COND_NZ, I4); - UML_ROLINS(block, DRC_SR, I4, 0, C_MASK); - - UML_XOR(block, I4, I0, I2); - UML_XOR(block, I5, I1, I2); - UML_AND(block, I6, I4, I5); - UML_ROLINS(block, DRC_SR, I6, 4, V_MASK); - - UML_ADD(block, I2, I0, I1); - - UML_TEST(block, I2, ~0); - UML_SETc(block, uml::COND_Z, I4); - UML_ROLINS(block, DRC_SR, I4, 0, Z_MASK); - UML_ROLINS(block, DRC_SR, I2, 3, N_MASK); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - UML_MOV(block, I5, I2); - generate_set_global_register(block, compiler, desc); - - if (dst_code == 0) - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - } - else - { - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I2, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_adds(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_adds (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_cmpb(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_cmpb (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_subc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_subc (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_sub(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - generate_check_delay_pc(block); - - if (!SRC_GLOBAL || !DST_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - UML_DMOV(block, I0, 0); - UML_DMOV(block, I1, 0); - - if (SRC_GLOBAL) - { - UML_LOAD(block, I0, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - if (DST_GLOBAL) - { - UML_LOAD(block, I1, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - } - - UML_DSUB(block, I2, I1, I0); - - UML_AND(block, DRC_SR, DRC_SR, ~(C_MASK | V_MASK | Z_MASK | N_MASK)); - - UML_DTEST(block, I2, 0x100000000U); - UML_SETc(block, uml::COND_NZ, I4); - UML_ROLINS(block, DRC_SR, I4, 0, C_MASK); - - UML_XOR(block, I4, I0, I2); - UML_XOR(block, I5, I1, I2); - UML_AND(block, I6, I4, I5); - UML_ROLINS(block, DRC_SR, I6, 4, V_MASK); - - UML_SUB(block, I2, I1, I0); - - UML_TEST(block, I2, ~0); - UML_SETc(block, uml::COND_Z, I4); - UML_ROLINS(block, DRC_SR, I4, 0, Z_MASK); - UML_ROLINS(block, DRC_SR, I2, 3, N_MASK); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - UML_MOV(block, I5, I2); - generate_set_global_register(block, compiler, desc); - - if (dst_code == 0) - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - } - else - { - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I2, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_subs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_subs (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_addc(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_addc (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_neg(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_neg (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_negs(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_negs (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_and(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_and (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_andn(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_andn (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_or(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_or (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_xor(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_xor (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_not(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_not (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_cmpi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t dst_code = (op & 0xf0) >> 4; - - if (IMM_LONG) - { - generate_decode_immediate_s(block, compiler, desc); // I1 <-- imm32 - } - else - { - UML_AND(block, I1, I0, 0xf); - } - - generate_check_delay_pc(block); - - if (DST_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - UML_ADD(block, I2, I3, dst_code); - UML_LOAD(block, I2, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, DRC_SR, DRC_SR, ~(V_MASK | Z_MASK | N_MASK | C_MASK)); - UML_DSUB(block, I0, I2, I1); - - int no_v; - UML_XOR(block, I0, I0, I2); - UML_XOR(block, I3, I1, I2); - UML_AND(block, I0, I0, I3); - UML_TEST(block, I0, 0x80000000); - UML_JMPc(block, uml::COND_Z, no_v = compiler->m_labelnum++); - UML_OR(block, DRC_SR, DRC_SR, V_MASK); - UML_LABEL(block, no_v); - - int no_n; - UML_MOV(block, I3, 0); - UML_CMP(block, I2, I1); - UML_MOVc(block, uml::COND_E, I3, Z_MASK); - UML_MOVc(block, uml::COND_B, I3, C_MASK); - UML_JMPc(block, uml::COND_GE, no_n = compiler->m_labelnum++); - UML_OR(block, I3, I3, N_MASK); - UML_LABEL(block, no_n); - UML_OR(block, DRC_SR, DRC_SR, I3); - - UML_CMP(block, I2, I1); - -} - - -template -void hyperstone_device::generate_movi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t dst_code = (op & 0xf0) >> 4; - const uint32_t src_code = op & 0xf; - - if (IMM_LONG) - generate_decode_immediate_s(block, compiler, desc); - else - UML_MOV(block, I1, src_code); - - generate_check_delay_pc(block); - - int done, no_exception; - if (DST_GLOBAL) - { - UML_TEST(block, DRC_SR, H_MASK); - UML_JMPc(block, uml::COND_Z, no_exception = compiler->m_labelnum++); - UML_TEST(block, DRC_SR, S_MASK); - UML_JMPc(block, uml::COND_NZ, no_exception); - UML_EXH(block, *m_exception[EXCEPTION_PRIVILEGE_ERROR], 0); - UML_JMP(block, done = compiler->m_labelnum++); - UML_LABEL(block, no_exception); - } - - UML_AND(block, DRC_SR, DRC_SR, ~(Z_MASK | N_MASK)); - - int no_z; - UML_TEST(block, I1, ~0); - UML_JMPc(block, uml::COND_NZ, no_z = compiler->m_labelnum++); - UML_OR(block, DRC_SR, DRC_SR, Z_MASK); - UML_LABEL(block, no_z); - - int no_n; - UML_TEST(block, I1, 0x80000000); - UML_JMPc(block, uml::COND_Z, no_n = compiler->m_labelnum++); - UML_OR(block, DRC_SR, DRC_SR, N_MASK); - UML_LABEL(block, no_n); - -#if MISSIONCRAFT_FLAGS - UML_AND(block, DRC_SR, DRC_SR, ~V_MASK); -#endif - - if (DST_GLOBAL) - { - UML_TEST(block, DRC_SR, H_MASK); - UML_MOVc(block, uml::COND_NZ, I4, dst_code + 16); - UML_MOVc(block, uml::COND_Z, I4, dst_code); - UML_MOV(block, I5, I1); - generate_set_global_register(block, compiler, desc); - - UML_TEST(block, op, 0xf0); - UML_JMPc(block, uml::COND_NZ, done); - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - generate_delay_slot_and_branch(block, compiler, desc); - - UML_LABEL(block, done); - } - else - { - UML_ROLAND(block, I2, DRC_SR, 7, 0x7f); - UML_ADD(block, I0, I2, dst_code); - UML_AND(block, I0, I0, 0x3f); - UML_STORE(block, (void *)m_local_regs, I0, I1, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_addi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t dst_code = (op & 0xf0) >> 4; - const uint32_t src_code = op & 0xf; - - if (IMM_LONG) - generate_decode_immediate_s(block, compiler, desc); // I1 <-- imm32 - else - UML_MOV(block, I1, src_code); - - generate_check_delay_pc(block); - - if (DST_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_LOAD(block, I2, (void *)m_local_regs, I5, SIZE_DWORD, SCALE_x4); - } - - if (!(op & 0x10f)) - { - UML_TEST(block, DRC_SR, Z_MASK); - UML_SETc(block, uml::COND_Z, I4); - UML_AND(block, I5, I2, 1); - UML_OR(block, I6, I4, I5); - UML_AND(block, I1, DRC_SR, I6); - } - - UML_AND(block, DRC_SR, DRC_SR, ~(C_MASK | V_MASK | Z_MASK | N_MASK)); - - UML_DADD(block, I0, I1, I2); - - UML_DTEST(block, I2, 0x100000000U); - UML_SETc(block, uml::COND_NZ, I4); - UML_ROLINS(block, DRC_SR, I4, 0, C_MASK); - - UML_XOR(block, I4, I2, I0); - UML_XOR(block, I5, I1, I0); - UML_AND(block, I6, I4, I5); - UML_ROLINS(block, DRC_SR, I6, 4, V_MASK); - - UML_ADD(block, I0, I1, I2); - - UML_TEST(block, I0, ~0); - UML_SETc(block, uml::COND_Z, I4); - UML_ROLINS(block, DRC_SR, I4, Z_SHIFT, Z_MASK); - UML_ROLINS(block, DRC_SR, I0, 3, N_MASK); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - UML_MOV(block, I5, I0); - generate_set_global_register(block, compiler, desc); - - if (dst_code == 0) - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - } - else - { - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I0, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_addsi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_addsi (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_cmpbi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t dst_code = (op & 0xf0) >> 4; - - if (!IMM_LONG) - generate_check_delay_pc(block); - - if (DST_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_LOAD(block, I2, (void *)m_local_regs, I5, SIZE_DWORD, SCALE_x4); - } - - const uint32_t n = ((op & 0x100) >> 4) | (op & 0x0f); - if (n) - { - if (n == 31) - { - if (IMM_LONG) - { - generate_ignore_immediate_s(block, desc); - generate_check_delay_pc(block); - } - UML_MOV(block, I1, 0x7fffffff); - } - else - { - if (IMM_LONG) - { - generate_decode_immediate_s(block, compiler, desc); - generate_check_delay_pc(block); - } - else - { - UML_MOV(block, I1, op & 0xf); - } - } - - UML_AND(block, DRC_SR, DRC_SR, ~Z_MASK); - UML_TEST(block, I2, I1); - UML_SETc(block, uml::COND_Z, I3); - UML_ROLINS(block, DRC_SR, I3, Z_SHIFT, Z_MASK); - } - else - { - if (IMM_LONG) - { - generate_ignore_immediate_s(block, desc); - generate_check_delay_pc(block); - } - - int or_mask, done; - UML_TEST(block, I2, 0xff000000); - UML_JMPc(block, uml::COND_Z, or_mask = compiler->m_labelnum++); - UML_TEST(block, I2, 0x00ff0000); - UML_JMPc(block, uml::COND_Z, or_mask); - UML_TEST(block, I2, 0x0000ff00); - UML_JMPc(block, uml::COND_Z, or_mask); - UML_TEST(block, I2, 0x000000ff); - UML_JMPc(block, uml::COND_Z, or_mask); - UML_AND(block, DRC_SR, DRC_SR, ~Z_MASK); - UML_JMP(block, done = compiler->m_labelnum++); - - UML_LABEL(block, or_mask); - UML_OR(block, DRC_SR, DRC_SR, Z_MASK); - - UML_LABEL(block, done); - } -} - - -template -void hyperstone_device::generate_andni(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t dst_code = (op & 0xf0) >> 4; - - if (IMM_LONG) - { - generate_decode_immediate_s(block, compiler, desc); // I1 <-- imm32 - } - else - { - UML_AND(block, I1, I0, 0xf); - } - - generate_check_delay_pc(block); - - if (DST_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - UML_ADD(block, I2, I3, dst_code); - UML_LOAD(block, I2, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, DRC_SR, DRC_SR, ~Z_MASK); - UML_XOR(block, I1, I1, ~0); - UML_AND(block, I5, I2, I1); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I4, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I4, I5, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_ori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - const uint32_t dst_code = (op & 0xf0) >> 4; - - if (IMM_LONG) - { - generate_decode_immediate_s(block, compiler, desc); // I1 <-- imm32 - } - else - { - UML_AND(block, I1, I0, 0xf); - } - - generate_check_delay_pc(block); - - if (DST_GLOBAL) - { - UML_LOAD(block, I2, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - UML_ADD(block, I2, I3, dst_code); - UML_LOAD(block, I2, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, DRC_SR, DRC_SR, ~Z_MASK); - UML_OR(block, I5, I2, I1); - - if (DST_GLOBAL) - { - UML_MOV(block, I4, dst_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I4, I3, dst_code); - UML_AND(block, I4, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I4, I5, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_xori(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_xori (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_shrdi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shrdi (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_shrd(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shrd (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_shr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shr (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_shri(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shri (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_sardi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_sardi (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_sard(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_sard (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_sar(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_sar (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_sari(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_sari (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_shldi(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shldi (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_shld(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shld (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_shl(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shl (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_shli(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_shli (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_testlz(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_testlz (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_rol(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_rol (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_ldxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - uint16_t next_1 = READ_OP(desc->pc + 2); - const uint16_t sub_type = (next_1 & 0x3000) >> 12; - - uint32_t extra_s; - if (next_1 & 0x8000) - { - const uint16_t next_2 = READ_OP(desc->pc + 4); - - extra_s = next_2; - extra_s |= ((next_1 & 0xfff) << 16); - - if (next_1 & 0x4000) - extra_s |= 0xf0000000; - - UML_MOV(block, mem(&m_instruction_length), (3<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 4); - } - else - { - extra_s = next_1 & 0xfff; - - if (next_1 & 0x4000) - extra_s |= 0xfffff000; - - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - } - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t srcf_code = src_code + 1; - const uint32_t dst_code = (op & 0xf0) >> 4; - - if (!DST_GLOBAL || !SRC_GLOBAL) - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (DST_GLOBAL) - { - if (dst_code == SR_REGISTER) - { - UML_MOV(block, I6, extra_s); - } - else - { - UML_LOAD(block, I4, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - } - else - { - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I5, I2, 0x3f); - UML_LOAD(block, I4, (void *)m_local_regs, I5, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I6, I4, extra_s); - - switch (sub_type) - { - case 0: // LDBS.A - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_mem_read8); - - if (SRC_GLOBAL) - { - UML_MOV(block, I4, src_code); - UML_SEXT(block, I5, I1, SIZE_BYTE); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - break; - - case 1: // LDBU.A - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_mem_read8); - - if (SRC_GLOBAL) - { - UML_MOV(block, I4, src_code); - UML_MOV(block, I5, I1); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - break; - - case 2: - UML_AND(block, I6, I6, ~1); - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_mem_read16); - - if (SRC_GLOBAL) - { - UML_MOV(block, I4, src_code); - if (extra_s & 1) // LDHS.A - UML_SEXT(block, I5, I1, SIZE_WORD); - else // LDHU.A - UML_MOV(block, I5, I1); - - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - if (extra_s & 1) - { - UML_SEXT(block, I5, I1, SIZE_WORD); - UML_STORE(block, (void *)m_local_regs, I2, I5, SIZE_DWORD, SCALE_x4); - } - else - { - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - } - break; - - case 3: - { - uint32_t switch_val = extra_s & 3; - UML_AND(block, I6, I6, ~3); - switch (switch_val) - { - case 0: // LDW.A/D - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_mem_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I5, I1); - UML_MOV(block, I4, src_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - break; - case 1: // LDD.A - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_mem_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I5, I1); - UML_MOV(block, I4, src_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I0, I6, 4); - UML_CALLH(block, *m_mem_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I5, I1); - UML_MOV(block, I4, srcf_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, srcf_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - break; - case 2: // LDW.IOA - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_io_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I5, I1); - UML_MOV(block, I4, src_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - break; - - case 3: // LDD.IOA - UML_MOV(block, I0, I6); - UML_CALLH(block, *m_io_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I5, I1); - UML_MOV(block, I4, src_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I0, I6, 4); - UML_CALLH(block, *m_io_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I5, I1); - UML_MOV(block, I4, srcf_code); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, srcf_code); - UML_AND(block, I2, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I1, SIZE_DWORD, SCALE_x4); - } - break; - } - break; - } - } -} - - -template -void hyperstone_device::generate_ldxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_ldxx2 (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_stxx1(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - uint16_t next_1 = READ_OP(desc->pc + 2); - const uint16_t sub_type = (next_1 & 0x3000) >> 12; - - uint32_t extra_s; - if (next_1 & 0x8000) - { - const uint16_t next_2 = READ_OP(desc->pc + 4); - - extra_s = next_2; - extra_s |= ((next_1 & 0xfff) << 16); - - if (next_1 & 0x4000) - extra_s |= 0xf0000000; - - UML_MOV(block, mem(&m_instruction_length), (3<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 4); - } - else - { - extra_s = next_1 & 0xfff; - - if (next_1 & 0x4000) - extra_s |= 0xfffff000; - - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - } - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (DST_GLOBAL) - { - UML_LOAD(block, I0, (void *)m_global_regs, dst_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I1, I3, dst_code); - UML_AND(block, I1, I1, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I1, SIZE_DWORD, SCALE_x4); - } - - if (SRC_GLOBAL) - { - UML_LOAD(block, I1, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I1, I3, src_code); - UML_AND(block, I1, I1, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I1, SIZE_DWORD, SCALE_x4); - } - - switch (sub_type) - { - case 0: // STBS.D - case 1: // STBU.D - // TODO: missing trap on range error for STBS.D - UML_ADD(block, I0, I0, extra_s); - UML_CALLH(block, *m_mem_write8); - break; - - case 2: // STHS.D, STHU.D - // TODO: missing trap on range error with STHS.D - UML_ADD(block, I0, I0, extra_s); - UML_CALLH(block, *m_mem_write16); - break; - - case 3: - switch (extra_s & 3) - { - case 0: // STW.D - UML_ADD(block, I0, I0, extra_s & ~3); - UML_CALLH(block, *m_mem_write32); - break; - case 1: // STD.D - { - UML_ADD(block, I0, I0, extra_s & ~1); - UML_CALLH(block, *m_mem_write32); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_MOV(block, I1, 0); - else - UML_LOAD(block, I1, (void *)m_global_regs, src_code + 1, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I1, I3, src_code + 1); - UML_AND(block, I1, I1, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I1, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I0, I0, 4); - UML_CALLH(block, *m_mem_write32); - break; - } - case 2: // STW.IOD - UML_ADD(block, I0, I0, extra_s & ~3); - UML_CALLH(block, *m_io_write32); - break; - case 3: // STD.IOD - { - UML_ADD(block, I0, I0, extra_s & ~1); - UML_CALLH(block, *m_io_write32); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_MOV(block, I1, 0); - else - UML_LOAD(block, I1, (void *)m_global_regs, src_code + 1, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I1, I3, src_code + 1); - UML_AND(block, I1, I1, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I1, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I0, I0, 4); - UML_CALLH(block, *m_io_write32); - break; - } - } - break; - } -} - - -template -void hyperstone_device::generate_stxx2(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_stxx2 (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_mulsu(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_mulsu (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_mul(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_mul (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_set(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_set (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_ldwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - UML_ADD(block, I2, I3, dst_code); - UML_LOAD(block, I0, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - UML_CALLH(block, *m_mem_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I4, src_code); - UML_MOV(block, I5, I1); - generate_set_global_register(block, compiler, desc); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I4, I2, 0x3f); - UML_STORE(block, (void *)m_local_regs, I4, I1, SIZE_DWORD, SCALE_x4); - } -} - - -template -void hyperstone_device::generate_lddr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_lddr (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_ldwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I1, I0, dst_code); - UML_AND(block, I2, I1, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - - UML_ADD(block, I3, I0, 4); - UML_CALLH(block, *m_mem_read32); - - if (SRC_GLOBAL) - { - UML_MOV(block, I4, src_code); - UML_MOV(block, I5, I1); - generate_set_global_register(block, compiler, desc); - - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I1, I0, dst_code); - UML_AND(block, I2, I1, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I3, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I4, I0, src_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I1, SIZE_DWORD, SCALE_x4); - - if (src_code != dst_code) - { - UML_ADD(block, I4, I0, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I3, SIZE_DWORD, SCALE_x4); - } - } -} - - -template -void hyperstone_device::generate_lddp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I1, I0, dst_code); - UML_AND(block, I2, I1, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - - UML_ADD(block, I3, I0, 8); - UML_CALLH(block, *m_mem_read32); - UML_MOV(block, I2, I1); // I2: dreg[0] - UML_ADD(block, I0, I0, 4); - UML_CALLH(block, *m_mem_read32); // I1: dreg[4] - - if (SRC_GLOBAL) - { - UML_MOV(block, I4, src_code); - UML_MOV(block, I5, I2); - generate_set_global_register(block, compiler, desc); - UML_MOV(block, I4, src_code + 1); - UML_MOV(block, I5, I1); - generate_set_global_register(block, compiler, desc); - - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I1, I0, dst_code); - UML_AND(block, I2, I1, 0x3f); - UML_STORE(block, (void *)m_local_regs, I2, I3, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ROLAND(block, I0, DRC_SR, 7, 0x7f); - UML_ADD(block, I4, I0, src_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I2, SIZE_DWORD, SCALE_x4); - UML_ADD(block, I4, I0, src_code + 1); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I1, SIZE_DWORD, SCALE_x4); - - if (src_code != dst_code && (src_code + 1) != dst_code) - { - UML_ADD(block, I4, I0, dst_code); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, I3, SIZE_DWORD, SCALE_x4); - } - } -} - - -template -void hyperstone_device::generate_stwr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_MOV(block, I1, 0); - else - UML_LOAD(block, I1, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I2, I2, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - UML_CALLH(block, *m_mem_write32); -} - - -template -void hyperstone_device::generate_stdr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_stdr (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_stwp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - const uint32_t dst_code = (op & 0xf0) >> 4; - - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_MOV(block, I1, 0); - else - UML_LOAD(block, I1, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I2, I3, src_code); - UML_AND(block, I0, I2, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I0, SIZE_DWORD, SCALE_x4); - } - - UML_ADD(block, I2, I3, dst_code); - UML_AND(block, I4, I2, 0x3f); - UML_LOAD(block, I0, (void *)m_local_regs, I4, SIZE_DWORD, SCALE_x4); - UML_CALLH(block, *m_mem_write32); - UML_ADD(block, I2, I0, 4); - UML_STORE(block, (void *)m_local_regs, I4, I2, SIZE_DWORD, SCALE_x4); -} - - -template -void hyperstone_device::generate_stdp(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_stdp (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -template -void hyperstone_device::generate_b(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - static const uint32_t condition_masks[6] = { V_MASK, Z_MASK, C_MASK, C_MASK | Z_MASK, N_MASK, N_MASK | Z_MASK }; - - int done = compiler->m_labelnum++; - uml::condition_t condition = COND_SET ? uml::COND_Z : uml::COND_NZ; - - int skip; - UML_TEST(block, DRC_SR, condition_masks[CONDITION]); - UML_JMPc(block, condition, skip = compiler->m_labelnum++); - generate_br(block, compiler, desc); - - UML_JMP(block, done); - - UML_LABEL(block, skip); - generate_ignore_pcrel(block, desc); - generate_check_delay_pc(block); - - UML_LABEL(block, done); -} - - -void hyperstone_device::generate_br(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - generate_decode_pcrel(block, desc); - generate_check_delay_pc(block); - - UML_ADD(block, DRC_PC, DRC_PC, I1); - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - - generate_delay_slot_and_branch(block, compiler, desc); - // TODO: correct cycle count -} - - -template -void hyperstone_device::generate_db(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - static const uint32_t condition_masks[6] = { V_MASK, Z_MASK, C_MASK, C_MASK | Z_MASK, N_MASK, N_MASK | Z_MASK }; - int skip_jump = compiler->m_labelnum++; - int done = compiler->m_labelnum++; - - UML_TEST(block, DRC_SR, condition_masks[CONDITION]); - if (COND_SET) - UML_JMPc(block, uml::COND_Z, skip_jump); - else - UML_JMPc(block, uml::COND_NZ, skip_jump); - - generate_dbr(block, compiler, desc); - UML_JMP(block, done); - - UML_LABEL(block, skip_jump); - generate_ignore_pcrel(block, desc); - generate_check_delay_pc(block); - - UML_LABEL(block, done); -} - - -void hyperstone_device::generate_dbr(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - generate_decode_pcrel(block, desc); - generate_check_delay_pc(block); - - UML_MOV(block, mem(&m_delay_slot), 1); - UML_ADD(block, mem(&m_delay_pc), DRC_PC, I1); - UML_MOV(block, mem(&m_intblock), 3); - generate_delay_slot_and_branch(block, compiler, desc); -} - - -void hyperstone_device::generate_frame(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - const uint16_t op = desc->opptr.w[0]; - - generate_check_delay_pc(block); - - UML_ROLAND(block, I1, DRC_SR, 7, 0x7f); - UML_SUB(block, I1, I1, op & 0xf); - UML_ROLINS(block, DRC_SR, I1, 25, 0xfe000000); // SET_FP(GET_FP - SRC_CODE) - UML_ROLINS(block, DRC_SR, op, 17, 0x01e00000); // SET_FL(DST_CODE) - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); // SET_M(0) - - UML_MOV(block, I0, mem(&SP)); - UML_ADD(block, I1, I1, (op & 0xf0) >> 4); - UML_ROLAND(block, I2, I0, 30, 0x7f); - UML_ADD(block, I2, I2, (64 - 10)); - UML_SUB(block, I3, I2, I1); - UML_SEXT(block, I3, I3, SIZE_BYTE); // difference = ((SP & 0x1fc) >> 2) + (64 - 10) - ((GET_FP - SRC_CODE) + GET_FL) - - int diff_in_range, done; - UML_CMP(block, I3, -64); - UML_JMPc(block, uml::COND_L, done = compiler->m_labelnum++); - UML_CMP(block, I3, 64); - UML_JMPc(block, uml::COND_L, diff_in_range = compiler->m_labelnum++); - UML_OR(block, I3, I3, 0xffffff80); - UML_LABEL(block, diff_in_range); - - UML_CMP(block, I0, mem(&UB)); - UML_SETc(block, uml::COND_AE, I4); - UML_CMP(block, I3, 0); - UML_JMPc(block, uml::COND_GE, done); - - int push_next; - UML_LABEL(block, push_next = compiler->m_labelnum++); - UML_ROLAND(block, I2, I0, 30, 0x3f); - UML_LOAD(block, I1, (void *)m_local_regs, I2, SIZE_DWORD, SCALE_x4); - UML_CALLH(block, *m_mem_write32); - UML_ADD(block, I0, I0, 4); - UML_ADD(block, I3, I3, 1); - - UML_TEST(block, I3, ~0); - UML_JMPc(block, uml::COND_NZ, push_next); - - UML_MOV(block, mem(&SP), I0); - - UML_TEST(block, I4, ~0); - UML_EXHc(block, uml::COND_NZ, *m_exception[EXCEPTION_FRAME_ERROR], 0); - - UML_LABEL(block, done); -} - -template -void hyperstone_device::generate_call(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - uint16_t op = desc->opptr.w[0]; - uint16_t imm_1 = READ_OP(desc->pc + 2); - - int32_t extra_s = 0; - - if (imm_1 & 0x8000) - { - uint16_t imm_2 = READ_OP(desc->pc + 4); - - extra_s = imm_2; - extra_s |= ((imm_1 & 0x3fff) << 16); - - if (imm_1 & 0x4000) - extra_s |= 0xc0000000; - - UML_MOV(block, mem(&m_instruction_length), (3<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 4); - } - else - { - extra_s = imm_1 & 0x3fff; - - if (imm_1 & 0x4000) - extra_s |= 0xffffc000; - - UML_MOV(block, mem(&m_instruction_length), (2<<19)); - UML_ADD(block, DRC_PC, DRC_PC, 2); - } - - UML_MOV(block, I1, extra_s); - - generate_check_delay_pc(block); - - const uint32_t src_code = op & 0xf; - uint32_t dst_code = (op & 0xf0) >> 4; - - if (!dst_code) - dst_code = 16; - - UML_ROLAND(block, I3, DRC_SR, 7, 0x7f); - - if (SRC_GLOBAL) - { - if (src_code == SR_REGISTER) - UML_MOV(block, I2, 0); - else - UML_LOAD(block, I2, (void *)m_global_regs, src_code, SIZE_DWORD, SCALE_x4); - } - else - { - UML_ADD(block, I4, I3, src_code); - UML_AND(block, I5, I4, 0x3f); - UML_LOAD(block, I2, (void *)m_local_regs, I5, SIZE_DWORD, SCALE_x4); - } - - UML_AND(block, I4, DRC_PC, ~1); - UML_ROLINS(block, I4, DRC_SR, 32-S_SHIFT, 1); - - UML_ADD(block, I1, I3, dst_code); - UML_AND(block, I6, I1, 0x3f); - UML_STORE(block, (void *)m_local_regs, I6, I4, SIZE_DWORD, SCALE_x4); - - UML_ADD(block, I4, I6, 1); - UML_AND(block, I5, I4, 0x3f); - UML_STORE(block, (void *)m_local_regs, I5, DRC_SR, SIZE_DWORD, SCALE_x4); - - UML_ROLINS(block, DRC_SR, I1, 25, 0xfe000000); - UML_ROLINS(block, DRC_SR, 6, 21, 0x01e00000); - UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - - UML_ADD(block, DRC_PC, I2, extra_s & ~1); - - UML_MOV(block, mem(&m_intblock), 2); - - generate_delay_slot_and_branch(block, compiler, desc); - //TODO: add interrupt locks, errors, .... -} - - - -void hyperstone_device::generate_trap_op(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_trap_op (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - -void hyperstone_device::generate_extend(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_extend (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - - -void hyperstone_device::generate_reserved(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_reserved (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - -void hyperstone_device::generate_do(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc) -{ - printf("Unimplemented: generate_do (%08x)\n", desc->pc); - fflush(stdout); - fatalerror(" "); -} - diff --git a/src/devices/cpu/e132xs/e132xsfe.cpp b/src/devices/cpu/e132xs/e132xsfe.cpp deleted file mode 100644 index 33f57434e1b..00000000000 --- a/src/devices/cpu/e132xs/e132xsfe.cpp +++ /dev/null @@ -1,1303 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -/*************************************************************************** - - e132xsfe.cpp - - Front end for Hyperstone recompiler - -***************************************************************************/ - -#include "emu.h" -#include "e132xsfe.h" -#include "32xsdefs.h" - -#define FE_FP ((m_cpu->m_global_regs[1] & 0xfe000000) >> 25) -#define FE_FL (m_cpu->m_fl_lut[((m_cpu->m_global_regs[1] >> 21) & 0xf)]) -#define DST_CODE ((op & 0xf0) >> 4) -#define SRC_CODE (op & 0x0f) -#define SR_CODE (1 << 1) - -/*************************************************************************** - INSTRUCTION PARSERS -***************************************************************************/ - -e132xs_frontend::e132xs_frontend(hyperstone_device *e132xs, uint32_t window_start, uint32_t window_end, uint32_t max_sequence) - : drc_frontend(*e132xs, window_start, window_end, max_sequence) - , m_cpu(e132xs) -{ -} - -inline uint32_t e132xs_frontend::imm_length(opcode_desc &desc, uint16_t op) -{ - uint8_t nybble = op & 0x0f; - switch (nybble) - { - case 0: - default: - return 2; - case 1: - return 6; - case 2: - case 3: - return 4; - } -} - -inline uint16_t e132xs_frontend::read_word(opcode_desc &desc) -{ - return m_cpu->m_direct->read_word(desc.physpc, m_cpu->m_opcodexor); -} - -inline uint16_t e132xs_frontend::read_imm1(opcode_desc &desc) -{ - return m_cpu->m_direct->read_word(desc.physpc + 2, m_cpu->m_opcodexor); -} - -inline uint16_t e132xs_frontend::read_imm2(opcode_desc &desc) -{ - return m_cpu->m_direct->read_word(desc.physpc + 4, m_cpu->m_opcodexor); -} - -inline uint32_t e132xs_frontend::read_ldstxx_imm(opcode_desc &desc) -{ - const uint16_t imm1 = read_imm1(desc); - uint32_t extra_s; - if (imm1 & 0x8000) - { - extra_s = read_imm2(desc); - extra_s |= ((imm1 & 0xfff) << 16); - - if (imm1 & 0x4000) - extra_s |= 0xf0000000; - } - else - { - extra_s = imm1 & 0xfff; - - if (imm1 & 0x4000) - extra_s |= 0xfffff000; - } - return extra_s; -} - -inline uint32_t e132xs_frontend::read_limm(opcode_desc &desc, uint16_t op) -{ - static const int32_t immediate_values[16] = - { - 16, 0, 0, 0, 32, 64, 128, int32_t(0x80000000), - -8, -7, -6, -5, -4, -3, -2, -1 - }; - - uint8_t nybble = op & 0xf; - switch (nybble) - { - case 0: - return 16; - case 1: - return (read_imm1(desc) << 16) | read_imm2(desc); - case 2: - return read_imm1(desc); - case 3: - return 0xffff0000 | read_imm1(desc); - default: - return immediate_values[nybble]; - } -} - -inline int32_t e132xs_frontend::decode_pcrel(opcode_desc &desc, uint16_t op) -{ - if (op & 0x80) - { - uint16_t next = read_imm1(desc); - - desc.length = 4; - - int32_t offset = (op & 0x7f) << 16; - offset |= (next & 0xfffe); - - if (next & 1) - offset |= 0xff800000; - - return offset; - } - else - { - int32_t offset = op & 0x7e; - if (op & 1) - offset |= 0xffffff80; - return offset; - } -} - -inline int32_t e132xs_frontend::decode_call(opcode_desc &desc) -{ - const uint16_t imm_1 = read_imm1(desc); - int32_t extra_s = 0; - if (imm_1 & 0x8000) - { - desc.length = 6; - extra_s = read_imm2(desc); - extra_s |= ((imm_1 & 0x3fff) << 16); - - if (imm_1 & 0x4000) - extra_s |= 0xc0000000; - } - else - { - desc.length = 4; - extra_s = imm_1 & 0x3fff; - if (imm_1 & 0x4000) - extra_s |= 0xffffc000; - } - return extra_s; -} - - -/*------------------------------------------------- - describe - build a description of a single - instruction --------------------------------------------------*/ - -bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) -{ - uint16_t op = desc.opptr.w[0] = read_word(desc); - - /* most instructions are 2 bytes and a single cycle */ - desc.length = 2; - desc.cycles = m_cpu->m_clock_cycles_1; - - const uint32_t fp = FE_FP; - const uint32_t gdst_code = DST_CODE; - const uint32_t gdstf_code = gdst_code + 1; - const uint32_t gsrc_code = SRC_CODE; - const uint32_t gsrcf_code = gsrc_code + 1; - const uint32_t ldst_code = (gdst_code + fp) & 0x1f; - const uint32_t ldstf_code = (gdstf_code + fp) & 0x1f; - const uint32_t lsrc_code = (gsrc_code + fp) & 0x1f; - const uint32_t lsrcf_code = (gsrcf_code + fp) & 0x1f; - const uint32_t ldst_group = 1 + (((DST_CODE + fp) & 0x20) >> 5); - const uint32_t ldstf_group = 1 + (((DST_CODE + fp + 1) & 0x20) >> 5); - const uint32_t lsrc_group = 1 + (((SRC_CODE + fp) & 0x20) >> 5); - const uint32_t lsrcf_group = 1 + ((SRC_CODE + fp + 1) >> 5); - - switch (op >> 8) - { - case 0x00: // chk global,global - desc.regin[0] |= 1 << gdst_code; - desc.regin[0] |= 1 << gsrc_code; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x01: // chk global,local - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x02: // chk local,global - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[0] |= 1 << gsrc_code; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x03: // chk local,local - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x04: // movd global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gsrcf_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdstf_code; - if (gdst_code == 0) - { - desc.regout[1] = 0xffffffff; - desc.regout[2] = 0xffffffff; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE | OPFLAG_CAN_CAUSE_EXCEPTION; - } - else - { - desc.cycles = m_cpu->m_clock_cycles_2; - } - desc.regout[0] |= SR_CODE; - break; - case 0x05: // movd global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[lsrcf_group] |= 1 << lsrcf_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdstf_code; - if (gdst_code == 0) - { - desc.regout[1] = 0xffffffff; - desc.regout[2] = 0xffffffff; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE | OPFLAG_CAN_CAUSE_EXCEPTION; - } - else - { - desc.cycles = m_cpu->m_clock_cycles_2; - } - desc.regout[0] |= SR_CODE; - break; - case 0x06: // movd local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gsrcf_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_2; - break; - case 0x07: // movd local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[lsrcf_group] |= 1 << lsrcf_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_2; - break; - case 0x08: // divu global,global - case 0x0c: // divs global,global - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regin[0] |= 1 << gdstf_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 36 << m_cpu->m_clck_scale; - break; - case 0x09: // divu global,local - case 0x0d: // divs global,local - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regin[0] |= 1 << gdstf_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 36 << m_cpu->m_clck_scale; - break; - case 0x0a: // divu local,global - case 0x0e: // divs local,global - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[ldstf_group] |= 1 << ldstf_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 36 << m_cpu->m_clck_scale; - break; - case 0x0b: // divu local,local - case 0x0f: // divs local,local - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[ldstf_group] |= 1 << ldstf_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 36 << m_cpu->m_clck_scale; - break; - case 0x10: // xm global,global - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x11: // xm global,local - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x12: // xm local,global - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x13: // xm local,local - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x14: // mask global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x15: // mask global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x16: // mask local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x17: // mask local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - break; - case 0x18: // sum global,global - case 0x1c: // sums global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - if (op & 0x4 && gsrc_code != SR_REGISTER) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x19: // sum global,local - case 0x1d: // sums global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - if (op & 0x4) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x1a: // sum local,global - case 0x1e: // sums local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - if (op & 0x4 && gsrc_code != SR_REGISTER) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x1b: // sum local,local - case 0x1f: // sums local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; - if (op & 0x4) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x20: // cmp global,global - case 0x30: // cmpb global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x21: // cmp global,local - case 0x31: // cmpb global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x22: // cmp local,global - case 0x32: // cmpb local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x23: // cmp local,local - case 0x33: // cmpb local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x24: // mov global,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << (gsrc_code + 16); - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x25: // mov global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x26: // mov local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << (gsrc_code + 16); - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x27: // mov local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x28: // add global,global - case 0x2c: // adds global,global - case 0x48: // sub global,global - case 0x4c: // subs global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // adds, subs - break; - case 0x29: // add global,local - case 0x2d: // adds global,local - case 0x49: // sub global,local - case 0x4d: // subs global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // adds, subs - break; - case 0x2a: // add local,global - case 0x2e: // adds local,global - case 0x4a: // sub local,global - case 0x4e: // subs local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // adds, subs - break; - case 0x2b: // add local,local - case 0x2f: // adds local,local - case 0x4b: // sub local,local - case 0x4f: // subs local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // adds, subs - break; - case 0x34: // andn global,global - case 0x38: // or global,global - case 0x3c: // xor global,global - case 0x54: // and global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x35: // andn global,local - case 0x39: // or global,local - case 0x3d: // xor global,local - case 0x55: // and global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x36: // andn local,global - case 0x3a: // or local,global - case 0x3e: // xor local,global - case 0x56: // and local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x37: // andn local,local - case 0x3b: // or local,local - case 0x3f: // xor local,local - case 0x57: // and local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x40: // subc global,global - case 0x50: // addc global,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x41: // subc global,local - case 0x51: // addc global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x42: // subc local,global - case 0x52: // addc local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x43: // subc local,local - case 0x53: // addc local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x44: // not global,global - case 0x58: // neg global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x45: // not global,local - case 0x59: // neg global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x46: // not local,global - case 0x5a: // neg local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x47: // not local,local - case 0x5b: // neg local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x5c: // negs global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x5d: // negs global,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x5e: // negs local,global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x5f: // negs local,local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - break; - case 0x60: // cmpi global,simm - case 0x70: // cmpbi global,simm - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x61: // cmpi global,limm - case 0x71: // cmpbi global,limm - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - break; - case 0x62: // cmpi local,simm - case 0x72: // cmpbi local,simm - desc.regin[0] |= SR_CODE; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x63: // cmpi local,limm - case 0x73: // cmpbi local,limm - desc.regin[0] |= SR_CODE; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - break; - case 0x64: // movi global,simm - desc.regin[0] |= SR_CODE; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << (gdst_code + 16); - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = op & 0xf; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - case 0x65: // movi global,limm - desc.regin[0] |= SR_CODE; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << (gdst_code + 16); - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = read_limm(desc, op); - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - case 0x66: // movi local,simm - desc.regin[0] |= SR_CODE; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x67: // movi local,limm - desc.regin[0] |= SR_CODE; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - break; - case 0x68: // addi global,simm - case 0x6c: // addsi global,simm - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - case 0x69: // addi global,limm - case 0x6d: // addsi global,limm - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - case 0x6a: // addi local,simm - case 0x6e: // addsi local,simm - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi - break; - case 0x6b: // addi local,limm - case 0x6f: // addsi local,limm - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi - break; - case 0x74: // andni global,simm - case 0x78: // ori global,simm - case 0x7c: // xori global,simm - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - case 0x75: // andni global,limm - case 0x79: // ori global,limm - case 0x7d: // xori global,limm - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - case 0x76: // andni local,simm - case 0x7a: // ori local,simm - case 0x7e: // xori local,simm - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x77: // andni local,limm - case 0x7b: // ori local,limm - case 0x7f: // xori local,limm - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); - break; - case 0x80: case 0x81: // shrdi - case 0x84: case 0x85: // sardi - case 0x88: case 0x89: // shldi - desc.regin[0] |= SR_CODE; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_2; - break; - case 0x82: // shrd - case 0x86: // sard - case 0x8a: // shld - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_2; - break; - case 0x83: // shr - case 0x87: // sar - case 0x8b: // shl - case 0x8f: // rol - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0x8c: case 0x8d: // reserved - return false; - case 0x8e: // testlz - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - break; - case 0x90: // ldxx1 global,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - } - case 0x91: // ldxx1 global,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regout[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - } - case 0x92: // ldxx1 local,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - break; - } - case 0x93: // ldxx1 local,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - break; - } - case 0x94: // ldxx2 global,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - } - case 0x95: // ldxx2 global,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - if (gdst_code == PC_REGISTER) - { - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - } - break; - } - case 0x96: // ldxx2 local,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[0] |= 1 << gsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - break; - } - case 0x97: // ldxx2 local,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regout[lsrcf_group] |= 1 << lsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_READS_MEMORY; - break; - } - case 0x98: // stxx1 global,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= 1 << gdst_code; - desc.regin[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x99: // stxx1 global,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x9a: // stxx1 local,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x9b: // stxx1 local,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x9c: // stxx2 global,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= 1 << gdst_code; - desc.regin[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code; - desc.regout[0] |= 1 << gdst_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x9d: // stxx2 global,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gdst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code; - desc.regout[0] |= 1 << gdst_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x9e: // stxx2 local,global - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[0] |= 1 << gsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[0] |= 1 << gsrcf_code; - desc.regout[ldst_group] |= 1 << ldst_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0x9f: // stxx2 local,local - { - const uint16_t imm1 = read_imm1(desc); - const uint32_t extra_s = read_ldstxx_imm(desc); - - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - if ((imm1 & 0x3000) == 3 && (extra_s & 2)) desc.regin[lsrcf_group] |= 1 << lsrcf_code; - desc.regout[ldst_group] |= 1 << ldst_code; - - desc.length = (imm1 & 0x8000) ? 6 : 4; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - } - case 0xa0: // shri global (lo n) - case 0xa1: // shri global (hi n) - case 0xa4: // sari global (lo n) - case 0xa5: // sari global (hi n) - case 0xa8: // shli global (lo n) - case 0xa9: // shli global (hi n) - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - break; - case 0xa2: // shri local (lo n) - case 0xa3: // shri local (hi n) - case 0xa6: // sari local (lo n) - case 0xa7: // sari local (hi n) - case 0xaa: // shli local (lo n) - case 0xab: // shli local (hi n) - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - break; - case 0xac: case 0xad: case 0xae: case 0xaf: // reserved - return false; - case 0xb0: // mulu global,global - case 0xb4: // muls global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_4; - break; - case 0xb1: // mulu global,local - case 0xb5: // muls global,local - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_4; - break; - case 0xb2: // mulu local,global - case 0xb6: // muls local,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_4; - break; - case 0xb3: // mulu local,local - case 0xb7: // muls local,local - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.regout[0] |= SR_CODE; - desc.cycles = m_cpu->m_clock_cycles_4; - break; - case 0xb8: // set global (lo n) - case 0xb9: // set global (hi n) - desc.regin[0] |= SR_CODE; - desc.regout[0] |= 1 << gdst_code; - break; - case 0xba: // set local (lo n) - case 0xbb: // set local (hi n) - desc.regout[ldst_group] |= 1 << ldst_code; - break; - case 0xbc: // mul global,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 3 << m_cpu->m_clck_scale; - break; - case 0xbd: // muls global,local - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[0] |= 1 << gdst_code; - desc.regout[0] |= 1 << gdst_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 3 << m_cpu->m_clck_scale; - break; - case 0xbe: // muls local,global - desc.regin[0] |= 1 << gsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 3 << m_cpu->m_clck_scale; - break; - case 0xbf: // mulu local,local - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= SR_CODE; - desc.cycles = 3 << m_cpu->m_clck_scale; - break; - case 0xc0: case 0xc1: case 0xc2: case 0xc3: // software - case 0xc4: case 0xc5: case 0xc6: case 0xc7: // software - case 0xc8: case 0xc9: case 0xca: case 0xcb: // software - case 0xcc: case 0xcd: // software - { - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[lsrcf_group] |= 1 << lsrcf_code; - - const uint32_t reg = FE_FP + FE_FL; - desc.regout[1 + (((reg + 0) & 0x20) >> 5)] |= 1 << ((reg + 0) & 0x1f); - desc.regout[1 + (((reg + 1) & 0x20) >> 5)] |= 1 << ((reg + 1) & 0x1f); - desc.regout[1 + (((reg + 2) & 0x20) >> 5)] |= 1 << ((reg + 2) & 0x1f); - desc.regout[1 + (((reg + 3) & 0x20) >> 5)] |= 1 << ((reg + 3) & 0x1f); - desc.regout[1 + (((reg + 4) & 0x20) >> 5)] |= 1 << ((reg + 4) & 0x1f); - - desc.regout[0] |= SR_CODE; - - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - break; - } - case 0xce: // extend - 4 bytes - desc.regin[0] |= SR_CODE; - desc.regin[0] |= (3 << 14); // global regs 14, 15 - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= (3 << 14); // global regs 14, 15 - break; - case 0xcf: // do - return false; - case 0xd0: // ldwr global - case 0xd4: // ldwp global - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= 1 << gsrc_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_READS_MEMORY; - break; - case 0xd1: // ldwr local - case 0xd5: // ldwp local - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[lsrc_group] |= 1 << lsrc_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_READS_MEMORY; - break; - case 0xd2: // lddr global - case 0xd6: // lddp global - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[0] |= 1 << gsrc_code; - desc.regout[0] |= 1 << gsrcf_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_READS_MEMORY; - break; - case 0xd3: // lddr local - case 0xd7: // lddp local - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regout[lsrc_group] |= 1 << lsrc_code; - desc.regout[lsrcf_group] |= 1 << lsrcf_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_READS_MEMORY; - break; - case 0xd8: // stwr global - case 0xdc: // stwp global - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[0] |= 1 << gsrc_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - case 0xd9: // stwr local - case 0xdd: // stwp local - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - case 0xda: // stdr global - case 0xde: // stdp global - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[0] |= 1 << gsrc_code; - desc.regin[0] |= 1 << gsrcf_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - case 0xdb: // stdr local - case 0xdf: // stdp local - desc.regin[0] |= SR_CODE; - desc.regin[ldst_group] |= 1 << ldst_code; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regin[lsrcf_group] |= 1 << lsrcf_code; - if (op & 0x04) desc.regout[ldst_group] |= 1 << ldst_code; - desc.flags |= OPFLAG_WRITES_MEMORY; - break; - case 0xe0: case 0xe1: case 0xe2: case 0xe3: // dbv, dbnv, dbe, dbne - could be 4 bytes (pcrel) - case 0xe4: case 0xe5: case 0xe6: case 0xe7: // dbc, dbnc, dbse, dbht - could be 4 bytes (pcrel) - case 0xe8: case 0xe9: case 0xea: case 0xeb: // dbn, dbnn, dblt, dbgt - could be 4 bytes (pcrel) - desc.regin[0] |= SR_CODE; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH; - desc.delayslots = 1; - break; - case 0xec: // dbr - could be 4 bytes (pcrel) - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - desc.delayslots = 1; - break; - case 0xed: // frame - desc.regin[0] |= SR_CODE; - desc.regin[1] = 0xffffffff; - desc.regin[2] = 0xffffffff; - desc.regout[0] |= SR_CODE; - desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION | OPFLAG_END_SEQUENCE; - break; - case 0xee: // call global - desc.regin[0] |= SR_CODE; - desc.regin[0] |= 1 << gsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - break; - case 0xef: // call local - desc.regin[0] |= SR_CODE; - desc.regin[lsrc_group] |= 1 << lsrc_code; - desc.regout[ldst_group] |= 1 << ldst_code; - desc.regout[ldstf_group] |= 1 << ldstf_code; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - break; - case 0xf0: case 0xf1: case 0xf2: case 0xf3: // bv, bnv, be, bne - case 0xf4: case 0xf5: case 0xf6: case 0xf7: // bc, bnc, bse, bht - case 0xf8: case 0xf9: case 0xfa: case 0xfb: // bn, bnn, blt, bgt - decode_pcrel(desc, op); - desc.regin[0] |= SR_CODE; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH; - break; - case 0xfc: // br - desc.targetpc = (desc.pc + 2) + decode_pcrel(desc, op); - desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; - break; - case 0xfd: case 0xfe: case 0xff: // trap - desc.regin[0] |= SR_CODE; - desc.targetpc = BRANCH_TARGET_DYNAMIC; - desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE | OPFLAG_CAN_CAUSE_EXCEPTION; - break; - } - return true; -} diff --git a/src/devices/cpu/e132xs/e132xsfe.h b/src/devices/cpu/e132xs/e132xsfe.h deleted file mode 100644 index 7463fd964d0..00000000000 --- a/src/devices/cpu/e132xs/e132xsfe.h +++ /dev/null @@ -1,34 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -#ifndef MAME_CPU_E132XS_E132XSFE_H -#define MAME_CPU_E132XS_E132XSFE_H - -#pragma once - -#include "e132xs.h" -#include "cpu/drcfe.h" - -class e132xs_frontend : public drc_frontend -{ -public: - e132xs_frontend(hyperstone_device *e132xs, uint32_t window_start, uint32_t window_end, uint32_t max_sequence); - void flush(); - -protected: - // required overrides - virtual bool describe(opcode_desc &desc, const opcode_desc *prev) override; - -private: - inline uint32_t imm_length(opcode_desc &desc, uint16_t op); - inline uint16_t read_word(opcode_desc &desc); - inline uint16_t read_imm1(opcode_desc &desc); - inline uint16_t read_imm2(opcode_desc &desc); - inline uint32_t read_ldstxx_imm(opcode_desc &desc); - inline uint32_t read_limm(opcode_desc &desc, uint16_t op); - inline int32_t decode_pcrel(opcode_desc &desc, uint16_t op); - inline int32_t decode_call(opcode_desc &desc); - - hyperstone_device *m_cpu; -}; - -#endif /* MAME_CPU_E132XS_E132XSFE_H */ -- cgit v1.2.3-70-g09d2 From 00c9b62a2405b6c4120564845694e90da1346d8b Mon Sep 17 00:00:00 2001 From: Sergey Svishchev Date: Sat, 9 Dec 2017 02:46:23 +0300 Subject: agat7: 840KB floppy HLE; minor fixes -> mark WORKING (#2912) * agat7: add port_char definitions to allow access from Lua, &c (nw) * agat7: adapt "apple2: Break up handlers for C000-C07F range" (nw) * agat7: timer and vblank interrupts (nw) * agat7: HLE of 840KB floppy controller, read-only (nw) * agat7: memory expansion wip (nw) * agat7: update todo list, mark partially WORKING --- scripts/src/bus.lua | 2 + scripts/src/formats.lua | 12 + scripts/target/mame/mess.lua | 1 + src/devices/bus/a2bus/agat7langcard.cpp | 19 +- src/devices/bus/a2bus/agat7langcard.h | 4 +- src/devices/bus/a2bus/agat7ram.cpp | 27 +- src/devices/bus/a2bus/agat7ram.h | 4 +- src/devices/bus/a2bus/agat840k_hle.cpp | 449 ++++++++++++++++++++++++++++++++ src/devices/bus/a2bus/agat840k_hle.h | 99 +++++++ src/lib/formats/agat840k_hle_dsk.cpp | 59 +++++ src/lib/formats/agat840k_hle_dsk.h | 17 ++ src/mame/drivers/agat.cpp | 340 ++++++++++++++---------- 12 files changed, 869 insertions(+), 164 deletions(-) create mode 100644 src/devices/bus/a2bus/agat840k_hle.cpp create mode 100644 src/devices/bus/a2bus/agat840k_hle.h create mode 100644 src/lib/formats/agat840k_hle_dsk.cpp create mode 100644 src/lib/formats/agat840k_hle_dsk.h (limited to 'scripts/src') diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 4dbf4fe0ad0..28f07a10d68 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1787,6 +1787,8 @@ if (BUSES["A2BUS"]~=null) then MAME_DIR .. "src/devices/bus/a2bus/agat7langcard.h", MAME_DIR .. "src/devices/bus/a2bus/agat7ram.cpp", MAME_DIR .. "src/devices/bus/a2bus/agat7ram.h", + MAME_DIR .. "src/devices/bus/a2bus/agat840k_hle.cpp", + MAME_DIR .. "src/devices/bus/a2bus/agat840k_hle.h", MAME_DIR .. "src/devices/bus/a2bus/ssprite.cpp", MAME_DIR .. "src/devices/bus/a2bus/ssprite.h", MAME_DIR .. "src/devices/bus/a2bus/ssbapple.cpp", diff --git a/scripts/src/formats.lua b/scripts/src/formats.lua index 29a22b23ad0..6558ff859d2 100644 --- a/scripts/src/formats.lua +++ b/scripts/src/formats.lua @@ -185,6 +185,18 @@ if (FORMATS["AFS_DSK"]~=null or _OPTIONS["with-tools"]) then } end +-------------------------------------------------- +-- +--@src/lib/formats/agat840k_hle_dsk.h,FORMATS["AGAT840K_HLE_DSK"] = true +-------------------------------------------------- + +if (FORMATS["AGAT840K_HLE_DSK"]~=null or _OPTIONS["with-tools"]) then + files { + MAME_DIR.. "src/lib/formats/agat840k_hle_dsk.cpp", + MAME_DIR.. "src/lib/formats/agat840k_hle_dsk.h", + } +end + -------------------------------------------------- -- --@src/lib/formats/ami_dsk.h,FORMATS["AMI_DSK"] = true diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 65c89bc15ce..ea2ee8ef9ec 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -775,6 +775,7 @@ FORMATS["ACORN_DSK"] = true FORMATS["ADAM_CAS"] = true FORMATS["ADAM_DSK"] = true FORMATS["AFS_DSK"] = true +FORMATS["AGAT840K_HLE_DSK"] = true FORMATS["AMI_DSK"] = true FORMATS["AP2_DSK"] = true FORMATS["APD_DSK"] = true diff --git a/src/devices/bus/a2bus/agat7langcard.cpp b/src/devices/bus/a2bus/agat7langcard.cpp index 9bb00b38c60..b4d2a168f38 100644 --- a/src/devices/bus/a2bus/agat7langcard.cpp +++ b/src/devices/bus/a2bus/agat7langcard.cpp @@ -10,6 +10,9 @@ #include "agat7langcard.h" +//#define VERBOSE 1 +#include "logmacro.h" + /*************************************************************************** PARAMETERS ***************************************************************************/ @@ -30,7 +33,7 @@ DEFINE_DEVICE_TYPE(A2BUS_AGAT7LANGCARD, a2bus_agat7langcard_device, "a7lang", "A a2bus_agat7langcard_device::a2bus_agat7langcard_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock), - device_a2bus_card_interface(mconfig, *this), m_inh_state(0), m_last_offset(0), m_dxxx_bank(0), m_main_bank(0) + device_a2bus_card_interface(mconfig, *this), m_inh_state(0), m_dxxx_bank(0), m_main_bank(0), m_csr(0) { } @@ -48,13 +51,13 @@ void a2bus_agat7langcard_device::device_start() // set_a2bus_device makes m_slot valid set_a2bus_device(); - memset(m_ram, 0, 32*1024); + memset(m_ram, 0, 32 * 1024); save_item(NAME(m_inh_state)); save_item(NAME(m_ram)); save_item(NAME(m_dxxx_bank)); save_item(NAME(m_main_bank)); - save_item(NAME(m_last_offset)); + save_item(NAME(m_csr)); } void a2bus_agat7langcard_device::device_reset() @@ -62,7 +65,7 @@ void a2bus_agat7langcard_device::device_reset() m_inh_state = INH_NONE; m_dxxx_bank = 0; m_main_bank = 0; - m_last_offset = -1; + m_csr = 0; m_mode = 0; } @@ -70,7 +73,7 @@ void a2bus_agat7langcard_device::do_io(int offset) { int old_inh_state = m_inh_state; - m_last_offset = offset; + m_csr = offset & 0x7f; m_inh_state = INH_WRITE; m_dxxx_bank = 0; @@ -91,13 +94,11 @@ void a2bus_agat7langcard_device::do_io(int offset) recalc_slot_inh(); } -#if 1 - logerror("LC: (ofs %02x) new state %c%c dxxx=%04x main=%05x\n", + LOG("LC: (ofs %02x) new state %c%c dxxx=%04x main=%05x\n", offset, (m_inh_state & INH_READ) ? 'R' : 'x', (m_inh_state & INH_WRITE) ? 'W' : 'x', m_dxxx_bank, m_main_bank); -#endif } @@ -107,7 +108,7 @@ void a2bus_agat7langcard_device::do_io(int offset) uint8_t a2bus_agat7langcard_device::read_cnxx(address_space &space, uint8_t offset) { - return m_last_offset < 0 ? 0x80 : (0x80 | m_last_offset); + return (0x80 | m_csr); } diff --git a/src/devices/bus/a2bus/agat7langcard.h b/src/devices/bus/a2bus/agat7langcard.h index 13647abfb11..be3a650a222 100644 --- a/src/devices/bus/a2bus/agat7langcard.h +++ b/src/devices/bus/a2bus/agat7langcard.h @@ -47,11 +47,11 @@ private: void do_io(int offset); int m_inh_state; - int m_last_offset; int m_dxxx_bank; int m_main_bank; - uint8_t m_ram[32*1024]; + uint8_t m_ram[32 * 1024]; uint8_t m_mode; + uint8_t m_csr; }; // device type definition diff --git a/src/devices/bus/a2bus/agat7ram.cpp b/src/devices/bus/a2bus/agat7ram.cpp index dde0260db3f..51bbabb792c 100644 --- a/src/devices/bus/a2bus/agat7ram.cpp +++ b/src/devices/bus/a2bus/agat7ram.cpp @@ -10,6 +10,9 @@ #include "agat7ram.h" +//#define VERBOSE 1 +#include "logmacro.h" + /*************************************************************************** PARAMETERS ***************************************************************************/ @@ -30,7 +33,7 @@ DEFINE_DEVICE_TYPE(A2BUS_AGAT7RAM, a2bus_agat7ram_device, "a7ram", "Agat-7 32K R a2bus_agat7ram_device::a2bus_agat7ram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock), - device_a2bus_card_interface(mconfig, *this), m_inh_state(0), m_last_offset(0), m_main_bank(0) + device_a2bus_card_interface(mconfig, *this), m_inh_state(0), m_main_bank(0), m_csr(0) { } @@ -48,32 +51,32 @@ void a2bus_agat7ram_device::device_start() // set_a2bus_device makes m_slot valid set_a2bus_device(); - memset(m_ram, 0, 32*1024); + memset(m_ram, 0, 32 * 1024); save_item(NAME(m_inh_state)); save_item(NAME(m_ram)); save_item(NAME(m_main_bank)); - save_item(NAME(m_last_offset)); + save_item(NAME(m_csr)); } void a2bus_agat7ram_device::device_reset() { m_inh_state = INH_NONE; m_main_bank = 0; - m_last_offset = -1; + m_csr = 0; } void a2bus_agat7ram_device::do_io(int offset) { int old_inh_state = m_inh_state; - m_last_offset = offset; + m_csr = offset & 0x7f; m_inh_state = INH_NONE; m_main_bank = 0; if (offset & 0x8) { - m_inh_state = INH_READ|INH_WRITE; + m_inh_state = INH_READ | INH_WRITE; } if (offset & 0x1) @@ -86,13 +89,11 @@ void a2bus_agat7ram_device::do_io(int offset) recalc_slot_inh(); } -#if 1 - logerror("RAM: (ofs %02x) new state %c%c main=%05x\n", + LOG("RAM: (ofs %02x) new state %c%c main=%05x\n", offset, (m_inh_state & INH_READ) ? 'R' : 'x', (m_inh_state & INH_WRITE) ? 'W' : 'x', m_main_bank); -#endif } @@ -102,7 +103,7 @@ void a2bus_agat7ram_device::do_io(int offset) uint8_t a2bus_agat7ram_device::read_cnxx(address_space &space, uint8_t offset) { - return m_last_offset < 0 ? 0 : (m_last_offset & 0x7f); + return m_csr; } @@ -125,12 +126,10 @@ uint8_t a2bus_agat7ram_device::read_inh_rom(address_space &space, uint16_t offse void a2bus_agat7ram_device::write_inh_rom(address_space &space, uint16_t offset, uint8_t data) { // are writes enabled? - if (!(m_inh_state & INH_WRITE)) + if ((m_inh_state & INH_WRITE) && !BIT(m_csr, 4)) { - return; + m_ram[(offset & 0x3fff) + m_main_bank] = data; } - - m_ram[(offset & 0x3fff) + m_main_bank] = data; } int a2bus_agat7ram_device::inh_type() diff --git a/src/devices/bus/a2bus/agat7ram.h b/src/devices/bus/a2bus/agat7ram.h index e30aaf7b94b..3476e738179 100644 --- a/src/devices/bus/a2bus/agat7ram.h +++ b/src/devices/bus/a2bus/agat7ram.h @@ -47,9 +47,9 @@ private: void do_io(int offset); int m_inh_state; - int m_last_offset; int m_main_bank; - uint8_t m_ram[32*1024]; + uint8_t m_ram[32 * 1024]; + uint8_t m_csr; }; // device type definition diff --git a/src/devices/bus/a2bus/agat840k_hle.cpp b/src/devices/bus/a2bus/agat840k_hle.cpp new file mode 100644 index 00000000000..a27d3d95ceb --- /dev/null +++ b/src/devices/bus/a2bus/agat840k_hle.cpp @@ -0,0 +1,449 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/********************************************************************* + + agat840k_hle.cpp + + High-level simulation of the Agat 840K floppy controller card + + http://agatcomp.ru/Reading/docs/es5323.txt + https://github.com/sintech/AGAT/blob/master/docs/agat-840k-format.txt + http://www.torlus.com/floppy/forum/viewtopic.php?f=19&t=1385 + +*********************************************************************/ + +#include "emu.h" +#include "imagedev/flopdrv.h" +#include "formats/agat840k_hle_dsk.h" +#include "agat840k_hle.h" + +//#define VERBOSE 1 +#include "logmacro.h" + + +/*************************************************************************** + PARAMETERS +***************************************************************************/ + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +DEFINE_DEVICE_TYPE(A2BUS_AGAT840K_HLE, a2bus_agat840k_hle_device, "agat840k_hle", "Agat 840K floppy card") + +#define AGAT840K_ROM_REGION "agat840k_hle_rom" + + +ROM_START( agat840k_hle ) + ROM_REGION(0x100, AGAT840K_ROM_REGION, 0) + // "Zagorsk" variant + ROM_LOAD( "teac.rom", 0x0000, 0x0100, CRC(94266928) SHA1(5d369bad6cdd6a70b0bb16480eba69640de87a2e) ) +ROM_END + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +static const floppy_interface agat840k_hle_floppy_interface = +{ + FLOPPY_STANDARD_5_25_DSHD, + LEGACY_FLOPPY_OPTIONS_NAME(agat840k_hle), + "floppy_5_25" +}; + +MACHINE_CONFIG_MEMBER( a2bus_agat840k_hle_device::device_add_mconfig ) + MCFG_DEVICE_ADD(FLOPPY_0, LEGACY_FLOPPY, 0) + MCFG_LEGACY_FLOPPY_CONFIG(agat840k_hle_floppy_interface) + MCFG_LEGACY_FLOPPY_IDX_CB(WRITELINE(a2bus_agat840k_hle_device, index_0_w)) + MCFG_DEVICE_ADD(FLOPPY_1, LEGACY_FLOPPY, 0) + MCFG_LEGACY_FLOPPY_CONFIG(agat840k_hle_floppy_interface) + MCFG_LEGACY_FLOPPY_IDX_CB(WRITELINE(a2bus_agat840k_hle_device, index_1_w)) + + MCFG_DEVICE_ADD("d14", I8255, 0) + // PA not connected + MCFG_I8255_IN_PORTB_CB(READ8(a2bus_agat840k_hle_device, d14_i_b)) // status signals from drive + MCFG_I8255_OUT_PORTC_CB(WRITE8(a2bus_agat840k_hle_device, d14_o_c)) // control + + MCFG_DEVICE_ADD("d15", I8255, 0) + MCFG_I8255_IN_PORTA_CB(READ8(a2bus_agat840k_hle_device, d15_i_a)) // read data +// MCFG_I8255_OUT_PORTB_CB(WRITE8(a2bus_agat840k_hle_device, d15_o_b)) // write data + MCFG_I8255_IN_PORTC_CB(READ8(a2bus_agat840k_hle_device, d15_i_c)) + MCFG_I8255_OUT_PORTC_CB(WRITE8(a2bus_agat840k_hle_device, d15_o_c)) +MACHINE_CONFIG_END + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const tiny_rom_entry *a2bus_agat840k_hle_device::device_rom_region() const +{ + return ROM_NAME(agat840k_hle); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +a2bus_agat840k_hle_device::a2bus_agat840k_hle_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) + , device_a2bus_card_interface(mconfig, *this) + , m_d14(*this, "d14") + , m_d15(*this, "d15") + , m_rom(nullptr) +{ +} + +a2bus_agat840k_hle_device::a2bus_agat840k_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + a2bus_agat840k_hle_device(mconfig, A2BUS_AGAT840K_HLE, tag, owner, clock) +{ +} + +WRITE_LINE_MEMBER(a2bus_agat840k_hle_device::index_0_w) +{ + index_callback(0, state); +} + +WRITE_LINE_MEMBER(a2bus_agat840k_hle_device::index_1_w) +{ + index_callback(1, state); +} + +void a2bus_agat840k_hle_device::index_callback(int unit, int state) +{ + if (unit != m_unit) return; + + LOG("index: unit %d state %d (%s)\n", unit, state, m_seen_magic ? "MAGIC" : "magic"); + +#if 0 + if (!state && !m_seen_magic) + { + m_seen_magic = true; + m_count_read = 0; + m_count_write = 0; + m_d15->pc4_w(0); // latch data into port A + m_d15->pc4_w(1); + m_timer_wait->adjust(attotime::from_usec(m_waittime), 0, attotime::from_usec(m_waittime)); + } +#endif +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void a2bus_agat840k_hle_device::device_start() +{ + // set_a2bus_device makes m_slot valid + set_a2bus_device(); + + m_rom = device().machine().root_device().memregion(this->subtag(AGAT840K_ROM_REGION).c_str())->base(); + + m_mxcs = MXCSR_SYNC; + + m_timer_wait = timer_alloc(TIMER_ID_WAIT); + m_timer_seek = timer_alloc(TIMER_ID_SEEK); + + m_seektime = 6000; // 6 ms, per es5323.txt + m_waittime = 32; // 16 bits x 2 us +} + +void a2bus_agat840k_hle_device::device_reset() +{ + u8 buf[256]; + + for (int i = 0; i < 2; i++) + { + legacy_floppy_image_device *img = floppy_image(i); + if (img) + { + img->floppy_drive_set_ready_state(FLOPPY_DRIVE_READY, 0); + img->floppy_drive_set_rpm(300.); + img->floppy_drive_seek(-img->floppy_drive_get_current_track()); + } + } + m_floppy = floppy_image(0); + + // generate track images in memory, using default volume ID and gap padding bytes + int t = 0; + for (auto &elem : m_tracks) + { + elem = std::make_unique(6250); + + for (int i = 0; i < 13; i++) + { + elem[i] = 0xaa; + } + for (int j = 0; j < 21; j++) + { + int k, cksum = 0, s = (j * 1) % 21; + + m_floppy->floppy_drive_read_sector_data(t & 1, s, buf, 256); + +#define BAUX 22 +#define BLOB (256 + 19 + BAUX) + + for (k = 0; k < 256; k++) + { + if (cksum > 255) { cksum++; cksum &= 255; } + cksum += buf[k]; + elem[13 + (BLOB * j) + 17 + k] = buf[k]; + } + cksum &= 255; + + elem[13 + (BLOB * j) + 0] = 0xa4; + elem[13 + (BLOB * j) + 1] = 0x80ff; // desync + elem[13 + (BLOB * j) + 2] = 0x95; + elem[13 + (BLOB * j) + 3] = 0x6a; + elem[13 + (BLOB * j) + 4] = 0x40fe; // volume id + elem[13 + (BLOB * j) + 5] = t; + elem[13 + (BLOB * j) + 6] = s; + elem[13 + (BLOB * j) + 7] = 0x5a; + elem[13 + (BLOB * j) + 8] = 0xaa; + elem[13 + (BLOB * j) + 9] = 0xaa; + elem[13 + (BLOB * j) + 10] = 0xaa; + elem[13 + (BLOB * j) + 11] = 0xaa; + elem[13 + (BLOB * j) + 12] = 0xaa; + elem[13 + (BLOB * j) + 13] = 0xa4; + elem[13 + (BLOB * j) + 14] = 0x80ff; // desync + elem[13 + (BLOB * j) + 15] = 0x6a; + elem[13 + (BLOB * j) + 16] = 0x95; + elem[13 + (BLOB * j) + 17 + 256] = cksum + 0x2000; + elem[13 + (BLOB * j) + 17 + 257] = 0x5a; + + // gap3 + for (k = 0; k < BAUX; k++) + { + elem[13 + (BLOB * j) + 17 + 258 + k] = 0xaa; + } + } +#undef BAUX +#undef BLOB + + t++; + if ((t & 1) == 0) + { + m_floppy->floppy_drive_seek(1); + } + } + m_floppy->floppy_drive_seek(-m_floppy->floppy_drive_get_current_track()); + + m_mxcs |= MXCSR_SYNC; + m_mxcs &= ~MXCSR_TR; +} + +void a2bus_agat840k_hle_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case TIMER_ID_WAIT: + { + m_count_read++; + m_count_read %= 6250; + m_d15->pc4_w(0); + m_d15->pc4_w(1); + if (BIT(m_tracks[(2 * m_floppy->floppy_drive_get_current_track()) + m_side][m_count_read], 15)) + m_mxcs &= ~MXCSR_SYNC; + } + break; + + case TIMER_ID_SEEK: + m_floppy->floppy_stp_w(1); + m_floppy->floppy_stp_w(0); + break; + } +} + + +/*------------------------------------------------- + read_c0nx - called for reads from this card's c0nx space +-------------------------------------------------*/ + +uint8_t a2bus_agat840k_hle_device::read_c0nx(address_space &space, uint8_t offset) +{ + u8 data; + + switch (offset) + { + case 0: case 1: case 2: case 3: + data = m_d14->read(space, offset); + break; + + case 4: case 5: case 6: case 7: + data = m_d15->read(space, offset - 4); + break; + + default: + data = 0xff; + break; + } + + return data; +} + + +/*------------------------------------------------- + write_c0nx - called for writes to this card's c0nx space +-------------------------------------------------*/ + +void a2bus_agat840k_hle_device::write_c0nx(address_space &space, uint8_t offset, uint8_t data) +{ + switch (offset) + { + case 0: case 1: case 2: case 3: + m_d14->write(space, offset, data); + break; + + case 4: case 5: case 6: case 7: + m_d15->write(space, offset - 4, data); + break; + + case 8: // write desync + break; + + case 9: // step + LOG("step at %11.6f\n", machine().time().as_double()); + m_seen_magic = false; + m_timer_wait->adjust(attotime::from_usec(m_seektime), 0, attotime::from_usec(m_waittime)); + m_floppy->floppy_stp_w(1); + m_floppy->floppy_stp_w(0); + break; + + case 10: // reset desync flipflop + m_mxcs |= MXCSR_SYNC; + break; + + default: + break; + } +} + +/*------------------------------------------------- + read_cnxx - called for reads from this card's c0nx space +-------------------------------------------------*/ + +uint8_t a2bus_agat840k_hle_device::read_cnxx(address_space &space, uint8_t offset) +{ + return m_rom[offset]; +} + +legacy_floppy_image_device *a2bus_agat840k_hle_device::floppy_image(int drive) +{ + const char *floppy_name = nullptr; + + switch (drive) + { + case 0: + floppy_name = FLOPPY_0; + break; + case 1: + floppy_name = FLOPPY_1; + break; + } + return subdevice(floppy_name); +} + +// all signals active low. write support not implemented; WPT is always active. +READ8_MEMBER(a2bus_agat840k_hle_device::d14_i_b) +{ + u8 data = 0x03; // one drive present, because drive select is broken + + m_floppy->floppy_drive_set_ready_state(FLOPPY_DRIVE_READY, 1); + + data |= (m_floppy->floppy_index_r() << 4) ^ 0x10; +// data |= m_floppy->floppy_wpt_r() << 5; + data |= m_floppy->floppy_tk00_r() << 6; + data |= m_floppy->floppy_ready_r() << 7; + + LOG("status A: %s %s (t %d) %s %s\n", BIT(data, 7) ? "ready" : "READY", BIT(data, 6) ? "tk00" : "TK00", + m_floppy->floppy_drive_get_current_track(), + BIT(data, 5) ? "wpt" : "WPT", BIT(data, 4) ? "index" : "INDEX"); + + return data; +} + +/* + * b0 AH strong write precomp + * b1 -- NC + * b2 -- step direction (1 - inward, 0 - outward) + * b3 -- drive select (0 - drive 1, 1 - drive 2) + * b4 -- head select (0 - bottom, 1 - top) + * b5 AH write precomp off + * b6 AH write enable + * b7 AH motor on + * + * C0x2 + */ +WRITE8_MEMBER(a2bus_agat840k_hle_device::d14_o_c) +{ + // drive select is broken in legacy flopdrv.cpp -- floppy_get_drive + m_unit = BIT(data, 3); + m_floppy = floppy_image(m_unit); + if (m_unit) + m_floppy->floppy_ds1_w(m_unit != 1); + else + m_floppy->floppy_ds0_w(m_unit != 0); + + m_floppy->floppy_drtn_w(!BIT(data, 2)); + m_side = BIT(data, 4); + m_floppy->floppy_wtg_w(!BIT(data, 6)); + m_floppy->floppy_mon_w(!BIT(data, 7)); // tied to 'drive select', 'motor on' and 'head load' + + if (!BIT(data, 7)) + { + m_seen_magic = false; + m_timer_wait->adjust(attotime::never); + } + else + { + m_d15->pc4_w(0); + m_d15->pc4_w(1); + m_timer_wait->adjust(attotime::from_usec(m_waittime), 0, attotime::from_usec(m_waittime)); + } + + LOG("D14 C <- %02X (unit %d side %d drtn %d wtg %d mon %d)\n", + data, m_unit, m_side, !BIT(data, 2), !BIT(data, 6), !BIT(data, 7)); +} + +// data are latched in by write to PC4 +READ8_MEMBER(a2bus_agat840k_hle_device::d15_i_a) +{ + u16 data = 0; + + data = m_tracks[(2 * m_floppy->floppy_drive_get_current_track()) + m_side][m_count_read]; + LOG("sector data: %02x @ %4d (head %d track %2d)%s\n", data & 0xff, m_count_read, + m_side, m_floppy->floppy_drive_get_current_track(), + BIT(data, 14) ? " volume" : (BIT(data, 13) ? " cksum" : "")); + + return data & 0xff; +} + +// C0x6 +// +// b6 AL desync detected +// b7 AH read or write data ready +READ8_MEMBER(a2bus_agat840k_hle_device::d15_i_c) +{ + LOG("status B: @ %4d %s %s (%s)\n", m_count_read, + BIT(m_mxcs, 7) ? "ready" : "READY", BIT(m_mxcs, 6) ? "SYNC" : "sync", + m_seen_magic ? "MAGIC" : "magic"); + + return m_mxcs; +} + +// C0x7 +// +// b0 -- connected to b7, set if m_intr[PORT_B] +// b2 AH b7 = ready for write data +// b3 -- connected to b7, set if m_intr[PORT_A] +// b4 AH b7 = read data ready +WRITE8_MEMBER(a2bus_agat840k_hle_device::d15_o_c) +{ + if (BIT(data, 0) || BIT(data, 3)) + { + m_mxcs |= MXCSR_TR; + } + else + { + m_mxcs &= ~MXCSR_TR; + } +} diff --git a/src/devices/bus/a2bus/agat840k_hle.h b/src/devices/bus/a2bus/agat840k_hle.h new file mode 100644 index 00000000000..42a1f2cc8c4 --- /dev/null +++ b/src/devices/bus/a2bus/agat840k_hle.h @@ -0,0 +1,99 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/********************************************************************* + + agat840k_hle.h + + High-level simulation of the Agat 840K floppy controller card + +*********************************************************************/ + +#ifndef MAME_BUS_A2BUS_AGAT840K_HLE_H +#define MAME_BUS_A2BUS_AGAT840K_HLE_H + +#pragma once + +#include "a2bus.h" +#include "machine/i8255.h" + + +#define MXCSR_SYNC 0x40 +#define MXCSR_TR 0x80 + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class a2bus_agat840k_hle_device: + public device_t, + public device_a2bus_card_interface +{ +public: + // construction/destruction + a2bus_agat840k_hle_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + DECLARE_READ8_MEMBER(d14_i_b); + DECLARE_READ8_MEMBER(d15_i_a); + DECLARE_READ8_MEMBER(d15_i_c); + DECLARE_WRITE8_MEMBER(d14_o_c); + DECLARE_WRITE8_MEMBER(d15_o_b); + DECLARE_WRITE8_MEMBER(d15_o_c); + + DECLARE_WRITE_LINE_MEMBER(index_0_w); + DECLARE_WRITE_LINE_MEMBER(index_1_w); + + void index_callback(int unit, int state); + +protected: + // construction/destruction + a2bus_agat840k_hle_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + + // overrides of standard a2bus slot functions + virtual uint8_t read_c0nx(address_space &space, uint8_t offset) override; + virtual void write_c0nx(address_space &space, uint8_t offset, uint8_t data) override; + virtual uint8_t read_cnxx(address_space &space, uint8_t offset) override; + + enum + { + TIMER_ID_WAIT = 0, + TIMER_ID_SEEK + }; + + required_device m_d14; + required_device m_d15; + +private: + legacy_floppy_image_device *floppy_image(int drive); + legacy_floppy_image_device *m_floppy; + bool m_side; + + std::unique_ptr m_tracks[160]; + int m_count_read; + int m_count_write; + bool m_seen_magic; + int m_current_track; + + u8 m_mxcs; + int m_unit; + int m_state; + + int m_seektime; + int m_waittime; + + emu_timer *m_timer_wait = nullptr; + emu_timer *m_timer_seek = nullptr; + + uint8_t *m_rom; +}; + +// device type definition +DECLARE_DEVICE_TYPE(A2BUS_AGAT840K_HLE, a2bus_agat840k_hle_device) + +#endif // MAME_BUS_A2BUS_AGAT840K_HLE_H diff --git a/src/lib/formats/agat840k_hle_dsk.cpp b/src/lib/formats/agat840k_hle_dsk.cpp new file mode 100644 index 00000000000..52cdd4668be --- /dev/null +++ b/src/lib/formats/agat840k_hle_dsk.cpp @@ -0,0 +1,59 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/********************************************************************** + + formats/agat840k_hle_dsk.cpp + + Agat 840KB floppies -- high level simulation (sector-level images) + + http://agatcomp.ru/Reading/docs/es5323.txt + https://github.com/sintech/AGAT/blob/master/docs/agat-840k-format.txt + http://www.torlus.com/floppy/forum/viewtopic.php?f=19&t=1385 + +************************************************************************/ + +#include + +#include "formats/agat840k_hle_dsk.h" + + +static FLOPPY_IDENTIFY(agat840k_hle_dsk_identify) +{ + switch (floppy_image_size(floppy)) + { + case 860160: + *vote = 100; + break; + + case 860164: + case 860288: + *vote = 99; + break; + + default: + *vote = 0; + break; + } + + return FLOPPY_ERROR_SUCCESS; +} + +static FLOPPY_CONSTRUCT(agat840k_hle_dsk_construct) +{ + struct basicdsk_geometry geometry; + + memset(&geometry, 0, sizeof(geometry)); + geometry.heads = 2; + geometry.first_sector_id = 0; + geometry.sector_length = 256; + geometry.tracks = 80; + geometry.sectors = 21; + + return basicdsk_construct(floppy, &geometry); +} + +LEGACY_FLOPPY_OPTIONS_START(agat840k_hle) + LEGACY_FLOPPY_OPTION(agat840k_hle_dsk, "ds9,dsk,raw", "Agat 840K DSK image", + agat840k_hle_dsk_identify, agat840k_hle_dsk_construct, nullptr, nullptr) +LEGACY_FLOPPY_OPTIONS_END + diff --git a/src/lib/formats/agat840k_hle_dsk.h b/src/lib/formats/agat840k_hle_dsk.h new file mode 100644 index 00000000000..dad245e3335 --- /dev/null +++ b/src/lib/formats/agat840k_hle_dsk.h @@ -0,0 +1,17 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/********************************************************************* + + formats/agat840k_hle_dsk.h + +*********************************************************************/ + +#ifndef AGAT840K_HLE_DSK_H_ +#define AGAT840K_HLE_DSK_H_ + +#include "flopimg.h" +#include "formats/basicdsk.h" + +LEGACY_FLOPPY_OPTIONS_EXTERN(agat840k_hle); + +#endif /* AGAT840K_HLE_DSK_H_ */ diff --git a/src/mame/drivers/agat.cpp b/src/mame/drivers/agat.cpp index 62f111e7255..9299a474805 100644 --- a/src/mame/drivers/agat.cpp +++ b/src/mame/drivers/agat.cpp @@ -2,18 +2,51 @@ // copyright-holders:R. Belmont, Sergey Svishchev /*************************************************************************** - agat.c - Skeleton driver for Agat series of Soviet Apple II non-clones - - These are similar to Apple II (same bus architecture, keyboard and - floppy interface), but video controller is completely different. - - To do: - - native keyboards (at least two variants) - - 840K floppy controller (MFM encoding, but track layout is unique) - - agat7: 64K and 128K onboard memory configurations - - agat9 - - 3rd party slot devices + agat.cpp + + Driver for Agat series of Soviet Apple II non-clones + + These are similar to Apple II (same bus architecture, keyboard + and floppy interface), but native video controllers are different. + + agat7 supports Apple (40col, HGR and DHR) video modes with add-on + card; agat9 has built-in support for 40col and HGR. Palette in + Apple modes is different and pixel stretching is not done. + + To do (common): + - native keyboard (at least two variants) + - video: text modes use 7x8 character cell and 224x256 raster + - video: vertical raster splits (used at least by Rapira) + - what is the state of devices at init and reset? + - what do floating bus reads do? + - ignore debugger reads -- use side_effect_disabled() + - softlists + + To do (agat7): + - hw variant: 16 colors + - hw variant: 256-char chargen + - hw variant: 64K and 128K onboard memory + - "500hz" interrupt breakage + - what does write to C009 do? (basedos7.nib) + + To do (agat9): + - memory banking: what does write to C18x..C1Fx do? + - memory expansion boards + - apple2 video compat mode incl. language card emulation + - 840K floppy controller: low level emulation, AIM format support + - mouse via parallel port + - hw revisions and agat9a model (via http://agatcomp.ru/Images/case.shtml) + + Slot devices -- 1st party: + - agat7: apple2 video card (decimal 3.089.121) -- http://agatcomp.ru/Images/new_j121.shtml + - agat7: serial-parallel card (decimal 3.089.10)6 + - agat9: printer card (decimal 3.089.17)4 + + Slot devices -- 3rd party: + - Nippel Clock (uses mc146818) + - Nippel mouse -- http://agatcomp.ru/Images/new_mouse.shtml + - Sprite Card-93 (uses fd1793) + - others ************************************************************************/ @@ -27,6 +60,7 @@ #include "bus/a2bus/a2diskii.h" #include "bus/a2bus/agat7langcard.h" #include "bus/a2bus/agat7ram.h" +#include "bus/a2bus/agat840k_hle.h" #include "screen.h" #include "softlist.h" @@ -78,14 +112,12 @@ public: required_device m_upperbank; TIMER_DEVICE_CALLBACK_MEMBER(ay3600_repeat); - TIMER_DEVICE_CALLBACK_MEMBER(agat_timer); - TIMER_DEVICE_CALLBACK_MEMBER(agat_vblank); + TIMER_DEVICE_CALLBACK_MEMBER(timer_irq); + INTERRUPT_GEN_MEMBER(agat_vblank); virtual void machine_start() override; virtual void machine_reset() override; - DECLARE_READ8_MEMBER(c000_r); - DECLARE_WRITE8_MEMBER(c000_w); DECLARE_READ8_MEMBER(c080_r); DECLARE_WRITE8_MEMBER(c080_w); DECLARE_READ8_MEMBER(c100_r); @@ -106,6 +138,20 @@ public: DECLARE_WRITE8_MEMBER(agat7_membank_w); DECLARE_READ8_MEMBER(agat7_ram_r); DECLARE_WRITE8_MEMBER(agat7_ram_w); + DECLARE_READ8_MEMBER(keyb_data_r); + DECLARE_READ8_MEMBER(keyb_strobe_r); + DECLARE_WRITE8_MEMBER(keyb_strobe_w); + DECLARE_READ8_MEMBER(cassette_toggle_r); + DECLARE_WRITE8_MEMBER(cassette_toggle_w); + DECLARE_READ8_MEMBER(speaker_toggle_r); + DECLARE_WRITE8_MEMBER(speaker_toggle_w); + DECLARE_READ8_MEMBER(interrupts_on_r); + DECLARE_WRITE8_MEMBER(interrupts_on_w); + DECLARE_READ8_MEMBER(interrupts_off_r); + DECLARE_WRITE8_MEMBER(interrupts_off_w); + DECLARE_READ8_MEMBER(flags_r); + DECLARE_READ8_MEMBER(controller_strobe_r); + DECLARE_WRITE8_MEMBER(controller_strobe_w); private: int m_speaker_state; @@ -291,120 +337,123 @@ void agat7_state::machine_reset() /*************************************************************************** I/O ***************************************************************************/ -// most softswitches don't care about read vs write, so handle them here -void agat7_state::do_io(address_space &space, int offset) + +READ8_MEMBER(agat7_state::keyb_data_r) { - if (machine().side_effect_disabled()) - { - return; - } + return m_strobe ? (m_transchar | m_strobe) : 0; +} - switch (offset & 0xf0) - { - case 0x20: - m_cassette_state ^= 1; - m_cassette->output(m_cassette_state ? 1.0f : -1.0f); - break; +READ8_MEMBER(agat7_state::keyb_strobe_r) +{ + // reads any key down, clears strobe + uint8_t rv = m_transchar | (m_anykeydown ? 0x80 : 0x00); + if (!machine().side_effect_disabled()) + m_strobe = 0; + return rv; +} - case 0x30: - m_speaker_state ^= 1; - m_speaker->level_w(m_speaker_state); - break; +WRITE8_MEMBER(agat7_state::keyb_strobe_w) +{ + // clear keyboard latch + m_strobe = 0; +} - // XXX agat7: 0x4N -- enable timer interrupts, 0x5N -- disable (or vice versa depending on hw rev) - case 0x40: - m_agat7_interrupts = true; - break; +READ8_MEMBER(agat7_state::cassette_toggle_r) +{ + if (!machine().side_effect_disabled()) + cassette_toggle_w(space, offset, 0); + return read_floatingbus(); +} - case 0x50: - m_agat7_interrupts = false; +WRITE8_MEMBER(agat7_state::cassette_toggle_w) +{ + m_cassette_state ^= 1; + m_cassette->output(m_cassette_state ? 1.0f : -1.0f); +} - case 0x70: - m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_joy1x->read(); - m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_joy1y->read(); - m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_joy2x->read(); - m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_joy2y->read(); - break; - } +READ8_MEMBER(agat7_state::speaker_toggle_r) +{ + if (!machine().side_effect_disabled()) + speaker_toggle_w(space, offset, 0); + return read_floatingbus(); } -READ8_MEMBER(agat7_state::c000_r) +WRITE8_MEMBER(agat7_state::speaker_toggle_w) { - if (offset) - logerror("%s: c000_r %04X == %02X\n", machine().describe_context(), offset+0xc000, 0); - else if (m_strobe) - logerror("%s: c000_r %04X == %02X\n", machine().describe_context(), offset+0xc000, m_transchar | m_strobe); + m_speaker_state ^= 1; + m_speaker->level_w(m_speaker_state); +} - switch (offset) - { - // keyboard latch. NB: agat7 returns 0 if latch is clear, agat9 returns char code. - case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: - case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: - return m_strobe ? (m_transchar | m_strobe) : 0; +READ8_MEMBER(agat7_state::interrupts_on_r) +{ + if (!machine().side_effect_disabled()) + interrupts_on_w(space, offset, 0); + return read_floatingbus(); +} - case 0x10: // reads any key down, clears strobe - { - uint8_t rv = m_transchar | (m_anykeydown ? 0x80 : 0x00); - m_strobe = 0; - return rv; - } +WRITE8_MEMBER(agat7_state::interrupts_on_w) +{ + m_agat7_interrupts = true; +} - case 0x60: // cassette in - case 0x68: - return m_cassette->input() > 0.0 ? 0x80 : 0; +READ8_MEMBER(agat7_state::interrupts_off_r) +{ + if (!machine().side_effect_disabled()) + interrupts_off_w(space, offset, 0); + return read_floatingbus(); +} - case 0x61: // button 0 - case 0x69: - return (m_joybuttons->read() & 0x10) ? 0x80 : 0; +WRITE8_MEMBER(agat7_state::interrupts_off_w) +{ + m_agat7_interrupts = false; +} + +READ8_MEMBER(agat7_state::flags_r) +{ + switch (offset) + { + case 0: // cassette in + return m_cassette->input() > 0.0 ? 0x80 : 0; - case 0x62: // button 1 - case 0x6a: - return (m_joybuttons->read() & 0x20) ? 0x80 : 0; + case 1: // button 0 + return (m_joybuttons->read() & 0x10) ? 0x80 : 0; - case 0x63: // button 2 - case 0x6b: - return ((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0 : 0x80; + case 2: // button 1 + return (m_joybuttons->read() & 0x20) ? 0x80 : 0; - case 0x64: // joy 1 X axis - case 0x6c: - return (space.machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0; + case 3: // button 2 + return ((m_joybuttons->read() & 0x40) || !(m_kbspecial->read() & 0x06)) ? 0x80 : 0; - case 0x65: // joy 1 Y axis - case 0x6d: - return (space.machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0; + case 4: // joy 1 X axis + return (space.machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0; - case 0x66: // joy 2 X axis - case 0x6e: - return (space.machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0; + case 5: // joy 1 Y axis + return (space.machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0; - case 0x67: // joy 2 Y axis - case 0x6f: - return (space.machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0; + case 6: // joy 2 X axis + return (space.machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0; - default: - do_io(space, offset); - break; + case 7: // joy 2 Y axis + return (space.machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0; } - return read_floatingbus(); + // this is never reached + return 0; } -WRITE8_MEMBER(agat7_state::c000_w) +READ8_MEMBER(agat7_state::controller_strobe_r) { - logerror("%s: c000_w %04X <- %02X\n", machine().describe_context(), offset + 0xc000, data); - - switch (offset) - { - // clear keyboard latch - case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: - case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: - m_strobe = 0; - break; + if (!machine().side_effect_disabled()) + controller_strobe_w(space, offset, 0); + return read_floatingbus(); +} - default: - do_io(space, offset); - break; - } +WRITE8_MEMBER(agat7_state::controller_strobe_w) +{ + m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_joy1x->read(); + m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_joy1y->read(); + m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_joy2x->read(); + m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_joy2y->read(); } READ8_MEMBER(agat7_state::c080_r) @@ -479,7 +528,7 @@ WRITE8_MEMBER(agat7_state::c100_w) m_cnxx_slot = slotnum; } - m_slotdevice[slotnum]->write_cnxx(space, offset&0xff, data); + m_slotdevice[slotnum]->write_cnxx(space, offset & 0xff, data); } } @@ -633,7 +682,14 @@ WRITE8_MEMBER(agat7_state::agat7_ram_w) static ADDRESS_MAP_START( agat7_map, AS_PROGRAM, 8, agat7_state ) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0000, 0xbfff) AM_READWRITE(agat7_ram_r, agat7_ram_w) - AM_RANGE(0xc000, 0xc07f) AM_READWRITE(c000_r, c000_w) + AM_RANGE(0xc000, 0xc000) AM_MIRROR(0xf) AM_READ(keyb_data_r) AM_WRITENOP + AM_RANGE(0xc010, 0xc010) AM_MIRROR(0xf) AM_READWRITE(keyb_strobe_r, keyb_strobe_w) + AM_RANGE(0xc020, 0xc020) AM_MIRROR(0xf) AM_READWRITE(cassette_toggle_r, cassette_toggle_w) + AM_RANGE(0xc030, 0xc030) AM_MIRROR(0xf) AM_READWRITE(speaker_toggle_r, speaker_toggle_w) + AM_RANGE(0xc040, 0xc040) AM_MIRROR(0xf) AM_READWRITE(interrupts_on_r, interrupts_on_w) + AM_RANGE(0xc050, 0xc050) AM_MIRROR(0xf) AM_READWRITE(interrupts_off_r, interrupts_off_w) + AM_RANGE(0xc060, 0xc067) AM_MIRROR(0x8) AM_READ(flags_r) AM_WRITENOP + AM_RANGE(0xc070, 0xc070) AM_MIRROR(0xf) AM_READWRITE(controller_strobe_r, controller_strobe_w) AM_RANGE(0xc080, 0xc0ef) AM_READWRITE(c080_r, c080_w) AM_RANGE(0xc0f0, 0xc0ff) AM_READWRITE(agat7_membank_r, agat7_membank_w) AM_RANGE(0xc100, 0xc6ff) AM_READWRITE(c100_r, c100_w) @@ -725,20 +781,20 @@ static const uint8_t a2_key_remap[0x40][4] = { 0x1a,0x1a,0x1a,0x1a }, /* Down */ { 0x10,0x10,0x10,0x10 }, /* KP1 */ { 0x0d,0x0d,0x0d,0x0d }, /* Enter 31 */ - { 0x11,0x11,0x11,0x11 }, - { 0x12,0x12,0x12,0x12 }, - { 0x13,0x13,0x13,0x13 }, - { 0x14,0x14,0x14,0x14 }, - { 0x1c,0x1c,0x1c,0x1c }, - { 0x1d,0x1d,0x1d,0x1d }, - { 0x1e,0x1e,0x1e,0x1e }, - { 0x1f,0x1f,0x1f,0x1f }, - { 0x01,0x01,0x01,0x01 }, - { 0x02,0x02,0x02,0x02 }, - { 0x03,0x03,0x03,0x03 }, - { 0x04,0x04,0x04,0x04 }, - { 0x05,0x05,0x05,0x05 }, - { 0x06,0x06,0x06,0x06 }, + { 0x11,0x11,0x11,0x11 }, /* KP2 */ + { 0x12,0x12,0x12,0x12 }, /* KP3 */ + { 0x13,0x13,0x13,0x13 }, /* KP4 */ + { 0x14,0x14,0x14,0x14 }, /* KP5 */ + { 0x1c,0x1c,0x1c,0x1c }, /* KP6 */ + { 0x1d,0x1d,0x1d,0x1d }, /* KP7 */ + { 0x1e,0x1e,0x1e,0x1e }, /* KP8 */ + { 0x1f,0x1f,0x1f,0x1f }, /* KP9 */ + { 0x01,0x01,0x01,0x01 }, /* KP0 */ + { 0x02,0x02,0x02,0x02 }, /* KP. */ + { 0x03,0x03,0x03,0x03 }, /* KP= */ + { 0x04,0x04,0x04,0x04 }, /* PF1 */ + { 0x05,0x05,0x05,0x05 }, /* PF2 */ + { 0x06,0x06,0x06,0x06 }, /* PF3 */ }; WRITE_LINE_MEMBER(agat7_state::ay3600_data_ready_w) @@ -777,19 +833,28 @@ TIMER_DEVICE_CALLBACK_MEMBER(agat7_state::ay3600_repeat) } } -TIMER_DEVICE_CALLBACK_MEMBER(agat7_state::agat_timer) +INTERRUPT_GEN_MEMBER(agat7_state::agat_vblank) { if (m_agat7_interrupts) { - m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); + m_maincpu->set_input_line(M6502_NMI_LINE, PULSE_LINE); } } -TIMER_DEVICE_CALLBACK_MEMBER(agat7_state::agat_vblank) +TIMER_DEVICE_CALLBACK_MEMBER(agat7_state::timer_irq) { if (m_agat7_interrupts) { - m_maincpu->set_input_line(M6502_NMI_LINE, ASSERT_LINE); + switch (param & 0x3f) + { + case 0: + m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); + break; + + case 0x20: + m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); + break; + } } } @@ -833,8 +898,8 @@ static INPUT_PORTS_START( agat7_joystick ) PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH) PORT_START("joystick_buttons") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(1) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(JOYCODE_BUTTON1) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(1) PORT_CODE(KEYCODE_ENTER_PAD)PORT_CODE(JOYCODE_BUTTON2) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(1) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(JOYCODE_BUTTON1) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(1) PORT_CODE(KEYCODE_ENTER_PAD)PORT_CODE(JOYCODE_BUTTON2) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(2) PORT_CODE(JOYCODE_BUTTON1) INPUT_PORTS_END @@ -879,7 +944,7 @@ static INPUT_PORTS_START( agat7_common ) PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHAR('u') PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CHAR('i') PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHAR('o') - PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHAR('@') + PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHAR('p') PORT_START("X2") PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CHAR('d') @@ -890,8 +955,8 @@ static INPUT_PORTS_START( agat7_common ) PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHAR('k') PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHAR('l') PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') - PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) - PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) + PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) + PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_START("X3") PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CHAR('z') @@ -912,8 +977,8 @@ static INPUT_PORTS_START( agat7_common ) PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27) PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CHAR('a') PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) - PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) + PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) + PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 1") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) @@ -932,8 +997,8 @@ static INPUT_PORTS_START( agat7_common ) PORT_START("X6") PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Num =") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("PF1") PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD)) - PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("PF2") PORT_CODE(KEYCODE_ASTERISK) - PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("PF3") PORT_CODE(KEYCODE_MINUS_PAD) + PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("PF2") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) + PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("PF3") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED) PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED) PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_UNUSED) @@ -972,7 +1037,7 @@ static INPUT_PORTS_START( agat7_common ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Control") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) INPUT_PORTS_END static INPUT_PORTS_START(agat7) @@ -991,7 +1056,7 @@ static SLOT_INTERFACE_START(agat7_cards) SLOT_INTERFACE("a7lang", A2BUS_AGAT7LANGCARD) // Agat-7 RAM Language Card -- decimal 3.089.119 SLOT_INTERFACE("a7ram", A2BUS_AGAT7RAM) // Agat-7 32K RAM Card -- decimal 3.089.119-01, KR565RU6D chips SLOT_INTERFACE("a7fdc", A2BUS_AGAT7_FDC) // Disk II clone -- decimal 3.089.105 - // 840K floppy controller -- decimal 7.104.351 + SLOT_INTERFACE("a7fdc840", A2BUS_AGAT840K_HLE) // 840K floppy controller -- decimal 7.104.351 or 3.089.023? // Serial-parallel card -- decimal 3.089.106 // Printer card (agat9) -- decimal 3.089.174 @@ -1007,8 +1072,9 @@ SLOT_INTERFACE_END static MACHINE_CONFIG_START( agat7 ) MCFG_CPU_ADD("maincpu", M6502, XTAL_14_3MHz / 14) MCFG_CPU_PROGRAM_MAP(agat7_map) + MCFG_CPU_VBLANK_INT_DRIVER(A7_VIDEO_TAG ":a7screen", agat7_state, agat_vblank) - MCFG_TIMER_DRIVER_ADD_PERIODIC("agat7irq", agat7_state, agat_timer, attotime::from_hz(500)) + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", agat7_state, timer_irq, A7_VIDEO_TAG ":a7screen", 0, 1) MCFG_DEVICE_ADD(A7_VIDEO_TAG, AGAT7VIDEO, 0) @@ -1111,5 +1177,5 @@ ROM_START( agat9 ) ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS -COMP( 1983, agat7, apple2, 0, agat7, agat7, agat7_state, 0, "Agat", "Agat-7", MACHINE_NOT_WORKING) +COMP( 1983, agat7, apple2, 0, agat7, agat7, agat7_state, 0, "Agat", "Agat-7", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_CONTROLS) COMP( 1984, agat9, apple2, 0, agat7, agat7, agat7_state, 0, "Agat", "Agat-9", MACHINE_NOT_WORKING) -- cgit v1.2.3-70-g09d2 From 141f2364cc5896717ff5f81e49c65b1fd12d7cad Mon Sep 17 00:00:00 2001 From: AJR Date: Sun, 10 Dec 2017 09:06:41 -0500 Subject: New generic ripple counter device --- scripts/src/machine.lua | 12 ++ scripts/target/mame/arcade.lua | 1 + scripts/target/mame/mess.lua | 1 + src/devices/bus/ss50/mpc.cpp | 42 ++----- src/devices/machine/ripple_counter.cpp | 202 +++++++++++++++++++++++++++++++++ src/devices/machine/ripple_counter.h | 92 +++++++++++++++ src/mame/drivers/mermaid.cpp | 52 +++++---- src/mame/includes/mermaid.h | 8 +- 8 files changed, 350 insertions(+), 60 deletions(-) create mode 100644 src/devices/machine/ripple_counter.cpp create mode 100644 src/devices/machine/ripple_counter.h (limited to 'scripts/src') diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua index d254c010116..38017680f93 100644 --- a/scripts/src/machine.lua +++ b/scripts/src/machine.lua @@ -2196,6 +2196,18 @@ if (MACHINES["RF5C296"]~=null) then } end +--------------------------------------------------- +-- +--@src/devices/machine/ripple_counter.h,MACHINES["RIPPLE_COUNTER"] = true +--------------------------------------------------- + +if (MACHINES["RIPPLE_COUNTER"]~=null) then + files { + MAME_DIR .. "src/devices/machine/ripple_counter.cpp", + MAME_DIR .. "src/devices/machine/ripple_counter.h", + } +end + --------------------------------------------------- -- --@src/devices/machine/roc10937.h,MACHINES["ROC10937"] = true diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index 7d0902de2bd..1aa8b9d94b9 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -535,6 +535,7 @@ MACHINES["RA17XX"] = true --MACHINES["R64H156"] = true MACHINES["RF5C296"] = true --MACHINES["RIOT6532"] = true +MACHINES["RIPPLE_COUNTER"] = true MACHINES["ROC10937"] = true MACHINES["RP5C01"] = true MACHINES["RP5C15"] = true diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index ea2ee8ef9ec..03a80c4a6f0 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -524,6 +524,7 @@ MACHINES["PROM82S129"] = true MACHINES["R64H156"] = true MACHINES["RF5C296"] = true MACHINES["RIOT6532"] = true +MACHINES["RIPPLE_COUNTER"] = true MACHINES["ROC10937"] = true MACHINES["RP5C01"] = true MACHINES["RP5C15"] = true diff --git a/src/devices/bus/ss50/mpc.cpp b/src/devices/bus/ss50/mpc.cpp index 7f587d6bb62..8a1ac577a5e 100644 --- a/src/devices/bus/ss50/mpc.cpp +++ b/src/devices/bus/ss50/mpc.cpp @@ -13,6 +13,7 @@ #include "bus/rs232/rs232.h" #include "machine/6821pia.h" #include "machine/input_merger.h" +#include "machine/ripple_counter.h" //************************************************************************** // TYPE DEFINITIONS @@ -29,10 +30,8 @@ public: ss50_card_interface(mconfig, *this), m_pia(*this, "pia"), m_loopback(*this, "loopback"), + m_counter(*this, "counter"), m_baud_jumper(*this, "BAUD"), - m_cd4024ae_count(0), - m_cd4024ae_clock(false), - m_cd4024ae_reset(true), m_count_select(false) { } @@ -53,17 +52,13 @@ private: DECLARE_WRITE_LINE_MEMBER(serial_input_w); DECLARE_WRITE_LINE_MEMBER(reader_control_w); DECLARE_READ_LINE_MEMBER(count_r); - DECLARE_WRITE_LINE_MEMBER(count_reset_w); DECLARE_WRITE_LINE_MEMBER(count_select_w); - DECLARE_WRITE_LINE_MEMBER(clock_input_w); required_device m_pia; required_device m_loopback; + required_device m_counter; required_ioport m_baud_jumper; - u8 m_cd4024ae_count; - bool m_cd4024ae_clock; - bool m_cd4024ae_reset; bool m_count_select; }; @@ -113,7 +108,7 @@ MACHINE_CONFIG_MEMBER(ss50_mpc_device::device_add_mconfig) MCFG_PIA_READPB_HANDLER(IOPORT("STOP")) MCFG_DEVCB_BIT(6) MCFG_DEVCB_CHAIN_INPUT(READLINE(ss50_mpc_device, count_r)) MCFG_DEVCB_BIT(7) MCFG_PIA_WRITEPB_HANDLER(WRITELINE(ss50_mpc_device, count_select_w)) MCFG_DEVCB_BIT(2) - MCFG_DEVCB_CHAIN_OUTPUT(WRITELINE(ss50_mpc_device, count_reset_w)) MCFG_DEVCB_BIT(0) + MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("counter", ripple_counter_device, reset_w)) MCFG_DEVCB_BIT(0) //MCFG_PIA_IRQA_HANDLER(WRITELINE(ss50_mpc_device, pia_irq_w)) //MCFG_PIA_IRQB_HANDLER(WRITELINE(ss50_mpc_device, pia_irq_w)) @@ -126,6 +121,9 @@ MACHINE_CONFIG_MEMBER(ss50_mpc_device::device_add_mconfig) MCFG_INPUT_MERGER_ANY_HIGH("loopback") MCFG_INPUT_MERGER_OUTPUT_HANDLER(DEVWRITELINE("outgate", input_merger_device, in_w<1>)) + + MCFG_DEVICE_ADD("counter", RIPPLE_COUNTER, 0) // CD4024AE (IC3) + MCFG_RIPPLE_COUNTER_STAGES(7) // only Q5 (÷32) and Q4 (÷16) are actually used MACHINE_CONFIG_END @@ -135,9 +133,6 @@ MACHINE_CONFIG_END void ss50_mpc_device::device_start() { - save_item(NAME(m_cd4024ae_count)); - save_item(NAME(m_cd4024ae_clock)); - save_item(NAME(m_cd4024ae_reset)); save_item(NAME(m_count_select)); } @@ -155,14 +150,7 @@ WRITE_LINE_MEMBER(ss50_mpc_device::reader_control_w) READ_LINE_MEMBER(ss50_mpc_device::count_r) { - return BIT(m_cd4024ae_count, m_count_select ? 4 : 3); -} - -WRITE_LINE_MEMBER(ss50_mpc_device::count_reset_w) -{ - m_cd4024ae_reset = bool(state); - if (state) - m_cd4024ae_count = 0; + return BIT(m_counter->count(), m_count_select ? 4 : 3); } WRITE_LINE_MEMBER(ss50_mpc_device::count_select_w) @@ -170,16 +158,6 @@ WRITE_LINE_MEMBER(ss50_mpc_device::count_select_w) m_count_select = bool(state); } -WRITE_LINE_MEMBER(ss50_mpc_device::clock_input_w) -{ - if (m_cd4024ae_clock != bool(state)) - { - m_cd4024ae_clock = bool(state); - if (!state && !m_cd4024ae_reset) - m_cd4024ae_count++; - } -} - //------------------------------------------------- // register_read - read from a port register @@ -202,13 +180,13 @@ WRITE8_MEMBER(ss50_mpc_device::register_write) WRITE_LINE_MEMBER(ss50_mpc_device::f110_w) { if (m_baud_jumper->read()) - clock_input_w(state); + m_counter->clock_w(state); } WRITE_LINE_MEMBER(ss50_mpc_device::f300_w) { if (!m_baud_jumper->read()) - clock_input_w(state); + m_counter->clock_w(state); } diff --git a/src/devices/machine/ripple_counter.cpp b/src/devices/machine/ripple_counter.cpp new file mode 100644 index 00000000000..ae38d342d68 --- /dev/null +++ b/src/devices/machine/ripple_counter.cpp @@ -0,0 +1,202 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/********************************************************************** + + Generic binary ripple counter emulation + + This device emulates basic ripple counter logic ICs with falling- + edge clocks and a synchronous reset inputs such as CD4040 and + 74LS393. + + The optional 8-bit ROM interface is intended to help stream ROM + data to sound chips that lack memory interfaces of their own + (e.g. MSM5205, TMS5110). + +**********************************************************************/ + +#include "emu.h" +#include "machine/ripple_counter.h" + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +DEFINE_DEVICE_TYPE(RIPPLE_COUNTER, ripple_counter_device, "ripple_counter", "Generic ripple counter") + + +//************************************************************************** +// RIPPLE COUNTER DEVICE +//************************************************************************** + +//------------------------------------------------- +// ripple_counter_device - constructor +//------------------------------------------------- + +ripple_counter_device::ripple_counter_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, RIPPLE_COUNTER, tag, owner, clock), + device_rom_interface(mconfig, *this, 0, ENDIANNESS_LITTLE, 8), + m_count_out_cb(*this), + m_rom_out_cb(*this), + m_count_timer(nullptr), + m_count_mask(0), + m_count(1), + m_clk(false), + m_reset(false) +{ +} + + +//------------------------------------------------- +// static_set_stages - configure the number of +// stages used to count +//------------------------------------------------- + +void ripple_counter_device::static_set_stages(device_t &device, u8 stages) +{ + auto &dev = downcast(device); + dev.m_count_mask = (1U << stages) - 1; + dev.set_rom_addr_width(stages); +} + + +//------------------------------------------------- +// memory_space_config - return a description of +// any address spaces owned by this device +//------------------------------------------------- + +device_memory_interface::space_config_vector ripple_counter_device::memory_space_config() const +{ + if (m_rom_out_cb.isnull()) + return space_config_vector(); + else + return device_rom_interface::memory_space_config(); +} + + +//------------------------------------------------- +// device_validity_check - validate a device after +// the configuration has been constructed +//------------------------------------------------- + +void ripple_counter_device::device_validity_check(validity_checker &valid) const +{ + if (m_count_mask == 0) + osd_printf_error("No counting stages configured\n"); +} + + +//------------------------------------------------- +// device_resolve_objects - resolve objects that +// may be needed for other devices to set +// initial conditions at start time +//------------------------------------------------- + +void ripple_counter_device::device_resolve_objects() +{ + // resolve callbacks + m_count_out_cb.resolve_safe(); + m_rom_out_cb.resolve(); +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void ripple_counter_device::device_start() +{ + // initialize timers + m_count_timer = timer_alloc(TIMER_COUNT); + + // register internal state + save_item(NAME(m_count)); + save_item(NAME(m_clk)); + save_item(NAME(m_reset)); +} + + +//------------------------------------------------- +// device_clock_changed - called when the +// device clock is altered in any way +//------------------------------------------------- + +void ripple_counter_device::device_clock_changed() +{ + attotime freq = m_reset ? attotime::never : clocks_to_attotime(1); + m_count_timer->adjust(freq, 0, freq); +} + + +//------------------------------------------------- +// rom_bank_updated - called when the ROM bank +// is changed +//------------------------------------------------- + +void ripple_counter_device::rom_bank_updated() +{ + m_rom_out_cb(read_byte(m_count)); +} + + +//------------------------------------------------- +// set_count - update the count and associated +// outputs +//------------------------------------------------- + +void ripple_counter_device::set_count(u32 count) +{ + m_count = count; + m_count_out_cb(count); + if (!m_rom_out_cb.isnull()) + m_rom_out_cb(read_byte(count)); +} + + +//------------------------------------------------- +// clock_w - handle falling-edge clock input +//------------------------------------------------- + +WRITE_LINE_MEMBER(ripple_counter_device::clock_w) +{ + if (m_clk != bool(state)) + { + m_clk = bool(state); + if (!state && !m_reset) + set_count((m_count + 1) & m_count_mask); + } +} + + +//------------------------------------------------- +// reset_w - handle active-high reset input +//------------------------------------------------- + +WRITE_LINE_MEMBER(ripple_counter_device::reset_w) +{ + if (m_reset != bool(state)) + { + m_reset = bool(state); + if (state && m_count != 0) + set_count(0); + + // stop or start the count timer as required + notify_clock_changed(); + } +} + + +//------------------------------------------------- +// device_timer - called whenever a device timer +// fires +//------------------------------------------------- + +void ripple_counter_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case TIMER_COUNT: + set_count((m_count + 1) & m_count_mask); + break; + } +} diff --git a/src/devices/machine/ripple_counter.h b/src/devices/machine/ripple_counter.h new file mode 100644 index 00000000000..f9e997f3348 --- /dev/null +++ b/src/devices/machine/ripple_counter.h @@ -0,0 +1,92 @@ +// license:BSD-3-Clause +// copyright-holders:AJR +/********************************************************************** + + Generic binary ripple counter emulation + +**********************************************************************/ + +#ifndef MAME_MACHINE_RIPPLE_COUNTER_H +#define MAME_MACHINE_RIPPLE_COUNTER_H + +#pragma once + +//************************************************************************** +// CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_RIPPLE_COUNTER_STAGES(_stages) \ + ripple_counter_device::static_set_stages(*device, _stages); + +// output callbacks +#define MCFG_RIPPLE_COUNTER_COUNT_OUT_CB(_devcb) \ + devcb = &ripple_counter_device::static_set_count_out_cb(*device, DEVCB_##_devcb); +#define MCFG_RIPPLE_COUNTER_ROM_OUT_CB(_devcb) \ + devcb = &ripple_counter_device::static_set_rom_out_cb(*device, DEVCB_##_devcb); + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> ripple_counter_device + +class ripple_counter_device : public device_t, public device_rom_interface +{ +public: + // construction/destruction + ripple_counter_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // static configuration + static void static_set_stages(device_t &device, u8 stages); + template static devcb_base &static_set_count_out_cb(device_t &device, Object &&cb) + { return downcast(device).m_count_out_cb.set_callback(std::forward(cb)); } + template static devcb_base &static_set_rom_out_cb(device_t &device, Object &&cb) + { return downcast(device).m_rom_out_cb.set_callback(std::forward(cb)); } + + // control line handlers + DECLARE_WRITE_LINE_MEMBER(clock_w); + DECLARE_WRITE_LINE_MEMBER(reset_w); + + // getters + u32 count() const { return m_count; } + +protected: + // device-level overrides + virtual void device_validity_check(validity_checker &valid) const override; + virtual void device_resolve_objects() override; + virtual void device_start() override; + virtual void device_clock_changed() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + + // device_rom_interface overrides + virtual space_config_vector memory_space_config() const override; + virtual void rom_bank_updated() override; + +private: + // internal helpers + void set_count(u32 count); + + // device callbacks + devcb_write32 m_count_out_cb; + devcb_write8 m_rom_out_cb; + + // device timers + enum + { + TIMER_COUNT + }; + emu_timer *m_count_timer; + + // configuration parameters + u32 m_count_mask; + + // running state + u32 m_count; + bool m_clk; + bool m_reset; +}; + +// device type definition +DECLARE_DEVICE_TYPE(RIPPLE_COUNTER, ripple_counter_device) + +#endif // MAME_MACHINE_RIPPLE_COUNTER_H diff --git a/src/mame/drivers/mermaid.cpp b/src/mame/drivers/mermaid.cpp index 2ab899f4d38..eaf4c46fc59 100644 --- a/src/mame/drivers/mermaid.cpp +++ b/src/mame/drivers/mermaid.cpp @@ -180,21 +180,22 @@ ADDRESS_MAP_END WRITE_LINE_MEMBER(mermaid_state::rougien_sample_rom_lo_w) { m_adpcm_rom_sel = state | (m_adpcm_rom_sel & 2); + m_adpcm_counter->set_rom_bank(m_adpcm_rom_sel); } WRITE_LINE_MEMBER(mermaid_state::rougien_sample_rom_hi_w) { m_adpcm_rom_sel = (state <<1) | (m_adpcm_rom_sel & 1); + m_adpcm_counter->set_rom_bank(m_adpcm_rom_sel); } WRITE_LINE_MEMBER(mermaid_state::rougien_sample_playback_w) { if (state) { - m_adpcm_pos = m_adpcm_rom_sel*0x1000; - m_adpcm_end = m_adpcm_pos+0x1000; m_adpcm_idle = 0; m_adpcm->reset_w(0); + m_adpcm_counter->reset_w(0); } } @@ -366,13 +367,10 @@ void mermaid_state::machine_start() save_item(NAME(m_rougien_gfxbank2)); save_item(NAME(m_ay8910_enable)); - save_item(NAME(m_adpcm_pos)); - save_item(NAME(m_adpcm_end)); save_item(NAME(m_adpcm_idle)); save_item(NAME(m_adpcm_data)); save_item(NAME(m_adpcm_trigger)); save_item(NAME(m_adpcm_rom_sel)); - save_item(NAME(m_adpcm_play_reg)); } void mermaid_state::machine_reset() @@ -387,33 +385,32 @@ void mermaid_state::machine_reset() m_adpcm_idle = 1; m_adpcm_rom_sel = 0; - m_adpcm_play_reg = 0; + m_adpcm->reset_w(1); + m_adpcm_counter->reset_w(1); + m_adpcm_trigger = 0; + m_adpcm_data = 0; } /* Similar to Jantotsu, apparently the HW has three ports that controls what kind of sample should be played. Every sample size is 0x1000. */ +WRITE8_MEMBER(mermaid_state::adpcm_data_w) +{ + m_adpcm_data = data; + m_adpcm->data_w(m_adpcm_trigger ? (data & 0x0f) : (data & 0xf0) >> 4); +} + WRITE_LINE_MEMBER(mermaid_state::rougien_adpcm_int) { -// popmessage("%08x",m_adpcm_pos); + if (!state) + return; - if (m_adpcm_pos >= m_adpcm_end || m_adpcm_idle) + m_adpcm_trigger ^= 1; + m_adpcm->data_w(m_adpcm_trigger ? (m_adpcm_data & 0x0f) : (m_adpcm_data & 0xf0) >> 4); + m_adpcm_counter->clock_w(m_adpcm_trigger); + if (m_adpcm_trigger == 0 && m_adpcm_counter->count() == 0) { - //m_adpcm_idle = 1; + m_adpcm_idle = 1; m_adpcm->reset_w(1); - m_adpcm_trigger = 0; - } - else - { - uint8_t *ROM = memregion("adpcm")->base(); - - m_adpcm_data = ((m_adpcm_trigger ? (ROM[m_adpcm_pos] & 0x0f) : (ROM[m_adpcm_pos] & 0xf0) >> 4)); - m_adpcm->data_w(m_adpcm_data & 0xf); - m_adpcm_trigger ^= 1; - if (m_adpcm_trigger == 0) - { - m_adpcm_pos++; - //if ((ROM[m_adpcm_pos] & 0xff) == 0x70) - // m_adpcm_idle = 1; - } + m_adpcm_counter->reset_w(1); } } @@ -483,9 +480,14 @@ static MACHINE_CONFIG_DERIVED( rougien, mermaid ) MCFG_PALETTE_INIT_OWNER(mermaid_state,rougien) MCFG_SOUND_ADD("adpcm", MSM5205, 384000) - MCFG_MSM5205_VCLK_CB(WRITELINE(mermaid_state, rougien_adpcm_int)) /* interrupt function */ + MCFG_MSM5205_VCK_CALLBACK(WRITELINE(mermaid_state, rougien_adpcm_int)) MCFG_MSM5205_PRESCALER_SELECTOR(S96_4B) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) + + MCFG_DEVICE_ADD("adpcm_counter", RIPPLE_COUNTER, 0) + MCFG_DEVICE_ROM("adpcm") + MCFG_RIPPLE_COUNTER_STAGES(12) + MCFG_RIPPLE_COUNTER_ROM_OUT_CB(WRITE8(mermaid_state, adpcm_data_w)) MACHINE_CONFIG_END /* ROMs */ diff --git a/src/mame/includes/mermaid.h b/src/mame/includes/mermaid.h index 6c7e5451aed..62b78871823 100644 --- a/src/mame/includes/mermaid.h +++ b/src/mame/includes/mermaid.h @@ -5,6 +5,8 @@ Mermaid *************************************************************************/ + +#include "machine/ripple_counter.h" #include "sound/msm5205.h" #include "sound/ay8910.h" #include "screen.h" @@ -22,6 +24,7 @@ public: m_colorram(*this, "colorram"), m_maincpu(*this, "maincpu"), m_adpcm(*this, "adpcm"), + m_adpcm_counter(*this, "adpcm_counter"), m_ay8910(*this, "ay%u", 1), m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), @@ -51,18 +54,16 @@ public: int m_rougien_gfxbank2; /* sound-related */ - uint32_t m_adpcm_pos; - uint32_t m_adpcm_end; uint8_t m_adpcm_idle; int m_adpcm_data; uint8_t m_adpcm_trigger; uint8_t m_adpcm_rom_sel; - uint8_t m_adpcm_play_reg; bool m_ay8910_enable[2]; /* devices */ required_device m_maincpu; optional_device m_adpcm; + optional_device m_adpcm_counter; required_device_array m_ay8910; required_device m_gfxdecode; required_device m_screen; @@ -77,6 +78,7 @@ public: DECLARE_WRITE_LINE_MEMBER(rougien_sample_rom_lo_w); DECLARE_WRITE_LINE_MEMBER(rougien_sample_rom_hi_w); DECLARE_WRITE_LINE_MEMBER(rougien_sample_playback_w); + DECLARE_WRITE8_MEMBER(adpcm_data_w); DECLARE_WRITE8_MEMBER(mermaid_videoram2_w); DECLARE_WRITE8_MEMBER(mermaid_videoram_w); DECLARE_WRITE8_MEMBER(mermaid_colorram_w); -- cgit v1.2.3-70-g09d2