|
|
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.4 root 28: ~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 root 37: //
38: // 2. Create() ... 動的コンストラクション
39: // 必要なら設定ファイルによって可変なオブジェクトのコンストラクトを行う。
40: // 例えば SCSI ドライブなどが該当する。
1.1.1.4 root 41: // ここでも gConfig の参照および内部変数の登録は可能。
1.1 root 42: //
43: // 3. parse_logopt() ... -L オプションの処理
44: // この時点で Object 由来のオブジェクトはすべて出揃っている必要がある。
1.1.1.4 root 45: // またここで --show-config も行うため、この時点で gConfig の内容は確定し
46: // 以降 gConfig の変更は出来ない。
1.1 root 47: //
48: // 4. Init() ... 初期化
1.1.1.3 root 49: // ここでは ROM などのファイルの読み込み、またスレッドの起動などを行う。
1.1 root 50: // Object 由来のオブジェクトはすべて揃っているため、相互にアクセス可能。
51: // ただしその際の依存関係については、vm.cpp (や xiospace.cpp) 内の
52: // コンストラクタの順序で調整すること (循環参照不可)。
53: // またここから putlog() が使える (Scheduler::Init() のコメントも参照)。
54: //
55: // 5. Apply() ... 動的設定の適用
56: // 実行中に変更可能なパラメータもここで一度適用する。
57: //
58: // 6. PowerOn(), ResetHard() ... VM 起動
59:
60: // 動的コンストラクション。
61: // この時点で設定ファイルは読める。putlog() は使えない。
62: // 成功すれば true を返す、
63: // 失敗なら warn()/warnx() でエラーメッセージを表示して false を返すこと。
64: virtual bool Create();
65:
66: // 初期化。
67: // 起動時設定の適用、ファイルの読み込み、スレッド作成を行う。
1.1.1.3 root 68: // Object 由来のオブジェクトはすべて揃っており、設定ファイルは読める。
69: // putlog() も使える。
1.1 root 70: // 成功すれば true を返すこと。
1.1.1.3 root 71: // 失敗なら warn()/warnx()、あるいは ConfigItem::Err() 系 (実態は warnx)
72: // でエラーメッセージを表示して false を返すこと。
1.1 root 73: virtual bool Init();
74:
75: // 現在の設定を VM に反映させる。
76: // ここで適用するのは実行中に変更可能なパラメータのみ。
77: // 適用内容を表示したい時は putlog(1) が妥当か。
78: // 成功すれば true を返すこと。
79: // 失敗なら warn()/warnx()、あるいは gConfig->Err() 系 (実態は warnx) で
80: // エラーメッセージを表示して false を返すこと。
81: // といっても false が返されたらどうするんだろうか。
82: virtual bool Apply();
83:
84: virtual bool PowerOn();
85: virtual bool PowerOff();
86:
87: // ResetHard() は本体リセットスイッチによるリセット。
88: // ResetSoft() は MPU の RESET 命令によるリセット。
89: //
90: // X680x0 では、
1.1.1.4 root 91: // o PowerOn でリセット : VIPS, VideoCtlr, OSCIAN2
1.1 root 92: // o ResetHard でリセット: YUKI, MPU, FPU および ResetSoft の全員
93: // o ResetSoft でリセット: PPI, PEDEC, SPC, ADPCM, FDC, MFP, SAKI,
94: // CYNTHIA, DMAC らしい
95: // o いずれでもリセットされないもの: CACHY, YM2151, RTC
96: // o 分からないけどたぶん ResetHard でリセット: SCC
97: //
98: // LUNA では、詳細分からないので全員 ResetHard にしとくか。
99: virtual void ResetHard();
100: virtual void ResetSoft();
101:
102: };
103:
104: class IODevice : public Device
105: {
1.1.1.4 root 106: using inherited = Device;
1.1 root 107: protected:
108: IODevice();
109: public:
1.1.1.4 root 110: ~IODevice() override;
1.1 root 111:
112: public:
113: // アクセス関数。
114: // Read*() は読み込んだ値を (uint32) で返す。
115: // Write*() は書き込めたら 0 を返す。
116: // Peek8() はデバッガアクセスで読み込んだ値を (uint32) で返す。
117: // いずれもバスエラーなら (uint64)-1 を返す。
118: // (signed) int64 を使ってないのはノーマルパスで signed/unsigned の
119: // キャスト事故を防ぐため。
120: virtual uint64 Read8(uint32 addr);
121: virtual uint64 Read16(uint32 addr);
122: virtual uint64 Read32(uint32 addr);
123: virtual uint64 Write8(uint32 addr, uint32 data);
124: virtual uint64 Write16(uint32 addr, uint32 data);
125: virtual uint64 Write32(uint32 addr, uint32 data);
126: virtual uint64 Peek8(uint32 addr);
127:
128: uint32 devaddr = 0; // このデバイスの先頭アドレス
129:
130: // (必要なら)このデバイスの占めるバイト数。
131: // 今のところ XIOSpace、MuxDevice では必要。それ以外では不要。
132: uint32 devlen = 0;
133: };
134:
135: class BusErrDevice : public IODevice
136: {
1.1.1.4 root 137: using inherited = IODevice;
1.1 root 138: public:
139: BusErrDevice();
1.1.1.4 root 140: ~BusErrDevice() override;
1.1 root 141:
142: public:
1.1.1.4 root 143: uint64 Read8(uint32 addr) override;
144: uint64 Read16(uint32 addr) override;
145: uint64 Read32(uint32 addr) override;
146: uint64 Write8(uint32 addr, uint32 data) override;
147: uint64 Write16(uint32 addr, uint32 data) override;
148: uint64 Write32(uint32 addr, uint32 data) override;
149: uint64 Peek8(uint32 addr) override;
1.1 root 150: };
151:
152: // 何もしないデバイス。
153: // 読み込むと全域で 0xff が読めて、書き込んでも何も起きない。
154: class NullDevice : public IODevice
155: {
1.1.1.4 root 156: using inherited = IODevice;
1.1 root 157: public:
158: NullDevice();
1.1.1.4 root 159: ~NullDevice() override;
1.1 root 160:
161: public:
1.1.1.4 root 162: uint64 Read8(uint32 addr) override;
163: uint64 Write8(uint32 addr, uint32 data) override;
164: uint64 Peek8(uint32 addr) override;
1.1 root 165: };
166:
167: // 前方参照
168: class BitmapDevice;
1.1.1.3 root 169: class CRTC2Device;
170: class DMACDevice;
171: class FuseROMDevice;
1.1 root 172: class Human68k;
173: class IODevice;
174: class LanceDevice;
175: class MK48T02Device;
176: class MPUDevice;
177: class PIO0Device;
178: class PIO1Device;
179: class PROMDevice;
180: class RAMDevice;
1.1.1.2 root 181: class SCSIDevice;
1.1 root 182: class SCSIHD;
183: class SCSIHostDevice;
184: class SCSITarget;
185: class SIODevice;
186: class SPCDevice;
187: class SysClkDevice;
188: class VM;
189: class XIOSpaceDevice;
190: class ZRAMDevice;
191:
192: extern std::vector<Device *> gDevices;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.