--- nono/vm/device.h 2026/04/29 17:04:32 1.1.1.3 +++ nono/vm/device.h 2026/04/29 17:04:44 1.1.1.7 @@ -1,6 +1,7 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once @@ -14,35 +15,43 @@ #define HLW(addr) ((addr) ^ 2) #else #define HB(addr) (addr) +#define HLB(addr) (addr) +#define HLW(addr) (addr) #endif class Device : public Object { - typedef Object inherited; + using inherited = Object; protected: Device(); public: - virtual ~Device(); + virtual ~Device() override; public: // 初期化は以下の手順で行う。 // 1. コンストラクタ // メンバ変数の初期値代入などを行う。失敗するケースは考慮していない。 - // gConfig の設定内容の参照は可能。 + // gConfig の内部変数の追加はここ(か2.の動的コンストラクション)で + // 行うこと。この時点ですでに gConfig の設定内容の参照は可能だが、 + // エラーが出るものはここではなく Init() で処理すること。 + // putlog() は使える。厳密には MPU コンストラクタ以降で使えるが + // MPU より前は BusErrDevice しかおらずこいつは putlog() しないので。 // // 2. Create() ... 動的コンストラクション // 必要なら設定ファイルによって可変なオブジェクトのコンストラクトを行う。 // 例えば SCSI ドライブなどが該当する。 + // ここでも gConfig の参照および内部変数の登録は可能。 // // 3. parse_logopt() ... -L オプションの処理 // この時点で Object 由来のオブジェクトはすべて出揃っている必要がある。 + // またここで --show-config も行うため、この時点で gConfig の内容は確定し + // 以降 gConfig の変更は出来ない。 // // 4. Init() ... 初期化 // ここでは ROM などのファイルの読み込み、またスレッドの起動などを行う。 // Object 由来のオブジェクトはすべて揃っているため、相互にアクセス可能。 // ただしその際の依存関係については、vm.cpp (や xiospace.cpp) 内の // コンストラクタの順序で調整すること (循環参照不可)。 - // またここから putlog() が使える (Scheduler::Init() のコメントも参照)。 // // 5. Apply() ... 動的設定の適用 // 実行中に変更可能なパラメータもここで一度適用する。 @@ -80,7 +89,7 @@ class Device : public Object // ResetSoft() は MPU の RESET 命令によるリセット。 // // X680x0 では、 - // o PowerOn でリセット : VIPS, VICON, OSCIAN2 + // o PowerOn でリセット : VIPS, VideoCtlr, OSCIAN2 // o ResetHard でリセット: YUKI, MPU, FPU および ResetSoft の全員 // o ResetSoft でリセット: PPI, PEDEC, SPC, ADPCM, FDC, MFP, SAKI, // CYNTHIA, DMAC らしい @@ -95,11 +104,11 @@ class Device : public Object class IODevice : public Device { - typedef Device inherited; + using inherited = Device; protected: IODevice(); public: - virtual ~IODevice(); + virtual ~IODevice() override; public: // アクセス関数。 @@ -117,43 +126,43 @@ 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 { - typedef IODevice inherited; + using inherited = IODevice; public: BusErrDevice(); - virtual ~BusErrDevice(); + virtual ~BusErrDevice() override; public: - 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); + 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; }; // 何もしないデバイス。 // 読み込むと全域で 0xff が読めて、書き込んでも何も起きない。 class NullDevice : public IODevice { - typedef IODevice inherited; + using inherited = IODevice; public: NullDevice(); - virtual ~NullDevice(); + virtual ~NullDevice() override; public: - virtual uint64 Read8(uint32 addr); - virtual uint64 Write8(uint32 addr, uint32 data); - virtual uint64 Peek8(uint32 addr); + uint64 Read8(uint32 addr) override; + uint64 Write8(uint32 addr, uint32 data) override; + uint64 Peek8(uint32 addr) override; }; // 前方参照 @@ -162,6 +171,7 @@ class CRTC2Device; class DMACDevice; class FuseROMDevice; class Human68k; +class InterruptDevice; class IODevice; class LanceDevice; class MK48T02Device;