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