summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/e132xs/e132xsop.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/e132xs/e132xsop.hxx')
-rw-r--r--src/devices/cpu/e132xs/e132xsop.hxx240
1 files changed, 144 insertions, 96 deletions
diff --git a/src/devices/cpu/e132xs/e132xsop.hxx b/src/devices/cpu/e132xs/e132xsop.hxx
index 8ef2143eae7..28ccc31f10a 100644
--- a/src/devices/cpu/e132xs/e132xsop.hxx
+++ b/src/devices/cpu/e132xs/e132xsop.hxx
@@ -244,6 +244,7 @@ void hyperstone_device::op08()
decode.same_src_dstf = (SRC_CODE == (DST_CODE + 1));
decode.same_srcf_dst = ((SRC_CODE + 1) == DST_CODE);
hyperstone_divu(decode);
+ printf("0x08, divu global,global\n");
}
void hyperstone_device::op09()
@@ -266,6 +267,7 @@ void hyperstone_device::op09()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_divu(decode);
+ printf("0x09, divu global,local\n");
}
void hyperstone_device::op0a()
@@ -287,6 +289,7 @@ void hyperstone_device::op0a()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_divu(decode);
+ printf("0x0a, divu local,global\n");
}
void hyperstone_device::hyperstone_divu_local_local()
@@ -352,6 +355,7 @@ void hyperstone_device::op0c()
decode.same_src_dstf = (SRC_CODE == (DST_CODE + 1));
decode.same_srcf_dst = ((SRC_CODE + 1) == DST_CODE);
hyperstone_divs(decode);
+ printf("0x0c, divs global,global\n");
}
void hyperstone_device::op0d()
@@ -374,6 +378,7 @@ void hyperstone_device::op0d()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_divs(decode);
+ printf("0x0d, divs global,local\n");
}
void hyperstone_device::op0e()
@@ -395,6 +400,7 @@ void hyperstone_device::op0e()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_divs(decode);
+ printf("0x0e, divs local,global\n");
}
void hyperstone_device::hyperstone_divs_local_local()
@@ -463,6 +469,7 @@ void hyperstone_device::op10()
decode.same_src_dstf = (SRC_CODE == (DST_CODE + 1));
decode.same_srcf_dst = ((SRC_CODE + 1) == DST_CODE);
hyperstone_xm(decode);
+ printf("0x10, xm global,global\n");
}
void hyperstone_device::op11()
@@ -485,6 +492,7 @@ void hyperstone_device::op11()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_xm(decode);
+ printf("0x11, xm global,global\n");
}
void hyperstone_device::op12()
@@ -507,6 +515,7 @@ void hyperstone_device::op12()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_xm(decode);
+ printf("0x12, xm global,global\n");
}
void hyperstone_device::hyperstone_xm_local_local()
@@ -568,6 +577,7 @@ void hyperstone_device::op14()
decode.same_src_dstf = (SRC_CODE == (DST_CODE + 1));
decode.same_srcf_dst = ((SRC_CODE + 1) == DST_CODE);
hyperstone_mask(decode);
+ printf("0x14, mask global,global\n");
}
void hyperstone_device::hyperstone_mask_global_local()
@@ -669,6 +679,7 @@ void hyperstone_device::op19()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_sum(decode);
+ printf("0x19, sum global,local\n");
}
void hyperstone_device::hyperstone_sum_local_global()
@@ -747,6 +758,7 @@ void hyperstone_device::op1c()
decode.same_src_dstf = (SRC_CODE == (DST_CODE + 1));
decode.same_srcf_dst = ((SRC_CODE + 1) == DST_CODE);
hyperstone_sums(decode);
+ printf("0x1c, sums global,global\n");
}
void hyperstone_device::op1d()
@@ -769,6 +781,7 @@ void hyperstone_device::op1d()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_sums(decode);
+ printf("0x1d, sums global,local\n");
}
void hyperstone_device::op1e()
@@ -791,6 +804,7 @@ void hyperstone_device::op1e()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_sums(decode);
+ printf("0x1e, sums local,global\n");
}
void hyperstone_device::op1f()
@@ -836,6 +850,7 @@ void hyperstone_device::op20()
decode.same_src_dstf = (SRC_CODE == (DST_CODE + 1));
decode.same_srcf_dst = ((SRC_CODE + 1) == DST_CODE);
hyperstone_cmp(decode);
+ printf("0x20, cmp global,global\n");
}
void hyperstone_device::op21()
@@ -858,6 +873,7 @@ void hyperstone_device::op21()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_cmp(decode);
+ printf("0x20, cmp global,local\n");
}
void hyperstone_device::hyperstone_cmp_local_global()
@@ -1031,6 +1047,7 @@ void hyperstone_device::op28()
DREG = m_global_regs[decode.dst];
hyperstone_add(decode);
+ printf("0x28, add global,global\n");
}
void hyperstone_device::hyperstone_add_global_local()
@@ -1139,6 +1156,7 @@ void hyperstone_device::op2c()
DREGF = m_global_regs[decode.dst + 1];
hyperstone_adds(decode);
+ printf("0x2c, adds global,global\n");
}
void hyperstone_device::op2d()
@@ -1155,6 +1173,7 @@ void hyperstone_device::op2d()
DREG = m_global_regs[decode.dst];
hyperstone_adds(decode);
+ printf("0x2d, adds global,local\n");
}
void hyperstone_device::op2e()
@@ -1171,6 +1190,7 @@ void hyperstone_device::op2e()
DREG = m_local_regs[(decode.dst + GET_FP) & 0x3f]; /* registers offset by frame pointer */
hyperstone_adds(decode);
+ printf("0x2e, adds local,global\n");
}
void hyperstone_device::op2f()
@@ -1187,6 +1207,7 @@ void hyperstone_device::op2f()
DREG = m_local_regs[(decode.dst + GET_FP) & 0x3f]; /* registers offset by frame pointer */
hyperstone_adds(decode);
+ printf("0x2f, adds local,local\n");
}
@@ -1466,6 +1487,7 @@ void hyperstone_device::op40()
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");
}
void hyperstone_device::op41()
@@ -1487,6 +1509,7 @@ void hyperstone_device::op41()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_subc(decode);
+ printf("0x41, subc global,global\n");
}
void hyperstone_device::op42()
@@ -1508,6 +1531,7 @@ void hyperstone_device::op42()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_subc(decode);
+ printf("0x42, subc global,global\n");
}
void hyperstone_device::op43()
@@ -1530,9 +1554,10 @@ void hyperstone_device::op43()
decode.same_srcf_dst = (((SRC_CODE + 1) & 0x3f) == DST_CODE);
hyperstone_subc(decode);
+ //printf("0x43, subc global,global\n");
}
-void hyperstone_device::hyperstone_not_global_global() // not
+void hyperstone_device::hyperstone_not_global_global()
{
check_delay_PC();
@@ -1608,6 +1633,7 @@ void hyperstone_device::op48()
DREG = m_global_regs[decode.dst];
hyperstone_sub(decode);
+ printf("0x48, sub global,global\n");
}
void hyperstone_device::op49()
@@ -1624,6 +1650,7 @@ void hyperstone_device::op49()
DREG = m_global_regs[decode.dst];
hyperstone_sub(decode);
+ printf("0x49, sub global,local\n");
}
void hyperstone_device::hyperstone_sub_local_global()
@@ -1696,6 +1723,7 @@ void hyperstone_device::op4c()
DREG = m_global_regs[decode.dst];
hyperstone_subs(decode);
+ printf("0x4c, subs global,global\n");
}
void hyperstone_device::op4d()
@@ -1712,6 +1740,7 @@ void hyperstone_device::op4d()
DREG = m_global_regs[decode.dst];
hyperstone_subs(decode);
+ printf("0x4d, subs global,local\n");
}
void hyperstone_device::op4e()
@@ -1728,6 +1757,7 @@ void hyperstone_device::op4e()
DREG = m_local_regs[(decode.dst + GET_FP) & 0x3f];
hyperstone_subs(decode);
+ printf("0x4e, subs local,global\n");
}
void hyperstone_device::op4f()
@@ -1744,6 +1774,7 @@ void hyperstone_device::op4f()
DREG = m_local_regs[(decode.dst + GET_FP) & 0x3f]; /* registers offset by frame pointer */
hyperstone_subs(decode);
+ printf("0x4f, subs local,local\n");
}
@@ -1762,6 +1793,7 @@ void hyperstone_device::op50()
DREG = m_global_regs[decode.dst];
hyperstone_addc(decode);
+ printf("0x50, addc global,global\n");
}
void hyperstone_device::op51()
@@ -1778,6 +1810,7 @@ void hyperstone_device::op51()
DREG = m_global_regs[decode.dst];
hyperstone_addc(decode);
+ printf("0x51, addc global,local\n");
}
void hyperstone_device::hyperstone_addc_local_global()
@@ -1936,6 +1969,7 @@ void hyperstone_device::op58()
DREG = m_global_regs[decode.dst];
hyperstone_neg(decode);
+ printf("0x58, neg global,global\n");
}
void hyperstone_device::op59()
@@ -1952,6 +1986,7 @@ void hyperstone_device::op59()
DREG = m_global_regs[decode.dst];
hyperstone_neg(decode);
+ printf("0x59, neg global,local\n");
}
void hyperstone_device::op5a()
@@ -1968,6 +2003,7 @@ void hyperstone_device::op5a()
DREG = m_local_regs[(decode.dst + GET_FP) & 0x3f]; /* registers offset by frame pointer */
hyperstone_neg(decode);
+ printf("0x5a, neg local,global\n");
}
void hyperstone_device::hyperstone_neg_local_local()
@@ -2010,6 +2046,7 @@ void hyperstone_device::op5c()
DREG = m_global_regs[decode.dst];
hyperstone_negs(decode);
+ printf("0x5c, negs global,global\n");
}
void hyperstone_device::op5d()
@@ -2026,6 +2063,7 @@ void hyperstone_device::op5d()
DREG = m_global_regs[decode.dst];
hyperstone_negs(decode);
+ printf("0x5d, negs global,local\n");
}
void hyperstone_device::op5e()
@@ -2042,6 +2080,7 @@ void hyperstone_device::op5e()
DREG = m_local_regs[(decode.dst + GET_FP) & 0x3f]; /* registers offset by frame pointer */
hyperstone_negs(decode);
+ printf("0x5e, negs local,global");
}
void hyperstone_device::op5f()
@@ -2058,11 +2097,12 @@ void hyperstone_device::op5f()
DREG = m_local_regs[(decode.dst + GET_FP) & 0x3f]; /* registers offset by frame pointer */
hyperstone_negs(decode);
+ printf("0x5f, negs local,local\n");
}
-void hyperstone_device::hyperstone_cmpi_global_simm() // cmpi global,short imm
+void hyperstone_device::hyperstone_cmpi_global_simm()
{
check_delay_PC();
@@ -2087,7 +2127,7 @@ void hyperstone_device::hyperstone_cmpi_global_simm() // cmpi global,short imm
m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::hyperstone_cmpi_global_limm() // cmpi global,long imm
+void hyperstone_device::hyperstone_cmpi_global_limm()
{
const uint32_t imm = decode_immediate_s();
@@ -2113,7 +2153,7 @@ void hyperstone_device::hyperstone_cmpi_global_limm() // cmpi global,long imm
m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::hyperstone_cmpi_local_simm() // cmpi local,short imm
+void hyperstone_device::hyperstone_cmpi_local_simm()
{
check_delay_PC();
@@ -2138,7 +2178,7 @@ void hyperstone_device::hyperstone_cmpi_local_simm() // cmpi local,short imm
m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::hyperstone_cmpi_local_limm() // cmpi local,long imm
+void hyperstone_device::hyperstone_cmpi_local_limm()
{
uint32_t imm = decode_immediate_s();
@@ -2410,6 +2450,7 @@ void hyperstone_device::op6c()
DREGF = m_global_regs[decode.dst + 1];
hyperstone_addsi(decode);
+ printf("0x6c, addsi global,simm\n");
}
void hyperstone_device::op6d()
@@ -2425,6 +2466,7 @@ void hyperstone_device::op6d()
DREGF = m_global_regs[decode.dst + 1];
hyperstone_addsi(decode);
+ printf("0x6d, addsi global,limm\n");
}
void hyperstone_device::op6e()
@@ -2439,6 +2481,7 @@ void hyperstone_device::op6e()
DREGF = m_local_regs[(decode.dst + 1 + GET_FP) & 0x3f];
hyperstone_addsi(decode);
+ printf("0x6e, addsi local,simm\n");
}
void hyperstone_device::op6f()
@@ -2453,6 +2496,7 @@ void hyperstone_device::op6f()
DREGF = m_local_regs[(decode.dst + 1 + GET_FP) & 0x3f];
hyperstone_addsi(decode);
+ printf("0x6f, addsi local,limm\n");
}
@@ -2599,18 +2643,26 @@ void hyperstone_device::hyperstone_cmpbi_local_limm()
m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::op74()
+void hyperstone_device::hyperstone_andni_global_simm()
{
- regs_decode decode;
- decode_immediate_u(decode);
check_delay_PC();
- decode.dst = DST_CODE;
- decode.dst_is_local = 0;
- DREG = m_global_regs[decode.dst];
- DREGF = m_global_regs[decode.dst + 1];
+ uint32_t imm;
+ if (N_OP_MASK == 0x10f)
+ imm = 0x7fffffff; // bit 31 = 0, others = 1
+ else
+ imm = immediate_values[m_op & 0x0f];
+
+ const uint32_t dst_code = DST_CODE;
+ const uint32_t dreg = m_global_regs[dst_code] & ~imm;
+ set_global_register(dst_code, dreg);
- hyperstone_andni(decode);
+ if (dreg == 0)
+ SR |= Z_MASK;
+ else
+ SR &= ~Z_MASK;
+
+ m_icount -= m_clock_cycles_1;
}
void hyperstone_device::hyperstone_andni_global_limm()
@@ -2684,7 +2736,7 @@ void hyperstone_device::hyperstone_andni_local_limm()
m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::hyperstone_ori_global_simm() // ori global,short imm
+void hyperstone_device::hyperstone_ori_global_simm()
{
check_delay_PC();
@@ -2700,7 +2752,7 @@ void hyperstone_device::hyperstone_ori_global_simm() // ori global,short imm
m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::hyperstone_ori_global_limm() // ori global,long imm
+void hyperstone_device::hyperstone_ori_global_limm()
{
uint32_t extra_u = decode_immediate_s();
@@ -2718,7 +2770,7 @@ void hyperstone_device::hyperstone_ori_global_limm() // ori global,long imm
m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::hyperstone_ori_local_simm() // ori local,short imm
+void hyperstone_device::hyperstone_ori_local_simm()
{
check_delay_PC();
@@ -2733,7 +2785,7 @@ void hyperstone_device::hyperstone_ori_local_simm() // ori local,short imm
m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::hyperstone_ori_local_limm() // ori local,long imm
+void hyperstone_device::hyperstone_ori_local_limm()
{
const uint32_t extra_u = decode_immediate_s();
check_delay_PC();
@@ -2960,27 +3012,37 @@ void hyperstone_device::hyperstone_sard()
m_icount -= m_clock_cycles_2;
}
-void hyperstone_device::op87()
+void hyperstone_device::hyperstone_sar()
{
- 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;
- 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 n = m_local_regs[(SRC_CODE + fp) & 0x3f] & 0x1f;
+ uint32_t ret = m_local_regs[dst_code];
- 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];
+ SR &= ~(C_MASK | Z_MASK | N_MASK);
- decode.same_src_dst = (SRC_CODE == DST_CODE);
- decode.same_src_dstf = (SRC_CODE == ((DST_CODE + 1) & 0x3f));
- decode.same_srcf_dst = 0;
+ if (n)
+ {
+ const uint32_t sign_bit = ret & 0x80000000;
+
+ SR |= (ret >> (n - 1)) & 1;
+
+ ret >>= n;
+
+ if (sign_bit)
+ ret |= 0xffffffff << (32 - n);
+ }
+
+ m_local_regs[dst_code] = ret;
+
+ if (ret == 0)
+ SR |= Z_MASK;
+ SR |= SIGN_TO_N(ret);
- hyperstone_sar(decode);
+ m_icount -= m_clock_cycles_1;
}
void hyperstone_device::hyperstone_shldi()
@@ -3038,13 +3100,8 @@ void hyperstone_device::hyperstone_rol()
const uint64_t mask = ((1U << (32 - n)) - 1) ^ 0xffffffff;
#endif
- while (n > 0)
- {
- val = (val << 1) | ((val & 0x80000000) >> 31);
- n--;
- }
- //if (n)
- //val = (val << n) | (val >> (32 - n));
+ if (n)
+ val = (val << n) | (val >> (32 - n));
#ifdef MISSIONCRAFT_FLAGS
SR &= ~(V_MASK | Z_MASK | C_MASK);
@@ -4403,6 +4460,7 @@ void hyperstone_device::op9d() // stxx2 global,local
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_stxx2(decode);
+ printf("0x9d, stxx2 global,local\n");
}
void hyperstone_device::hyperstone_stxx2_local_global()
@@ -4643,6 +4701,7 @@ void hyperstone_device::opa4()
DREGF = m_global_regs[decode.dst + 1];
hyperstone_sari(decode);
+ printf("0xa4, sari\n");
}
void hyperstone_device::opa5()
@@ -4657,6 +4716,7 @@ void hyperstone_device::opa5()
DREGF = m_global_regs[decode.dst + 1];
hyperstone_sari(decode);
+ printf("0xa5, sari\n");
}
void hyperstone_device::hyperstone_sari_local()
@@ -4758,6 +4818,7 @@ void hyperstone_device::opb0()
decode.same_src_dstf = (SRC_CODE == (DST_CODE + 1));
decode.same_srcf_dst = ((SRC_CODE + 1) == DST_CODE);
hyperstone_mulu(decode);
+ printf("0xb0, mulu global,global\n");
}
void hyperstone_device::opb1()
@@ -4779,6 +4840,7 @@ void hyperstone_device::opb1()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_mulu(decode);
+ printf("0xb1, mulu global,local\n");
}
void hyperstone_device::opb2()
@@ -4800,6 +4862,7 @@ void hyperstone_device::opb2()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_mulu(decode);
+ printf("0xb2, mulu local,global\n");
}
void hyperstone_device::hyperstone_mulu_local_local()
@@ -4850,6 +4913,7 @@ void hyperstone_device::opb4()
decode.same_src_dstf = (SRC_CODE == (DST_CODE + 1));
decode.same_srcf_dst = ((SRC_CODE + 1) == DST_CODE);
hyperstone_muls(decode);
+ printf("0xb4, mulu global,global\n");
}
void hyperstone_device::opb5()
@@ -4871,6 +4935,7 @@ void hyperstone_device::opb5()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_muls(decode);
+ printf("0xb4, mulu global,local\n");
}
void hyperstone_device::opb6()
@@ -4892,6 +4957,7 @@ void hyperstone_device::opb6()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_muls(decode);
+ printf("0xb4, mulu local,global\n");
}
void hyperstone_device::hyperstone_muls_local_local()
@@ -5364,6 +5430,7 @@ void hyperstone_device::opbc()
decode.same_src_dstf = (SRC_CODE == (DST_CODE + 1));
decode.same_srcf_dst = ((SRC_CODE + 1) == DST_CODE);
hyperstone_mul(decode);
+ printf("0xbc, mul global,global\n");
}
void hyperstone_device::opbd()
@@ -5386,6 +5453,7 @@ void hyperstone_device::opbd()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_mul(decode);
+ printf("0xbd, mul global,local\n");
}
void hyperstone_device::opbe()
@@ -5407,6 +5475,7 @@ void hyperstone_device::opbe()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_mul(decode);
+ printf("0xbe, mul local,global\n");
}
void hyperstone_device::hyperstone_mul_local_local()
@@ -5583,61 +5652,41 @@ void hyperstone_device::hyperstone_ldwr_local_local() // ldwr local,local
m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::opd2()
+void hyperstone_device::hyperstone_lddr_global_local()
{
- regs_decode decode;
check_delay_PC();
- decode.src = SRC_CODE;
- decode.dst = DST_CODE;
- decode_source_noh(decode);
- 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];
+ const uint32_t src_code = SRC_CODE;
+ const uint32_t dreg = m_local_regs[(DST_CODE + GET_FP) & 0x3f];
+ set_global_register(src_code, READ_W(dreg));
+ set_global_register(src_code + 1, READ_W(dreg + 4));
- decode.same_src_dst = 0;
- decode.same_src_dstf = 0;
- decode.same_srcf_dst = 0;
- hyperstone_lddr(decode);
+ m_icount -= m_clock_cycles_2;
}
-void hyperstone_device::opd3()
+void hyperstone_device::hyperstone_lddr_local_local()
{
- regs_decode decode;
check_delay_PC();
- decode.src = SRC_CODE;
- decode.dst = 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 fp = GET_FP;
+ const uint32_t src_code = SRC_CODE + fp;
+ const uint32_t dreg = m_local_regs[(DST_CODE + fp) & 0x3f];
- 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[src_code & 0x3f] = READ_W(dreg);
+ m_local_regs[(src_code + 1) & 0x3f] = READ_W(dreg + 4);
- decode.same_src_dst = 0;
- decode.same_src_dstf = 0;
- decode.same_srcf_dst = (((SRC_CODE + 1) & 0x3f) == DST_CODE);
- hyperstone_lddr(decode);
+ m_icount -= m_clock_cycles_2;
}
-void hyperstone_device::opd4()
+void hyperstone_device::hypesrtone_ldwp_global_local()
{
- regs_decode decode;
check_delay_PC();
- decode.src = SRC_CODE;
- decode.dst = DST_CODE;
- decode_source_noh(decode);
- 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];
+ const uint32_t dst_code = (DST_CODE + GET_FP) & 0x3f;
+ set_global_register(SRC_CODE, READ_W(m_local_regs[dst_code]));
+ m_local_regs[dst_code] += 4;
- decode.same_src_dst = 0;
- decode.same_src_dstf = 0;
- decode.same_srcf_dst = 0;
- hyperstone_ldwp(decode);
+ m_icount -= m_clock_cycles_1;
}
void hyperstone_device::hypesrtone_ldwp_local_local()
@@ -5648,34 +5697,30 @@ void hyperstone_device::hypesrtone_ldwp_local_local()
const uint32_t src_code = (SRC_CODE + fp) & 0x3f;
const uint32_t dst_code = (DST_CODE + fp) & 0x3f;
- const uint32_t dreg = m_local_regs[dst_code];
-
- m_local_regs[src_code] = READ_W(dreg);
+ m_local_regs[src_code] = READ_W(m_local_regs[dst_code]);
// post increment the destination register if it's different from the source one
// (needed by Hidden Catch)
- if (src_code != dst_code && (m_op & 0x100))
+ if (src_code != dst_code || (m_op & 0x100))
m_local_regs[dst_code] += 4;
m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::opd6() // lddp local,global
+void hyperstone_device::hyperstone_lddp_global_local()
{
- regs_decode decode;
check_delay_PC();
- decode.src = SRC_CODE;
- decode.dst = DST_CODE;
- decode_source_noh(decode);
- 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];
+ const uint32_t src_code = SRC_CODE;
+ const uint32_t dst_code = (DST_CODE + GET_FP) & 0x3f;
+ const uint32_t dreg = m_local_regs[dst_code];
- decode.same_src_dst = 0;
- decode.same_src_dstf = 0;
- decode.same_srcf_dst = 0;
- hyperstone_lddp(decode);
+ set_global_register(src_code, READ_W(dreg));
+ set_global_register(src_code + 1, READ_W(dreg + 4));
+
+ m_local_regs[dst_code] += 8;
+
+ m_icount -= m_clock_cycles_2;
}
void hyperstone_device::hyperstone_lddp_local_local()
@@ -5701,7 +5746,7 @@ void hyperstone_device::hyperstone_lddp_local_local()
m_icount -= m_clock_cycles_2;
}
-void hyperstone_device::hyperstone_stwr_global() // stwr local,global
+void hyperstone_device::hyperstone_stwr_global()
{
check_delay_PC();
@@ -5712,7 +5757,7 @@ void hyperstone_device::hyperstone_stwr_global() // stwr local,global
m_icount -= m_clock_cycles_1;
}
-void hyperstone_device::hyperstone_stwr_local() // stwr local,local
+void hyperstone_device::hyperstone_stwr_local()
{
check_delay_PC();
@@ -5738,6 +5783,7 @@ void hyperstone_device::opda()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_stdr(decode);
+ printf("0xda, stdr local,global\n");
}
void hyperstone_device::opdb()
@@ -5759,6 +5805,7 @@ void hyperstone_device::opdb()
decode.same_src_dstf = 0;
decode.same_srcf_dst = (((SRC_CODE + 1) & 0x3f) == DST_CODE);
hyperstone_stdr(decode);
+ printf("0xdb, stdr local,local\n");
}
void hyperstone_device::hyperstone_stwp_global_local()
@@ -5805,6 +5852,7 @@ void hyperstone_device::opde()
decode.same_src_dstf = 0;
decode.same_srcf_dst = 0;
hyperstone_stdp(decode);
+ printf("0xde, stdp local,global\n");
}
void hyperstone_device::hyperstone_stdp_local_local()
@@ -6140,7 +6188,7 @@ void hyperstone_device::hyperstone_call_global()
SR &= ~M_MASK;
PPC = PC;
- PC = (extra_s & ~1) + sreg; // const value
+ PC = (extra_s & ~1) + sreg;
m_intblock = 2;
@@ -6200,7 +6248,7 @@ void hyperstone_device::hyperstone_call_local()
SR &= ~M_MASK;
PPC = PC;
- PC = extra_s; // const value
+ PC = extra_s;
m_intblock = 2;