PDP11: Record the actual source and destination values for history.

Previously, the history would always use a register value as source or
destination as if the mode were zero, even when it wasn't.  Also, now
the destination value reflects the destination after instruction
execution rather than before.
This commit is contained in:
Paul Koning 2016-04-07 15:21:59 -04:00 committed by Mark Pizzolato
parent e2a8f0fcdc
commit 66fb70b768

View file

@ -745,6 +745,7 @@ while (reason == 0) {
int32 IR, srcspec, srcreg, dstspec, dstreg; int32 IR, srcspec, srcreg, dstspec, dstreg;
int32 src, src2, dst, ea; int32 src, src2, dst, ea;
int32 i, t, sign, oldrs, trapnum; int32 i, t, sign, oldrs, trapnum;
InstHistory *hst_ent;
if (cpu_astop) { if (cpu_astop) {
cpu_astop = 0; cpu_astop = 0;
@ -886,20 +887,22 @@ while (reason == 0) {
SWMASK ('K') | SWMASK ('V'), SWMASK ('S') | SWMASK ('V'), SWMASK ('K') | SWMASK ('V'), SWMASK ('S') | SWMASK ('V'),
SWMASK ('U') | SWMASK ('V'), SWMASK ('U') | SWMASK ('V') SWMASK ('U') | SWMASK ('V'), SWMASK ('U') | SWMASK ('V')
}; };
hst[hst_p].pc = PC | HIST_VLD; hst_ent = &hst[hst_p];
hst[hst_p].psw = get_PSW (); hst_ent->pc = PC | HIST_VLD;
hst[hst_p].src = R[srcspec & 07]; hst_ent->psw = get_PSW ();
hst[hst_p].dst = R[dstspec & 07]; hst_ent->src = 0;
hst[hst_p].inst[0] = IR; hst_ent->dst = 0;
hst_ent->inst[0] = IR;
for (i = 1; i < HIST_ILNT; i++) { for (i = 1; i < HIST_ILNT; i++) {
if (cpu_ex (&val, (PC + (i << 1)) & 0177777, &cpu_unit, swmap[cm & 03])) if (cpu_ex (&val, (PC + (i << 1)) & 0177777, &cpu_unit, swmap[cm & 03]))
hst[hst_p].inst[i] = 0; hst_ent->inst[i] = 0;
else hst[hst_p].inst[i] = (uint16) val; else hst_ent->inst[i] = (uint16) val;
} }
hst_p = (hst_p + 1); hst_p = (hst_p + 1);
if (hst_p >= hst_lnt) if (hst_p >= hst_lnt)
hst_p = 0; hst_p = 0;
} }
else hst_ent = NULL;
PC = (PC + 2) & 0177777; /* incr PC, mod 65k */ PC = (PC + 2) & 0177777; /* incr PC, mod 65k */
switch ((IR >> 12) & 017) { /* decode IR<15:12> */ switch ((IR >> 12) & 017) { /* decode IR<15:12> */
@ -988,6 +991,8 @@ while (reason == 0) {
if (CPUT (CPUT_05|CPUT_20) && /* 11/05, 11/20 */ if (CPUT (CPUT_05|CPUT_20) && /* 11/05, 11/20 */
((dstspec & 070) == 020)) /* JMP (R)+? */ ((dstspec & 070) == 020)) /* JMP (R)+? */
dst = R[dstspec & 07]; /* use post incr */ dst = R[dstspec & 07]; /* use post incr */
if (hst_ent)
hst_ent->dst = dst;
JMP_PC (dst); JMP_PC (dst);
} }
break; /* end JMP */ break; /* end JMP */
@ -995,6 +1000,8 @@ while (reason == 0) {
case 002: /* RTS et al*/ case 002: /* RTS et al*/
if (IR < 000210) { /* RTS */ if (IR < 000210) { /* RTS */
dstspec = dstspec & 07; dstspec = dstspec & 07;
if (hst_ent)
hst_ent->dst = R[dstspec];
JMP_PC (R[dstspec]); JMP_PC (R[dstspec]);
R[dstspec] = ReadW (SP | dsenable); R[dstspec] = ReadW (SP | dsenable);
if (dstspec != 6) if (dstspec != 6)
@ -1043,6 +1050,8 @@ while (reason == 0) {
if (!CPUT (CPUT_20)) if (!CPUT (CPUT_20))
V = 0; V = 0;
C = 0; C = 0;
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else PWriteW (dst, last_pa); else PWriteW (dst, last_pa);
@ -1143,6 +1152,8 @@ while (reason == 0) {
if ((cm == MD_KER) && (SP < (STKLIM + STKL_Y))) if ((cm == MD_KER) && (SP < (STKLIM + STKL_Y)))
set_stack_trap (SP); set_stack_trap (SP);
R[srcspec] = PC; R[srcspec] = PC;
if (hst_ent)
hst_ent->dst = dst;
JMP_PC (dst & 0177777); JMP_PC (dst & 0177777);
} }
break; /* end JSR */ break; /* end JSR */
@ -1150,6 +1161,8 @@ while (reason == 0) {
case 050: /* CLR */ case 050: /* CLR */
N = V = C = 0; N = V = C = 0;
Z = 1; Z = 1;
if (hst_ent)
hst_ent->dst = 0;
if (dstreg) if (dstreg)
R[dstspec] = 0; R[dstspec] = 0;
else WriteW (0, GeteaW (dstspec)); else WriteW (0, GeteaW (dstspec));
@ -1162,6 +1175,8 @@ while (reason == 0) {
Z = GET_Z (dst); Z = GET_Z (dst);
V = 0; V = 0;
C = 1; C = 1;
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else PWriteW (dst, last_pa); else PWriteW (dst, last_pa);
@ -1173,6 +1188,8 @@ while (reason == 0) {
N = GET_SIGN_W (dst); N = GET_SIGN_W (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = (dst == 0100000); V = (dst == 0100000);
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else PWriteW (dst, last_pa); else PWriteW (dst, last_pa);
@ -1184,6 +1201,8 @@ while (reason == 0) {
N = GET_SIGN_W (dst); N = GET_SIGN_W (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = (dst == 077777); V = (dst == 077777);
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else PWriteW (dst, last_pa); else PWriteW (dst, last_pa);
@ -1196,6 +1215,8 @@ while (reason == 0) {
Z = GET_Z (dst); Z = GET_Z (dst);
V = (dst == 0100000); V = (dst == 0100000);
C = Z ^ 1; C = Z ^ 1;
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else PWriteW (dst, last_pa); else PWriteW (dst, last_pa);
@ -1208,6 +1229,8 @@ while (reason == 0) {
Z = GET_Z (dst); Z = GET_Z (dst);
V = (C && (dst == 0100000)); V = (C && (dst == 0100000));
C = C & Z; C = C & Z;
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else PWriteW (dst, last_pa); else PWriteW (dst, last_pa);
@ -1220,6 +1243,8 @@ while (reason == 0) {
Z = GET_Z (dst); Z = GET_Z (dst);
V = (C && (dst == 077777)); V = (C && (dst == 077777));
C = (C && (dst == 0177777)); C = (C && (dst == 0177777));
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else PWriteW (dst, last_pa); else PWriteW (dst, last_pa);
@ -1227,6 +1252,8 @@ while (reason == 0) {
case 057: /* TST */ case 057: /* TST */
dst = dstreg? R[dstspec]: ReadW (GeteaW (dstspec)); dst = dstreg? R[dstspec]: ReadW (GeteaW (dstspec));
if (hst_ent)
hst_ent->dst = dst;
N = GET_SIGN_W (dst); N = GET_SIGN_W (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = C = 0; V = C = 0;
@ -1239,6 +1266,8 @@ while (reason == 0) {
Z = GET_Z (dst); Z = GET_Z (dst);
C = (src & 1); C = (src & 1);
V = N ^ C; V = N ^ C;
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else PWriteW (dst, last_pa); else PWriteW (dst, last_pa);
@ -1251,6 +1280,8 @@ while (reason == 0) {
Z = GET_Z (dst); Z = GET_Z (dst);
C = GET_SIGN_W (src); C = GET_SIGN_W (src);
V = N ^ C; V = N ^ C;
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else PWriteW (dst, last_pa); else PWriteW (dst, last_pa);
@ -1263,6 +1294,8 @@ while (reason == 0) {
Z = GET_Z (dst); Z = GET_Z (dst);
C = (src & 1); C = (src & 1);
V = N ^ C; V = N ^ C;
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else PWriteW (dst, last_pa); else PWriteW (dst, last_pa);
@ -1275,6 +1308,8 @@ while (reason == 0) {
Z = GET_Z (dst); Z = GET_Z (dst);
C = GET_SIGN_W (src); C = GET_SIGN_W (src);
V = N ^ C; V = N ^ C;
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else PWriteW (dst, last_pa); else PWriteW (dst, last_pa);
@ -1312,6 +1347,8 @@ while (reason == 0) {
SP = (SP - 2) & 0177777; SP = (SP - 2) & 0177777;
if (update_MM) if (update_MM)
MMR1 = calc_MMR1 (0366); MMR1 = calc_MMR1 (0366);
if (hst_ent)
hst_ent->dst = dst;
WriteW (dst, SP | dsenable); WriteW (dst, SP | dsenable);
if ((cm == MD_KER) && (SP < (STKLIM + STKL_Y))) if ((cm == MD_KER) && (SP < (STKLIM + STKL_Y)))
set_stack_trap (SP); set_stack_trap (SP);
@ -1327,6 +1364,8 @@ while (reason == 0) {
V = 0; V = 0;
SP = (SP + 2) & 0177777; SP = (SP + 2) & 0177777;
if (update_MM) MMR1 = 026; if (update_MM) MMR1 = 026;
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) { if (dstreg) {
if ((dstspec == 6) && (cm != pm)) if ((dstspec == 6) && (cm != pm))
STACKFILE[pm] = dst; STACKFILE[pm] = dst;
@ -1342,6 +1381,8 @@ while (reason == 0) {
dst = N? 0177777: 0; dst = N? 0177777: 0;
Z = N ^ 1; Z = N ^ 1;
V = 0; V = 0;
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else WriteW (dst, GeteaW (dstspec)); else WriteW (dst, GeteaW (dstspec));
@ -1376,6 +1417,8 @@ while (reason == 0) {
V = 0; V = 0;
C = (dst & 1); C = (dst & 1);
R[0] = dst; /* R[0] <- dst */ R[0] = dst; /* R[0] <- dst */
if (hst_ent)
hst_ent->dst = dst | 1;
PWriteW (R[0] | 1, last_pa); /* dst <- R[0] | 1 */ PWriteW (R[0] | 1, last_pa); /* dst <- R[0] | 1 */
} }
else setTRAP (TRAP_ILL); else setTRAP (TRAP_ILL);
@ -1387,6 +1430,8 @@ while (reason == 0) {
Z = GET_Z (R[0]); Z = GET_Z (R[0]);
V = 0; V = 0;
WriteW (R[0], GeteaW (dstspec)); WriteW (R[0], GeteaW (dstspec));
if (hst_ent)
hst_ent->dst = R[0];
} }
else setTRAP (TRAP_ILL); else setTRAP (TRAP_ILL);
break; break;
@ -1421,6 +1466,10 @@ while (reason == 0) {
N = GET_SIGN_W (dst); N = GET_SIGN_W (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = 0; V = 0;
if (hst_ent) {
hst_ent->src = dst;
hst_ent->dst = dst;
}
if (dstreg) if (dstreg)
R[dstspec] = dst; R[dstspec] = dst;
else WriteW (dst, ea); else WriteW (dst, ea);
@ -1436,6 +1485,10 @@ while (reason == 0) {
src2 = dstreg? R[dstspec]: ReadW (GeteaW (dstspec)); src2 = dstreg? R[dstspec]: ReadW (GeteaW (dstspec));
} }
dst = (src - src2) & 0177777; dst = (src - src2) & 0177777;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = src2;
}
N = GET_SIGN_W (dst); N = GET_SIGN_W (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = GET_SIGN_W ((src ^ src2) & (~src2 ^ dst)); V = GET_SIGN_W ((src ^ src2) & (~src2 ^ dst));
@ -1452,6 +1505,10 @@ while (reason == 0) {
src2 = dstreg? R[dstspec]: ReadW (GeteaW (dstspec)); src2 = dstreg? R[dstspec]: ReadW (GeteaW (dstspec));
} }
dst = src2 & src; dst = src2 & src;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
N = GET_SIGN_W (dst); N = GET_SIGN_W (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = 0; V = 0;
@ -1467,6 +1524,10 @@ while (reason == 0) {
src2 = dstreg? R[dstspec]: ReadMW (GeteaW (dstspec)); src2 = dstreg? R[dstspec]: ReadMW (GeteaW (dstspec));
} }
dst = src2 & ~src; dst = src2 & ~src;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
N = GET_SIGN_W (dst); N = GET_SIGN_W (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = 0; V = 0;
@ -1485,6 +1546,10 @@ while (reason == 0) {
src2 = dstreg? R[dstspec]: ReadMW (GeteaW (dstspec)); src2 = dstreg? R[dstspec]: ReadMW (GeteaW (dstspec));
} }
dst = src2 | src; dst = src2 | src;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
N = GET_SIGN_W (dst); N = GET_SIGN_W (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = 0; V = 0;
@ -1503,6 +1568,10 @@ while (reason == 0) {
src2 = dstreg? R[dstspec]: ReadMW (GeteaW (dstspec)); src2 = dstreg? R[dstspec]: ReadMW (GeteaW (dstspec));
} }
dst = (src2 + src) & 0177777; dst = (src2 + src) & 0177777;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
N = GET_SIGN_W (dst); N = GET_SIGN_W (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = GET_SIGN_W ((~src ^ src2) & (src ^ dst)); V = GET_SIGN_W ((~src ^ src2) & (src ^ dst));
@ -1545,6 +1614,10 @@ while (reason == 0) {
if (GET_SIGN_W (src)) if (GET_SIGN_W (src))
src = src | ~077777; src = src | ~077777;
dst = src * src2; dst = src * src2;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
R[srcspec] = (dst >> 16) & 0177777; R[srcspec] = (dst >> 16) & 0177777;
R[srcspec | 1] = dst & 0177777; R[srcspec | 1] = dst & 0177777;
N = (dst < 0); N = (dst < 0);
@ -1575,6 +1648,10 @@ while (reason == 0) {
if (GET_SIGN_W (R[srcspec])) if (GET_SIGN_W (R[srcspec]))
src = src | ~017777777777; src = src | ~017777777777;
dst = src / src2; dst = src / src2;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
N = (dst < 0); /* N set on 32b result */ N = (dst < 0); /* N set on 32b result */
if ((dst > 077777) || (dst < -0100000)) { if ((dst > 077777) || (dst < -0100000)) {
V = 1; /* J11,11/70 compat */ V = 1; /* J11,11/70 compat */
@ -1621,6 +1698,10 @@ while (reason == 0) {
V = 0; V = 0;
C = ((src >> (63 - src2)) & 1); C = ((src >> (63 - src2)) & 1);
} }
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
dst = R[srcspec] = dst & 0177777; dst = R[srcspec] = dst & 0177777;
N = GET_SIGN_W (dst); N = GET_SIGN_W (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
@ -1656,6 +1737,10 @@ while (reason == 0) {
C = ((src >> (63 - src2)) & 1); C = ((src >> (63 - src2)) & 1);
} }
i = R[srcspec] = (dst >> 16) & 0177777; i = R[srcspec] = (dst >> 16) & 0177777;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
dst = R[srcspec | 1] = dst & 0177777; dst = R[srcspec | 1] = dst & 0177777;
N = GET_SIGN_W (i); N = GET_SIGN_W (i);
Z = GET_Z (dst | i); Z = GET_Z (dst | i);
@ -1672,6 +1757,10 @@ while (reason == 0) {
src2 = dstreg? R[dstspec]: ReadMW (GeteaW (dstspec)); src2 = dstreg? R[dstspec]: ReadMW (GeteaW (dstspec));
} }
dst = src ^ src2; dst = src ^ src2;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
N = GET_SIGN_W (dst); N = GET_SIGN_W (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = 0; V = 0;
@ -1702,6 +1791,8 @@ while (reason == 0) {
case 7: /* SOB */ case 7: /* SOB */
if (CPUT (HAS_SXS)) { if (CPUT (HAS_SXS)) {
R[srcspec] = (R[srcspec] - 1) & 0177777; R[srcspec] = (R[srcspec] - 1) & 0177777;
if (hst_ent)
hst_ent->dst = R[srcspec];
if (R[srcspec]) { if (R[srcspec]) {
JMP_PC ((PC - dstspec - dstspec) & 0177777); JMP_PC ((PC - dstspec - dstspec) & 0177777);
} }
@ -1826,6 +1917,11 @@ while (reason == 0) {
if (dstreg) if (dstreg)
R[dstspec] = R[dstspec] & 0177400; R[dstspec] = R[dstspec] & 0177400;
else WriteB (0, GeteaB (dstspec)); else WriteB (0, GeteaB (dstspec));
if (hst_ent) {
if (dstreg)
hst_ent->dst = R[dstspec];
else hst_ent->dst = 0;
}
break; break;
case 051: /* COMB */ case 051: /* COMB */
@ -1838,6 +1934,11 @@ while (reason == 0) {
if (dstreg) if (dstreg)
R[dstspec] = (R[dstspec] & 0177400) | dst; R[dstspec] = (R[dstspec] & 0177400) | dst;
else PWriteB (dst, last_pa); else PWriteB (dst, last_pa);
if (hst_ent) {
if (dstreg)
hst_ent->dst = R[dstspec];
else hst_ent->dst = dst;
}
break; break;
case 052: /* INCB */ case 052: /* INCB */
@ -1849,6 +1950,11 @@ while (reason == 0) {
if (dstreg) if (dstreg)
R[dstspec] = (R[dstspec] & 0177400) | dst; R[dstspec] = (R[dstspec] & 0177400) | dst;
else PWriteB (dst, last_pa); else PWriteB (dst, last_pa);
if (hst_ent) {
if (dstreg)
hst_ent->dst = R[dstspec];
else hst_ent->dst = dst;
}
break; break;
case 053: /* DECB */ case 053: /* DECB */
@ -1860,6 +1966,11 @@ while (reason == 0) {
if (dstreg) if (dstreg)
R[dstspec] = (R[dstspec] & 0177400) | dst; R[dstspec] = (R[dstspec] & 0177400) | dst;
else PWriteB (dst, last_pa); else PWriteB (dst, last_pa);
if (hst_ent) {
if (dstreg)
hst_ent->dst = R[dstspec];
else hst_ent->dst = dst;
}
break; break;
case 054: /* NEGB */ case 054: /* NEGB */
@ -1872,6 +1983,11 @@ while (reason == 0) {
if (dstreg) if (dstreg)
R[dstspec] = (R[dstspec] & 0177400) | dst; R[dstspec] = (R[dstspec] & 0177400) | dst;
else PWriteB (dst, last_pa); else PWriteB (dst, last_pa);
if (hst_ent) {
if (dstreg)
hst_ent->dst = R[dstspec];
else hst_ent->dst = dst;
}
break; break;
case 055: /* ADCB */ case 055: /* ADCB */
@ -1884,6 +2000,11 @@ while (reason == 0) {
if (dstreg) if (dstreg)
R[dstspec] = (R[dstspec] & 0177400) | dst; R[dstspec] = (R[dstspec] & 0177400) | dst;
else PWriteB (dst, last_pa); else PWriteB (dst, last_pa);
if (hst_ent) {
if (dstreg)
hst_ent->dst = R[dstspec];
else hst_ent->dst = dst;
}
break; break;
case 056: /* SBCB */ case 056: /* SBCB */
@ -1896,10 +2017,17 @@ while (reason == 0) {
if (dstreg) if (dstreg)
R[dstspec] = (R[dstspec] & 0177400) | dst; R[dstspec] = (R[dstspec] & 0177400) | dst;
else PWriteB (dst, last_pa); else PWriteB (dst, last_pa);
if (hst_ent) {
if (dstreg)
hst_ent->dst = R[dstspec];
else hst_ent->dst = dst;
}
break; break;
case 057: /* TSTB */ case 057: /* TSTB */
dst = dstreg? R[dstspec] & 0377: ReadB (GeteaB (dstspec)); dst = dstreg? R[dstspec] & 0377: ReadB (GeteaB (dstspec));
if (hst_ent)
hst_ent->dst = dst;
N = GET_SIGN_B (dst); N = GET_SIGN_B (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = C = 0; V = C = 0;
@ -1915,6 +2043,11 @@ while (reason == 0) {
if (dstreg) if (dstreg)
R[dstspec] = (R[dstspec] & 0177400) | dst; R[dstspec] = (R[dstspec] & 0177400) | dst;
else PWriteB (dst, last_pa); else PWriteB (dst, last_pa);
if (hst_ent) {
if (dstreg)
hst_ent->dst = R[dstspec];
else hst_ent->dst = dst;
}
break; break;
case 061: /* ROLB */ case 061: /* ROLB */
@ -1927,6 +2060,11 @@ while (reason == 0) {
if (dstreg) if (dstreg)
R[dstspec] = (R[dstspec] & 0177400) | dst; R[dstspec] = (R[dstspec] & 0177400) | dst;
else PWriteB (dst, last_pa); else PWriteB (dst, last_pa);
if (hst_ent) {
if (dstreg)
hst_ent->dst = R[dstspec];
else hst_ent->dst = dst;
}
break; break;
case 062: /* ASRB */ case 062: /* ASRB */
@ -1939,6 +2077,11 @@ while (reason == 0) {
if (dstreg) if (dstreg)
R[dstspec] = (R[dstspec] & 0177400) | dst; R[dstspec] = (R[dstspec] & 0177400) | dst;
else PWriteB (dst, last_pa); else PWriteB (dst, last_pa);
if (hst_ent) {
if (dstreg)
hst_ent->dst = R[dstspec];
else hst_ent->dst = dst;
}
break; break;
case 063: /* ASLB */ case 063: /* ASLB */
@ -1951,6 +2094,11 @@ while (reason == 0) {
if (dstreg) if (dstreg)
R[dstspec] = (R[dstspec] & 0177400) | dst; R[dstspec] = (R[dstspec] & 0177400) | dst;
else PWriteB (dst, last_pa); else PWriteB (dst, last_pa);
if (hst_ent) {
if (dstreg)
hst_ent->dst = R[dstspec];
else hst_ent->dst = dst;
}
break; break;
/* Notes: /* Notes:
@ -1988,6 +2136,8 @@ while (reason == 0) {
SP = (SP - 2) & 0177777; SP = (SP - 2) & 0177777;
if (update_MM) if (update_MM)
MMR1 = calc_MMR1 (0366); MMR1 = calc_MMR1 (0366);
if (hst_ent)
hst_ent->dst = dst;
WriteW (dst, SP | dsenable); WriteW (dst, SP | dsenable);
if ((cm == MD_KER) && (SP < (STKLIM + STKL_Y))) if ((cm == MD_KER) && (SP < (STKLIM + STKL_Y)))
set_stack_trap (SP); set_stack_trap (SP);
@ -2004,6 +2154,8 @@ while (reason == 0) {
SP = (SP + 2) & 0177777; SP = (SP + 2) & 0177777;
if (update_MM) if (update_MM)
MMR1 = 026; MMR1 = 026;
if (hst_ent)
hst_ent->dst = dst;
if (dstreg) { if (dstreg) {
if ((dstspec == 6) && (cm != pm)) if ((dstspec == 6) && (cm != pm))
STACKFILE[pm] = dst; STACKFILE[pm] = dst;
@ -2055,6 +2207,10 @@ while (reason == 0) {
if (dstreg) if (dstreg)
R[dstspec] = (dst & 0200)? 0177400 | dst: dst; R[dstspec] = (dst & 0200)? 0177400 | dst: dst;
else WriteB (dst, ea); else WriteB (dst, ea);
if (hst_ent) {
hst_ent->src = srcreg? R[srcspec]: dst;
hst_ent->dst = dstreg? R[dstspec]: dst;
}
break; break;
case 012: /* CMPB */ case 012: /* CMPB */
@ -2066,6 +2222,10 @@ while (reason == 0) {
src = srcreg? R[srcspec] & 0377: ReadB (GeteaB (srcspec)); src = srcreg? R[srcspec] & 0377: ReadB (GeteaB (srcspec));
src2 = dstreg? R[dstspec] & 0377: ReadB (GeteaB (dstspec)); src2 = dstreg? R[dstspec] & 0377: ReadB (GeteaB (dstspec));
} }
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = src2;
}
dst = (src - src2) & 0377; dst = (src - src2) & 0377;
N = GET_SIGN_B (dst); N = GET_SIGN_B (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
@ -2083,6 +2243,10 @@ while (reason == 0) {
src2 = dstreg? R[dstspec] & 0377: ReadB (GeteaB (dstspec)); src2 = dstreg? R[dstspec] & 0377: ReadB (GeteaB (dstspec));
} }
dst = (src2 & src) & 0377; dst = (src2 & src) & 0377;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
N = GET_SIGN_B (dst); N = GET_SIGN_B (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = 0; V = 0;
@ -2098,6 +2262,10 @@ while (reason == 0) {
src2 = dstreg? R[dstspec]: ReadMB (GeteaB (dstspec)); src2 = dstreg? R[dstspec]: ReadMB (GeteaB (dstspec));
} }
dst = (src2 & ~src) & 0377; dst = (src2 & ~src) & 0377;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
N = GET_SIGN_B (dst); N = GET_SIGN_B (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = 0; V = 0;
@ -2116,6 +2284,10 @@ while (reason == 0) {
src2 = dstreg? R[dstspec]: ReadMB (GeteaB (dstspec)); src2 = dstreg? R[dstspec]: ReadMB (GeteaB (dstspec));
} }
dst = (src2 | src) & 0377; dst = (src2 | src) & 0377;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
N = GET_SIGN_B (dst); N = GET_SIGN_B (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = 0; V = 0;
@ -2134,6 +2306,10 @@ while (reason == 0) {
src2 = dstreg? R[dstspec]: ReadMW (GeteaW (dstspec)); src2 = dstreg? R[dstspec]: ReadMW (GeteaW (dstspec));
} }
dst = (src2 - src) & 0177777; dst = (src2 - src) & 0177777;
if (hst_ent) {
hst_ent->src = src;
hst_ent->dst = dst;
}
N = GET_SIGN_W (dst); N = GET_SIGN_W (dst);
Z = GET_Z (dst); Z = GET_Z (dst);
V = GET_SIGN_W ((src ^ src2) & (~src ^ dst)); V = GET_SIGN_W ((src ^ src2) & (~src ^ dst));