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