--- nono/vm/iodevstream.h 2026/04/29 17:05:28 1.1.1.5 +++ nono/vm/iodevstream.h 2026/04/29 17:05:42 1.1.1.7 @@ -12,6 +12,15 @@ // Read/Write とも受け渡しはホストバイトオーダの値で行い、 // デバイスへのアクセスはビッグエンディアンで行う。 // アクセス中にバスエラーが起きることは考慮していない。 +// +// addr は基本的には物理アドレスだが、Read()/Write() がアドレスをマスクする +// タイプならオフセットを指定しても等価となる。 +// MainRAM は物理アドレスだが、通常 0 から始まるのでどちらも等価にみえる。 +// ExtRAM なら物理アドレスでなければならない。 +// SubRAM はアドレスをマスクするので、アドレスでもオフセットでもよいが +// XP 視点でいえばオフセットのほうが処理しやすい、などそれぞれ事情が異なる。 +// 指定したデバイスがどっちの振る舞いなのかは把握してから使うこと。 +// どちらにしてもこのクラスでは "アドレス" と呼ぶ。 class IODeviceStream { public: @@ -19,19 +28,19 @@ class IODeviceStream explicit IODeviceStream(IODevice *dev_) { dev = dev_; } - IODeviceStream(IODevice *dev_, uint32 offset_) { + IODeviceStream(IODevice *dev_, uint32 addr_) { dev = dev_; - offset = offset_; + addr = addr_; } ~IODeviceStream(); // アドレスを設定する - void SetOffset(uint32 offset_) { - offset = offset_; + void SetAddr(uint32 addr_) { + addr = addr_; } // アドレスを取得する - uint32 GetOffset() const { - return offset; + uint32 GetAddr() const { + return addr; } // 1バイト読み込んでポインタを進める @@ -62,6 +71,12 @@ class IODeviceStream WriteN(BusAddr::Size2, data); } + // 3バイト書き込んでポインタを進める。addr はアラインしてなくてよい + void Write3(uint32 data) + { + WriteN(BusAddr::Size3, data); + } + // 4バイト書き込んでポインタを進める。addr はアラインしてなくてよい void Write4(uint32 data) { @@ -88,28 +103,28 @@ class IODeviceStream void WriteMem(const void *src, uint len); // アドレスも指定する版。ポインタは同様に進める - uint64 Read1(uint32 offset_) { - SetOffset(offset_); + uint64 Read1(uint32 addr_) { + SetAddr(addr_); return Read1(); } - uint64 Read2(uint32 offset_) { - SetOffset(offset_); + uint64 Read2(uint32 addr_) { + SetAddr(addr_); return Read2(); } - uint64 Read4(uint32 offset_) { - SetOffset(offset_); + uint64 Read4(uint32 addr_) { + SetAddr(addr_); return Read4(); } - void Write1(uint32 offset_, uint32 data) { - SetOffset(offset_); + void Write1(uint32 addr_, uint32 data) { + SetAddr(addr_); Write1(data); } - void Write2(uint32 offset_, uint32 data) { - SetOffset(offset_); + void Write2(uint32 addr_, uint32 data) { + SetAddr(addr_); Write2(data); } - void Write4(uint32 offset_, uint32 data) { - SetOffset(offset_); + void Write4(uint32 addr_, uint32 data) { + SetAddr(addr_); Write4(data); } @@ -118,5 +133,5 @@ class IODeviceStream busdata WriteN(busaddr size, uint32 data); IODevice *dev {}; - uint32 offset {}; + uint32 addr {}; };