--- nono/vm/mk48t02.h 2026/04/29 17:04:28 1.1 +++ nono/vm/mk48t02.h 2026/04/29 17:04:52 1.1.1.8 @@ -1,11 +1,13 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once #include "device.h" +#include "mappedfile.h" #include "rtc.h" // MK48T02 の時計部分のレジスタと内部状態 @@ -49,25 +51,30 @@ struct MK48T02Clock class MK48T02Device : public RTCDevice { - typedef RTCDevice inherited; + using inherited = RTCDevice; public: MK48T02Device(); - virtual ~MK48T02Device(); + virtual ~MK48T02Device() override; - virtual bool Init(); - virtual bool InitRTC(); + bool Init() override; + void MonitorUpdate(TextScreen&) override; - virtual uint64 Read8(uint32 addr); - virtual uint64 Read16(uint32 addr); - virtual uint64 Read32(uint32 addr); - virtual uint64 Write8(uint32 addr, uint32 data); - virtual uint64 Write16(uint32 addr, uint32 data); - virtual uint64 Write32(uint32 addr, uint32 data); - virtual uint64 Peek8(uint32 addr); + void ClockIn() override; - virtual bool MonitorUpdate(); - - virtual void ClockIn(); + // 指定したアドレスからの文字列を読み出す (内蔵 ROM からのアクセス用) + std::string PeekString(uint32 addr) const; + // 指定したアドレスに文字列を書き込む (内蔵 ROM からのアクセス用) + bool WriteString(uint32 addr, const std::string& data); + + // BusIO インタフェース + // (内蔵 ROM からのアクセス用に特別に public にしてある) + uint64 Read(uint32 offset); + uint64 Write(uint32 offset, uint32 data); + uint64 Peek(uint32 offset); + + protected: + // BusIO インタフェース + static const uint32 NPORT = 2048; private: // バイナリ <-> BCD 変換 @@ -77,14 +84,10 @@ class MK48T02Device : public RTCDevice // コントロールレジスタへの書き込み void WriteCtrl(uint32 data); + // ファイル std::string filename {}; - int fd = 0; - - // バイト順はファイルイメージそのままで、2040バイト。 - uint8 *mem = NULL; - - // mmap する長さ - int memlen = 0; + MappedFile file {}; + uint8 *mem {}; // 時計 MK48T02Clock reg {}; @@ -92,5 +95,5 @@ class MK48T02Device : public RTCDevice // レジスタとして読める値を定数にすることで、仮想マシン状態を // 常に同じ状態にするためのパフォーマンス測定用フラグ。 // なお NVRAM 部分は影響されない。 - bool force_fixed = false; + bool force_fixed {}; };