--- nono/vm/rp5c15.cpp 2026/04/29 17:04:32 1.1.1.2 +++ nono/vm/rp5c15.cpp 2026/04/29 17:04:36 1.1.1.3 @@ -1,6 +1,7 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "rp5c15.h" @@ -36,27 +37,14 @@ RP5C15Device::InitRTC() return true; } -// アドレスデコーダ -inline uint64 -RP5C15Device::Decoder(uint32 addr) const -{ - // XXX 折り返しは - - // 偶数アドレスへのアクセスは先にエラーにする - if ((addr & 1) == 0) - return (uint64)-1; - - // Bank0 を 0..15、Bank1 を 16..31 に並べる - return ((addr - devaddr) / 2) + bank * 0x10; -} - uint64 -RP5C15Device::Read8(uint32 addr) +RP5C15Device::Read(uint32 addr) { uint8 data; int n; - n = Decoder(addr); + // バンクを展開する + n = bank * 0x10 + addr; // XXX 14, 15 は write only らしいが何が読めるか @@ -70,34 +58,27 @@ 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, addr, data); return data; } uint64 -RP5C15Device::Read16(uint32 addr) -{ - return 0xff00 | Read8(addr + 1); -} - -uint64 -RP5C15Device::Write8(uint32 addr, uint32 data) +RP5C15Device::Write(uint32 addr, uint32 data) { int n; - n = Decoder(addr); + // バンクを展開する + n = bank * 0x10 + addr; - putlog(2, "RTC Bank%d $%x <- $%x", bank, (n & 0x0f), (data & 0x0f)); + putlog(2, "RTC Bank%d $%x <- $%x", bank, addr, (data & 0x0f)); switch (n) { case RP5C15::SEC1: @@ -239,17 +220,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 addr) { int n; - n = Decoder(addr); + // バンクを展開する + n = bank * 0x10 + addr; switch (n) { case RP5C15::MODE_BANK1: @@ -263,7 +239,7 @@ RP5C15Device::Peek8(uint32 addr) return reg.r[n] | 0xf0; default: - return 0xf0; + __unreachable(); } } @@ -283,7 +259,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]); @@ -307,7 +283,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;