--- nono/vm/device.h 2026/04/29 17:04:38 1.1.1.5 +++ nono/vm/device.h 2026/04/29 17:04:55 1.1.1.10 @@ -23,9 +23,9 @@ class Device : public Object { using inherited = Object; protected: - Device(); + Device(const std::string& objname_); public: - ~Device() override; + virtual ~Device() override; public: // 初期化は以下の手順で行う。 @@ -34,6 +34,8 @@ class Device : public Object // gConfig の内部変数の追加はここ(か2.の動的コンストラクション)で // 行うこと。この時点ですでに gConfig の設定内容の参照は可能だが、 // エラーが出るものはここではなく Init() で処理すること。 + // putlog() は使える。厳密には MPU コンストラクタ以降で使えるが + // MPU より前は BusErrDevice しかおらずこいつは putlog() しないので。 // // 2. Create() ... 動的コンストラクション // 必要なら設定ファイルによって可変なオブジェクトのコンストラクトを行う。 @@ -45,12 +47,18 @@ class Device : public Object // またここで --show-config も行うため、この時点で gConfig の内容は確定し // 以降 gConfig の変更は出来ない。 // + // 3.1. InitDriver() ... NetDriver を選択 + // NetDriver の選択はログが準備出来た後で行いたいが、スレッドの動く + // Init() よりは前で行いたいのでここで特別扱いしている。 + // + // 3.2. ParseMonitors() ... -M オプションの処理 + // (GUI 版のみ) この時点で Monitor がすべて登録されている必要がある。 + // // 4. Init() ... 初期化 // ここでは ROM などのファイルの読み込み、またスレッドの起動などを行う。 // Object 由来のオブジェクトはすべて揃っているため、相互にアクセス可能。 // ただしその際の依存関係については、vm.cpp (や xiospace.cpp) 内の // コンストラクタの順序で調整すること (循環参照不可)。 - // またここから putlog() が使える (Scheduler::Init() のコメントも参照)。 // // 5. Apply() ... 動的設定の適用 // 実行中に変更可能なパラメータもここで一度適用する。 @@ -84,30 +92,20 @@ class Device : public Object virtual bool PowerOn(); virtual bool PowerOff(); - // ResetHard() は本体リセットスイッチによるリセット。 - // ResetSoft() は MPU の RESET 命令によるリセット。 - // - // X680x0 では、 - // o PowerOn でリセット : VIPS, VideoCtlr, OSCIAN2 - // o ResetHard でリセット: YUKI, MPU, FPU および ResetSoft の全員 - // o ResetSoft でリセット: PPI, PEDEC, SPC, ADPCM, FDC, MFP, SAKI, - // CYNTHIA, DMAC らしい - // o いずれでもリセットされないもの: CACHY, YM2151, RTC - // o 分からないけどたぶん ResetHard でリセット: SCC - // - // LUNA では、詳細分からないので全員 ResetHard にしとくか。 + // ResetHard() はこのデバイスのリセット。 + // このデバイスがどのタイミングでリセットされるかは VM による。 + // X68030 なら vm_x68k.cpp 内のコメント参照。 + // LUNA は詳細不明。 virtual void ResetHard(); - virtual void ResetSoft(); - }; class IODevice : public Device { using inherited = Device; protected: - IODevice(); + IODevice(const std::string& objname_); public: - ~IODevice() override; + virtual ~IODevice() override; public: // アクセス関数。 @@ -125,11 +123,11 @@ class IODevice : public Device virtual uint64 Write32(uint32 addr, uint32 data); virtual uint64 Peek8(uint32 addr); - uint32 devaddr = 0; // このデバイスの先頭アドレス + uint32 devaddr {}; // このデバイスの先頭アドレス // (必要なら)このデバイスの占めるバイト数。 // 今のところ XIOSpace、MuxDevice では必要。それ以外では不要。 - uint32 devlen = 0; + uint32 devlen {}; }; class BusErrDevice : public IODevice @@ -137,7 +135,7 @@ class BusErrDevice : public IODevice using inherited = IODevice; public: BusErrDevice(); - ~BusErrDevice() override; + virtual ~BusErrDevice() override; public: uint64 Read8(uint32 addr) override; @@ -151,42 +149,35 @@ class BusErrDevice : public IODevice // 何もしないデバイス。 // 読み込むと全域で 0xff が読めて、書き込んでも何も起きない。 -class NullDevice : public IODevice +class NopIODevice : public IODevice { using inherited = IODevice; public: - NullDevice(); - ~NullDevice() override; + NopIODevice(); + virtual ~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; }; // 前方参照 -class BitmapDevice; -class CRTC2Device; class DMACDevice; -class FuseROMDevice; class Human68k; +class InterruptDevice; class IODevice; -class LanceDevice; +class LunafbDevice; class MK48T02Device; class MPUDevice; -class PIO0Device; -class PIO1Device; -class PROMDevice; -class RAMDevice; class SCSIDevice; class SCSIHD; -class SCSIHostDevice; class SCSITarget; -class SIODevice; -class SPCDevice; -class SysClkDevice; -class VM; -class XIOSpaceDevice; -class ZRAMDevice; extern std::vector gDevices; +extern std::unique_ptr gBusErr; +extern std::unique_ptr gNopIO;