diff --git a/src/devices/cpu/e132xs/32xsdefs.h b/src/devices/cpu/e132xs/32xsdefs.h index 1a81b30dc5b..b2348360a24 100644 --- a/src/devices/cpu/e132xs/32xsdefs.h +++ b/src/devices/cpu/e132xs/32xsdefs.h @@ -129,9 +129,6 @@ /* write word */ #define IO_WRITE_W(addr, data) m_io->write_dword(((addr) >> 11) & 0x7ffc, data) - -#define READ_OP(addr) m_pr16(addr) - // set C in adds/addsi/subs/sums #define SETCARRYS 0 #define MISSIONCRAFT_FLAGS 1 @@ -176,6 +173,7 @@ #define N_SHIFT 2 #define V_SHIFT 3 #define S_SHIFT 18 +#define ILC_SHIFT 19 /* SR flags */ #define GET_C ( SR & C_MASK) // bit 0 //CARRY diff --git a/src/devices/cpu/e132xs/e132xs.cpp b/src/devices/cpu/e132xs/e132xs.cpp index a4e14e15af0..eaebc6d2d84 100644 --- a/src/devices/cpu/e132xs/e132xs.cpp +++ b/src/devices/cpu/e132xs/e132xs.cpp @@ -418,19 +418,6 @@ uint32_t hyperstone_device::get_emu_code_addr(uint8_t num) /* num is OP */ #if E132XS_LOG_INTERPRETER_REGS void hyperstone_device::dump_registers() { - static uint64_t total_ops = 0; - //static uint64_t total_11094 = 0; - total_ops++; - if (total_ops < 0ULL) - { - //if (m_core->global_regs[0] == 0x11094) - //{ - // total_11094++; - //} - return; - } else if (total_ops == 0ULL) { - //printf("Total non-log hits of 0x11094: %d\n", (uint32_t)total_11094); - } uint8_t packed[4]; packed[0] = (uint8_t)m_core->intblock; packed[1] = (uint8_t)(m_core->icount >> 16); @@ -710,21 +697,21 @@ uint32_t hyperstone_device::decode_immediate_s() case 1: { m_instruction_length = (3<<19); - uint32_t extra_u = (READ_OP(PC) << 16) | READ_OP(PC + 2); + uint32_t extra_u = (m_pr16(PC) << 16) | m_pr16(PC + 2); PC += 4; return extra_u; } case 2: { m_instruction_length = (2<<19); - uint32_t extra_u = READ_OP(PC); + uint32_t extra_u = m_pr16(PC); PC += 2; return extra_u; } case 3: { m_instruction_length = (2<<19); - uint32_t extra_u = 0xffff0000 | READ_OP(PC); + uint32_t extra_u = 0xffff0000 | m_pr16(PC); PC += 2; return extra_u; } @@ -735,14 +722,13 @@ uint32_t hyperstone_device::decode_immediate_s() uint32_t hyperstone_device::decode_const() { - const uint16_t imm_1 = READ_OP(PC); + const uint16_t imm_1 = m_pr16(PC); PC += 2; - m_instruction_length = (2<<19); if (imm_1 & 0x8000) { - const uint16_t imm_2 = READ_OP(PC); + const uint16_t imm_2 = m_pr16(PC); PC += 2; m_instruction_length = (3<<19); @@ -756,6 +742,8 @@ uint32_t hyperstone_device::decode_const() } else { + m_instruction_length = (2<<19); + uint32_t imm = imm_1 & 0x3fff; if (imm_1 & 0x4000) @@ -768,7 +756,7 @@ int32_t hyperstone_device::decode_pcrel() { if (OP & 0x80) { - uint16_t next = READ_OP(PC); + uint16_t next = m_pr16(PC); PC += 2; m_instruction_length = (2<<19); @@ -1099,6 +1087,8 @@ void hyperstone_device::device_start() void hyperstone_device::init(int scale_mask) { + m_instruction_length_valid = false; + m_core = (internal_hyperstone_state *)m_cache.alloc_near(sizeof(internal_hyperstone_state)); memset(m_core, 0, sizeof(internal_hyperstone_state)); @@ -1630,6 +1620,51 @@ void hyperstone_device::hyperstone_do() fatalerror("Executed hyperstone_do instruction. PC = %08X\n", PC-4); } +uint32_t hyperstone_device::imm_length(uint16_t op) +{ + switch (op & 0x0f) + { + case 0: + default: + return 1; + case 1: + return 3; + case 2: + case 3: + return 2; + } +} + +int32_t hyperstone_device::get_instruction_length(uint16_t op) +{ + switch (op >> 8) + { + 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: + case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: + case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f: + case 0xee: case 0xef: + m_instruction_length = ((m_pr16(PC+2) & 0x8000) ? 3 : 2) << ILC_SHIFT; + break; + case 0x61: case 0x63: case 0x65: case 0x67: case 0x69: case 0x6b: case 0x6d: case 0x6f: + case 0x71: case 0x73: case 0x75: case 0x77: case 0x79: case 0x7b: case 0x7d: case 0x7f: + m_instruction_length = imm_length(op) << ILC_SHIFT; + break; + case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7: + case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: + m_instruction_length = ((op & 0x80) ? 2 : 1) << ILC_SHIFT; + break; + case 0xce: + m_instruction_length = 2 << ILC_SHIFT; + break; + default: + m_instruction_length = 1 << ILC_SHIFT; + break; + } + m_instruction_length_valid = true; + return m_instruction_length; +} + //------------------------------------------------- // execute_run - execute a timeslice's worth of // opcodes @@ -1646,6 +1681,9 @@ void hyperstone_device::execute_run() if (m_core->intblock < 0) m_core->intblock = 0; + if (!m_instruction_length_valid) + SET_ILC(get_instruction_length(m_pr16(PC))); + if (m_core->timer_int_pending) check_interrupts(); else @@ -1659,10 +1697,10 @@ void hyperstone_device::execute_run() debugger_instruction_hook(PC); - OP = READ_OP(PC); + OP = m_pr16(PC); PC += 2; - m_instruction_length = (1<<19); + m_instruction_length = 1 << ILC_SHIFT; #if E132XS_COUNT_INSTRUCTIONS m_op_counts[m_op >> 8]++; diff --git a/src/devices/cpu/e132xs/e132xs.h b/src/devices/cpu/e132xs/e132xs.h index c9df8f271f6..ff5e9cb9bdb 100644 --- a/src/devices/cpu/e132xs/e132xs.h +++ b/src/devices/cpu/e132xs/e132xs.h @@ -135,6 +135,8 @@ public: void e132_4k_iram_map(address_map &map); void e132_8k_iram_map(address_map &map); + static uint32_t imm_length(uint16_t op); + protected: // compilation boundaries -- how far back/forward does the analysis extend? enum : u32 @@ -312,7 +314,8 @@ protected: /* core state */ internal_hyperstone_state *m_core; - int32_t m_instruction_length; + int32_t m_instruction_length; + bool m_instruction_length_valid; emu_timer *m_timer; @@ -332,6 +335,7 @@ private: uint32_t get_global_register(uint8_t code); uint32_t get_emu_code_addr(uint8_t num); + int32_t get_instruction_length(uint16_t op); TIMER_CALLBACK_MEMBER(timer_callback); @@ -479,7 +483,7 @@ private: void static_generate_interrupt_checks(); void generate_interrupt_checks_no_timer(drcuml_block &block, uml::code_label &labelnum); void generate_interrupt_checks_with_timer(drcuml_block &block, uml::code_label &labelnum); - void generate_branch(drcuml_block &block, uml::parameter targetpc, bool update_cycles = true); + void generate_branch(drcuml_block &block, uml::parameter targetpc, const opcode_desc *desc, bool update_cycles = true); void generate_update_cycles(drcuml_block &block, bool check_interrupts = true); 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); diff --git a/src/devices/cpu/e132xs/e132xsdrc.cpp b/src/devices/cpu/e132xs/e132xsdrc.cpp index 0603e8eeeec..31bcda4b104 100644 --- a/src/devices/cpu/e132xs/e132xsdrc.cpp +++ b/src/devices/cpu/e132xs/e132xsdrc.cpp @@ -865,8 +865,11 @@ void hyperstone_device::log_add_disasm_comment(drcuml_block &block, uint32_t pc, generate_branch ------------------------------------------------------------------*/ -void hyperstone_device::generate_branch(drcuml_block &block, uml::parameter targetpc, bool update_cycles) +void hyperstone_device::generate_branch(drcuml_block &block, uml::parameter targetpc, const opcode_desc *desc, bool update_cycles) { + if (desc) + UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK); + if (update_cycles) generate_update_cycles(block); @@ -910,8 +913,6 @@ void hyperstone_device::generate_sequence_instruction(drcuml_block &block, compi UML_DEBUG(block, desc->pc); } - UML_ROLINS(block, DRC_SR, (1<<19), 0, ILC_MASK); - if (!(desc->flags & OPFLAG_VIRTUAL_NOOP)) { /* compile the instruction */ @@ -930,7 +931,6 @@ bool hyperstone_device::generate_opcode(drcuml_block &block, compiler_state &com { uint32_t op = (uint32_t)desc->opptr.w[0]; - //UML_MOV(block, I0, op); UML_ADD(block, DRC_PC, DRC_PC, 2); switch (op >> 8) @@ -1193,6 +1193,8 @@ bool hyperstone_device::generate_opcode(drcuml_block &block, compiler_state &com case 0xff: generate_trap_op(block, compiler, desc); break; } + UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK); + int no_delay_taken = compiler.m_labelnum++; UML_TEST(block, mem(&m_core->delay_slot_taken), ~0); UML_JMPc(block, uml::COND_Z, no_delay_taken); @@ -1209,6 +1211,5 @@ bool hyperstone_device::generate_opcode(drcuml_block &block, compiler_state &com UML_EXHc(block, uml::COND_E, *m_exception[EXCEPTION_TRACE], 0); UML_LABEL(block, done); - return true; } diff --git a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx index a5c3defdac1..f61f88f482b 100644 --- a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx +++ b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx @@ -16,11 +16,11 @@ void hyperstone_device::generate_check_delay_pc(drcuml_block &block, compiler_st 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); + const uint16_t imm_1 = m_pr16(desc->pc + 2); if (imm_1 & 0x8000) { - const uint16_t imm_2 = READ_OP(desc->pc + 4); + const uint16_t imm_2 = m_pr16(desc->pc + 4); uint32_t imm = imm_2; imm |= ((imm_1 & 0x3fff) << 16); @@ -28,7 +28,6 @@ void hyperstone_device::generate_decode_const(drcuml_block &block, compiler_stat if (imm_1 & 0x4000) imm |= 0xc0000000; - UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 4); UML_MOV(block, I1, imm); } @@ -39,7 +38,6 @@ void hyperstone_device::generate_decode_const(drcuml_block &block, compiler_stat if (imm_1 & 0x4000) imm |= 0xffffc000; - UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 2); UML_MOV(block, I1, imm); } @@ -56,24 +54,21 @@ void hyperstone_device::generate_decode_immediate_s(drcuml_block &block, compile return; case 1: { - uint32_t extra_u = (READ_OP(desc->pc + 2) << 16) | READ_OP(desc->pc + 4); - UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK); + uint32_t extra_u = (m_pr16(desc->pc + 2) << 16) | m_pr16(desc->pc + 4); 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_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK); + uint32_t extra_u = m_pr16(desc->pc + 2); 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_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK); + uint32_t extra_u = 0xffff0000 | m_pr16(desc->pc + 2); UML_ADD(block, DRC_PC, DRC_PC, 2); UML_MOV(block, I1, extra_u); return; @@ -88,11 +83,9 @@ void hyperstone_device::generate_ignore_immediate_s(drcuml_block &block, const o { 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_ROLINS(block, DRC_SR, lengths[nybble], 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, offsets[nybble]); } @@ -103,7 +96,7 @@ void hyperstone_device::generate_decode_pcrel(drcuml_block &block, const opcode_ int32_t offset; if (op & 0x80) { - uint16_t next = READ_OP(desc->pc + 2); + uint16_t next = m_pr16(desc->pc + 2); offset = (op & 0x7f) << 16; offset |= (next & 0xfffe); @@ -111,7 +104,6 @@ void hyperstone_device::generate_decode_pcrel(drcuml_block &block, const opcode_ if (next & 1) offset |= 0xff800000; - UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 2); } else @@ -132,7 +124,6 @@ void hyperstone_device::generate_ignore_pcrel(drcuml_block &block, const opcode_ if (op & 0x80) { UML_ADD(block, DRC_PC, DRC_PC, 2); - UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK); } } @@ -275,7 +266,7 @@ void hyperstone_device::generate_trap_exception_or_int(drcuml_block &block) UML_OR(block, DRC_SR, DRC_SR, (L_MASK | S_MASK)); UML_MOV(block, DRC_PC, I0); - generate_branch(block, DRC_PC, true); + generate_branch(block, DRC_PC, nullptr, true); } void hyperstone_device::generate_int(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc, uint32_t addr) @@ -368,7 +359,7 @@ void hyperstone_device::generate_software(drcuml_block &block, compiler_state &c UML_ROLINS(block, I0, I4, 25, 0xfe000000); // SET_FP(reg) UML_AND(block, DRC_SR, I0, ~(M_MASK | T_MASK)); - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } @@ -471,7 +462,6 @@ void hyperstone_device::generate_movd(drcuml_block &block, compiler_state &compi UML_AND(block, DRC_SR, I3, 0xffe3ffff); UML_ROLINS(block, DRC_SR, I2, S_SHIFT, S_MASK); - UML_ROLINS(block, DRC_SR, (1<<19), 0, ILC_MASK); UML_TEST(block, mem(&m_core->intblock), ~0); UML_MOVc(block, uml::COND_Z, mem(&m_core->intblock), 1); @@ -522,7 +512,7 @@ void hyperstone_device::generate_movd(drcuml_block &block, compiler_state &compi UML_LABEL(block, done_ret); UML_MOV(block, mem(&SP), I0); - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); return; } else if (SRC_GLOBAL && (src_code == SR_REGISTER)) // Rd doesn't denote PC and Rs denotes SR @@ -538,7 +528,7 @@ void hyperstone_device::generate_movd(drcuml_block &block, compiler_state &compi UML_MOV(block, I5, 0); generate_set_global_register(block, compiler, desc); if (dst_code == PC_REGISTER || dstf_code == PC_REGISTER) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -593,7 +583,7 @@ void hyperstone_device::generate_movd(drcuml_block &block, compiler_state &compi UML_MOV(block, I5, I1); generate_set_global_register(block, compiler, desc); if (dst_code == PC_REGISTER || dstf_code == PC_REGISTER) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -715,19 +705,17 @@ void hyperstone_device::generate_xm(drcuml_block &block, compiler_state &compile const uint32_t dst_code = (op & 0xf0) >> 4; const uint32_t src_code = op & 0xf; - const uint32_t next = READ_OP(desc->pc + 2); + const uint32_t next = m_pr16(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_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK); + extra_u = ((extra_u & 0xfff) << 16) | m_pr16(desc->pc + 4); UML_ADD(block, DRC_PC, DRC_PC, 4); } else { - UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 2); } @@ -840,7 +828,7 @@ void hyperstone_device::generate_mask(drcuml_block &block, compiler_state &compi UML_MOV(block, I5, I1); generate_set_global_register(block, compiler, desc); if (dst_code == PC_REGISTER) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -915,7 +903,7 @@ void hyperstone_device::generate_sum(drcuml_block &block, compiler_state &compil UML_MOV(block, I4, dst_code); generate_set_global_register(block, compiler, desc); if (dst_code == PC_REGISTER) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -1091,7 +1079,7 @@ void hyperstone_device::generate_mov(drcuml_block &block, compiler_state &compil generate_set_global_register(block, compiler, desc); UML_CMP(block, I3, 0); UML_JMPc(block, uml::COND_NE, done); - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -1170,7 +1158,7 @@ void hyperstone_device::generate_add(drcuml_block &block, compiler_state &compil if (dst_code == PC_REGISTER) { UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } } else @@ -1309,7 +1297,7 @@ void hyperstone_device::generate_subc(drcuml_block &block, compiler_state &compi UML_AND(block, I2, I2, I6); // old_z && dreg == 0 UML_OR(block, I5, I5, I2); UML_ROLINS(block, I5, I1, 3, N_MASK); - UML_ROLINS(block, DRC_SR, I5, 0, (V_MASK | Z_MASK | N_MASK)); + UML_ROLINS(block, DRC_SR, I5, 0, (C_MASK | V_MASK | Z_MASK | N_MASK)); if (DST_GLOBAL) { @@ -1320,7 +1308,7 @@ void hyperstone_device::generate_subc(drcuml_block &block, compiler_state &compi generate_set_global_register(block, compiler, desc); if (dst_code == PC_REGISTER) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -1409,7 +1397,7 @@ void hyperstone_device::generate_sub(drcuml_block &block, compiler_state &compil if (dst_code == PC_REGISTER) { UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } } else @@ -1491,7 +1479,7 @@ void hyperstone_device::generate_subs(drcuml_block &block, compiler_state &compi if (dst_code == PC_REGISTER) { - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } } else @@ -1509,6 +1497,7 @@ void hyperstone_device::generate_subs(drcuml_block &block, compiler_state &compi int no_exception = compiler.m_labelnum++; UML_TEST(block, DRC_SR, V_MASK); UML_JMPc(block, uml::COND_Z, no_exception); + UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK); generate_trap_exception_or_int(block); UML_LABEL(block, no_exception); } @@ -2113,7 +2102,7 @@ void hyperstone_device::generate_movi(drcuml_block &block, compiler_state &compi UML_TEST(block, op, 0xf0); UML_JMPc(block, uml::COND_NZ, done); UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); UML_LABEL(block, done); } @@ -2200,7 +2189,7 @@ void hyperstone_device::generate_addi(drcuml_block &block, compiler_state &compi if (dst_code == PC_REGISTER) { UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } } else @@ -2350,7 +2339,7 @@ void hyperstone_device::generate_andni(drcuml_block &block, compiler_state &comp generate_set_global_register(block, compiler, desc); if (dst_code == PC_REGISTER) { - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } } else @@ -2413,7 +2402,7 @@ void hyperstone_device::generate_ori(drcuml_block &block, compiler_state &compil generate_set_global_register(block, compiler, desc); if (dst_code == PC_REGISTER) { - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } } else @@ -2476,7 +2465,7 @@ void hyperstone_device::generate_xori(drcuml_block &block, compiler_state &compi generate_set_global_register(block, compiler, desc); if (dst_code == PC_REGISTER) { - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } } else @@ -3259,13 +3248,13 @@ template opptr.w[0]; - uint16_t next_1 = READ_OP(desc->pc + 2); + uint16_t next_1 = m_pr16(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); + const uint16_t next_2 = m_pr16(desc->pc + 4); extra_s = next_2; extra_s |= ((next_1 & 0xfff) << 16); @@ -3273,7 +3262,6 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp if (next_1 & 0x4000) extra_s |= 0xf0000000; - UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 4); } else @@ -3283,7 +3271,6 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp if (next_1 & 0x4000) extra_s |= 0xfffff000; - UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 2); } @@ -3323,7 +3310,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp UML_MOV(block, I4, src_code); generate_set_global_register(block, compiler, desc); if (src_code == PC_REGISTER) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -3344,7 +3331,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp UML_MOV(block, I5, I1); generate_set_global_register(block, compiler, desc); if (src_code == PC_REGISTER) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -3371,7 +3358,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp generate_set_global_register(block, compiler, desc); if (src_code == 0) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -3407,7 +3394,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp UML_MOV(block, I4, src_code); generate_set_global_register(block, compiler, desc); if (src_code == PC_REGISTER) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -3426,7 +3413,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp UML_MOV(block, I4, src_code); generate_set_global_register(block, compiler, desc); if (src_code == PC_REGISTER) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -3462,7 +3449,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp UML_MOV(block, I4, src_code); generate_set_global_register(block, compiler, desc); if (src_code == 0) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -3483,7 +3470,7 @@ void hyperstone_device::generate_ldxx1(drcuml_block &block, compiler_state &comp UML_MOV(block, I4, src_code); generate_set_global_register(block, compiler, desc); if (src_code == PC_REGISTER) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -3519,13 +3506,13 @@ template opptr.w[0]; - uint16_t next_1 = READ_OP(desc->pc + 2); + uint16_t next_1 = m_pr16(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); + const uint16_t next_2 = m_pr16(desc->pc + 4); extra_s = next_2; extra_s |= ((next_1 & 0xfff) << 16); @@ -3533,7 +3520,6 @@ void hyperstone_device::generate_ldxx2(drcuml_block &block, compiler_state &comp if (next_1 & 0x4000) extra_s |= 0xf0000000; - UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 4); } else @@ -3543,7 +3529,6 @@ void hyperstone_device::generate_ldxx2(drcuml_block &block, compiler_state &comp if (next_1 & 0x4000) extra_s |= 0xfffff000; - UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 2); } @@ -3788,13 +3773,13 @@ void hyperstone_device::generate_stxx1(drcuml_block &block, compiler_state &comp { const uint16_t op = desc->opptr.w[0]; - uint16_t next_1 = READ_OP(desc->pc + 2); + uint16_t next_1 = m_pr16(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); + const uint16_t next_2 = m_pr16(desc->pc + 4); extra_s = next_2; extra_s |= ((next_1 & 0xfff) << 16); @@ -3802,7 +3787,6 @@ void hyperstone_device::generate_stxx1(drcuml_block &block, compiler_state &comp if (next_1 & 0x4000) extra_s |= 0xf0000000; - UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 4); } else @@ -3812,7 +3796,6 @@ void hyperstone_device::generate_stxx1(drcuml_block &block, compiler_state &comp if (next_1 & 0x4000) extra_s |= 0xfffff000; - UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 2); } @@ -3945,13 +3928,13 @@ void hyperstone_device::generate_stxx2(drcuml_block &block, compiler_state &comp { const uint16_t op = desc->opptr.w[0]; - uint16_t next_1 = READ_OP(desc->pc + 2); + uint16_t next_1 = m_pr16(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); + const uint16_t next_2 = m_pr16(desc->pc + 4); extra_s = next_2; extra_s |= ((next_1 & 0xfff) << 16); @@ -3959,7 +3942,6 @@ void hyperstone_device::generate_stxx2(drcuml_block &block, compiler_state &comp if (next_1 & 0x4000) extra_s |= 0xf0000000; - UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 4); } else @@ -3969,7 +3951,6 @@ void hyperstone_device::generate_stxx2(drcuml_block &block, compiler_state &comp if (next_1 & 0x4000) extra_s |= 0xfffff000; - UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 2); } @@ -4391,7 +4372,7 @@ void hyperstone_device::generate_ldwr(drcuml_block &block, compiler_state &compi generate_set_global_register(block, compiler, desc); if (src_code == PC_REGISTER) { - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } } else @@ -4489,7 +4470,7 @@ void hyperstone_device::generate_ldwp(drcuml_block &block, compiler_state &compi UML_STORE(block, (void *)m_core->local_regs, I2, I3, SIZE_DWORD, SCALE_x4); if (src_code == PC_REGISTER) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -4547,7 +4528,7 @@ void hyperstone_device::generate_lddp(drcuml_block &block, compiler_state &compi UML_STORE(block, (void *)m_core->local_regs, I2, I3, SIZE_DWORD, SCALE_x4); if (src_code == PC_REGISTER || (src_code + 1) == PC_REGISTER) - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); } else { @@ -4794,7 +4775,7 @@ void hyperstone_device::generate_br(drcuml_block &block, compiler_state &compile UML_ADD(block, DRC_PC, DRC_PC, I1); UML_AND(block, DRC_SR, DRC_SR, ~M_MASK); - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, desc); // TODO: correct cycle count } @@ -4898,15 +4879,16 @@ template void hyperstone_device::generate_call(drcuml_block &block, compiler_state &compiler, const opcode_desc *desc) { UML_MOV(block, I7, mem(&m_core->clock_cycles_1)); + UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK); uint16_t op = desc->opptr.w[0]; - uint16_t imm_1 = READ_OP(desc->pc + 2); + uint16_t imm_1 = m_pr16(desc->pc + 2); int32_t extra_s = 0; if (imm_1 & 0x8000) { - uint16_t imm_2 = READ_OP(desc->pc + 4); + uint16_t imm_2 = m_pr16(desc->pc + 4); extra_s = imm_2; extra_s |= ((imm_1 & 0x3fff) << 16); @@ -4914,7 +4896,6 @@ void hyperstone_device::generate_call(drcuml_block &block, compiler_state &compi if (imm_1 & 0x4000) extra_s |= 0xc0000000; - UML_ROLINS(block, DRC_SR, (3<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 4); } else @@ -4924,7 +4905,6 @@ void hyperstone_device::generate_call(drcuml_block &block, compiler_state &compi if (imm_1 & 0x4000) extra_s |= 0xffffc000; - UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK); UML_ADD(block, DRC_PC, DRC_PC, 2); } @@ -4973,7 +4953,7 @@ void hyperstone_device::generate_call(drcuml_block &block, compiler_state &compi UML_MOV(block, mem(&m_core->intblock), 2); - generate_branch(block, desc->targetpc); + generate_branch(block, desc->targetpc, nullptr); //TODO: add interrupt locks, errors, .... } @@ -4997,7 +4977,6 @@ void hyperstone_device::generate_trap_op(drcuml_block &block, compiler_state &co const uint8_t trapno = (op & 0xfc) >> 2; const uint8_t code = ((op & 0x300) >> 6) | (op & 0x03); - UML_ROLINS(block, DRC_SR, (1<<19), 0, ILC_MASK); UML_TEST(block, DRC_SR, conditions[code]); int skip_trap = compiler.m_labelnum++; @@ -5006,6 +4985,7 @@ void hyperstone_device::generate_trap_op(drcuml_block &block, compiler_state &co else UML_JMPc(block, uml::COND_NZ, skip_trap); + UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK); generate_get_trap_addr(block, compiler.m_labelnum, trapno); generate_trap_exception_or_int(block); @@ -5018,8 +4998,7 @@ void hyperstone_device::generate_extend(drcuml_block &block, compiler_state &com uint16_t op = desc->opptr.w[0]; - uint16_t func = READ_OP(desc->pc + 2); - UML_ROLINS(block, DRC_SR, (2<<19), 0, ILC_MASK); + uint16_t func = m_pr16(desc->pc + 2); UML_ADD(block, DRC_PC, DRC_PC, 2); generate_check_delay_pc(block, compiler, desc); diff --git a/src/devices/cpu/e132xs/e132xsfe.cpp b/src/devices/cpu/e132xs/e132xsfe.cpp index 0b2edeb0b0b..355104aca3a 100644 --- a/src/devices/cpu/e132xs/e132xsfe.cpp +++ b/src/devices/cpu/e132xs/e132xsfe.cpp @@ -28,22 +28,6 @@ e132xs_frontend::e132xs_frontend(hyperstone_device *e132xs, uint32_t window_star { } -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_pr16(desc.physpc); @@ -686,7 +670,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) case 0x71: // cmpbi global,limm desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); + desc.length = hyperstone_device::imm_length(op) << 1; break; case 0x62: // cmpi local,simm case 0x72: // cmpbi local,simm @@ -699,7 +683,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regin[0] |= SR_CODE; desc.regout[ldst_group] |= 1 << ldst_code; desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); + desc.length = hyperstone_device::imm_length(op) << 1; break; case 0x64: // movi global,simm desc.regin[0] |= SR_CODE; @@ -722,7 +706,7 @@ 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.length = imm_length(desc, op); + desc.length = hyperstone_device::imm_length(op) << 1; desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; if (gdst_code == PC_REGISTER) { @@ -743,7 +727,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regin[0] |= SR_CODE; desc.regout[ldst_group] |= 1 << ldst_code; desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); + desc.length = hyperstone_device::imm_length(op) << 1; break; case 0x68: // addi global,simm case 0x6c: // addsi global,simm @@ -764,7 +748,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regin[0] |= 1 << gdst_code; desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); + desc.length = hyperstone_device::imm_length(op) << 1; if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi if (gdst_code == PC_REGISTER) { @@ -786,7 +770,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) 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); + desc.length = hyperstone_device::imm_length(op) << 1; if (op & 0x04) desc.flags |= OPFLAG_CAN_CAUSE_EXCEPTION; // addsi break; case 0x74: // andni global,simm @@ -809,7 +793,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regin[0] |= 1 << gdst_code; desc.regout[0] |= 1 << gdst_code; desc.regout[0] |= SR_CODE; - desc.length = imm_length(desc, op); + desc.length = hyperstone_device::imm_length(op) << 1; if (gdst_code == PC_REGISTER) { desc.targetpc = BRANCH_TARGET_DYNAMIC; @@ -831,7 +815,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) 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); + desc.length = hyperstone_device::imm_length(op) << 1; break; case 0x80: case 0x81: // shrdi case 0x84: case 0x85: // sardi @@ -1310,12 +1294,14 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.targetpc = BRANCH_TARGET_DYNAMIC; desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; desc.delayslots = 1; + desc.length = (op & 0x80) ? 4 : 2; break; - case 0xec: // dbr - could be 4 bytes (pcrel) + case 0xec: // dbr decode_pcrel(desc, op); desc.targetpc = BRANCH_TARGET_DYNAMIC; desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; desc.delayslots = 1; + desc.length = (op & 0x80) ? 4 : 2; break; case 0xed: // frame desc.regin[0] |= SR_CODE; @@ -1331,6 +1317,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[ldstf_group] |= 1 << ldstf_code; desc.targetpc = BRANCH_TARGET_DYNAMIC; desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; break; case 0xef: // call local desc.regin[0] |= SR_CODE; @@ -1339,6 +1326,7 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regout[ldstf_group] |= 1 << ldstf_code; desc.targetpc = BRANCH_TARGET_DYNAMIC; desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; + desc.length = (read_imm1(desc) & 0x8000) ? 6 : 4; 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 @@ -1347,12 +1335,14 @@ bool e132xs_frontend::describe(opcode_desc &desc, const opcode_desc *prev) desc.regin[0] |= SR_CODE; desc.targetpc = BRANCH_TARGET_DYNAMIC; desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH; + desc.length = (op & 0x80) ? 4 : 2; break; case 0xfc: // br { int32_t offset = decode_pcrel(desc, op); desc.targetpc = (desc.pc + desc.length) + offset; desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; + desc.length = (op & 0x80) ? 4 : 2; break; } case 0xfd: case 0xfe: case 0xff: // trap diff --git a/src/devices/cpu/e132xs/e132xsfe.h b/src/devices/cpu/e132xs/e132xsfe.h index 7463fd964d0..1cac61a08cd 100644 --- a/src/devices/cpu/e132xs/e132xsfe.h +++ b/src/devices/cpu/e132xs/e132xsfe.h @@ -19,7 +19,6 @@ protected: 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); diff --git a/src/devices/cpu/e132xs/e132xsop.hxx b/src/devices/cpu/e132xs/e132xsop.hxx index 8b0c3817b08..1a82e5bb57c 100644 --- a/src/devices/cpu/e132xs/e132xsop.hxx +++ b/src/devices/cpu/e132xs/e132xsop.hxx @@ -164,7 +164,7 @@ void hyperstone_device::hyperstone_divsu() template void hyperstone_device::hyperstone_xm() { - const uint32_t next = READ_OP(PC); + const uint32_t next = m_pr16(PC); PC += 2; const uint8_t sub_type = (next & 0x7000) >> 12; @@ -172,7 +172,7 @@ void hyperstone_device::hyperstone_xm() uint32_t extra_u = next & 0xfff; if (next & 0x8000) { - extra_u = ((extra_u & 0xfff) << 16) | READ_OP(PC); + extra_u = ((extra_u & 0xfff) << 16) | m_pr16(PC); PC += 2; m_instruction_length = (3<<19); } @@ -1536,7 +1536,7 @@ void hyperstone_device::hyperstone_rol() template void hyperstone_device::hyperstone_ldxx1() { - uint16_t next_1 = READ_OP(PC); + uint16_t next_1 = m_pr16(PC); PC += 2; const uint16_t sub_type = (next_1 & 0x3000) >> 12; @@ -1544,7 +1544,7 @@ void hyperstone_device::hyperstone_ldxx1() uint32_t extra_s; if (next_1 & 0x8000) { - const uint16_t next_2 = READ_OP(PC); + const uint16_t next_2 = m_pr16(PC); PC += 2; m_instruction_length = (3<<19); @@ -1655,7 +1655,7 @@ void hyperstone_device::hyperstone_ldxx1() template void hyperstone_device::hyperstone_ldxx2() { - uint16_t next_1 = READ_OP(PC); + uint16_t next_1 = m_pr16(PC); PC += 2; const uint16_t sub_type = (next_1 & 0x3000) >> 12; @@ -1663,7 +1663,7 @@ void hyperstone_device::hyperstone_ldxx2() uint32_t extra_s; if (next_1 & 0x8000) { - const uint16_t next_2 = READ_OP(PC); + const uint16_t next_2 = m_pr16(PC); PC += 2; m_instruction_length = (3<<19); @@ -1800,7 +1800,7 @@ void hyperstone_device::hyperstone_ldxx2() template void hyperstone_device::hyperstone_stxx1() { - uint16_t next_1 = READ_OP(PC); + uint16_t next_1 = m_pr16(PC); PC += 2; const uint16_t sub_type = (next_1 & 0x3000) >> 12; @@ -1808,7 +1808,7 @@ void hyperstone_device::hyperstone_stxx1() uint32_t extra_s; if (next_1 & 0x8000) { - const uint16_t next_2 = READ_OP(PC); + const uint16_t next_2 = m_pr16(PC); PC += 2; m_instruction_length = (3<<19); @@ -1890,7 +1890,7 @@ void hyperstone_device::hyperstone_stxx1() template void hyperstone_device::hyperstone_stxx2() { - uint16_t next_1 = READ_OP(PC); + uint16_t next_1 = m_pr16(PC); PC += 2; const uint16_t sub_type = (next_1 & 0x3000) >> 12; @@ -1898,7 +1898,7 @@ void hyperstone_device::hyperstone_stxx2() uint32_t extra_s; if (next_1 & 0x8000) { - const uint16_t next_2 = READ_OP(PC); + const uint16_t next_2 = m_pr16(PC); PC += 2; m_instruction_length = (3<<19); @@ -2219,7 +2219,7 @@ void hyperstone_device::hyperstone_mul() void hyperstone_device::hyperstone_extend() { m_instruction_length = (2<<19); - const uint32_t func = READ_OP(PC); + const uint32_t func = m_pr16(PC); PC += 2; check_delay_PC(); @@ -2612,14 +2612,14 @@ void hyperstone_device::hyperstone_frame() template void hyperstone_device::hyperstone_call() { - uint16_t imm_1 = READ_OP(PC); + uint16_t imm_1 = m_pr16(PC); PC += 2; int32_t extra_s = 0; if (imm_1 & 0x8000) { - uint16_t imm_2 = READ_OP(PC); + uint16_t imm_2 = m_pr16(PC); PC += 2; SET_ILC(3<<19);