--- nono/vm/mpu680x0.cpp 2026/04/29 17:04:47 1.1.1.6 +++ nono/vm/mpu680x0.cpp 2026/04/29 17:04:52 1.1.1.8 @@ -16,22 +16,15 @@ std::unique_ptr gMPUATC; // コンストラクタ -// -// reset_vector にはリセットベクタの番地を指定する。 -// 本来の MPU の動作は、リセット例外時にメモリの $0, $4 番地 (もっと言えば -// FC がプログラム空間の) から SP, PC を読み込むのだが、そのためにメモリ空間 -// を切り替える処理はリセット時にしか必要ないわりに結構手間である。そしてこの -// m68k 恒例のブートストラップ動作はソフトウェア的には一切観測する手段がない。 -// であれば、リセット例外時にこのアドレスから SP, PC の値を直接読み込んだと -// しても動作にはまったく違いは出ない。そしてバス・メモリ空間の実装も簡略化 -// できる。すごい楽。 -MPU680x0Device::MPU680x0Device(uint32 reset_vector) +MPU680x0Device::MPU680x0Device() { monitor_size = nnSize(79, 16); - cpu = m68030_init(reset_vector); + cpu = m68030_init(); // イベントコールバック設定 + event.dev = this; + event.SetName("MPU"); event.func = (DeviceCallback_t)&MPU680x0Device::Callback; // モニタ用の別オブジェクト @@ -51,7 +44,7 @@ MPU680x0Device::Init() return false; } // MPU クロックは親 Init() で読み込んで、ここで cpu にセットする - cpu->clock_khz = clock_khz; + m68030_set_clockspeed(cpu, clock_khz); // 割り込み時のディレイ intdelay = cpu->Cycle2Vtime(4); @@ -72,21 +65,28 @@ MPU680x0Device::Init() return true; } +bool +MPU680x0Device::PowerOn() +{ + m68030_power_on(cpu); + return true; +} + +void +MPU680x0Device::ResetHard() +{ + // リセット例外 + m68030_request_reset_exception(cpu); +} + // イベントコールバック // ev.code は -// 0x80000000: リセット例外 // 0x0 〜 0x7: 新しい割り込みレベルを通知 (0-7) void MPU680x0Device::Callback(Event& ev) { - if (__predict_false((int32)ev.code < 0)) { - // リセット例外 - m68030_request_reset_exception(cpu); - } else { - // コードが 0-7 なら新しい割り込みレベルの通知 - int level = ev.code; - m68030_interrupt(cpu, level); - } + int level = ev.code; + m68030_interrupt(cpu, level); } // MPU を vtime [nsec] 分実行する。 @@ -337,7 +337,7 @@ MPU680x0Device::MonitorUpdate(TextScreen void m68030_reset_inst(m68kcpu *cpu) { - gVM->ResetSoft(); + gVM->ResetByMPU(); } //