|
|
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:
7: #include "vm_luna.h"
8: #include "aout.h"
9: #include "bitmap.h"
10: #include "bt454.h"
11: #include "busio.h"
1.1.1.2 ! root 12: #include "cmmu.h"
! 13: #include "config.h"
1.1 root 14: #include "crtc2.h"
15: #include "ethernet.h"
16: #include "fuserom.h"
17: #include "lance.h"
18: #include "lcd.h"
19: #include "lunakbd.h"
20: #include "mainapp.h"
21: #include "mk48t02.h"
1.1.1.2 ! root 22: #include "mpu680x0.h"
! 23: #include "mpu88xx0.h"
1.1 root 24: #include "pio.h"
1.1.1.2 ! root 25: #include "prom.h"
1.1 root 26: #include "ram.h"
27: #include "renderer.h"
28: #include "romemu_luna.h"
29: #include "romemu_luna88k.h"
30: #include "scheduler.h"
31: #include "sio.h"
32: #include "spc.h"
33: #include "sysclk.h"
1.1.1.2 ! root 34: #include "sysctlr.h"
! 35: #include "tas.h"
1.1 root 36: #include "zram.h"
37:
38: // LUNA のデバイス割り当て表 (上位8ビット)
39: //
40: // 仕様 実際
41: // 00 00 メインメモリ
42: // -- 01..03 二重バスフォールトするようだ
43: // -- 04..0f 何かよく分からないものが読める
44: // -- 10..3f BUSERR
45: // 41 40..43 PROM (B、N=128KBでミラー)
46: // 45 44..47 mk48t02 (B、N=2048でミラー)
47: // 49 48..4b pio0 (B、N=4でミラー)
48: // 4d 4c..4f pio1 (B、N=4でミラー)
49: // 51 50..53 sio (BB、N=4でミラー)
50: // -- 54..5f 0xff が読めるようだ
51: // 61 60..61 TAS (B、N=1でミラー)
52: // 63 62..63 システムクロック (B、N=1でミラー)
53: // -- 以降TASとSysClkで2枠ずつ。また無効ビットの読み出しは
54: // -- 必ずしも Hi とは限らず不安定のようだ。
55: // 71 70..7f 3ポートRAM (B、N=128KBでミラー)
56: // 81 80.. BUSERR (オンボード拡張スロットA)
57: // 83 ..8f BUSERR (オンボード拡張スロットB)
58: // 91 90..9f 0xff が読めるようだ (PC-9000 拡張スロット)
59: //
60: // a1 マスクROM
61: // a0,a2,a4,... BUSERR
62: // a1,a3,a5,... マスクROM(なければ0xffが読める)
63: // b1 ビットマップ
64: // b0,b2,b4,... BUSERR
65: // b1,b3,b5,... ビットマップ (内訳は bitmap.cpp 参照)
66: // c1 パレット
67: // c0,c2,c4,... BUSERR
68: // c1,c3,c5,... パレット (B、N=4でミラー)
69: // d1 CRTC-II
70: // d0,d2,d4,... BUSERR
71: // d1,d3,d5,... CRTC-II (B、N=2でミラー)
72: //
73: // e1 e0..e3 SCSI (BBBB、N=16 でミラー)
74: // -- e4..ef 0xff が読めるようだが不安定。
75: // f1 f0..f3 LANCE (WW、N=2 でミラー)
76: // -- f4..ff 0xff が読めるようだ
77:
78: // デバイスマップ用の識別子
79: enum {
80: NONE,
81: BUSERR,
82: RAM,
83: PROM,
84: MK48,
85: PIO0,
86: PIO1,
87: SIO,
88: TAS,
89: SYSCLK,
90: ZRAM,
91: MROM,
92: BITMAP,
93: BT454,
94: CRTC2,
95: SCSI,
96: LANCE,
97: FUSE,
1.1.1.2 ! root 98: SYSCTL,
! 99: CMMU,
1.1 root 100: };
101:
102: //
103: // LUNA-I
104: //
105:
106: /*static*/ const uint8
107: VM_LUNA::maptable[256] = {
108: // 01,02,03 は実際には二重バスフォールトになるがそれは未対応
109: RAM, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 00
110: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 08
111: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10
112: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18
113: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20
114: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28
115: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30
116: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38
117:
118: PROM, PROM, PROM, PROM, MK48, MK48, MK48, MK48, // 40
119: PIO0, PIO0, PIO0, PIO0, PIO1, PIO1, PIO1, PIO1, // 48
120: SIO, SIO, SIO, SIO, NONE, NONE, NONE, NONE, // 50
121: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 58
122: TAS, TAS, SYSCLK, SYSCLK, TAS, TAS, SYSCLK, SYSCLK, // 60
123: TAS, TAS, SYSCLK, SYSCLK, TAS, TAS, SYSCLK, SYSCLK, // 68
124: ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 70
125: ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 78
126:
127: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80
128: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88
129: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 90
130: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 98
131: BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a0
132: BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a8
133: BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b0
134: BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b8
135:
136: BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c0
137: BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c8
138: BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d0
139: BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d8
140: SCSI, SCSI, SCSI, SCSI, NONE, NONE, NONE, NONE, // e0
141: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // e8
142: LANCE, LANCE, LANCE, LANCE, NONE, NONE, NONE, NONE, // f0
143: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // f8
144: };
145:
146: // コンストラクタ
147: VM_LUNA::VM_LUNA()
148: {
1.1.1.2 ! root 149: // 機種固有パラメータ
! 150: // MPU クロックの初期値は機種ごとに異なる。単位は MHz
! 151: gConfig->SetDefault("mpu-clock", 20);
! 152: // RAM 初期値は MAX にしておく
! 153: gConfig->SetDefault("ram-size", 16);
! 154: // SPC の入力クロック (おそらく 6.144MHz = 163ns が入ってる)
! 155: gConfig->Add("!spc-tCLF", 163);
! 156: // LUNA-I のクロック割り込みは 60Hz
! 157: gConfig->Add("!sysclk-period", 16.666667_msec);
! 158:
1.1 root 159: // デバイス (順序に注意)
1.1.1.2 ! root 160: // BusErrDevice は親コンストラクタで作成済み。
! 161:
! 162: gScheduler.reset(new Scheduler()); // required by *
1.1 root 163: gMPU.reset(new MPU680x0Device(0x41000000));
164: gRAM.reset(new RAMDevice());
1.1.1.2 ! root 165: gEthernet.reset(new BusIO_W<LanceDevice>()); // required by PROM
! 166: if (gMainApp.host_file || gConfig->Find("prom-image").AsString().empty()) {
! 167: prom.reset(new LunaPROMEmuDevice());
1.1 root 168: } else {
1.1.1.2 ! root 169: prom.reset(new PROMDevice());
1.1 root 170: }
171: gRTC.reset(new BusIO_B<MK48T02Device>());
172: gPIO0.reset(new BusIO_B<PIO0Device>());
173: gPIO1.reset(new BusIO_B<PIO1Device>());
174: gSIO.reset(new BusIO_BB<SIODevice>());
175: sysclk.reset(new BusIO_B<SysClkDevice>());
1.1.1.2 ! root 176: gTAS.reset(new BusIO_B<TASDevice>());
1.1 root 177: gZRAM.reset(new ZRAMDevice());
1.1.1.2 ! root 178: gBitmap.reset(new BitmapDevice()); // required by BT454
1.1 root 179: gBT454.reset(new BusIO_B<BT454Device>());
180: crtc2.reset(new BusIO_B<CRTC2Device>());
181: gSPC.reset(new BusIO_BBBB<SPCDevice>());
182: nulldev.reset(new NullDevice());
183:
184: gLCD.reset(new LCDDevice());
185: gKeyboard.reset(new LunaKeyboard());
186: gRenderer.reset(new LunaRenderer());
187:
188: // デバイスマップから devtable を作成
189: for (uint i = 0; i < countof(::devtable); i++) {
190: IODevice *d;
191: switch (maptable[i]) {
192: case NONE: d = nulldev.get(); break;
193: case BUSERR: d = buserr.get(); break;
194: case RAM: d = gRAM.get(); break;
1.1.1.2 ! root 195: case PROM: d = prom.get(); break;
1.1 root 196: case MK48: d = gRTC.get(); break;
197: case PIO0: d = gPIO0.get(); break;
198: case PIO1: d = gPIO1.get(); break;
199: case SIO: d = gSIO.get(); break;
1.1.1.2 ! root 200: case TAS: d = gTAS.get(); break;
1.1 root 201: case SYSCLK: d = sysclk.get(); break;
202: case ZRAM: d = gZRAM.get(); break;
203: case MROM: d = nulldev.get(); break;
204: case BITMAP: d = gBitmap.get(); break;
205: case BT454: d = gBT454.get(); break;
206: case CRTC2: d = crtc2.get(); break;
207: case SCSI: d = gSPC.get(); break;
208: case LANCE: d = gEthernet.get(); break;
209: default:
210: __unreachable();
211: }
212: ::devtable[i] = d;
213: }
214: }
215:
216: // デストラクタ
217: VM_LUNA::~VM_LUNA()
218: {
219: }
220:
221: void
222: VM_LUNA::PowerButton()
223: {
224: // LUNA の電源ボタンは電源オンにしか使わない。
225: //
226: // 電源 ボタン
227: // ON PUSH (何も起きない)
228: // OFF PUSH 電源オン
229:
230: // デバイスに指示
231: DevicePowerOn();
232: }
233:
234:
235: //
236: // LUNA88K
237: //
238:
239: /*static*/ const uint8
240: VM_LUNA88K::maptable[256] = {
241: RAM, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 00
242: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 08
243: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10
244: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18
245: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20
246: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28
247: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30
248: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38
249:
250: // LUNA88K2 は 47 に(も?) NVRAM がいるようだ
251: // 69,6b,6d にも何かのコントローラ?
252: PROM, PROM, PROM, FUSE, MK48, MK48, MK48, MK48, // 40
253: PIO0, PIO0, PIO0, PIO0, PIO1, PIO1, PIO1, PIO1, // 48
254: SIO, SIO, SIO, SIO, NONE, NONE, NONE, NONE, // 50
255: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 58
1.1.1.2 ! root 256: TAS, TAS, SYSCLK, SYSCLK, NONE, SYSCTL, NONE, NONE, // 60
! 257: NONE, SYSCTL, NONE, NONE, NONE, SYSCTL, NONE, NONE, // 68
1.1 root 258: ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 70
259: ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 78
260:
261: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80
262: BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88
263: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 90
264: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 98
265: BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a0
266: BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a8
267: BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b0
268: BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b8
269:
270: // d0 にボードチェックレジスタ?
271: BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c0
272: BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c8
273: BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d0
274: BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d8
275: SCSI, SCSI, SCSI, SCSI, NONE, NONE, NONE, NONE, // e0
276: NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // e8
277: LANCE, LANCE, LANCE, LANCE, NONE, NONE, NONE, NONE, // f0
1.1.1.2 ! root 278: NONE, NONE, NONE, NONE, NONE, NONE, NONE, CMMU, // f8
1.1 root 279: };
280:
281: // コンストラクタ
282: VM_LUNA88K::VM_LUNA88K()
283: {
1.1.1.2 ! root 284: // 機種固有パラメータ
! 285: // MPU クロックの初期値は機種ごとに異なる。単位は MHz
! 286: gConfig->SetDefault("mpu-clock", 25);
! 287: // RAM 初期値は MAX にしておく
! 288: gConfig->SetDefault("ram-size", 16);
! 289: // SPC の入力クロック (XXX LUNA-I と同じ?)
! 290: gConfig->Add("!spc-tCLF", 163);
! 291: // LUNA-II, LUNA88K, LUNA88K2 のクロック割り込みは 100Hz らしい
! 292: gConfig->Add("!sysclk-period", 10_msec);
! 293:
1.1 root 294: // デバイス (順序に注意)
1.1.1.2 ! root 295: // BusErrDevice は親コンストラクタで作成済み。
! 296:
! 297: gScheduler.reset(new Scheduler()); // required by *
1.1 root 298: gMPU.reset(new MPU88xx0Device(0x41000000));
299: gRAM.reset(new RAMDevice());
1.1.1.2 ! root 300: if (gMainApp.host_file || gConfig->Find("prom-image").AsString().empty()) {
! 301: prom.reset(new Luna88kPROMEmuDevice());
1.1 root 302: } else {
1.1.1.2 ! root 303: prom.reset(new PROMDevice());
1.1 root 304: }
305: gRTC.reset(new BusIO_BFFF<MK48T02Device>());
1.1.1.2 ! root 306: gPIO0.reset(new BusIO_BFFF<PIO0Device>());
! 307: gPIO1.reset(new BusIO_BFFF<PIO1Device>());
1.1 root 308: gSIO.reset(new BusIO_BFFF<SIODevice>());
309: sysclk.reset(new SysClkDevice());
1.1.1.2 ! root 310: gTAS.reset(new BusIO_BFFF<TASDevice>());
1.1 root 311: gZRAM.reset(new ZRAMDevice());
1.1.1.2 ! root 312: gBitmap.reset(new BitmapDevice()); // required by BT454
1.1 root 313: gBT454.reset(new BusIO_B<BT454Device>());
314: crtc2.reset(new BusIO_BFFF<CRTC2Device>());
315: gSPC.reset(new BusIO_BFFF<SPCDevice>());
1.1.1.2 ! root 316: gEthernet.reset(new BusIO_WF<LanceDevice>()); // required by FuseROM
! 317: fuserom.reset(new BusIO_BFFF<FuseROMDevice>());
! 318: gSysCtlr.reset(new SysCtlrDevice());
! 319: gCMMU.reset(new CMMUDevice());
1.1 root 320: nulldev.reset(new NullDevice());
321:
322: gLCD.reset(new LCDDevice());
323: gKeyboard.reset(new LunaKeyboard());
324: gRenderer.reset(new LunaRenderer());
325:
326: // デバイスマップから devtable を作成
327: for (uint i = 0; i < countof(::devtable); i++) {
328: IODevice *d;
329: switch (maptable[i]) {
330: case NONE: d = nulldev.get(); break;
331: case BUSERR: d = buserr.get(); break;
332: case RAM: d = gRAM.get(); break;
1.1.1.2 ! root 333: case PROM: d = prom.get(); break;
1.1 root 334: case MK48: d = gRTC.get(); break;
335: case PIO0: d = gPIO0.get(); break;
336: case PIO1: d = gPIO1.get(); break;
337: case SIO: d = gSIO.get(); break;
1.1.1.2 ! root 338: case TAS: d = gTAS.get(); break;
1.1 root 339: case SYSCLK: d = sysclk.get(); break;
340: case ZRAM: d = gZRAM.get(); break;
341: case MROM: d = nulldev.get(); break;
342: case BITMAP: d = gBitmap.get(); break;
343: case BT454: d = gBT454.get(); break;
344: case CRTC2: d = crtc2.get(); break;
345: case SCSI: d = gSPC.get(); break;
1.1.1.2 ! root 346: case LANCE: d = gEthernet.get(); break;
1.1 root 347: case FUSE: d = fuserom.get(); break;
1.1.1.2 ! root 348: case SYSCTL: d = gSysCtlr.get(); break;
! 349: case CMMU: d = gCMMU.get(); break;
1.1 root 350: default:
351: __unreachable();
352: }
353: ::devtable[i] = d;
354: }
355: }
356:
357: // デストラクタ
358: VM_LUNA88K::~VM_LUNA88K()
359: {
360: }
361:
362: void
363: VM_LUNA88K::PowerButton()
364: {
365: // デバイスに指示
366: DevicePowerOn();
367: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.