| 1081 | | GET_CFLG()); |
| 1082 | } |
| 1083 | void MakeFromSR_x(int t0trace) |
| 1084 | { |
| 1085 | int oldm = regs.m; |
| 1086 | int olds = regs.s; |
| 1087 | int oldt0 = regs.t0; |
| 1088 | int oldt1 = regs.t1; |
| 1089 | |
| 1090 | SET_XFLG((regs.sr >> 4) & 1); |
| 1091 | SET_NFLG((regs.sr >> 3) & 1); |
| 1092 | SET_ZFLG((regs.sr >> 2) & 1); |
| 1093 | SET_VFLG((regs.sr >> 1) & 1); |
| 1094 | SET_CFLG(regs.sr & 1); |
| 1095 | |
| 1096 | if (regs.t1 == ((regs.sr >> 15) & 1) && |
| 1097 | regs.t0 == ((regs.sr >> 14) & 1) && |
| 1098 | regs.s == ((regs.sr >> 13) & 1) && |
| 1099 | regs.m == ((regs.sr >> 12) & 1) && |
| 1100 | regs.intmask == ((regs.sr >> 8) & 7)) |
| 1101 | return; |
| 1102 | |
| 1103 | regs.t1 = (regs.sr >> 15) & 1; |
| 1104 | regs.t0 = (regs.sr >> 14) & 1; |
| 1105 | regs.s = (regs.sr >> 13) & 1; |
| 1106 | regs.m = (regs.sr >> 12) & 1; |
| 1107 | |
| 1108 | if (regs.intmask != ((regs.sr >> 8) & 7)) { |
| 1109 | int newimask = (regs.sr >> 8) & 7; |
| 1110 | // STOP intmask change enabling already active interrupt: delay it by 1 STOP round |
| 1111 | if (t0trace < 0 && regs.ipl[0] <= regs.intmask && regs.ipl[0] > newimask && regs.ipl[0] < 7) { |
| 1112 | regs.ipl[0] = 0; |
| 1113 | } |
| 1114 | regs.intmask = newimask; |
| 1115 | } |
| 1116 | |
| 1117 | if (currprefs.cpu_model >= 68020) { |
| 1118 | /* 68060 does not have MSP but does have M-bit.. */ |
| 1119 | if (currprefs.cpu_model >= 68060) |
| 1120 | regs.msp = regs.isp; |
| 1121 | if (olds != regs.s) { |
| 1122 | if (olds) { |
| 1123 | if (oldm) |
| 1124 | regs.msp = m68k_areg (regs, 7); |
| 1125 | else |
| 1126 | regs.isp = m68k_areg (regs, 7); |
| 1127 | m68k_areg (regs, 7) = regs.usp; |
| 1128 | } else { |
| 1129 | regs.usp = m68k_areg (regs, 7); |
| 1130 | m68k_areg (regs, 7) = regs.m ? regs.msp : regs.isp; |
| 1131 | } |
| 1132 | } else if (olds && oldm != regs.m) { |
| 1133 | if (oldm) { |
| 1134 | regs.msp = m68k_areg (regs, 7); |
| 1135 | m68k_areg (regs, 7) = regs.isp; |
| 1136 | } else { |
| 1137 | regs.isp = m68k_areg (regs, 7); |
| 1138 | m68k_areg (regs, 7) = regs.msp; |
| 1139 | } |
| 1140 | } |
no test coverage detected