--- nono/m88xx0/m88100core.cpp 2026/04/29 17:04:49 1.1.1.7 +++ nono/m88xx0/m88100core.cpp 2026/04/29 17:04:57 1.1.1.9 @@ -22,10 +22,30 @@ } \ } while (0) +void +m88kcpu::PowerOn() +{ + // 履歴は電源オン時だけ初期化。 + // (LUNA88K は ROM が正常パスで CPU リセットを行ったりするので) + exhist.Clear(); + brhist.Clear(); + + // この後起きるリセット例外で xip を初期化する前に参照することになるので + // これだけここでも初期化しておく。 + xip = 0; +} + // リセット例外のようなもの? void m88kcpu::Reset() { + // 例外履歴に記録 (例外発生はブランチ履歴にも記録) + // リセット例外も発生時の XIP を記録する。(LUNA88K の ROM 1.20) + exhist.AddEntry(xip | 1, 0, 0xfc000000 | 0); + brhist.AddEntry(xip | 1, 0, 0xfc000000 | 0); + // デバッガに通知 (例外ブレーク用) + debugger_notify_exception(0); + // 内部の割り込み状態をクリア intr_pending = 0; atomic_reqflag &= ~(CPU_REQ_RESET | CPU_REQ_INTR | CPU_REQ_STOP); @@ -42,11 +62,7 @@ m88kcpu::Reset() SetPSR(); - // 実際には m88k MPU はリセット直後は 0 番地から実行を開始するので、 - // 大抵の場合システムでリセット直後は 0 番地付近に ROM を見せるように - // してあるのだと思うが、ここではその代わりに ROM のアドレスを指定して、 - // 直接そこから実行を開始することにする。 - fip = reset_vector; + fip = 0; // レジスタのうち明記されてるものをクリア。 // 不定と明記されてるものはリセットでは触らないでおく。 @@ -65,17 +81,6 @@ m88kcpu::Reset() cmmu[0].Reset(); cmmu[1].Reset(); - // 履歴を初期化 - exhist.Clear(); - brhist.Clear(); - - // 例外履歴に記録 (例外発生はブランチ履歴にも記録) - // リセット例外発生時の from にはあまり意味がないので 0 にするか。 - exhist.AddEntry(0 | 1, 0, 0xfc000000 | 0); - brhist.AddEntry(0 | 1, 0, 0xfc000000 | 0); - // デバッガに通知 (例外ブレーク用) - debugger_notify_exception(0); - fetch(); } @@ -207,6 +212,15 @@ m88kcpu::Run(uint32 delta) } } + // XXX 命令の実行でリリースするのに、いったんループを回って + // からではタイミングが遅すぎる + if ((atomic_reqflag & CPU_REQ_RELEASE)) { + // 中断リクエスト受信 + // この命令を実行し終わったら抜ける + atomic_reqflag &= ~CPU_REQ_RELEASE; + is_release = true; + } + if (used_cycle >= goal_cycle) break; }