--- nono/vm/device.h 2026/04/29 17:05:21 1.1.1.14 +++ nono/vm/device.h 2026/04/29 17:05:25 1.1.1.15 @@ -11,6 +11,7 @@ #pragma once #include "object.h" +#include "bus.h" #if BYTE_ORDER == LITTLE_ENDIAN #define HB(addr) ((addr) ^ 1) @@ -22,6 +23,13 @@ #define HLW(addr) (addr) #endif +// デバイスを作成して代入するマクロ。 +// …だったが今となってはあまり意味がなくなっている。 +#define NEWDV(NAME, NEW_CTOR) do { \ + __CONCAT(p,NAME).reset(NEW_CTOR); \ + assert(__CONCAT(p,NAME)); \ +} while (0) + // 前方参照 class MPUDevice; class Scheduler; @@ -35,7 +43,7 @@ class Device : public Object protected: Device(int objid_); public: - virtual ~Device() override; + ~Device() override; public: // 初期化は以下の手順で行う。 @@ -74,6 +82,8 @@ class Device : public Object // を呼ぶこと。 // gConfig の設定項目のうち内容によってエラー終了する可能性があるものは // ここまでに処理する。 + // 複数のオブジェクトが同じ設定項目を処理しないようにすること (複数で + // 別々に読んでその際の範囲チェックに齟齬が発生するとかを避けるため)。 // Object 同士は完全に相互アクセス可能だが、Init() 自身の依存関係 // (A::Init() で設定した値を B::Init() が参照する必要があるケース) に // ついては vm.cpp (などコンテナデバイス) 内のコンストラクタの順序で @@ -135,57 +145,37 @@ class IODevice : public Device protected: IODevice(int objid_); public: - virtual ~IODevice() override; + ~IODevice() override; bool Init() override; public: // アクセス関数。 - // Read*() は読み込んだ値を (uint32) で返す。 - // Write*() は書き込めたら 0 を返す。 - // いずれもバスエラーなら (uint64)-1 を返す。 - 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 busdata Read8(uint32 addr); + virtual busdata Read16(uint32 addr); + virtual busdata Read32(uint32 addr); + virtual busdata Write8(uint32 addr, uint32 data); + virtual busdata Write16(uint32 addr, uint32 data); + virtual busdata Write32(uint32 addr, uint32 data); // Peek8() はデバッガアクセスで読み込んだ値を (uint32) で返す。 // バイトアクセスした時に読める値ではなく、現在このアドレスに見えている - // であろう値。バスエラーなら (uint64)-1 を返す。 - virtual uint64 Peek8(uint32 addr); + // であろう値。バスエラーなら busdata::BusErr を返す。 + virtual busdata Peek8(uint32 addr); // Poke8() はデバッガからこのアドレス(メモリ)へ書き込む。 // メモリでない領域 (レジスタなど) は書き込み不可。 - // data が (int32 で) 非負なら data (の下位8ビット)を書き込む。 - // 書き込めれば 0、書き込めなければ (uint64)-1 を返す。 + // data が (int32 で) 非負なら data の下位8ビットを書き込む。 + // 書き込めれば true、書き込めなければ false を返す。 // data が (int32 で) 負なら addr への書き込み可否の問い合わせで、 - // 書き込み可能なら 0、書き込み不可能なら (uint64)-1 を返す。 - virtual uint64 Poke8(uint32 addr, uint32 data); + // 書き込み可能なら true、書き込み不可能なら false を返す。 + virtual bool Poke8(uint32 addr, uint32 data); protected: // BusIO インタフェース。 // BusIO を経由するデバイスはほとんどが Poke 不可なので、 // ベースクラスに用意しておく。 - virtual uint64 Poke(uint32 addr, uint32 data); -}; - -// コンテナデバイス (複数の IODevice を格納するデバイス)。 -class IOContainerDevice : public IODevice -{ - using inherited = IODevice; - protected: - IOContainerDevice(int objid_); - public: - virtual ~IOContainerDevice() override; - - // このアドレスを担当する IODevice を再帰的に探して返す。 - IODevice *FindDevice(uint32 addr) const; - - protected: - // このアドレスを担当する次段の IODevice を返す。 - virtual IODevice *GetDevice(uint32 addr) const = 0; + virtual bool Poke(uint32 addr, uint32 data); }; class BusErrDevice : public IODevice @@ -193,16 +183,16 @@ class BusErrDevice : public IODevice using inherited = IODevice; public: BusErrDevice(); - virtual ~BusErrDevice() override; + ~BusErrDevice() override; public: - uint64 Read8(uint32 addr) override; - uint64 Read16(uint32 addr) override; - uint64 Read32(uint32 addr) override; - uint64 Write8(uint32 addr, uint32 data) override; - uint64 Write16(uint32 addr, uint32 data) override; - uint64 Write32(uint32 addr, uint32 data) override; - uint64 Peek8(uint32 addr) override; + busdata Read8(uint32 addr) override; + busdata Read16(uint32 addr) override; + busdata Read32(uint32 addr) override; + busdata Write8(uint32 addr, uint32 data) override; + busdata Write16(uint32 addr, uint32 data) override; + busdata Write32(uint32 addr, uint32 data) override; + busdata Peek8(uint32 addr) override; }; // 何もしないデバイス。 @@ -212,16 +202,16 @@ class NopIODevice : public IODevice using inherited = IODevice; public: NopIODevice(); - virtual ~NopIODevice() override; + ~NopIODevice() override; public: - uint64 Read8(uint32 addr) override; - uint64 Read16(uint32 addr) override; - uint64 Read32(uint32 addr) override; - uint64 Write8(uint32 addr, uint32 data) override; - uint64 Write16(uint32 addr, uint32 data) override; - uint64 Write32(uint32 addr, uint32 data) override; - uint64 Peek8(uint32 addr) override; + busdata Read8(uint32 addr) override; + busdata Read16(uint32 addr) override; + busdata Read32(uint32 addr) override; + busdata Write8(uint32 addr, uint32 data) override; + busdata Write16(uint32 addr, uint32 data) override; + busdata Write32(uint32 addr, uint32 data) override; + busdata Peek8(uint32 addr) override; }; static inline BusErrDevice *GetBusErrDevice() {