|
|
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:
1.1.1.12! root 7: //
! 8: // デバイスの基本クラスなど
! 9: //
! 10:
1.1 root 11: #pragma once
12:
13: #include "object.h"
14:
15: #if BYTE_ORDER == LITTLE_ENDIAN
16: #define HB(addr) ((addr) ^ 1)
17: #define HLB(addr) ((addr) ^ 3)
18: #define HLW(addr) ((addr) ^ 2)
19: #else
20: #define HB(addr) (addr)
1.1.1.5 root 21: #define HLB(addr) (addr)
22: #define HLW(addr) (addr)
1.1 root 23: #endif
24:
25: class Device : public Object
26: {
1.1.1.4 root 27: using inherited = Object;
1.1 root 28: protected:
1.1.1.10 root 29: Device(const std::string& objname_);
1.1 root 30: public:
1.1.1.7 root 31: virtual ~Device() override;
1.1 root 32:
33: public:
34: // 初期化は以下の手順で行う。
35: // 1. コンストラクタ
36: // メンバ変数の初期値代入などを行う。失敗するケースは考慮していない。
1.1.1.4 root 37: // gConfig の内部変数の追加はここ(か2.の動的コンストラクション)で
38: // 行うこと。この時点ですでに gConfig の設定内容の参照は可能だが、
39: // エラーが出るものはここではなく Init() で処理すること。
1.1.1.12! root 40: // putmsg() は使えない。
1.1 root 41: //
42: // 2. Create() ... 動的コンストラクション
43: // 必要なら設定ファイルによって可変なオブジェクトのコンストラクトを行う。
1.1.1.12! root 44: // 例えば SCSI ドライブなどが該当する。ここでも gConfig の参照および
! 45: // 内部変数の登録は可能、putmsg() は使えない。
1.1 root 46: //
47: // 3. parse_logopt() ... -L オプションの処理
1.1.1.12! root 48: // この時点でログの割り当てを受ける Object 由来のオブジェクトはすべて
! 49: // 出揃っている必要がある。
1.1.1.4 root 50: // またここで --show-config も行うため、この時点で gConfig の内容は確定し
51: // 以降 gConfig の変更は出来ない。
1.1 root 52: //
1.1.1.12! root 53: // (4.) ParseMonitors() ... -M オプションの処理
1.1.1.10 root 54: // (GUI 版のみ) この時点で Monitor がすべて登録されている必要がある。
55: //
1.1.1.12! root 56: // 5. Init() ... 初期化
! 57: // この時点で Object 由来のオブジェクトはすべて出揃っており、ログレベル
! 58: // も確定しているのでこれ以降 putmsg() は使える。
! 59: // gConfig の設定項目のうち内容によってエラー終了する可能性があるものは
! 60: // ここで処理する。
! 61: // ここでは Object 同士を相互にアクセス可能。ただしその際の依存関係に
! 62: // ついては、vm.cpp (や xiospace.cpp) 内のコンストラクタの順序で調整
! 63: // すること (循環参照不可)。
! 64: // ホストデバイスの個別ドライバはここで起動する。本来 Create() で行いたい
! 65: // ところだが、ネットワークドライバの選択などは複雑なので putmsg() を
! 66: // 使いたい。そうするとここまで遅延せざるを得ない。そのため 3. を過ぎて
! 67: // からオブジェクトが増えることになるが、個別ドライバは新たなログ名を
! 68: // 増やさず、ホストドライバのログレベルを継承するため、ぎりぎり大丈夫。
! 69: // スレッドはまだ起動していない。
! 70: //
! 71: // 6. StartThread() ... スレッド起動
1.1 root 72: //
1.1.1.12! root 73: // 7. Apply() ... 動的設定の適用
1.1 root 74: // 実行中に変更可能なパラメータもここで一度適用する。
1.1.1.12! root 75: // ここで適用するのは実行中に変更可能なパラメータのみ。
! 76: // 適用内容を表示したい時は putlog(1) が妥当か。
1.1 root 77: //
1.1.1.12! root 78: // 8. ResetHard(true) ... 電源オン
1.1 root 79:
80: // 動的コンストラクション。
1.1.1.12! root 81: // 成功すれば true を返す。失敗なら warn() 系、あるいは gConfig->Err()
! 82: // 系でエラーメッセージを表示して false を返すこと。
1.1 root 83: virtual bool Create();
84:
85: // 初期化。
1.1.1.12! root 86: // 成功すれば true を返す。失敗なら warn() 系、あるいは gConfig->Err()
! 87: // 系でエラーメッセージを表示して false を返すこと。
1.1 root 88: virtual bool Init();
89:
90: // 現在の設定を VM に反映させる。
1.1.1.12! root 91: // 成功すれば true を返す。失敗なら warn() 系、あるいは gConfig->Err()
! 92: // 系でエラーメッセージを表示して false を返すこと。
1.1 root 93: // といっても false が返されたらどうするんだろうか。
94: virtual bool Apply();
95:
1.1.1.12! root 96: // 電源オンもしくはリセット。
! 97: // true なら電源オン、false ならリセット。
1.1.1.8 root 98: // このデバイスがどのタイミングでリセットされるかは VM による。
99: // X68030 なら vm_x68k.cpp 内のコメント参照。
100: // LUNA は詳細不明。
1.1.1.12! root 101: virtual void ResetHard(bool poweron);
! 102:
! 103: // 電源オフ
! 104: virtual void PowerOff();
! 105:
! 106: // ログ出力
! 107: void putlogn(const char *fmt, ...) const override __printflike(2, 3);
1.1 root 108: };
109:
110: class IODevice : public Device
111: {
1.1.1.4 root 112: using inherited = Device;
1.1 root 113: protected:
1.1.1.10 root 114: IODevice(const std::string& objname_);
1.1 root 115: public:
1.1.1.7 root 116: virtual ~IODevice() override;
1.1 root 117:
118: public:
119: // アクセス関数。
120: // Read*() は読み込んだ値を (uint32) で返す。
121: // Write*() は書き込めたら 0 を返す。
122: // Peek8() はデバッガアクセスで読み込んだ値を (uint32) で返す。
123: // いずれもバスエラーなら (uint64)-1 を返す。
124: // (signed) int64 を使ってないのはノーマルパスで signed/unsigned の
125: // キャスト事故を防ぐため。
126: virtual uint64 Read8(uint32 addr);
127: virtual uint64 Read16(uint32 addr);
128: virtual uint64 Read32(uint32 addr);
129: virtual uint64 Write8(uint32 addr, uint32 data);
130: virtual uint64 Write16(uint32 addr, uint32 data);
131: virtual uint64 Write32(uint32 addr, uint32 data);
132: virtual uint64 Peek8(uint32 addr);
133:
1.1.1.6 root 134: uint32 devaddr {}; // このデバイスの先頭アドレス
1.1 root 135:
136: // (必要なら)このデバイスの占めるバイト数。
137: // 今のところ XIOSpace、MuxDevice では必要。それ以外では不要。
1.1.1.6 root 138: uint32 devlen {};
1.1 root 139: };
140:
141: class BusErrDevice : public IODevice
142: {
1.1.1.4 root 143: using inherited = IODevice;
1.1 root 144: public:
145: BusErrDevice();
1.1.1.7 root 146: virtual ~BusErrDevice() override;
1.1 root 147:
148: public:
1.1.1.4 root 149: uint64 Read8(uint32 addr) override;
150: uint64 Read16(uint32 addr) override;
151: uint64 Read32(uint32 addr) override;
152: uint64 Write8(uint32 addr, uint32 data) override;
153: uint64 Write16(uint32 addr, uint32 data) override;
154: uint64 Write32(uint32 addr, uint32 data) override;
155: uint64 Peek8(uint32 addr) override;
1.1 root 156: };
157:
158: // 何もしないデバイス。
159: // 読み込むと全域で 0xff が読めて、書き込んでも何も起きない。
1.1.1.10 root 160: class NopIODevice : public IODevice
1.1 root 161: {
1.1.1.4 root 162: using inherited = IODevice;
1.1 root 163: public:
1.1.1.10 root 164: NopIODevice();
165: virtual ~NopIODevice() override;
1.1 root 166:
167: public:
1.1.1.4 root 168: uint64 Read8(uint32 addr) override;
1.1.1.8 root 169: uint64 Read16(uint32 addr) override;
170: uint64 Read32(uint32 addr) override;
1.1.1.4 root 171: uint64 Write8(uint32 addr, uint32 data) override;
1.1.1.8 root 172: uint64 Write16(uint32 addr, uint32 data) override;
173: uint64 Write32(uint32 addr, uint32 data) override;
1.1.1.4 root 174: uint64 Peek8(uint32 addr) override;
1.1 root 175: };
176:
177: // 前方参照
1.1.1.3 root 178: class DMACDevice;
1.1 root 179: class Human68k;
1.1.1.7 root 180: class InterruptDevice;
1.1.1.10 root 181: class LunafbDevice;
1.1 root 182: class MK48T02Device;
183: class MPUDevice;
1.1.1.2 root 184: class SCSIDevice;
1.1.1.11 root 185: class SCSIDisk;
1.1 root 186: class SCSITarget;
187:
1.1.1.12! root 188: extern BusErrDevice *gBusErr;
! 189: extern NopIODevice *gNopIO;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.