--- nono/vm/vm_luna.cpp 2026/04/29 17:04:32 1.1.1.1 +++ nono/vm/vm_luna.cpp 2026/04/29 17:04:42 1.1.1.3 @@ -1,6 +1,7 @@ // // nono -// Copyright (C) 2020 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "vm_luna.h" @@ -8,6 +9,8 @@ #include "bitmap.h" #include "bt454.h" #include "busio.h" +#include "cmmu.h" +#include "config.h" #include "crtc2.h" #include "ethernet.h" #include "fuserom.h" @@ -16,16 +19,20 @@ #include "lunakbd.h" #include "mainapp.h" #include "mk48t02.h" +#include "mpu680x0.h" +#include "mpu88xx0.h" #include "pio.h" +#include "prom.h" #include "ram.h" #include "renderer.h" #include "romemu_luna.h" #include "romemu_luna88k.h" -#include "romimg_luna.h" #include "scheduler.h" #include "sio.h" #include "spc.h" #include "sysclk.h" +#include "sysctlr.h" +#include "tas.h" #include "zram.h" // LUNA のデバイス割り当て表 (上位8ビット) @@ -88,6 +95,8 @@ enum { SCSI, LANCE, FUSE, + SYSCTL, + CMMU, }; // @@ -137,26 +146,39 @@ VM_LUNA::maptable[256] = { // コンストラクタ VM_LUNA::VM_LUNA() { + // 機種固有パラメータ + // MPU クロックの初期値は機種ごとに異なる。単位は MHz + gConfig->SetDefault("mpu-clock", 20); + // RAM 初期値は MAX にしておく + gConfig->SetDefault("ram-size", 16); + // SPC の入力クロック (おそらく 6.144MHz = 163ns が入ってる) + gConfig->Add("!spc-tCLF", 163); + // LUNA-I のクロック割り込みは 60Hz + gConfig->Add("!sysclk-period", 16.666667_msec); + // デバイス (順序に注意) - // Scheduler (と BusErrDevice) は親コンストラクタで作成済み。 + // BusErrDevice は親コンストラクタで作成済み。 + + gScheduler.reset(new Scheduler()); // required by * gMPU.reset(new MPU680x0Device(0x41000000)); gRAM.reset(new RAMDevice()); - if (gConfig->Get("prom-use-rom").AsInt() && gMainApp.host_file == NULL) { - gPROM.reset(new PROMDevice()); + gEthernet.reset(new BusIO_W()); // required by PROM + if (gMainApp.host_file || gConfig->Find("prom-image").AsString().empty()) { + prom.reset(new LunaPROMEmuDevice()); } else { - gPROM.reset(new LunaPROMEmuDevice()); + prom.reset(new PROMDevice()); } gRTC.reset(new BusIO_B()); gPIO0.reset(new BusIO_B()); gPIO1.reset(new BusIO_B()); gSIO.reset(new BusIO_BB()); sysclk.reset(new BusIO_B()); + gTAS.reset(new BusIO_B()); gZRAM.reset(new ZRAMDevice()); - gBitmap.reset(new BitmapDevice()); // required by BT454 + gBitmap.reset(new BitmapDevice()); // required by BT454 gBT454.reset(new BusIO_B()); crtc2.reset(new BusIO_B()); gSPC.reset(new BusIO_BBBB()); - gEthernet.reset(new BusIO_W()); nulldev.reset(new NullDevice()); gLCD.reset(new LCDDevice()); @@ -170,12 +192,12 @@ VM_LUNA::VM_LUNA() case NONE: d = nulldev.get(); break; case BUSERR: d = buserr.get(); break; case RAM: d = gRAM.get(); break; - case PROM: d = gPROM.get(); break; + case PROM: d = prom.get(); break; case MK48: d = gRTC.get(); break; case PIO0: d = gPIO0.get(); break; case PIO1: d = gPIO1.get(); break; case SIO: d = gSIO.get(); break; - case TAS: d = gZRAM.get(); break; + case TAS: d = gTAS.get(); break; case SYSCLK: d = sysclk.get(); break; case ZRAM: d = gZRAM.get(); break; case MROM: d = nulldev.get(); break; @@ -226,14 +248,13 @@ VM_LUNA88K::maptable[256] = { BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38 // LUNA88K2 は 47 に(も?) NVRAM がいるようだ - // 65 に割り込みコントローラ? // 69,6b,6d にも何かのコントローラ? PROM, PROM, PROM, FUSE, MK48, MK48, MK48, MK48, // 40 PIO0, PIO0, PIO0, PIO0, PIO1, PIO1, PIO1, PIO1, // 48 SIO, SIO, SIO, SIO, NONE, NONE, NONE, NONE, // 50 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 58 - TAS, TAS, SYSCLK, SYSCLK, NONE, NONE, NONE, NONE, // 60 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 68 + TAS, TAS, SYSCLK, SYSCLK, NONE, SYSCTL, NONE, NONE, // 60 + NONE, SYSCTL, NONE, NONE, NONE, SYSCTL, NONE, NONE, // 68 ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 70 ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 78 @@ -247,7 +268,6 @@ VM_LUNA88K::maptable[256] = { BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b8 // d0 にボードチェックレジスタ? - // ff に CMMU BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c0 BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, BUSERR, BT454, // c8 BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d0 @@ -255,33 +275,48 @@ VM_LUNA88K::maptable[256] = { SCSI, SCSI, SCSI, SCSI, NONE, NONE, NONE, NONE, // e0 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // e8 LANCE, LANCE, LANCE, LANCE, NONE, NONE, NONE, NONE, // f0 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // f8 + NONE, NONE, NONE, NONE, NONE, NONE, NONE, CMMU, // f8 }; // コンストラクタ VM_LUNA88K::VM_LUNA88K() { + // 機種固有パラメータ + // MPU クロックの初期値は機種ごとに異なる。単位は MHz + gConfig->SetDefault("mpu-clock", 25); + // RAM 初期値は MAX にしておく + gConfig->SetDefault("ram-size", 64); + // SPC の入力クロック (XXX LUNA-I と同じ?) + gConfig->Add("!spc-tCLF", 163); + // LUNA-II, LUNA88K, LUNA88K2 のクロック割り込みは 100Hz らしい + gConfig->Add("!sysclk-period", 10_msec); + // デバイス (順序に注意) - // Scheduler (と BusErrDevice) は親コンストラクタで作成済み。 + // BusErrDevice は親コンストラクタで作成済み。 + + gScheduler.reset(new Scheduler()); // required by * gMPU.reset(new MPU88xx0Device(0x41000000)); gRAM.reset(new RAMDevice()); - if (0) { - //gPROM.reset(new PROMDevice()); + if (gMainApp.host_file || gConfig->Find("prom-image").AsString().empty()) { + prom.reset(new Luna88kPROMEmuDevice()); } else { - gPROM.reset(new Luna88kPROMEmuDevice()); + prom.reset(new PROMDevice()); } gRTC.reset(new BusIO_BFFF()); - gPIO0.reset(new PIO0Device()); - gPIO1.reset(new PIO1Device()); + gPIO0.reset(new BusIO_BFFF()); + gPIO1.reset(new BusIO_BFFF()); gSIO.reset(new BusIO_BFFF()); sysclk.reset(new SysClkDevice()); + gTAS.reset(new BusIO_BFFF()); gZRAM.reset(new ZRAMDevice()); - gBitmap.reset(new BitmapDevice()); // required by BT454 + gBitmap.reset(new BitmapDevice()); // required by BT454 gBT454.reset(new BusIO_B()); crtc2.reset(new BusIO_BFFF()); gSPC.reset(new BusIO_BFFF()); - //gEthernet.reset(new BusIO_WF()); - fuserom.reset(new FuseROMDevice()); + gEthernet.reset(new BusIO_WF()); // required by FuseROM + fuserom.reset(new BusIO_BFFF()); + gSysCtlr.reset(new SysCtlrDevice()); + gCMMU.reset(new CMMUDevice()); nulldev.reset(new NullDevice()); gLCD.reset(new LCDDevice()); @@ -295,12 +330,12 @@ VM_LUNA88K::VM_LUNA88K() case NONE: d = nulldev.get(); break; case BUSERR: d = buserr.get(); break; case RAM: d = gRAM.get(); break; - case PROM: d = gPROM.get(); break; + case PROM: d = prom.get(); break; case MK48: d = gRTC.get(); break; case PIO0: d = gPIO0.get(); break; case PIO1: d = gPIO1.get(); break; case SIO: d = gSIO.get(); break; - case TAS: d = gZRAM.get(); break; + case TAS: d = gTAS.get(); break; case SYSCLK: d = sysclk.get(); break; case ZRAM: d = gZRAM.get(); break; case MROM: d = nulldev.get(); break; @@ -308,8 +343,10 @@ VM_LUNA88K::VM_LUNA88K() case BT454: d = gBT454.get(); break; case CRTC2: d = crtc2.get(); break; case SCSI: d = gSPC.get(); break; - case LANCE: d = buserr.get(); break; // XXX not yet + case LANCE: d = gEthernet.get(); break; case FUSE: d = fuserom.get(); break; + case SYSCTL: d = gSysCtlr.get(); break; + case CMMU: d = gCMMU.get(); break; default: __unreachable(); }