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