|
|
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:
26: Device();
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: //
50: // 4. Init() ... 初期化
1.1.1.3 root 51: // ここでは ROM などのファイルの読み込み、またスレッドの起動などを行う。
1.1 root 52: // Object 由来のオブジェクトはすべて揃っているため、相互にアクセス可能。
53: // ただしその際の依存関係については、vm.cpp (や xiospace.cpp) 内の
54: // コンストラクタの順序で調整すること (循環参照不可)。
55: //
56: // 5. Apply() ... 動的設定の適用
57: // 実行中に変更可能なパラメータもここで一度適用する。
58: //
59: // 6. PowerOn(), ResetHard() ... VM 起動
60:
61: // 動的コンストラクション。
62: // この時点で設定ファイルは読める。putlog() は使えない。
63: // 成功すれば true を返す、
64: // 失敗なら warn()/warnx() でエラーメッセージを表示して false を返すこと。
65: virtual bool Create();
66:
67: // 初期化。
68: // 起動時設定の適用、ファイルの読み込み、スレッド作成を行う。
1.1.1.3 root 69: // Object 由来のオブジェクトはすべて揃っており、設定ファイルは読める。
70: // putlog() も使える。
1.1 root 71: // 成功すれば true を返すこと。
1.1.1.3 root 72: // 失敗なら warn()/warnx()、あるいは ConfigItem::Err() 系 (実態は warnx)
73: // でエラーメッセージを表示して false を返すこと。
1.1 root 74: virtual bool Init();
75:
76: // 現在の設定を VM に反映させる。
77: // ここで適用するのは実行中に変更可能なパラメータのみ。
78: // 適用内容を表示したい時は putlog(1) が妥当か。
79: // 成功すれば true を返すこと。
80: // 失敗なら warn()/warnx()、あるいは gConfig->Err() 系 (実態は warnx) で
81: // エラーメッセージを表示して false を返すこと。
82: // といっても false が返されたらどうするんだろうか。
83: virtual bool Apply();
84:
85: virtual bool PowerOn();
86: virtual bool PowerOff();
87:
1.1.1.8 root 88: // ResetHard() はこのデバイスのリセット。
89: // このデバイスがどのタイミングでリセットされるかは VM による。
90: // X68030 なら vm_x68k.cpp 内のコメント参照。
91: // LUNA は詳細不明。
1.1 root 92: virtual void ResetHard();
93: };
94:
95: class IODevice : public Device
96: {
1.1.1.4 root 97: using inherited = Device;
1.1 root 98: protected:
99: IODevice();
100: public:
1.1.1.7 root 101: virtual ~IODevice() override;
1.1 root 102:
103: public:
104: // アクセス関数。
105: // Read*() は読み込んだ値を (uint32) で返す。
106: // Write*() は書き込めたら 0 を返す。
107: // Peek8() はデバッガアクセスで読み込んだ値を (uint32) で返す。
108: // いずれもバスエラーなら (uint64)-1 を返す。
109: // (signed) int64 を使ってないのはノーマルパスで signed/unsigned の
110: // キャスト事故を防ぐため。
111: virtual uint64 Read8(uint32 addr);
112: virtual uint64 Read16(uint32 addr);
113: virtual uint64 Read32(uint32 addr);
114: virtual uint64 Write8(uint32 addr, uint32 data);
115: virtual uint64 Write16(uint32 addr, uint32 data);
116: virtual uint64 Write32(uint32 addr, uint32 data);
117: virtual uint64 Peek8(uint32 addr);
118:
1.1.1.6 root 119: uint32 devaddr {}; // このデバイスの先頭アドレス
1.1 root 120:
121: // (必要なら)このデバイスの占めるバイト数。
122: // 今のところ XIOSpace、MuxDevice では必要。それ以外では不要。
1.1.1.6 root 123: uint32 devlen {};
1.1 root 124: };
125:
126: class BusErrDevice : public IODevice
127: {
1.1.1.4 root 128: using inherited = IODevice;
1.1 root 129: public:
130: BusErrDevice();
1.1.1.7 root 131: virtual ~BusErrDevice() override;
1.1 root 132:
133: public:
1.1.1.4 root 134: uint64 Read8(uint32 addr) override;
135: uint64 Read16(uint32 addr) override;
136: uint64 Read32(uint32 addr) override;
137: uint64 Write8(uint32 addr, uint32 data) override;
138: uint64 Write16(uint32 addr, uint32 data) override;
139: uint64 Write32(uint32 addr, uint32 data) override;
140: uint64 Peek8(uint32 addr) override;
1.1 root 141: };
142:
143: // 何もしないデバイス。
144: // 読み込むと全域で 0xff が読めて、書き込んでも何も起きない。
145: class NullDevice : public IODevice
146: {
1.1.1.4 root 147: using inherited = IODevice;
1.1 root 148: public:
149: NullDevice();
1.1.1.7 root 150: virtual ~NullDevice() override;
1.1 root 151:
152: public:
1.1.1.4 root 153: uint64 Read8(uint32 addr) override;
1.1.1.8 root 154: uint64 Read16(uint32 addr) override;
155: uint64 Read32(uint32 addr) override;
1.1.1.4 root 156: uint64 Write8(uint32 addr, uint32 data) override;
1.1.1.8 root 157: uint64 Write16(uint32 addr, uint32 data) override;
158: uint64 Write32(uint32 addr, uint32 data) override;
1.1.1.4 root 159: uint64 Peek8(uint32 addr) override;
1.1 root 160: };
161:
162: // 前方参照
163: class BitmapDevice;
1.1.1.3 root 164: class DMACDevice;
1.1 root 165: class Human68k;
1.1.1.7 root 166: class InterruptDevice;
1.1 root 167: class IODevice;
168: class MK48T02Device;
169: class MPUDevice;
1.1.1.2 root 170: class SCSIDevice;
1.1 root 171: class SCSIHD;
172: class SCSITarget;
173:
174: extern std::vector<Device *> gDevices;
1.1.1.9 ! root 175: extern std::unique_ptr<BusErrDevice> gBusErr;
1.1.1.8 root 176: extern std::unique_ptr<NullDevice> gNull;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.