--- nono/vm/vm_luna.cpp 2026/04/29 17:04:32 1.1.1.1 +++ nono/vm/vm_luna.cpp 2026/04/29 17:05:34 1.1.1.15 @@ -1,194 +1,48 @@ // // nono -// Copyright (C) 2020 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// VM (LUNA) // #include "vm_luna.h" -#include "aout.h" -#include "bitmap.h" -#include "bt454.h" -#include "busio.h" -#include "crtc2.h" -#include "ethernet.h" -#include "fuserom.h" -#include "lance.h" +#include "config.h" +#include "dipsw.h" #include "lcd.h" #include "lunakbd.h" -#include "mainapp.h" -#include "mk48t02.h" -#include "pio.h" -#include "ram.h" +#include "mainbus_luna.h" +#include "mpu64180.h" +#include "mpu680x0.h" +#include "mpu88xx0.h" +#include "nmi.h" +#include "power.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 "zram.h" - -// LUNA のデバイス割り当て表 (上位8ビット) -// -// 仕様 実際 -// 00 00 メインメモリ -// -- 01..03 二重バスフォールトするようだ -// -- 04..0f 何かよく分からないものが読める -// -- 10..3f BUSERR -// 41 40..43 PROM (B、N=128KBでミラー) -// 45 44..47 mk48t02 (B、N=2048でミラー) -// 49 48..4b pio0 (B、N=4でミラー) -// 4d 4c..4f pio1 (B、N=4でミラー) -// 51 50..53 sio (BB、N=4でミラー) -// -- 54..5f 0xff が読めるようだ -// 61 60..61 TAS (B、N=1でミラー) -// 63 62..63 システムクロック (B、N=1でミラー) -// -- 以降TASとSysClkで2枠ずつ。また無効ビットの読み出しは -// -- 必ずしも Hi とは限らず不安定のようだ。 -// 71 70..7f 3ポートRAM (B、N=128KBでミラー) -// 81 80.. BUSERR (オンボード拡張スロットA) -// 83 ..8f BUSERR (オンボード拡張スロットB) -// 91 90..9f 0xff が読めるようだ (PC-9000 拡張スロット) -// -// a1 マスクROM -// a0,a2,a4,... BUSERR -// a1,a3,a5,... マスクROM(なければ0xffが読める) -// b1 ビットマップ -// b0,b2,b4,... BUSERR -// b1,b3,b5,... ビットマップ (内訳は bitmap.cpp 参照) -// c1 パレット -// c0,c2,c4,... BUSERR -// c1,c3,c5,... パレット (B、N=4でミラー) -// d1 CRTC-II -// d0,d2,d4,... BUSERR -// d1,d3,d5,... CRTC-II (B、N=2でミラー) -// -// e1 e0..e3 SCSI (BBBB、N=16 でミラー) -// -- e4..ef 0xff が読めるようだが不安定。 -// f1 f0..f3 LANCE (WW、N=2 でミラー) -// -- f4..ff 0xff が読めるようだ - -// デバイスマップ用の識別子 -enum { - NONE, - BUSERR, - RAM, - PROM, - MK48, - PIO0, - PIO1, - SIO, - TAS, - SYSCLK, - ZRAM, - MROM, - BITMAP, - BT454, - CRTC2, - SCSI, - LANCE, - FUSE, -}; +#include "ssg.h" +#include "xpbus.h" // -// LUNA-I +// LUNA 共通部 // -/*static*/ const uint8 -VM_LUNA::maptable[256] = { - // 01,02,03 は実際には二重バスフォールトになるがそれは未対応 - RAM, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 00 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 08 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 38 - - PROM, PROM, PROM, PROM, 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, TAS, TAS, SYSCLK, SYSCLK, // 60 - TAS, TAS, SYSCLK, SYSCLK, TAS, TAS, SYSCLK, SYSCLK, // 68 - ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 70 - ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 78 - - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 90 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 98 - BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a0 - BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a8 - BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b0 - BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b8 - - 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 - BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d8 - 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 -}; - // コンストラクタ -VM_LUNA::VM_LUNA() +VM_LUNA::VM_LUNA(const char *name_) + : inherited(name_) { - // デバイス (順序に注意) - // Scheduler (と BusErrDevice) は親コンストラクタで作成済み。 - gMPU.reset(new MPU680x0Device(0x41000000)); - gRAM.reset(new RAMDevice()); - if (gConfig->Get("prom-use-rom").AsInt() && gMainApp.host_file == NULL) { - gPROM.reset(new PROMDevice()); - } else { - gPROM.reset(new LunaPROMEmuDevice()); - } - 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()); - gZRAM.reset(new ZRAMDevice()); - 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()); - gKeyboard.reset(new LunaKeyboard()); - gRenderer.reset(new LunaRenderer()); - - // デバイスマップから devtable を作成 - for (uint i = 0; i < countof(::devtable); i++) { - IODevice *d; - switch (maptable[i]) { - 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 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 SYSCLK: d = sysclk.get(); break; - case ZRAM: d = gZRAM.get(); break; - case MROM: d = nulldev.get(); break; - case BITMAP: d = gBitmap.get(); break; - case BT454: d = gBT454.get(); break; - case CRTC2: d = crtc2.get(); break; - case SCSI: d = gSPC.get(); break; - case LANCE: d = gEthernet.get(); break; - default: - __unreachable(); - } - ::devtable[i] = d; - } + // RTC epoch は NetBSD/luna68k, OpenBSD/luna88k をデフォルトにしておく。 + gConfig->SetDefault("rtc-epoch-year", 1970); + + // LUNA 共通だしここで作成しておく + NEWDV(Power, new LunaPowerDevice()); + NEWDV(Dipsw, new LunaDipswDevice()); + NEWDV(Keyboard, new LunaKeyboard()); + NEWDV(LCD, new LCDDevice()); + NEWDV(MPU64180, new MPU64180Device()); + NEWDV(NMI, new NMIDevice()); + NEWDV(Renderer, new LunaRenderer()); + NEWDV(XPbus, new XPbusDevice()); } // デストラクタ @@ -196,135 +50,71 @@ VM_LUNA::~VM_LUNA() { } -void -VM_LUNA::PowerButton() + +// +// LUNA-I +// + +// コンストラクタ +VM_LUNA1::VM_LUNA1() + : inherited("LUNA-I") { - // LUNA の電源ボタンは電源オンにしか使わない。 - // - // 電源 ボタン - // ON PUSH (何も起きない) - // OFF PUSH 電源オン + // 機種固有パラメータ + // MPU 種別。 + gConfig->SetDefault("mpu-type", "68030"); + // 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-freq", 60); + + // デバイス + NEWDV(MPU, NewMPU680x0Device()); + NEWDV(Mainbus, new Luna1Mainbus()); + NEWDV(SSG, new SSGDevice()); + + // バーストアクセスたぶんあり + auto mpu680x0 = GetMPU680x0Device(pMPU.get()); + if (mpu680x0) { + mpu680x0->EnableBurstAccess(true); + } +} - // デバイスに指示 - DevicePowerOn(); +// デストラクタ +VM_LUNA1::~VM_LUNA1() +{ } // -// LUNA88K +// LUNA-88K // -/*static*/ const uint8 -VM_LUNA88K::maptable[256] = { - RAM, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 00 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 08 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 10 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 18 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 20 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 28 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 30 - 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 - ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 70 - ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, ZRAM, // 78 - - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 80 - BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, BUSERR, // 88 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 90 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 98 - BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a0 - BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, BUSERR, MROM, // a8 - BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, BUSERR, BITMAP, // b0 - 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 - BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, BUSERR, CRTC2, // d8 - 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 -}; - // コンストラクタ VM_LUNA88K::VM_LUNA88K() + : inherited("LUNA-88K") { + // 機種固有パラメータ + // 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, LUNA-88K, LUNA-88K2 のクロック割り込みは 100Hz らしい + gConfig->Add("!sysclk-freq", 100); + // デバイス (順序に注意) - // Scheduler (と BusErrDevice) は親コンストラクタで作成済み。 - gMPU.reset(new MPU88xx0Device(0x41000000)); - gRAM.reset(new RAMDevice()); - if (0) { - //gPROM.reset(new PROMDevice()); - } else { - gPROM.reset(new Luna88kPROMEmuDevice()); - } - gRTC.reset(new BusIO_BFFF()); - gPIO0.reset(new PIO0Device()); - gPIO1.reset(new PIO1Device()); - gSIO.reset(new BusIO_BFFF()); - sysclk.reset(new SysClkDevice()); - gZRAM.reset(new ZRAMDevice()); - 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()); - nulldev.reset(new NullDevice()); - - gLCD.reset(new LCDDevice()); - gKeyboard.reset(new LunaKeyboard()); - gRenderer.reset(new LunaRenderer()); - - // デバイスマップから devtable を作成 - for (uint i = 0; i < countof(::devtable); i++) { - IODevice *d; - switch (maptable[i]) { - 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 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 SYSCLK: d = sysclk.get(); break; - case ZRAM: d = gZRAM.get(); break; - case MROM: d = nulldev.get(); break; - case BITMAP: d = gBitmap.get(); break; - 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 FUSE: d = fuserom.get(); break; - default: - __unreachable(); - } - ::devtable[i] = d; - } + NEWDV(MPU, new MPU88xx0Device()); + NEWDV(Mainbus, new Luna88kMainbus()); + + // バーストアクセスあり (m88k では常に有効) } // デストラクタ VM_LUNA88K::~VM_LUNA88K() { } - -void -VM_LUNA88K::PowerButton() -{ - // デバイスに指示 - DevicePowerOn(); -}