Annotation of nono/vm/device.h, revision 1.1.1.10

1.1       root        1: //
                      2: // nono
1.1.1.4   root        3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
1.1       root        5: //
                      6: 
                      7: #pragma once
                      8: 
                      9: #include "object.h"
                     10: #include <vector>
                     11: 
                     12: #if BYTE_ORDER == LITTLE_ENDIAN
                     13: #define HB(addr)       ((addr) ^ 1)
                     14: #define HLB(addr)      ((addr) ^ 3)
                     15: #define HLW(addr)      ((addr) ^ 2)
                     16: #else
                     17: #define HB(addr)       (addr)
1.1.1.5   root       18: #define HLB(addr)      (addr)
                     19: #define HLW(addr)      (addr)
1.1       root       20: #endif
                     21: 
                     22: class Device : public Object
                     23: {
1.1.1.4   root       24:        using inherited = Object;
1.1       root       25:  protected:
1.1.1.10! root       26:        Device(const std::string& objname_);
1.1       root       27:  public:
1.1.1.7   root       28:        virtual ~Device() override;
1.1       root       29: 
                     30:  public:
                     31:        // 初期化は以下の手順で行う。
                     32:        // 1. コンストラクタ
                     33:        //      メンバ変数の初期値代入などを行う。失敗するケースは考慮していない。
1.1.1.4   root       34:        //      gConfig の内部変数の追加はここ(か2.の動的コンストラクション)で
                     35:        //      行うこと。この時点ですでに gConfig の設定内容の参照は可能だが、
                     36:        //      エラーが出るものはここではなく Init() で処理すること。
1.1.1.7   root       37:        //      putlog() は使える。厳密には MPU コンストラクタ以降で使えるが
                     38:        //      MPU より前は BusErrDevice しかおらずこいつは putlog() しないので。
1.1       root       39:        //
                     40:        // 2. Create() ... 動的コンストラクション
                     41:        //      必要なら設定ファイルによって可変なオブジェクトのコンストラクトを行う。
                     42:        //      例えば SCSI ドライブなどが該当する。
1.1.1.4   root       43:        //      ここでも gConfig の参照および内部変数の登録は可能。
1.1       root       44:        //
                     45:        // 3. parse_logopt() ... -L オプションの処理
                     46:        //      この時点で Object 由来のオブジェクトはすべて出揃っている必要がある。
1.1.1.4   root       47:        //      またここで --show-config も行うため、この時点で gConfig の内容は確定し
                     48:        //      以降 gConfig の変更は出来ない。
1.1       root       49:        //
1.1.1.10! root       50:        // 3.1. InitDriver() ... NetDriver を選択
        !            51:        //      NetDriver の選択はログが準備出来た後で行いたいが、スレッドの動く
        !            52:        //      Init() よりは前で行いたいのでここで特別扱いしている。
        !            53:        //
        !            54:        // 3.2. ParseMonitors() ... -M オプションの処理
        !            55:        //      (GUI 版のみ) この時点で Monitor がすべて登録されている必要がある。
        !            56:        //
1.1       root       57:        // 4. Init() ... 初期化
1.1.1.3   root       58:        //      ここでは ROM などのファイルの読み込み、またスレッドの起動などを行う。
1.1       root       59:        //      Object 由来のオブジェクトはすべて揃っているため、相互にアクセス可能。
                     60:        //      ただしその際の依存関係については、vm.cpp (や xiospace.cpp) 内の
                     61:        //      コンストラクタの順序で調整すること (循環参照不可)。
                     62:        //
                     63:        // 5. Apply() ... 動的設定の適用
                     64:        //      実行中に変更可能なパラメータもここで一度適用する。
                     65:        //
                     66:        // 6. PowerOn(), ResetHard() ... VM 起動
                     67: 
                     68:        // 動的コンストラクション。
                     69:        // この時点で設定ファイルは読める。putlog() は使えない。
                     70:        // 成功すれば true を返す、
                     71:        // 失敗なら warn()/warnx() でエラーメッセージを表示して false を返すこと。
                     72:        virtual bool Create();
                     73: 
                     74:        // 初期化。
                     75:        // 起動時設定の適用、ファイルの読み込み、スレッド作成を行う。
1.1.1.3   root       76:        // Object 由来のオブジェクトはすべて揃っており、設定ファイルは読める。
                     77:        // putlog() も使える。
1.1       root       78:        // 成功すれば true を返すこと。
1.1.1.3   root       79:        // 失敗なら warn()/warnx()、あるいは ConfigItem::Err() 系 (実態は warnx)
                     80:        // でエラーメッセージを表示して false を返すこと。
1.1       root       81:        virtual bool Init();
                     82: 
                     83:        // 現在の設定を VM に反映させる。
                     84:        // ここで適用するのは実行中に変更可能なパラメータのみ。
                     85:        // 適用内容を表示したい時は putlog(1) が妥当か。
                     86:        // 成功すれば true を返すこと。
                     87:        // 失敗なら warn()/warnx()、あるいは gConfig->Err() 系 (実態は warnx) で
                     88:        // エラーメッセージを表示して false を返すこと。
                     89:        // といっても false が返されたらどうするんだろうか。
                     90:        virtual bool Apply();
                     91: 
                     92:        virtual bool PowerOn();
                     93:        virtual bool PowerOff();
                     94: 
1.1.1.8   root       95:        // ResetHard() はこのデバイスのリセット。
                     96:        // このデバイスがどのタイミングでリセットされるかは VM による。
                     97:        // X68030 なら vm_x68k.cpp 内のコメント参照。
                     98:        // LUNA は詳細不明。
1.1       root       99:        virtual void ResetHard();
                    100: };
                    101: 
                    102: class IODevice : public Device
                    103: {
1.1.1.4   root      104:        using inherited = Device;
1.1       root      105:  protected:
1.1.1.10! root      106:        IODevice(const std::string& objname_);
1.1       root      107:  public:
1.1.1.7   root      108:        virtual ~IODevice() override;
1.1       root      109: 
                    110:  public:
                    111:        // アクセス関数。
                    112:        // Read*() は読み込んだ値を (uint32) で返す。
                    113:        // Write*() は書き込めたら 0 を返す。
                    114:        // Peek8() はデバッガアクセスで読み込んだ値を (uint32) で返す。
                    115:        // いずれもバスエラーなら (uint64)-1 を返す。
                    116:        // (signed) int64 を使ってないのはノーマルパスで signed/unsigned の
                    117:        // キャスト事故を防ぐため。
                    118:        virtual uint64 Read8(uint32 addr);
                    119:        virtual uint64 Read16(uint32 addr);
                    120:        virtual uint64 Read32(uint32 addr);
                    121:        virtual uint64 Write8(uint32 addr, uint32 data);
                    122:        virtual uint64 Write16(uint32 addr, uint32 data);
                    123:        virtual uint64 Write32(uint32 addr, uint32 data);
                    124:        virtual uint64 Peek8(uint32 addr);
                    125: 
1.1.1.6   root      126:        uint32 devaddr {};                      // このデバイスの先頭アドレス
1.1       root      127: 
                    128:        // (必要なら)このデバイスの占めるバイト数。
                    129:        // 今のところ XIOSpace、MuxDevice では必要。それ以外では不要。
1.1.1.6   root      130:        uint32 devlen {};
1.1       root      131: };
                    132: 
                    133: class BusErrDevice : public IODevice
                    134: {
1.1.1.4   root      135:        using inherited = IODevice;
1.1       root      136:  public:
                    137:        BusErrDevice();
1.1.1.7   root      138:        virtual ~BusErrDevice() override;
1.1       root      139: 
                    140:  public:
1.1.1.4   root      141:        uint64 Read8(uint32 addr) override;
                    142:        uint64 Read16(uint32 addr) override;
                    143:        uint64 Read32(uint32 addr) override;
                    144:        uint64 Write8(uint32 addr, uint32 data) override;
                    145:        uint64 Write16(uint32 addr, uint32 data) override;
                    146:        uint64 Write32(uint32 addr, uint32 data) override;
                    147:        uint64 Peek8(uint32 addr) override;
1.1       root      148: };
                    149: 
                    150: // 何もしないデバイス。
                    151: // 読み込むと全域で 0xff が読めて、書き込んでも何も起きない。
