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