--- nono/m680x0/m68030core.cpp 2026/04/29 17:04:43 1.1.1.3 +++ nono/m680x0/m68030core.cpp 2026/04/29 17:04:46 1.1.1.4 @@ -71,7 +71,7 @@ m68030_run(m68kcpu *cpu, uint32 delta) if ((cpu->atomic_reqflag & CPU_REQ_RELEASE)) { // ここで実行を中断してスケジューラに戻る cpu->atomic_reqflag &= ~CPU_REQ_RELEASE; - return cpu->atomic_reqflag; + goto exit; } if ((cpu->atomic_reqflag & CPU_REQ_RESET)) { @@ -89,15 +89,19 @@ m68030_run(m68kcpu *cpu, uint32 delta) if ((cpu->atomic_reqflag & CPU_REQ_STOP)) { // STOP 状態は、残りサイクルを消費したことにして戻る cpu->reg.state = CPU_REQ_STOP; - cpu->used_cycle = cpu->goal_cycle; - return cpu->atomic_reqflag; + if (cpu->used_cycle < cpu->goal_cycle) { + cpu->used_cycle = cpu->goal_cycle; + } + goto exit; } if ((cpu->atomic_reqflag & CPU_REQ_HALT)) { // HALT 状態も、残りサイクルを消費したことにして戻る cpu->reg.state = CPU_REQ_HALT; - cpu->used_cycle = cpu->goal_cycle; - return cpu->atomic_reqflag; + if (cpu->used_cycle < cpu->goal_cycle) { + cpu->used_cycle = cpu->goal_cycle; + } + goto exit; } if ((cpu->atomic_reqflag & CPU_REQ_TRACE)) { @@ -141,7 +145,7 @@ m68030_run(m68kcpu *cpu, uint32 delta) cpu->used_cycle += cpu->cycle_nocache; \ cpu->cycle_nocache = 0; \ if (cpu->used_cycle >= cpu->goal_cycle) \ - return cpu->atomic_reqflag; \ + goto exit; \ if (cpu->atomic_reqflag != 0) goto exit_inner_loop; \ JUMP @@ -171,7 +175,7 @@ m68030_run(m68kcpu *cpu, uint32 delta) cpu->used_cycle += cpu->cycle_nocache; cpu->cycle_nocache = 0; if (cpu->used_cycle >= cpu->goal_cycle) - return cpu->atomic_reqflag; + goto exit; } while (cpu->atomic_reqflag == 0); #endif @@ -185,6 +189,12 @@ m68030_run(m68kcpu *cpu, uint32 delta) } } __unreachable(); + + exit: + cpu->total_vtime += cpu->Cycle2Vtime(cpu->used_cycle); + cpu->used_cycle = 0; + + return cpu->atomic_reqflag; } // ペンディングの割り込みを確認