--- nono/m88xx0/m88100core.cpp 2026/04/29 17:05:22 1.1.1.14 +++ nono/m88xx0/m88100core.cpp 2026/04/29 17:05:26 1.1.1.15 @@ -58,13 +58,22 @@ MPU88xx0Device::ExecNormal(Event& ev) break; } - if (intr_pending && IsIntrEnable()) { - // 割り込み処理要求が来ていて、 - // 直前の命令が割り込みを禁止していなければ割り込み - // XXX 実際は違う気がする - putlog(4, "INTR take"); - ExceptionCore(EXCEP_INTERRUPT, ExceptionKind::INTR); - goto exit; + if (__predict_false(intr_pending != 0)) { + if (resetting) { + // 命令実行の先でリセットが起きたら以降を全部キャンセルして帰る。 + // システムコントローラのリセットポートで起きる。 + // リセットは実際には intr_pending ではないが、 + // ここでフラグ処理をまとめるために立ててある。 + return; + } + if (IsIntrEnable()) { + // 割り込み処理要求が来ていて、 + // 直前の命令が割り込みを禁止していなければ割り込み。 + // XXX 実際は違う気がする + putlog(4, "INTR take"); + ExceptionCore(EXCEP_INTERRUPT, ExceptionKind::INTR); + goto exit; + } } used_cycle++; @@ -99,6 +108,7 @@ MPU88xx0Device::ExceptionCore(int vec, E // ただし 0 番は syscall(2) (間接システムコール) で、実際の番号は r2。 // 198番 __syscall(2) だと r2:r3 (なので実質 r3)。 // 非公式 NetBSD/luna88k はベクタ 128 を使っているようだ。 + excep_counter[vec]++; if (vec == 128 || vec == 450) { syscall = reg.r[13]; if (syscall == 0) { @@ -378,7 +388,7 @@ MPU88xx0Device::XmemDataException(uint32 // FPxS レジスタをセット /*static*/ void -MPU88xx0Device::SetFPxS(uint32& h, uint32& l, double src, uint32 ts) +MPU88xx0Device::SetFPxS(uint32 *h, uint32 *l, double src, uint32 ts) { // FPHS[12]、FPLS[12] は以下の構造 // @@ -428,12 +438,12 @@ MPU88xx0Device::SetFPxS(uint32& h, uint3 exp &= 0x7ff00000; } - h = (u.h & 0x800fffff) | exp; - l = u.l; + *h = (u.h & 0x800fffff) | exp; + *l = u.l; } else { // double - h = u.h; - l = u.l; + *h = u.h; + *l = u.l; } } @@ -441,14 +451,14 @@ MPU88xx0Device::SetFPxS(uint32& h, uint3 void MPU88xx0Device::SetFPS1(double src, uint32 t1) { - SetFPxS(reg.fphs1, reg.fpls1, src, t1); + SetFPxS(®.fphs1, ®.fpls1, src, t1); } // FPxS2 レジスタをセット void MPU88xx0Device::SetFPS2(double src, uint32 t2) { - SetFPxS(reg.fphs2, reg.fpls2, src, t2); + SetFPxS(®.fphs2, ®.fpls2, src, t2); } void