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