--- nono/vm/syncer.cpp 2026/04/29 17:05:28 1.1.1.3 +++ nono/vm/syncer.cpp 2026/04/29 17:05:37 1.1.1.5 @@ -10,6 +10,7 @@ #include "syncer.h" #include "config.h" +#include "monitor.h" #include "mpu680x0.h" #include "scheduler.h" @@ -42,14 +43,11 @@ Syncer::~Syncer() bool Syncer::Init() { - if (inherited::Init() == false) { - return false; - } - mpu680x0 = dynamic_cast(mpu); - mode = SCHED_POWEROFF; + mode = SYNCMODE_POWEROFF; overslept = 0; + dmac_idle = 1; // 高速モード指定 bool fast_mode = gConfig->Find("fast-mode").AsInt(); @@ -109,7 +107,23 @@ Syncer::RequestCPUMode(uint32 cpumode) { uint32 newmode; - newmode = (mode & ~SCHED_CPU_MASK) | cpumode; + halt = cpumode & SYNCMODE_CPU_HALT; + cpu_idle = cpumode & SYNCMODE_CPU_STOP; + + newmode = (mode & ~SYNCMODE_CPU_MASK) | halt | (cpu_idle & dmac_idle); + + ChangeMode(newmode); +} + +// DMAC のアクティブ状態を指示する。 +void +Syncer::RequestDMACActive(bool active) +{ + uint32 newmode; + + dmac_idle = active ? 0 : SYNCMODE_IDLE; + + newmode = (mode & ~SYNCMODE_IDLE) | (cpu_idle & dmac_idle); ChangeMode(newmode); } @@ -131,9 +145,9 @@ Syncer::RequestBootPageMode(bool isrom) uint32 newmode; if (isrom) { - newmode = mode | SCHED_BOOT; + newmode = mode | SYNCMODE_BOOT; } else { - newmode = mode & ~SCHED_BOOT; + newmode = mode & ~SYNCMODE_BOOT; } ChangeMode(newmode); @@ -146,9 +160,9 @@ Syncer::RequestKeyPressed(bool pressed) uint32 newmode; if (pressed) { - newmode = mode | SCHED_KEY; + newmode = mode | SYNCMODE_KEY; } else { - newmode = mode & ~SCHED_KEY; + newmode = mode & ~SYNCMODE_KEY; } ChangeMode(newmode); @@ -161,9 +175,9 @@ Syncer::RequestPowerOffMode(bool powerof uint32 newmode; if (poweroff) { - newmode = mode | SCHED_POWEROFF; + newmode = mode | SYNCMODE_POWEROFF; } else { - newmode = mode & ~SCHED_POWEROFF; + newmode = mode & ~SYNCMODE_POWEROFF; } ChangeMode(newmode); @@ -177,16 +191,16 @@ Syncer::ChangeModeMessage(MessageID msgi if (msgid == MessageID::SCHEDULER_SYNCMODE) { if (arg) { - newmode = mode & ~SCHED_SYNC; + newmode = mode & ~SYNCMODE_SYNC; } else { - newmode = mode | SCHED_SYNC; + newmode = mode | SYNCMODE_SYNC; } ChangeMode(newmode); } } -// メンバ変数 mode_request に従ってスケジューラの動作状態を変更。 +// newmode に従ってスケジューラの動作状態を変更。 // 自スレッドから呼ぶこと。 void Syncer::ChangeMode(uint32 newmode) @@ -372,25 +386,25 @@ Syncer::MonitorUpdateSub(TextScreen& scr int y = 0; screen.Print(0, y, "Mode: 0x%04x (", mode); - switch (mode & SCHED_CPU_MASK) { - case SCHED_CPU_NORMAL: + switch (mode & SYNCMODE_CPU_MASK) { + case SYNCMODE_CPU_NORMAL: screen.Puts(14, y, TA::Off, "Run"); break; - case SCHED_CPU_STOP: + case SYNCMODE_CPU_STOP: screen.Puts(14, y, TA::On, "STOP"); break; - case SCHED_CPU_HALT: + case SYNCMODE_CPU_HALT: screen.Puts(14, y, TA::On, "HALT"); break; } - if ((mode & SCHED_SYNC)) { + if ((mode & SYNCMODE_SYNC)) { screen.Puts(19, y, TA::On, "Sync"); } else { screen.Puts(19, y, TA::Off, "Full"); } - screen.Puts(24, y, TA::OnOff((mode & SCHED_BOOT)), "Boot"); - screen.Puts(29, y, TA::OnOff((mode & SCHED_KEY)), "Key"); - screen.Puts(34, y, TA::OnOff((mode & SCHED_POWEROFF)), "POff"); + screen.Puts(24, y, TA::OnOff((mode & SYNCMODE_BOOT)), "Boot"); + screen.Puts(29, y, TA::OnOff((mode & SYNCMODE_KEY)), "Key"); + screen.Puts(34, y, TA::OnOff((mode & SYNCMODE_POWEROFF)), "POff"); screen.Puts(38, y, ")"); y++; uint64 rt = rtime;