|
|
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;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.