1.1.1.10! root      152: class NopIODevice : public IODevice
1.1       root      153: {
1.1.1.4   root      154:        using inherited = IODevice;
1.1       root      155:  public:
1.1.1.10! root      156:        NopIODevice();
        !           157:        virtual ~NopIODevice() override;
1.1       root      158: 
                    159:  public:
1.1.1.4   root      160:        uint64 Read8(uint32 addr) override;
1.1.1.8   root      161:        uint64 Read16(uint32 addr) override;
                    162:        uint64 Read32(uint32 addr) override;
1.1.1.4   root      163:        uint64 Write8(uint32 addr, uint32 data) override;
1.1.1.8   root      164:        uint64 Write16(uint32 addr, uint32 data) override;
                    165:        uint64 Write32(uint32 addr, uint32 data) override;
1.1.1.4   root      166:        uint64 Peek8(uint32 addr) override;
1.1       root      167: };
                    168: 
                    169: // 前方参照
1.1.1.3   root      170: class DMACDevice;
1.1       root      171: class Human68k;
1.1.1.7   root      172: class InterruptDevice;
1.1       root      173: class IODevice;
1.1.1.10! root      174: class LunafbDevice;
1.1       root      175: class MK48T02Device;
                    176: class MPUDevice;
1.1.1.2   root      177: class SCSIDevice;
1.1       root      178: class SCSIHD;
                    179: class SCSITarget;
                    180: 
                    181: extern std::vector<Device *> gDevices;
1.1.1.9   root      182: extern std::unique_ptr<BusErrDevice> gBusErr;
1.1.1.10! root      183: extern std::unique_ptr<NopIODevice> gNopIO;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.