--- nono/vm/vm_luna.cpp 2026/04/29 17:05:14 1.1.1.11 +++ nono/vm/vm_luna.cpp 2026/04/29 17:05:25 1.1.1.13 @@ -9,76 +9,41 @@ // #include "vm_luna.h" -#include "bus.h" -#include "bt454.h" -#include "busio.h" -#include "cmmu.h" #include "config.h" -#include "crtc2.h" -#include "ethernet.h" -#include "fdc.h" -#include "fuserom.h" -#include "interrupt.h" -#include "lance.h" +#include "dipsw.h" #include "lcd.h" -#include "lunafb.h" #include "lunakbd.h" #include "mainapp.h" -#include "mk48t02.h" +#include "mainbus_luna.h" +#include "mpu64180.h" #include "mpu680x0.h" #include "mpu88xx0.h" +#include "msxdos.h" #include "nmi.h" -#include "pio.h" #include "power.h" -#include "prom.h" -#include "ram.h" -#include "ram_partial.h" #include "renderer.h" -#include "romemu_luna1.h" -#include "romemu_luna88k.h" -#include "scheduler.h" -#include "sio.h" -#include "spc.h" -#include "sysclk.h" -#include "sysctlr.h" -#include "tas.h" -#include "zram.h" +#include "xpbus.h" // // LUNA 共通部 // -// デバイスマップ用の識別子 -enum { - NONE, - BUSERR, - PROM, - MK48, - PIO0, - PIO1, - SIO, - TAS, - SYSCLK, - ZRAM, - MROM, - LUNAFB, - BT454, - CRTC2, - SCSI, - LANCE, - FUSE, - SYSCTL, - CMMU, -}; - // コンストラクタ -VM_LUNA::VM_LUNA() +VM_LUNA::VM_LUNA(const char *name_) + : inherited(name_) { // RTC epoch は NetBSD/luna68k, OpenBSD/luna88k をデフォルトにしておく。 gConfig->SetDefault("rtc-epoch-year", 1970); // LUNA 共通だしここで作成しておく - NEWDV(NopIO, new NopIODevice()); + 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()); } // デストラクタ @@ -86,175 +51,14 @@ VM_LUNA::~VM_LUNA() { } -// デバイスマップから devtable を作成 (ここは共通にできる) -void -VM_LUNA::MakeDevtable(const uint8 *maptable) -{ - for (uint i = 0; i < countof(::devtable); i++) { - IODevice *d; - switch (maptable[i]) { - case NONE: d = gNopIO; break; - case BUSERR: d = gBusErr; break; - case PROM: d = gPROM; break; - case MK48: d = gRTC; break; - case PIO0: d = gPIO0; break; - case PIO1: d = gPIO1; break; - case SIO: d = gSIO; break; - case TAS: d = gTAS; break; - case SYSCLK: d = gSysClk; break; - case ZRAM: d = gZRAM; break; - case MROM: d = gNopIO; break; - case LUNAFB: d = gPlaneVRAM; break; - case BT454: d = gBT454; break; - case CRTC2: d = gCRTC2; break; - case SCSI: d = gSPC; break; - case LANCE: d = gEthernet; break; - case FUSE: d = gFuseROM; break; - case SYSCTL: d = gInterrupt; break; - case CMMU: d = gCMMU; break; - default: - __unreachable(); - } - ::devtable[i] = d; - } -} - -// 初期化 -bool -VM_LUNA::Init() -{ - // 親クラス - if (inherited::Init() == false) { - return false; - } - - // RAM 容量が確定したので、ここで devtable に RAM を配置。 - int ram_size_MB = gRAM->GetSizeMB(); - int i = 0; - while (ram_size_MB >= 16) { - // 16MB あれば RAM が直接担当 - ::devtable[i++] = gRAM; - ram_size_MB -= 16; - } - // 16MB 未満なら PartialRAM が担当 - if (ram_size_MB > 0) { - ::devtable[i] = gPartialRAM; - } - - // ブートページ切り替え用に覚えておく - ram0 = ::devtable[0]; - - return true; -} - -// ブートページを切り替える。 -void -VM_LUNA::SwitchBootPage(Device *parent, bool isrom) -{ - // 共通処理 - inherited::SwitchBootPage(parent, isrom); - - // ROM は 128KB しかないので 16MB まるごと切り替わったりはしないとは - // 思うけど、具体的にどの範囲が切り替わるのかを知る方法がないのと - // 大して副作用もないので、先頭の 1ブロックをまるごと切り替えておく。 - if (isrom) { - ::devtable[0x00] = gPROM0; - ::devtable[0x41] = gPROM0; - } else { - ::devtable[0x00] = ram0; - ::devtable[0x41] = gPROM; - } -} - // // LUNA-I // -// LUNA-I のデバイス割り当て表 (上位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,... ビットマップ (内訳は lunafb.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 が読めるようだ - -/*static*/ const uint8 -VM_LUNA1::maptable[256] = { - // (00,)01,02,03 は実際にはたぶんパリティチェックが入っていて(?) - // 非実装領域にアクセスすると二重バスフォールトになるがそれは未対応。 - // RAM は Init() で動的に配置する。 - NONE, 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, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b0 - BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // 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_LUNA1::VM_LUNA1() + : inherited("LUNA-I") { // 機種固有パラメータ // MPU クロックの初期値は機種ごとに異なる。単位は MHz @@ -264,41 +68,11 @@ VM_LUNA1::VM_LUNA1() // SPC の入力クロック (おそらく 6.144MHz = 163ns が入ってる) gConfig->Add("!spc-tCLF", 163); // LUNA-I のクロック割り込みは 60Hz - gConfig->Add("!sysclk-period", 16.666667_msec); - - // デバイス (順序に注意) - // BusErrDevice, NopIODevice は親コンストラクタで作成済み。 + gConfig->Add("!sysclk-freq", 60); + // デバイス NEWDV(MPU, new MPU680x0Device()); - NEWDV(Interrupt, new LunaInterrupt()); - NEWDV(RAM, new RAMDevice()); // required by PartialRAM - NEWDV(PartialRAM, new PartialRAMDevice()); - NEWDV(Ethernet, new BusIO_W()); // required by PROM - if (gMainApp.exec_file || gConfig->Find("prom-image").AsString().empty()) { - NEWDV(PROM, new Luna1PROMEmuDevice()); - } else { - NEWDV(PROM, new PROMDevice()); - } - NEWDV(PROM0, new PROM0Device()); - NEWDV(RTC, new BusIO_B()); // required by Sysclk - NEWDV(PIO0, new BusIO_B()); - NEWDV(PIO1, new BusIO_B()); - NEWDV(SIO, new BusIO_BB()); - NEWDV(SysClk, new BusIO_B()); - NEWDV(TAS, new BusIO_B()); - NEWDV(ZRAM, new ZRAMDevice()); - NEWDV(PlaneVRAM, new LunafbDevice()); // required by BT454 - NEWDV(BT454, new BusIO_B()); - NEWDV(CRTC2, new BusIO_B()); - NEWDV(SPC, new BusIO_BBBB()); - - NEWDV(NMI, new NMIDevice()); - NEWDV(LCD, new LCDDevice()); - NEWDV(Keyboard, new LunaKeyboard()); - NEWDV(Renderer, new LunaRenderer()); - - // デバイスマップから devtable を作成 - MakeDevtable(maptable); + NEWDV(Mainbus, new Luna1Mainbus()); } // デストラクタ @@ -308,54 +82,12 @@ VM_LUNA1::~VM_LUNA1() // -// LUNA88K +// LUNA-88K // -/*static*/ const uint8 -VM_LUNA88K::maptable[256] = { - // RAM は Init() で動的に配置する。 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, // 00 - NONE, NONE, NONE, NONE, NONE, NONE, NONE, BUSERR, // 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 がいるようだ - // 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, 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 - - 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, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b0 - BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, BUSERR, LUNAFB, // b8 - - // d0 にボードチェックレジスタ? - 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, CMMU, // f8 -}; - // コンストラクタ VM_LUNA88K::VM_LUNA88K() + : inherited("LUNA-88K") { // 機種固有パラメータ // MPU クロックの初期値は機種ごとに異なる。単位は MHz @@ -364,44 +96,12 @@ VM_LUNA88K::VM_LUNA88K() 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); + // LUNA-II, LUNA-88K, LUNA-88K2 のクロック割り込みは 100Hz らしい + gConfig->Add("!sysclk-freq", 100); // デバイス (順序に注意) - // BusErrDevice, NopIODevice は親コンストラクタで作成済み。 - NEWDV(MPU, new MPU88xx0Device()); - NEWDV(Interrupt, new SysCtlrDevice()); - NEWDV(RAM, new RAMDevice()); // required by PartialRAM - NEWDV(PartialRAM, new PartialRAMDevice()); - NEWDV(Ethernet, new BusIO_WF()); // required by FuseROM - NEWDV(FuseROM, new BusIO_BFFF()); - if (gMainApp.exec_file || gConfig->Find("prom-image").AsString().empty()) { - NEWDV(PROM, new Luna88kPROMEmuDevice()); - } else { - NEWDV(PROM, new PROMDevice()); - } - NEWDV(PROM0, new PROM0Device()); - NEWDV(RTC, new BusIO_BFFF()); - NEWDV(PIO0, new BusIO_BFFF()); - NEWDV(PIO1, new BusIO_BFFF()); - NEWDV(SIO, new BusIO_BFFF()); - NEWDV(SysClk, new BusIO_BFFF()); - NEWDV(TAS, new BusIO_BFFF()); - NEWDV(ZRAM, new ZRAMDevice()); - NEWDV(PlaneVRAM, new LunafbDevice()); // required by BT454 - NEWDV(BT454, new BusIO_B()); - NEWDV(CRTC2, new BusIO_BFFF()); - NEWDV(SPC, new BusIO_BFFF()); - NEWDV(CMMU, new CMMUDevice()); - - NEWDV(NMI, new NMIDevice()); - NEWDV(LCD, new LCDDevice()); - NEWDV(Keyboard, new LunaKeyboard()); - NEWDV(Renderer, new LunaRenderer()); - - // デバイスマップから devtable を作成 - MakeDevtable(maptable); + NEWDV(Mainbus, new Luna88kMainbus()); } // デストラクタ