|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // メインバス (LUNA)
9: //
10:
11: // IODevice
12: // +-- MainbusBaseDevice (InitMainbus() と FC アクセスを持つ)
13: // | +-- MainbusDevice (これがメインバス、システムに1つ)
14: // | | +-- Mainbus24Device (上位8ビットがテーブルで表せるメインバス)
15: // | | | | +-------------+
16: // | | | +--| LunaMainbus | (LUNA 共通部)
17: // | | | | +-------------+
18: // | | | | | +--------------+
19: // | | | | +--| Luna1Mainbus | (LUNA-I)
20: // | | | | | +--------------+
21: // | | | | | +----------------+
22: // | | | | +--| Luna88kMainbus | (LUNA-88K)
23: // | | | | +----------------+
24: // | | | |
25: // | | | +-- NewsMainbus
26: // | | | +-- Virt68kMainbus
27: // | | +-- X68kMainbus
28: // | +-- X68kIODevice
29: // +-- XPbusDevice
30:
31: #include "mainbus_luna.h"
32: #include "bt45x.h"
1.1.1.5 ! root 33: #include "buserr.h"
1.1 root 34: #include "busio.h"
35: #include "cmmu.h"
36: #include "config.h"
37: #include "crtc2.h"
38: #include "fuserom.h"
39: #include "interrupt.h"
40: #include "lance.h"
41: #include "lunafb.h"
42: #include "mainapp.h"
43: #include "mainram.h"
44: #include "mk48t02.h"
45: #include "msxdos.h"
1.1.1.5 ! root 46: #include "nop.h"
1.1 root 47: #include "partialram.h"
48: #include "pio.h"
49: #include "prom.h"
50: #include "romemu_luna1.h"
51: #include "romemu_luna88k.h"
52: #include "sio.h"
53: #include "spc.h"
54: #include "subram.h"
55: #include "sysclk.h"
56: #include "sysctlr.h"
57: #include "tas.h"
58:
59: //
60: // LUNA 共通部
61: //
62:
63: // デバイスマップ用の識別子
64: enum {
65: NONE,
66: BUSERR,
67: PROM,
68: MK48,
69: PIO0,
70: PIO1,
71: SIO,
72: TAS,
73: SYSCLK,
74: SUBRAM,
75: MROM,
76: LUNAFB,
77: BT45x,
78: CRTC2,
79: SCSI,
80: LANCE,
81: FUSE,
82: SYSCTL,
83: CMMU,
84: };
85:
86: // コンストラクタ
87: LunaMainbus::LunaMainbus()
88: {
89: NEWDV(BusErr, new BusErrDevice());
90: NEWDV(NopIO, new NopIODevice());
91:
1.1.1.3 root 92: accstat_monitor->SetSize(80, 2 + 32);
1.1 root 93: }
94:
95: // デストラクタ
96: LunaMainbus::~LunaMainbus()
97: {
98: }
99:
100: // デバイスマップから devtable を作成 (ここは共通にできる)
101: void
102: LunaMainbus::MakeDevtable(const uint8 *maptable)
103: {
104: for (int i = 0; i < devtable.size(); i++) {
105: IODevice *d;
106: switch (maptable[i]) {
107: case NONE: d = pNopIO.get(); break;
108: case BUSERR: d = pBusErr.get(); break;
109: case PROM: d = pPROM.get(); break;
110: case MK48: d = pRTC.get(); break;
111: case PIO0: d = pPIO0.get(); break;
112: case PIO1: d = pPIO1.get(); break;
113: case SIO: d = pSIO.get(); break;
114: case TAS: d = pTAS.get(); break;
115: case SYSCLK: d = pSysClk.get(); break;
116: case SUBRAM: d = pSubRAM.get(); break;
117: case MROM: d = pNopIO.get(); break;
118: case LUNAFB: d = pPlaneVRAM.get(); break;
119: case BT45x: d = pBT45x.get(); break;
120: case CRTC2: d = pCRTC2.get(); break;
121: case SCSI: d = pSPC.get(); break;
122: case LANCE: d = pEthernet.get(); break;
123: case SYSCTL: d = pInterrupt.get(); break;
124: // これらはサブクラスが所有しているので Get で取得する必要がある。
125: case FUSE: d = GetFuseROMDevice(); break;
126: case CMMU: d = GetCMMUDevice(); break;
127: default:
1.1.1.2 root 128: PANIC("corrupted maptable[%u]=%d", i, maptable[i]);
1.1 root 129: }
130: devtable[i] = d;
131: }
132: }
133:
134: // メインバスの初期化
135: bool
136: LunaMainbus::InitMainbus()
137: {
138: auto mainram = dynamic_cast<MainRAMDevice *>(pMainRAM.get());
139: auto partial = dynamic_cast<PartialRAMDevice *>(pPartialRAM.get());
140:
141: // RAM は容量が確定した後のここで配置。
1.1.1.4 root 142: uint ram_size_MB = mainram->GetSizeMB();
1.1 root 143: int i = 0;
144: while (ram_size_MB >= 16) {
145: // 16MB あれば RAM が直接担当
146: devtable[i++] = mainram;
147: ram_size_MB -= 16;
148: }
149: // 16MB 未満なら PartialRAM が担当
150: if (ram_size_MB > 0) {
151: devtable[i] = partial;
152: }
153:
154: // 先頭 (mainram or partial) をブートページ切り替え用に覚えておく。
155: ram0 = devtable[0];
156:
157: // アクセス状況用のマップを作成。
158: InitAccStat();
159:
160: return true;
161: }
162:
163: // ブートページを切り替える。
164: void
165: LunaMainbus::SwitchBootPage(bool isrom)
166: {
167: // 共通処理
168: inherited::SwitchBootPage(isrom);
169:
170: // ROM は 128KB しかないので 16MB まるごと切り替わったりはしないとは
171: // 思うけど、具体的にどの範囲が切り替わるのかを知る方法がないのと
172: // 大して副作用もないので、先頭の 1ブロックをまるごと切り替えておく。
173: if (isrom) {
174: auto prom0 = GetPROM0Device();
175: devtable[0x00] = prom0;
176: devtable[0x41] = prom0;
177: } else {
178: auto prom = GetPROMDevice();
179: devtable[0x00] = ram0;
180: devtable[0x41] = prom;
181: }
182: }
183:
184:
185: //
186: // LUNA-I
187: //
188:
189: // LUNA-I のデバイス割り当て表 (上位8ビット)
190: //
191: // 仕様 実際
192: // 00 00 メインメモリ
193: // -- 01..03 二重バスフォールトするようだ
194: // -- 04..0f 何かよく分からないものが読める
195: // -- 10..3f BUSERR
196: // 41 40..43 PROM (B、N=128KBでミラー)
197: // 45 44..47 mk48t02 (B、N=2048でミラー)
198: // 49 48..4b pio0 (B、N=4でミラー)
199: // 4d 4c..4f pio1 (B、N=4でミラー)
200: // 51 50..53 sio (BB、N=4でミラー)
201: // -- 54..5f 0xff が読めるようだ
202: // 61 60..61 TAS (B、N=1でミラー)
203: // 63 62..63 システムクロック (B、N=1でミラー)
204: // -- 以降TASとSysClkで2枠ずつ。また無効ビットの読み出しは
205: // -- 必ずしも Hi とは限らず不安定のようだ。
206: // 71 70..7f 3ポートRAM (B、N=128KBでミラー)
207: // 81 80.. BUSERR (オンボード拡張スロットA)
208: // 83 ..8f BUSERR (オンボード拡張スロットB)
209: // 91 90..9f 0xff が読めるようだ (PC-9000 拡張スロット)
210: //
211: // a1 マスクROM
212: // a0,a2,a4,... BUSERR
213: // a1,a3,a5,... マスクROM(なければ0xffが読める)
214: // b1 ビットマップ
215: // b0,b2,b4,... BUSERR
216: // b1,b3,b5,... ビットマップ (内訳は lunafb.cpp 参照)
217: // c1 パレット
218: // c0,c2,c4,... BUSERR
219: // c1,c3,c5,... パレット (B、N=4でミラー)
220: // d1 CRTC-II
221: // d0,d2,d4,... BUSERR
222: // d1,d3,d5,... CRTC-II (B、N=2でミラー)
223: //
224: // e1 e0..e3 SCSI (BBBB、N=16 でミラー)
225: // -- e4..ef 0xff が読めるようだが不安定。
226: // f1 f0..f3 LANCE (WW、N=2 でミラー)
227: // -- f4..ff 0xff が読めるようだ
228:
229: /*static*/ const uint8
230: Luna1Mainbus::maptable[256] = {
231: // (00,)01,02,03 は実際にはたぶんパリティチェックが入っていて(?)
232: // 非実装領域にアクセスすると二重バスフォールトになるがそれは未対応。
233: // RAM は Init() で動的に配置する。
234: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 00
235: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 08
236: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10
237: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18
238: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20
239: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28
240: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30
241: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38
242:
243: PROM, PROM, PROM, PROM, MK48, MK48, MK48, MK48, // 40
244: PIO0, PIO0, PIO0, PIO0, PIO1, PIO1, PIO1, PIO1, // 48
245: SIO, SIO, SIO, SIO, NONE, NONE, NONE, NONE, // 50
246: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 58
247: TAS, TAS, SYSCLK, SYSCLK, TAS, TAS, SYSCLK, SYSCLK, // 60
248: TAS, TAS, SYSCLK, SYSCLK, TAS, TAS, SYSCLK, SYSCLK, // 68
249: SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, // 70
250: SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, // 78
251:
252: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80
253: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88
254: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 90
255: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 98
256: BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a0
257: BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a8
258: BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b0
259: BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b8
260:
261: BUSERR, BT45x, BUSERR, BT45x, BUSERR, BT45x, BUSERR, BT45x, // c0
262: BUSERR, BT45x, BUSERR, BT45x, BUSERR, BT45x, BUSERR, BT45x, // c8
263: BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d0
264: BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d8
265: SCSI, SCSI, SCSI, SCSI, NONE, NONE, NONE, NONE, // e0
266: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // e8
267: LANCE, LANCE, LANCE, LANCE, NONE, NONE, NONE, NONE, // f0
268: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // f8
269: };
270:
271: // コンストラクタ
272: Luna1Mainbus::Luna1Mainbus()
273: {
274: // デバイス (順序に注意)
275: // BusErrDevice, NopIODevice は親コンストラクタで作成済み。
276:
277: NEWDV(Interrupt, new LunaInterrupt());
278: NEWDV(RTC, new BusIO_B<MK48T02Device>()); // required by SysClk
279: NEWDV(SysClk, new BusIO_B<SysClkDevice>()); // required by PROMEmu
280: if (gMainApp.msxdos_mode) {
281: NEWDV(PROM, new MSXDOSDevice());
282: } else if (gMainApp.exec_file ||
283: gConfig->Find("prom-image").AsString().empty()) {
284: NEWDV(PROM, new Luna1PROMEmuDevice());
285: } else {
286: NEWDV(PROM, new PROMDevice()); // required by RAM,BT45x
287: }
288: NEWDV(PROM0, new PROM0Device());
289: NEWDV(MainRAM, new MainRAMDevice()); // required by PartialRAM
290: NEWDV(PartialRAM, new PartialRAMDevice());
291: NEWDV(PIO0, new BusIO_B<PIO0Device>());
292: NEWDV(PIO1, new BusIO_B<PIO1Device>());
293: NEWDV(SIO, new BusIO_BB<SIODevice>());
294: NEWDV(TAS, new BusIO_B<TASDevice>());
295: NEWDV(SubRAM, new SubRAMDevice(128));
296: NEWDV(CRTC2, new BusIO_B<CRTC2Device>());
297: NEWDV(SPC, new BusIO_BBBB<SPCDevice>());
298: NEWDV(Ethernet, new BusIO_W<LanceDevice>());
299: }
300:
301: // デストラクタ
302: Luna1Mainbus::~Luna1Mainbus()
303: {
304: }
305:
1.1.1.2 root 306: // 動的なコンストラクション
307: bool
308: Luna1Mainbus::Create()
309: {
310: int nplane = BT45xDevice::GetConfigPlaneCount();
311: if (nplane < 0) {
312: return false;
313: }
314: if (nplane == 8) { // required by Lunafb
315: NEWDV(BT45x, new BusIO_BFFF<BT458Device>());
316: } else {
317: NEWDV(BT45x, new BusIO_B<BT454Device>());
318: }
319: NEWDV(PlaneVRAM, new LunafbDevice());
320:
321: // 全部揃ったここで、デバイスマップから devtable を作成。
322: MakeDevtable(maptable);
323: return true;
324: }
1.1 root 325:
326: //
327: // LUNA-88K
328: //
329:
330: // 00..03 RAM (64MB 実機の場合)
1.1.1.5 ! root 331: // 04..3f バスエラー
1.1 root 332: // 40,41 PROM (B、N=256KB でミラー)
333: // 42,43 FUSEROM (BFFF、N=256 でミラー)
334: // 44,45 NVRAM (BFFF、N=2048 でミラー)
1.1.1.5 ! root 335: // 46,47 バスエラー
1.1 root 336: // 48,49 PIO0 (BFFF、N=4 でミラー)
1.1.1.5 ! root 337: // 4a,4b バスエラー
1.1 root 338: // 4c,4d PIO1 (BFFF、N=4 でミラー)
1.1.1.5 ! root 339: // 4e,4f バスエラー
1.1 root 340: // 50,51 SIO (BFFF、N=4 でミラー)
1.1.1.5 ! root 341: // 52..5f バスエラー
1.1 root 342: // 60,61 TAS? (BFFF、N=1 ?)
343: // 62,63 SysClk (BFFF、N=1 ?)
1.1.1.5 ! root 344: // 64,65,66,67 SysCtlr? (L、N=1 ?)
1.1 root 345: // 68,69,6a,6b SysCtlr? (L、N=4 ?)
346: // 6c,6d CPU リセット
1.1.1.5 ! root 347: // 6e,6f $ff (?)
1.1 root 348: // 70-7f SubRAM
1.1.1.5 ! root 349: // 80-9f バスエラー
! 350: // a0-af 偶数(a0,a2,..)はバスエラー、奇数(a1,a3,..)は $ff
! 351: // b0-bf 偶数(b0,b2,..)はバスエラー、奇数(b1,b3,..)は LUNAFB
! 352: // c0-cf 偶数(c0,c2,..)はバスエラー、奇数(c1,c3,..)は BT454(BFFF、N=4)
! 353: // d0-df 偶数(d0,d2,..)はバスエラー、奇数(d1,d3,..)はたぶん CRTC2
1.1 root 354: // (CRTC2 は今の所 $ff しか観測できていないので詳細不明)
355: // e0,e1 SPC (BFFF、N=16 でミラー)
1.1.1.5 ! root 356: // e2-ef $ff
1.1 root 357: // f0,f1 たぶん Lance (BFFF、N=2)
358: // f2-fd $ff
1.1.1.5 ! root 359: // fe $fe00'0000-$fef7'ffff まではアドレス(*)
1.1 root 360: // $fef8'0000-$feff'ffff までは $ff
1.1.1.5 ! root 361: // ff たぶん CMMU 以外はアドレス(*)
1.1 root 362: //
1.1.1.5 ! root 363: // バスエラーの領域は 3% くらいの確率で $ffffffff が読めることがある。まじか。
! 364: // (OpenBSD の CMMU 検出がバスエラーが起きるはずなのに起きなかった時のことを
! 365: // 考慮したコードになってるのはこのためだろうか…)
! 366: //
! 367: // アドレス(*) のところは、32ビットアドレスが読み出せる。バイトアクセスしても
! 368: // そのバイトに応じたところが読み出せるので 32ビットの (フルワード単位の)
! 369: // アドレスがデータバスに乗って返って来ているようだ…。
! 370: // 以下 PROM でのダンプ結果 (boot の machine read コマンドでも同じ)。
! 371: // 0> dw fe000000 fe00000f
! 372: // fe000000: fe000000 fe000004 fe000008 fe00000c
! 373: // 0> d fe000000 fe00000f
! 374: // fe000000: fe 00 00 00 fe 00 00 04 fe 00 00 08 fe 00 00 0c
1.1 root 375:
376: /*static*/ const uint8
377: Luna88kMainbus::maptable[256] = {
378: // RAM は Init() で動的に配置する (64MB なら 00..03 の4枠)。
379: // 先頭 64MB の空間 (00..03) だけは、PROM 1.20 ではメモリが無いときでも
380: // バスエラーにならないことを期待しているので NONE にしておく。
1.1.1.5 ! root 381: // それ以降はバスエラー。
1.1 root 382: NONE, NONE, NONE, NONE, BUSERR, BUSERR, BUSERR, BUSERR, // 00
383: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 08
384: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10
385: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18
386: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20
387: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28
388: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30
389: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38
390:
391: // LUNA-88K2 は 47 に(も?) NVRAM がいるようだ
392: // 69,6b,6d にも何かのコントローラ?
1.1.1.5 ! root 393: PROM, PROM, FUSE, FUSE, MK48, MK48, BUSERR, BUSERR, // 40
! 394: PIO0, PIO0, BUSERR, BUSERR, PIO1, PIO1, BUSERR, BUSERR, // 48
! 395: SIO, SIO, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 50
! 396: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 58
1.1 root 397: TAS, TAS, SYSCLK, SYSCLK, SYSCTL, SYSCTL, SYSCTL, SYSCTL, // 60
398: SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, SYSCTL, // 68
399: SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, // 70
400: SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, SUBRAM, // 78
401:
1.1.1.5 ! root 402: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80
! 403: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88
! 404: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 90
! 405: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 98
! 406: BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a0
! 407: BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a8
! 408: BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b0
! 409: BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b8
1.1 root 410:
411: // d0 にボードチェックレジスタ?
1.1.1.5 ! root 412: BUSERR, BT45x, BUSERR, BT45x, BUSERR, BT45x, BUSERR, BT45x, // c0
! 413: BUSERR, BT45x, BUSERR, BT45x, BUSERR, BT45x, BUSERR, BT45x, // c8
! 414: BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d0
! 415: BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d8
1.1 root 416: SCSI, SCSI, NONE, NONE, NONE, NONE, NONE, NONE, // e0
417: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // e8
418: LANCE, LANCE, NONE, NONE, NONE, NONE, NONE, NONE, // f0
419: NONE, NONE, NONE, NONE, NONE, NONE, NONE, CMMU, // f8
420: };
421:
422: // コンストラクタ
423: Luna88kMainbus::Luna88kMainbus()
424: {
425: // デバイス (順序に注意)
426: // BusErrDevice, NopIODevice は親コンストラクタで作成済み。
427:
428: NEWDV(Interrupt, new SysCtlrDevice());
429: NEWDV(RTC, new BusIO_BFFF<MK48T02Device>()); // required by SysClk
430: NEWDV(SysClk, new BusIO_BFFF<SysClkDevice>()); // required by PROMEmu
431: if (gMainApp.exec_file || gConfig->Find("prom-image").AsString().empty()) {
432: NEWDV(PROM, new Luna88kPROMEmuDevice());
433: } else {
434: NEWDV(PROM, new PROMDevice()); // required by RAM
435: }
436: NEWDV(PROM0, new PROM0Device());
437: NEWDV(MainRAM, new MainRAMDevice()); // required by PartialRAM
438: NEWDV(PartialRAM, new PartialRAMDevice());
439: NEWDV(FuseROM, new BusIO_BFFF<FuseROMDevice>());
440: NEWDV(PIO0, new BusIO_BFFF<PIO0Device>());
441: NEWDV(PIO1, new BusIO_BFFF<PIO1Device>());
442: NEWDV(SIO, new BusIO_BFFF<SIODevice>());
443: NEWDV(TAS, new BusIO_BFFF<TASDevice>());
444: NEWDV(SubRAM, new SubRAMDevice(128));
445: NEWDV(CRTC2, new BusIO_BFFF<CRTC2Device>());
446: NEWDV(SPC, new BusIO_BFFF<SPCDevice>());
447: NEWDV(Ethernet, new BusIO_WF<LanceDevice>());
448: NEWDV(CMMU, new CMMUDevice());
449: }
450:
451: // デストラクタ
452: Luna88kMainbus::~Luna88kMainbus()
453: {
454: }
1.1.1.2 root 455:
456: // 動的なコンストラクション
457: bool
458: Luna88kMainbus::Create()
459: {
460: int nplane = BT45xDevice::GetConfigPlaneCount();
461: if (nplane < 0) {
462: return false;
463: }
464: if (nplane == 8) { // required by Lunafb
465: NEWDV(BT45x, new BusIO_BFFF<BT458Device>());
466: } else {
467: NEWDV(BT45x, new BusIO_B<BT454Device>());
468: }
469: NEWDV(PlaneVRAM, new LunafbDevice());
470:
471: // 全部揃ったここで、デバイスマップから devtable を作成。
472: MakeDevtable(maptable);
473: return true;
474: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.