--- nono/vm/rp5c15.cpp 2026/04/29 17:04:28 1.1 +++ nono/vm/rp5c15.cpp 2026/04/29 17:04:50 1.1.1.6 @@ -1,9 +1,11 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "rp5c15.h" +#include "mpu.h" #include // アラームは未実装 @@ -16,7 +18,7 @@ RP5C15Device::RP5C15Device() devname = "RTC"; devaddr = 0xe8a000; devlen = 0x2000; - monitor.Init(30, 17); + monitor_size = nnSize(30, 17); } RP5C15Device::~RP5C15Device() @@ -37,17 +39,15 @@ RP5C15Device::InitRTC() } uint64 -RP5C15Device::Read8(uint32 addr) +RP5C15Device::Read(uint32 offset) { uint8 data; int n; - // 偶数アドレスへのアクセスは先にエラーにする - if (addr % 2 == 0) - return (uint64)-1; + gMPU->AddCycle(29); // InsideOut p.135 - // Bank0 を 0..15、Bank1 を 16..31 に並べる - n = ((addr - devaddr) / 2) + bank * 0x10; + // バンクを展開する + n = bank * 0x10 + offset; // XXX 14, 15 は write only らしいが何が読めるか @@ -61,39 +61,29 @@ RP5C15Device::Read8(uint32 addr) case 0x00 ... 0x1c: data = reg.r[n]; break; - default: - putlog(2, "RTC $%06x 未実装領域読み込み", addr); - return 0xf0; + __unreachable(); } // 下位4ビット(RP5C15) の中の未実装ビットは %0 だが // 上位4ビットは %1 になる。 data |= 0xf0; - putlog(2, "RTC Bank%d $%x -> $%02x", bank, (n & 0x0f), data); + putlog(2, "RTC Bank%d $%x -> $%02x", bank, offset, data); return data; } uint64 -RP5C15Device::Read16(uint32 addr) -{ - return 0xff00 | Read8(addr + 1); -} - -uint64 -RP5C15Device::Write8(uint32 addr, uint32 data) +RP5C15Device::Write(uint32 offset, uint32 data) { int n; - // 偶数アドレスへのアクセスは先にエラーにする - if (addr % 2 == 0) - return (uint64)-1; + gMPU->AddCycle(38); // InsideOut p.135 - // Bank0 を 0..15、Bank1 を 16..31 に並べる - n = ((addr - devaddr) / 2) + bank * 0x10; + // バンクを展開する + n = bank * 0x10 + offset; - putlog(2, "RTC Bank%d $%x <- $%x", bank, (n & 0x0f), (data & 0x0f)); + putlog(2, "RTC Bank%d $%x <- $%x", bank, offset, (data & 0x0f)); switch (n) { case RP5C15::SEC1: @@ -235,22 +225,12 @@ RP5C15Device::Write8(uint32 addr, uint32 } uint64 -RP5C15Device::Write16(uint32 addr, uint32 data) -{ - return Write8(addr + 1, data); -} - -uint64 -RP5C15Device::Peek8(uint32 addr) +RP5C15Device::Peek(uint32 offset) { int n; - // 偶数アドレスへのアクセスを先に弾く - if (addr % 2 == 0) { - return (uint64)-1; - } - - n = ((addr - devaddr) / 2) + bank * 0x10; + // バンクを展開する + n = bank * 0x10 + offset; switch (n) { case RP5C15::MODE_BANK1: @@ -264,12 +244,12 @@ RP5C15Device::Peek8(uint32 addr) return reg.r[n] | 0xf0; default: - return 0xf0; + __unreachable(); } } -bool -RP5C15Device::MonitorUpdate() +void +RP5C15Device::MonitorUpdate(TextScreen& monitor) { int x; int y; @@ -284,7 +264,7 @@ RP5C15Device::MonitorUpdate() monitor.Clear(); - monitor.Print(0, 0, " #0 #1"); + monitor.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]); @@ -308,7 +288,7 @@ RP5C15Device::MonitorUpdate() hour = reg.hour10 * 10 + reg.hour1; } else { hour = (reg.hour10 & 1) * 10 + reg.hour1; - monitor.Print(x, y, "%s", (reg.hour10 & 2) == 0 ? "AM" : "PM"); + monitor.Puts(x, y, (reg.hour10 & 2) == 0 ? "AM" : "PM"); } int min = reg.min10 * 10 + reg.min1; int sec = reg.sec10 * 10 + reg.sec1; @@ -323,8 +303,6 @@ RP5C15Device::MonitorUpdate() y++; monitor.Print(x, y++, "cnt %2d", rtc.cnt); - - return true; } // 32Hz クロック入力