--- nono/vm/mk48t02.cpp 2026/04/29 17:04:50 1.1.1.7 +++ nono/vm/mk48t02.cpp 2026/04/29 17:04:55 1.1.1.9 @@ -19,11 +19,16 @@ // 0x44000000 から 0x48000000 の手前まで 2KB 単位でミラーが見える。 MK48T02Device::MK48T02Device() + : inherited("MK48T02") { - logname = "mk48t02"; - devname = "MK48T02"; + AddAlias("NVRAM"); + AddAlias("RTC"); + devaddr = 0x45000000; - monitor_size = nnSize(25, 2); + + monitor.func = (MonitorCallback_t)&MK48T02Device::MonitorUpdate; + monitor.SetSize(25, 2); + monitor.Regist(ID_MONITOR_MK48T02); } MK48T02Device::~MK48T02Device() @@ -47,13 +52,8 @@ MK48T02Device::Init() if (force_fixed) { putmsgn("force_fixed"); } - return true; -} -// RTC を初期化 -bool -MK48T02Device::InitRTC() -{ + // RTC を初期化 // ホストの時刻を UTC で取得 LoadHostRTC(false); @@ -227,21 +227,21 @@ MK48T02Device::Peek(uint32 offset) } void -MK48T02Device::MonitorUpdate(TextScreen& monitor) +MK48T02Device::MonitorUpdate(Monitor *, TextScreen& screen) { - monitor.Clear(); + screen.Clear(); - monitor.Print(0, 0, "WR:%d RD:%d", + screen.Print(0, 0, "WR:%d RD:%d", (reg.ctrl & MK48T02Clock::WRITE) ? 1 : 0, (reg.ctrl & MK48T02Clock::READ) ? 1 : 0); - monitor.Print(0, 1, "ST:%d KS:%d", + screen.Print(0, 1, "ST:%d KS:%d", reg.stop, reg.kickstart); // XXX レジスタの値はラッチされるまで意味がないので // どうしたものか。 - monitor.Print(10, 0, "%4d/%02d/%02d(%s)", + screen.Print(10, 0, "%4d/%02d/%02d(%s)", rtc.year, rtc.mon, rtc.mday, wdays[rtc.wday]); - monitor.Print(10, 1, "%02d:%02d:%02d", + screen.Print(10, 1, "%02d:%02d:%02d", rtc.hour, rtc.min, rtc.sec); } @@ -314,17 +314,31 @@ MK48T02Device::WriteString(uint32 addr, { int i = 0; - // XXX ここの文字列はゼロ終端なのかどうか - if (data.length() == 0 || data.length() > 15) { + // ここの文字列は16バイト未満なら一見ゼロ終端のようだが、 + // 16バイトならゼロ終端せず16文字とするフォーマット。 + + if (data.length() > 16) { return false; } addr &= 0x7ff; for (; i < data.length(); i++) { - Write(addr + i, data[i]); + mem[addr + i] = data[i]; } for (; i < 16; i++) { - Write(addr + i, 0); + mem[addr + i] = 0; } return true; } + +// 全域をゼロクリアする。 +// クリアするだけなので、その後何か書いたりチェックサムを計算したりする +// 必要はある。 +// (内蔵 ROM からの書き込み用) +void +MK48T02Device::ClearAll() +{ + for (int i = 0, sz = file.GetMemSize(); i < sz; i++) { + mem[i] = 0; + } +}