--- nono/vm/rp5c15.cpp 2026/04/29 17:05:10 1.1.1.10 +++ nono/vm/rp5c15.cpp 2026/04/29 17:05:14 1.1.1.11 @@ -11,7 +11,9 @@ // アラームは未実装 #include "rp5c15.h" +#include "mfp.h" #include "mpu.h" +#include "power.h" // コンストラクタ RP5C15Device::RP5C15Device() @@ -195,7 +197,7 @@ RP5C15Device::Write(uint32 offset, uint3 if (data == 0) { // 通常 0 を書き込むこと、となっているので 0 は許可 } else { - putlog(0, "TEST <- $%1x 未実装書き込み", data); + putlog(0, "TEST <- $%1x (NOT IMPLEMENTED)", data); } reg.test = data; break; @@ -215,6 +217,7 @@ RP5C15Device::Write(uint32 offset, uint3 if ((reg.reset & RP5C15::RESET_1Hz)) { alarm_1Hz = false; } + ChangeAlarmOut(); break; default: @@ -372,7 +375,7 @@ RP5C15Device::MonitorUpdate(Monitor *, T // ここでは分かりやすさ優先で正論理としている。 screen.Print(0, y, "Pin: CLKOUT=%c ALARM=%c", clkout ? 'H' : 'L', - AlarmOut() ? 'H' : 'L'); + alarm_out ? 'H' : 'L'); } // 秒を取得 @@ -505,6 +508,22 @@ RP5C15Device::SetLeap(uint v) reg.leap = v & 3; } +// ALARM OUT 信号 +void +RP5C15Device::ChangeAlarmOut() +{ + bool old = alarm_out; + + // アラーム出力は内部のアラーム用 16Hz, 1Hz と + // アラーム時刻一致の alarm_on との OR 論理となっている。 + alarm_out = alarm_16Hz | alarm_1Hz | alarm_on; + + if (old != alarm_out) { + gPower->SetAlarmOut(alarm_out); + gMFP->SetAlarmOut(alarm_out); + } +} + // 32Hz 仮想 RTC からのコール void RP5C15Device::Tick32Hz() @@ -521,6 +540,7 @@ RP5C15Device::Tick32Hz() // アラーム端子 16Hz パルス出力は %0 ならオン if ((reg.reset & RP5C15::RESET_16Hz) == 0) { alarm_16Hz = !alarm_16Hz; + ChangeAlarmOut(); } } @@ -546,6 +566,7 @@ RP5C15Device::Tick2Hz() // アラーム端子 16Hz パルス出力は %0 ならオン if ((reg.reset & RP5C15::RESET_1Hz) == 0) { alarm_1Hz = !alarm_1Hz; + ChangeAlarmOut(); } }