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