--- nono/vm/device.h 2026/04/29 17:05:25 1.1.1.15 +++ nono/vm/device.h 2026/04/29 17:05:29 1.1.1.16 @@ -27,21 +27,18 @@ // …だったが今となってはあまり意味がなくなっている。 #define NEWDV(NAME, NEW_CTOR) do { \ __CONCAT(p,NAME).reset(NEW_CTOR); \ - assert(__CONCAT(p,NAME)); \ + assert((bool)__CONCAT(p,NAME)); \ } while (0) // 前方参照 -class MPUDevice; +class MainMPUDevice; class Scheduler; -class SCSIDevice; -class SCSIDisk; -class SCSITarget; class Device : public Object { using inherited = Object; protected: - Device(int objid_); + explicit Device(uint objid_); public: ~Device() override; @@ -135,7 +132,7 @@ class Device : public Object protected: // ログに時刻と PPC を出すために必要 - MPUDevice *mpu {}; + MainMPUDevice *mpu {}; Scheduler *scheduler {}; }; @@ -143,39 +140,53 @@ class IODevice : public Device { using inherited = Device; protected: - IODevice(int objid_); + explicit IODevice(uint objid_); public: ~IODevice() override; bool Init() override; public: - // アクセス関数。 - 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); + // メイン CPU からのデバイスの読み込み。 + // busaddr.Addr にアドレス、busaddr.Size に要求バイト数がセットされている。 + // busdata.Size にはポートサイズ (応答バイト数) を返す。 + // 戻り値 busdata.Data は下詰めし、不要な上位バイトはクリアして返すこと。 + virtual busdata Read(busaddr addr); + + // メイン CPU からのデバイスへの書き込み。 + // busaddr.Addr にアドレス、busaddr.Size に要求バイト数がセットされている。 + // data は Size バイト分が下詰めされており、上位の不要バイトはクリア済み。 + // 戻り値の busdata.Size にはポートサイズを返すこと。 + virtual busdata Write(busaddr addr, uint32 data); + + // メイン CPU からのバーストアクセス。 + // addr (16バイト境界) からの 16 バイトを転送してウェイトと OK を返す。 + // dst/src の uint32 はホストエンディアン。 + // バースト転送をサポートしてなければ BusData::BusErr を返す。 + virtual busdata ReadBurst16(busaddr addr, uint32 *dst); + virtual busdata WriteBurst16(busaddr addr, const uint32 *src); + + // XP からのデバイスの読み込み。 + // 戻り値は busdata.Data の1バイトと必要なら Wait。他は使用しない。 + virtual busdata Read1(uint32 addr); + + // XP からのデバイスへの書き込み。 + // data は1バイト。 + // 戻り値は busdata.Wait のみ。他は使用しない。 + virtual busdata Write1(uint32 addr, uint32 data); - // Peek8() はデバッガアクセスで読み込んだ値を (uint32) で返す。 + // Peek1() はデバッガアクセスで読み込んだ値を (uint32) で返す。 // バイトアクセスした時に読める値ではなく、現在このアドレスに見えている - // であろう値。バスエラーなら busdata::BusErr を返す。 - virtual busdata Peek8(uint32 addr); + // であろう値。バスエラーなら BusData::BusErr を返す。 + virtual busdata Peek1(uint32 addr); - // Poke8() はデバッガからこのアドレス(メモリ)へ書き込む。 + // Poke1() はデバッガからこのアドレス(メモリ)へ書き込む。 // メモリでない領域 (レジスタなど) は書き込み不可。 // data が (int32 で) 非負なら data の下位8ビットを書き込む。 // 書き込めれば true、書き込めなければ false を返す。 // data が (int32 で) 負なら addr への書き込み可否の問い合わせで、 // 書き込み可能なら true、書き込み不可能なら false を返す。 - virtual bool Poke8(uint32 addr, uint32 data); - - protected: - // BusIO インタフェース。 - // BusIO を経由するデバイスはほとんどが Poke 不可なので、 - // ベースクラスに用意しておく。 - virtual bool Poke(uint32 addr, uint32 data); + virtual bool Poke1(uint32 addr, uint32 data); }; class BusErrDevice : public IODevice @@ -186,13 +197,9 @@ class BusErrDevice : public IODevice ~BusErrDevice() override; public: - 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; + busdata Read(busaddr addr) override; + busdata Write(busaddr addr, uint32 data) override; + busdata Peek1(uint32 addr) override; }; // 何もしないデバイス。 @@ -205,13 +212,11 @@ class NopIODevice : public IODevice ~NopIODevice() override; public: - 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; + busdata Read(busaddr addr) override; + busdata Write(busaddr addr, uint32 data) override; + busdata Read1(uint32 addr) override; + busdata Write1(uint32 addr, uint32 data) override; + busdata Peek1(uint32 addr) override; }; static inline BusErrDevice *GetBusErrDevice() {