--- nono/vm/rp5c15.cpp 2026/04/29 17:04:59 1.1.1.9 +++ nono/vm/rp5c15.cpp 2026/04/29 17:05:10 1.1.1.10 @@ -4,29 +4,33 @@ // Licensed under nono-license.txt // -#include "rp5c15.h" -#include "mpu.h" -#include +// +// RTC (RP5C15) +// // アラームは未実装 -// XXX RTC の読み書きはロックしたほうがいいような気がする +#include "rp5c15.h" +#include "mpu.h" +// コンストラクタ RP5C15Device::RP5C15Device() : inherited("RTC") { devaddr = 0xe8a000; devlen = 0x2000; - // X68k は 1980 年の時、年カウンタに 0 をセット + // X68k の RTC epoch は 1980年固定で変更の必要はないので、設定も見ない。 year_epoch = 1980; + // X68k は通常ローカルタイム (というか JST) で使用する前提 use_localtime = true; - monitor.func = (MonitorCallback_t)&RP5C15Device::MonitorUpdate; + monitor.func = ToMonitorCallback(&RP5C15Device::MonitorUpdate); monitor.SetSize(41, 22); monitor.Regist(ID_MONITOR_RTC); } +// デストラクタ RP5C15Device::~RP5C15Device() { } @@ -506,7 +510,7 @@ void RP5C15Device::Tick32Hz() { if (reg.clksel == 4) { - // CLKOUT 16Hz は duty50% なので ON/OFF 駆動は 32Hz になる + // CLKOUT 16Hz は duty50% なのでオン/オフ駆動は 32Hz になる clkout = ((cnt & 1) == 0); } @@ -526,11 +530,11 @@ void RP5C15Device::Tick2Hz() { if (reg.clksel == 5) { - // CLKOUT 1Hz は duty50% なので ON/OFF 駆動は 2Hz になる + // CLKOUT 1Hz は duty50% なのでオン/オフ駆動は 2Hz になる。 // CLKOUT 端子は秒の繰り上がりに同期している。 // TIMER_EN (秒への繰り上がり) が無効でも反転自体は起きる気が // するので、ここでは UPDATE_SEC ではなく cnt で判定する。 - // CLKOUT は 1秒の繰り上がりが起きる時に 'H' になる + // CLKOUT は 1秒の繰り上がりが起きる時に 'H' になる。 clkout = ((cnt & 15) == 0); } @@ -563,7 +567,7 @@ RP5C15Device::Tick1Hz() // としか書かれておらず、00 or 30 秒で動作するとは書かれていない。 // データシートの図からはカレンダとは独立しているように読める。 - // 1/60Hz CLKOUT のための 60sec カウンタ + // 1/60Hz CLKOUT のための 60sec カウンタ。 // このカウンタは clksel によらず常にカウントする。 cnt_60sec++; if (cnt_60sec == 60) { @@ -571,7 +575,7 @@ RP5C15Device::Tick1Hz() } if (reg.clksel == 6) { - // CLKOUT 1/60Hz は duty50% なので ON/OFF 駆動は 30sec になる + // CLKOUT 1/60Hz は duty50% なのでオン/オフ駆動は 30sec になる clkout = (cnt_60sec < 30); } }