--- nono/vm/rp5c15.cpp 2026/04/29 17:04:42 1.1.1.5 +++ nono/vm/rp5c15.cpp 2026/04/29 17:04:55 1.1.1.8 @@ -13,21 +13,23 @@ // XXX RTC の読み書きはロックしたほうがいいような気がする RP5C15Device::RP5C15Device() + : inherited("RTC") { - logname = "rtc"; - devname = "RTC"; devaddr = 0xe8a000; devlen = 0x2000; - monitor_size = nnSize(30, 17); + + monitor.func = (MonitorCallback_t)&RP5C15Device::MonitorUpdate; + monitor.SetSize(30, 17); + monitor.Regist(ID_MONITOR_RTC); } RP5C15Device::~RP5C15Device() { } -// RTC を初期化 +// 初期化 bool -RP5C15Device::InitRTC() +RP5C15Device::Init() { // ホストの時刻をローカル時刻で取得 LoadHostRTC(true); @@ -39,7 +41,7 @@ RP5C15Device::InitRTC() } uint64 -RP5C15Device::Read(uint32 addr) +RP5C15Device::Read(uint32 offset) { uint8 data; int n; @@ -47,7 +49,7 @@ RP5C15Device::Read(uint32 addr) gMPU->AddCycle(29); // InsideOut p.135 // バンクを展開する - n = bank * 0x10 + addr; + n = bank * 0x10 + offset; // XXX 14, 15 は write only らしいが何が読めるか @@ -68,22 +70,22 @@ RP5C15Device::Read(uint32 addr) // 下位4ビット(RP5C15) の中の未実装ビットは %0 だが // 上位4ビットは %1 になる。 data |= 0xf0; - putlog(2, "RTC Bank%d $%x -> $%02x", bank, addr, data); + putlog(2, "RTC Bank%d $%x -> $%02x", bank, offset, data); return data; } uint64 -RP5C15Device::Write(uint32 addr, uint32 data) +RP5C15Device::Write(uint32 offset, uint32 data) { int n; gMPU->AddCycle(38); // InsideOut p.135 // バンクを展開する - n = bank * 0x10 + addr; + n = bank * 0x10 + offset; - putlog(2, "RTC Bank%d $%x <- $%x", bank, addr, (data & 0x0f)); + putlog(2, "RTC Bank%d $%x <- $%x", bank, offset, (data & 0x0f)); switch (n) { case RP5C15::SEC1: @@ -225,12 +227,12 @@ RP5C15Device::Write(uint32 addr, uint32 } uint64 -RP5C15Device::Peek(uint32 addr) +RP5C15Device::Peek(uint32 offset) { int n; // バンクを展開する - n = bank * 0x10 + addr; + n = bank * 0x10 + offset; switch (n) { case RP5C15::MODE_BANK1: @@ -249,7 +251,7 @@ RP5C15Device::Peek(uint32 addr) } void -RP5C15Device::MonitorUpdate(TextScreen& monitor) +RP5C15Device::MonitorUpdate(Monitor *, TextScreen& screen) { int x; int y; @@ -262,15 +264,15 @@ RP5C15Device::MonitorUpdate(TextScreen& // Bank0 0 1 2 3 4 5 6 7 8 9 a b c d e f // Bank1 - monitor.Clear(); + screen.Clear(); - monitor.Puts(0, 0, " #0 #1"); + screen.Puts(0, 0, " #0 #1"); y = 1; for (int i = 0; i < 13; i++, y++) { - monitor.Print(0, y, "%X:%x %x", i, reg.r[i], reg.r[i + 16]); + screen.Print(0, y, "%X:%x %x", i, reg.r[i], reg.r[i + 16]); } for (int i = 13; i < 16; i++, y++) { - monitor.Print(0, y, "%X:%x", i, reg.r[i]); + screen.Print(0, y, "%X:%x", i, reg.r[i]); } x = 8; @@ -279,7 +281,7 @@ RP5C15Device::MonitorUpdate(TextScreen& int year = reg.year10 * 10 + reg.year1 + 1980; int mon = reg.mon10 * 10 + reg.mon1; int day = reg.day10 * 10 + reg.day1; - monitor.Print(x, y, "%04d/%02d/%02d(%s)", + screen.Print(x, y, "%04d/%02d/%02d(%s)", year, mon, day, wdays[reg.wday]); y++; @@ -288,21 +290,21 @@ RP5C15Device::MonitorUpdate(TextScreen& hour = reg.hour10 * 10 + reg.hour1; } else { hour = (reg.hour10 & 1) * 10 + reg.hour1; - monitor.Puts(x, y, (reg.hour10 & 2) == 0 ? "AM" : "PM"); + screen.Puts(x, y, (reg.hour10 & 2) == 0 ? "AM" : "PM"); } int min = reg.min10 * 10 + reg.min1; int sec = reg.sec10 * 10 + reg.sec1; - monitor.Print(x + 3, y, "%02d:%02d:%02d", hour, min, sec); + screen.Print(x + 3, y, "%02d:%02d:%02d", hour, min, sec); y++; - monitor.Print(x, y++, "Leap %d", reg.leap); + screen.Print(x, y++, "Leap %d", reg.leap); y++; - monitor.Print(x, y++, "CLKOUT %c", clkout ? 'H' : 'L'); - monitor.Print(x, y++, "ALARM %c", alarmout ? 'H' : 'L'); + screen.Print(x, y++, "CLKOUT %c", clkout ? 'H' : 'L'); + screen.Print(x, y++, "ALARM %c", alarmout ? 'H' : 'L'); y++; - monitor.Print(x, y++, "cnt %2d", rtc.cnt); + screen.Print(x, y++, "cnt %2d", rtc.cnt); } // 32Hz クロック入力