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

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

unix.superglobalmegacorp.com

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