--- nono/vm/rp5c15.cpp 2026/04/29 17:05:17 1.1.1.12 +++ nono/vm/rp5c15.cpp 2026/04/29 17:05:25 1.1.1.14 @@ -25,7 +25,7 @@ RP5C15Device::RP5C15Device() use_localtime = true; monitor.func = ToMonitorCallback(&RP5C15Device::MonitorUpdate); - monitor.SetSize(41, 22); + monitor.SetSize(38, 22); monitor.Regist(ID_MONITOR_RTC); } @@ -43,7 +43,7 @@ RP5C15Device::Init() } mfp = GetMFPDevice(); - power = GetPowerDevice(); + power = dynamic_cast(GetPowerDevice()); // デフォルトで 24 時間計にしておく reg.sel24 = 0x01; @@ -53,14 +53,12 @@ RP5C15Device::Init() return true; } -uint64 +busdata RP5C15Device::Read(uint32 offset) { - uint8 data; + busdata data; int n; - mpu->AddCycle(29); // InsideOut p.135 - // バンクを展開する int bank = (reg.mode & RP5C15::MODE_BANK); n = bank * 0x10 + offset; @@ -84,23 +82,25 @@ RP5C15Device::Read(uint32 offset) // 下位4ビット(RP5C15) の中の未実装ビットは %0 だが // 上位4ビットは %1 になる。 data |= 0xf0; - putlog(2, "RTC Bank%d $%x -> $%02x", bank, offset, data); + putlog(2, "Bank%d $%x -> $%02x", bank, offset, data.Data()); + + // InsideOut p.135 + const busdata read_wait = busdata::Wait(29 * 40_nsec); + data |= read_wait; return data; } -uint64 +busdata RP5C15Device::Write(uint32 offset, uint32 data) { int n; - mpu->AddCycle(38); // InsideOut p.135 - // バンクを展開する int bank = (reg.mode & RP5C15::MODE_BANK); n = bank * 0x10 + offset; - putlog(2, "RTC Bank%d $%x <- $%x", bank, offset, (data & 0x0f)); + putlog(2, "Bank%d $%x <- $%x", bank, offset, (data & 0x0f)); switch (n) { case RP5C15::SEC1: @@ -227,10 +227,14 @@ RP5C15Device::Write(uint32 offset, uint3 default: break; } - return 0; + + // InsideOut p.135 + const busdata write_wait = busdata::Wait(38 * 40_nsec); + + return write_wait; } -uint64 +busdata RP5C15Device::Peek(uint32 offset) { int n; @@ -353,24 +357,22 @@ RP5C15Device::MonitorUpdate(Monitor *, T // MODE y = 17; - screen.Print(0, y, "$d(MODE): %x", reg.mode); - screen.Puts(13, y, TA::OnOff(reg.mode & RP5C15::MODE_TIMER_EN), "TIMER_EN"); - screen.Puts(22, y, TA::OnOff(reg.mode & RP5C15::MODE_ALARM_EN), "ALARM_EN"); - screen.Print(31, y, "BANK=%d", reg.mode & RP5C15::MODE_BANK); + screen.Print(0, y, "$d(MODE): %x", reg.mode); + screen.Puts(14, y, TA::OnOff(reg.mode & RP5C15::MODE_TIMER_EN), "TIMER_EN"); + screen.Puts(23, y, TA::OnOff(reg.mode & RP5C15::MODE_ALARM_EN), "ALARM_EN"); + screen.Print(32, y, "BANK=%d", reg.mode & RP5C15::MODE_BANK); // TEST y++; - screen.Print(0, y, "$e(TEST): %x", reg.test); + screen.Print(0, y, "$e(TEST): %x", reg.test); // RESET y++; - screen.Print(0, y, "$f(RESET): %x", reg.reset); - screen.Print(13, y, "1Hz=%s", - (reg.reset & RP5C15::RESET_1Hz) ? "OFF" : "ON"); - screen.Print(21, y, "16Hz=%s", - (reg.reset & RP5C15::RESET_16Hz) ? "OFF" : "ON"); - screen.Puts(30, y, TA::OnOff(reg.reset & RP5C15::RESET_TIMER), "TIMER"); - screen.Puts(36, y, TA::OnOff(reg.reset & RP5C15::RESET_ALARM), "ALARM"); + screen.Print(0, y, "$f(RESET): %x", reg.reset); + screen.Print(14, y, TA::OnOff(reg.reset & RP5C15::RESET_1Hz), "!1Hz"); + screen.Print(19, y, TA::OnOff(reg.reset & RP5C15::RESET_16Hz), "!16Hz"); + screen.Puts(25, y, TA::OnOff(reg.reset & RP5C15::RESET_TIMER), "TIMER"); + screen.Puts(31, y, TA::OnOff(reg.reset & RP5C15::RESET_ALARM), "ALARM"); // PIN y++;