summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author mooglyguy <therealmogminer@gmail.com>2017-11-13 19:29:31 +0100
committer mooglyguy <therealmogminer@gmail.com>2017-11-13 20:34:40 +0100
commitb47c845edad899c370e0e8fcb65583fa14e893da (patch)
tree9821a1c5008023553a5338635eba4263fe64bab1
parent7ef02cc5f3a581865e6d6141cc9b731db3b1474c (diff)
e132x, looked at subc opcode, nw.
-rw-r--r--src/devices/cpu/e132xs/e132xs.cpp44
-rw-r--r--src/devices/cpu/e132xs/e132xs.h9
-rw-r--r--src/devices/cpu/e132xs/e132xsop.hxx166
3 files changed, 110 insertions, 109 deletions
diff --git a/src/devices/cpu/e132xs/e132xs.cpp b/src/devices/cpu/e132xs/e132xs.cpp
index 1cf5a2cb561..62b93eba679 100644
--- a/src/devices/cpu/e132xs/e132xs.cpp
+++ b/src/devices/cpu/e132xs/e132xs.cpp
@@ -1721,42 +1721,6 @@ offs_t hyperstone_device::disasm_disassemble(std::ostream &stream, offs_t pc, co
/* Opcodes */
-void hyperstone_device::hyperstone_subc(regs_decode &decode)
-{
- uint64_t tmp;
-
- if (SRC_IS_SR)
- {
- tmp = (uint64_t)(DREG) - (uint64_t)(GET_C);
- CHECK_VSUB(GET_C,DREG,tmp);
- }
- else
- {
- tmp = (uint64_t)(DREG) - ((uint64_t)(SREG) + (uint64_t)(GET_C));
- //CHECK!
- CHECK_VSUB((SREG + GET_C),DREG,tmp);
- }
-
-
- if (SRC_IS_SR)
- {
- DREG = DREG - GET_C;
- }
- else
- {
- DREG = DREG - (SREG + GET_C);
- }
-
- CHECK_C(tmp);
-
- SET_DREG(DREG);
-
- SET_Z(GET_Z & (DREG == 0 ? 1 : 0));
- SET_N(SIGN_BIT(DREG));
-
- m_icount -= m_clock_cycles_1;
-}
-
void hyperstone_device::hyperstone_subs(regs_decode &decode)
{
if (SRC_IS_SR)
@@ -2103,10 +2067,10 @@ void hyperstone_device::execute_run()
case 0x3d: hyperstone_xor_global_local(); break;
case 0x3e: hyperstone_xor_local_global(); break;
case 0x3f: hyperstone_xor_local_local(); break;
- case 0x40: op40(); break;
- case 0x41: op41(); break;
- case 0x42: op42(); break;
- case 0x43: op43(); break;
+ case 0x40: hyperstone_subc_global_global(); break;
+ case 0x41: hyperstone_subc_global_local(); break;
+ case 0x42: hyperstone_subc_local_global(); break;
+ case 0x43: hyperstone_subc_local_local(); break;
case 0x44: hyperstone_not_global_global(); break;
case 0x45: hyperstone_not_global_local(); break;
case 0x46: hyperstone_not_local_global(); break;
diff --git a/src/devices/cpu/e132xs/e132xs.h b/src/devices/cpu/e132xs/e132xs.h
index 78b3fa0c93d..098a5271a5f 100644
--- a/src/devices/cpu/e132xs/e132xs.h
+++ b/src/devices/cpu/e132xs/e132xs.h
@@ -257,7 +257,6 @@ private:
void hyperstone_cmp_global_local();
void hyperstone_cmp_local_global();
void hyperstone_cmp_local_local();
- void hyperstone_mov(regs_decode &decode);
void hyperstone_mov_global_global();
void hyperstone_mov_global_local();
void hyperstone_mov_local_global();
@@ -274,7 +273,10 @@ private:
void hyperstone_cmpb_global_local();
void hyperstone_cmpb_local_global();
void hyperstone_cmpb_local_local();
- void hyperstone_subc(regs_decode &decode);
+ void hyperstone_subc_global_global();
+ void hyperstone_subc_global_local();
+ void hyperstone_subc_local_global();
+ void hyperstone_subc_local_local();
void hyperstone_sub_global_global();
void hyperstone_sub_global_local();
void hyperstone_sub_local_global();
@@ -316,12 +318,10 @@ private:
void hyperstone_cmpi_global_limm();
void hyperstone_cmpi_local_simm();
void hyperstone_cmpi_local_limm();
- void hyperstone_movi(regs_decode &decode);
void hyperstone_movi_global_simm();
void hyperstone_movi_global_limm();
void hyperstone_movi_local_simm();
void hyperstone_movi_local_limm();
- void hyperstone_addi(regs_decode &decode);
void hyperstone_addi_global_simm();
void hyperstone_addi_global_limm();
void hyperstone_addi_local_simm();
@@ -465,7 +465,6 @@ private:
bool generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
#endif
- void op40(); void op41(); void op42(); void op43(); // subc
void op4c(); void op4d(); void op4e(); void op4f(); // subs
#if 0
diff --git a/src/devices/cpu/e132xs/e132xsop.hxx b/src/devices/cpu/e132xs/e132xsop.hxx
index f5fadf8355b..a4c5d64236f 100644
--- a/src/devices/cpu/e132xs/e132xsop.hxx
+++ b/src/devices/cpu/e132xs/e132xsop.hxx
@@ -1780,93 +1780,131 @@ void hyperstone_device::hyperstone_xor_local_local()
-void hyperstone_device::op40()
+void hyperstone_device::hyperstone_subc_global_global()
{
- regs_decode decode;
- check_delay_PC();
- decode.src = SRC_CODE;
- decode.dst = DST_CODE;
+ const uint32_t src_code = SRC_CODE;
+ const uint32_t dst_code = DST_CODE;
+ uint32_t dreg = m_global_regs[dst_code];
- decode.src_is_local = 0;
- SREG = m_global_regs[decode.src];
- SREGF = m_global_regs[decode.src + 1];
+ if (src_code == SR_REGISTER)
+ {
+ const uint32_t c = SR & C_MASK;
+ const uint64_t tmp = (uint64_t)dreg - (uint64_t)c;
+ SR &= ~(C_MASK | V_MASK | Z_MASK | N_MASK);
+ SR |= ((tmp ^ dreg) & dreg & 0x80000000);
+ SR |= (tmp & 0x100000000L) >> 32;
+ dreg -= c;
+ }
+ else
+ {
+ const uint32_t sreg = m_global_regs[src_code];
+ const uint32_t c = SR & C_MASK;
+ const uint64_t tmp = (uint64_t)dreg - ((uint64_t)sreg + (uint64_t)c);
+ SR &= ~(C_MASK | V_MASK | Z_MASK | N_MASK);
+ //CHECK!
+ const uint32_t sreg_c = sreg + c;
+ SR |= ((tmp ^ dreg) & (dreg ^ sreg_c) & 0x80000000);
+ SR |= (tmp & 0x100000000L) >> 32;
+ dreg -= sreg_c;
+ }
- decode.dst_is_local = 0;
- DREG = m_global_regs[decode.dst];
- DREGF = m_global_regs[decode.dst + 1];
+ set_global_register(DST_CODE, dreg);
- decode.same_src_dst = (SRC_CODE == DST_CODE);
- decode.same_src_dstf = (SRC_CODE == (DST_CODE + 1));
- decode.same_srcf_dst = ((SRC_CODE + 1) == DST_CODE);
- hyperstone_subc(decode);
- printf("0x40, subc global,global\n");
+ if (dreg == 0)
+ SR |= Z_MASK;
+ SR |= SIGN_TO_N(dreg);
+
+ m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::op41()
+void hyperstone_device::hyperstone_subc_global_local()
{
- regs_decode decode;
- check_delay_PC();
- decode.src = SRC_CODE;
- decode.dst = DST_CODE;
+ const uint32_t dst_code = DST_CODE;
+ const uint32_t sreg = m_local_regs[(SRC_CODE + GET_FP) & 0x3f];
+ uint32_t dreg = m_global_regs[dst_code];
- decode.src_is_local = 1;
- SREG = m_local_regs[(decode.src + GET_FP) & 0x3f];
- SREGF = m_local_regs[(decode.src + 1 + GET_FP) & 0x3f];
+ const uint32_t c = SR & C_MASK;
+ const uint64_t tmp = (uint64_t)dreg - ((uint64_t)sreg + (uint64_t)c);
- decode.dst_is_local = 0;
- DREG = m_global_regs[decode.dst];
- DREGF = m_global_regs[decode.dst + 1];
+ //CHECK!
+ const uint32_t sreg_c = sreg + c;
- decode.same_src_dst = 0;
- decode.same_src_dstf = 0;
- decode.same_srcf_dst = 0;
- hyperstone_subc(decode);
- printf("0x41, subc global,global\n");
+ SR &= ~(C_MASK | V_MASK | Z_MASK | N_MASK);
+ SR |= ((tmp ^ dreg) & (dreg ^ sreg_c) & 0x80000000);
+ SR |= (tmp & 0x100000000L) >> 32;
+ dreg -= sreg_c;
+
+ set_global_register(dst_code, dreg);
+
+ if (dreg == 0)
+ SR |= Z_MASK;
+ SR |= SIGN_TO_N(dreg);
+
+ m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::op42()
+void hyperstone_device::hyperstone_subc_local_global()
{
- regs_decode decode;
- check_delay_PC();
- decode.src = SRC_CODE;
- decode.dst = DST_CODE;
- decode.src_is_local = 0;
+ const uint32_t src_code = SRC_CODE;
+ const uint32_t dst_code = (DST_CODE + GET_FP) & 0x3f;
+ uint32_t dreg = m_local_regs[dst_code];
- SREG = m_global_regs[decode.src];
- SREGF = m_global_regs[decode.src + 1];
+ if (src_code == SR_REGISTER)
+ {
+ const uint32_t c = SR & C_MASK;
+ const uint64_t tmp = (uint64_t)dreg - (uint64_t)c;
+ SR &= ~(C_MASK | V_MASK | Z_MASK | N_MASK);
+ SR |= ((tmp ^ dreg) & dreg & 0x80000000);
+ SR |= (tmp & 0x100000000L) >> 32;
+ dreg -= c;
+ }
+ else
+ {
+ const uint32_t sreg = m_global_regs[src_code];
+ const uint32_t c = SR & C_MASK;
+ const uint64_t tmp = (uint64_t)dreg - ((uint64_t)sreg + (uint64_t)c);
+ SR &= ~(C_MASK | V_MASK | Z_MASK | N_MASK);
+ //CHECK!
+ const uint32_t sreg_c = sreg + c;
+ SR |= ((tmp ^ dreg) & (dreg ^ sreg_c) & 0x80000000);
+ SR |= (tmp & 0x100000000L) >> 32;
+ dreg -= sreg_c;
+ }
- decode.dst_is_local = 1;
- DREG = m_local_regs[(decode.dst + GET_FP) & 0x3f]; /* registers offset by frame pointer */
- DREGF = m_local_regs[(decode.dst + 1 + GET_FP) & 0x3f];
+ m_local_regs[dst_code] = dreg;
- decode.same_src_dst = 0;
- decode.same_src_dstf = 0;
- decode.same_srcf_dst = 0;
- hyperstone_subc(decode);
- printf("0x42, subc global,global\n");
+ if (dreg == 0)
+ SR |= Z_MASK;
+ SR |= SIGN_TO_N(dreg);
+
+ m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::op43()
+void hyperstone_device::hyperstone_subc_local_local()
{
- regs_decode decode;
- check_delay_PC();
- decode.src = SRC_CODE;
- decode.dst = DST_CODE;
+ const uint32_t fp = GET_FP;
+ const uint32_t dst_code = (DST_CODE + fp) & 0x3f;
+ const uint32_t sreg = m_local_regs[(SRC_CODE + fp) & 0x3f];
+ uint32_t dreg = m_local_regs[dst_code];
- decode.src_is_local = 1;
- SREG = m_local_regs[(decode.src + GET_FP) & 0x3f];
- SREGF = m_local_regs[(decode.src + 1 + GET_FP) & 0x3f];
+ const uint32_t c = SR & C_MASK;
+ const uint64_t tmp = (uint64_t)dreg - ((uint64_t)sreg + (uint64_t)c);
- decode.dst_is_local = 1;
- DREG = m_local_regs[(decode.dst + GET_FP) & 0x3f]; /* registers offset by frame pointer */
- DREGF = m_local_regs[(decode.dst + 1 + GET_FP) & 0x3f];
+ //CHECK!
+ const uint32_t sreg_c = sreg + c;
+
+ SR &= ~(C_MASK | V_MASK | Z_MASK | N_MASK);
+ SR |= ((tmp ^ dreg) & (dreg ^ sreg_c) & 0x80000000);
+ SR |= (tmp & 0x100000000L) >> 32;
+ dreg -= sreg_c;
- decode.same_src_dst = (SRC_CODE == DST_CODE);
- decode.same_src_dstf = (SRC_CODE == ((DST_CODE + 1) & 0x3f));
- decode.same_srcf_dst = (((SRC_CODE + 1) & 0x3f) == DST_CODE);
+ m_local_regs[dst_code] = dreg;
+
+ if (dreg == 0)
+ SR |= Z_MASK;
+ SR |= SIGN_TO_N(dreg);
- hyperstone_subc(decode);
- //printf("0x43, subc global,global\n");
+ m_icount -= m_clock_cycles_1;
}
void hyperstone_device::hyperstone_not_global_global()