--- nono/vm/vm_x68k.cpp 2026/04/29 17:04:32 1.1 +++ nono/vm/vm_x68k.cpp 2026/04/29 17:05:42 1.1.1.15 @@ -1,91 +1,62 @@ // // nono -// Copyright (C) 2020 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// VM (X68030) // #include "vm_x68k.h" +#include "config.h" #include "human68k.h" +#include "mainapp.h" +#include "mainbus_x68k.h" +#include "mpu680x0.h" +#include "nmi.h" +#include "power.h" #include "renderer.h" -#include "rp5c15.h" -#include "scheduler.h" #include "x68kkbd.h" -#include "xiospace.h" - -// -// X68030 VM -// // コンストラクタ VM_X68030::VM_X68030() + : inherited("X68030") { - // デバイス (順序に注意) - // Scheduler (と BusErrDevice) は親コンストラクタで作成済み。 - gMPU.reset(new MPU680x0Device(0xff0000)); - gRAM.reset(new RAMDevice()); // required by XIOSpace - xiospace.reset(new XIOSpaceDevice()); - - gKeyboard.reset(new X68030Keyboard()); - gRenderer.reset(new X68030Renderer()); - - // 割り当て - // 今は拡張メモリがないので、今は上位8ビット全領域がミラーになっている。 - for (int i = 0; i < countof(::devtable); i++) { - ::devtable[i] = xiospace.get(); - } -} - -// デストラクタ -VM_X68030::~VM_X68030() -{ -} - -// X68030 の電源ボタンを押します。 -void -VM_X68030::PowerButton() -{ - // 電源 ボタン - // ON OFF->ON 電源オフ割り込みをネゲート? - // ON ON ->OFF 電源オフ割り込みをアサート? - // OFF OFF->ON 電源オン - // OFF ON ->OFF (通常はあり得ないはず) + // 機種固有パラメータ - // ボタンの状態を更新して.. - power_button = !power_button; + // 実時間同期がちゃんと動作するにはゲスト OS の設定を要するため、 + // デフォルトは仮想時間同期にしておくほうがトラブルが少なそう。 + gConfig->SetDefault("clock-sync", "virtual"); + // MPU 種別。 + gConfig->SetDefault("mpu-type", "68030"); + // MPU クロックの初期値は機種ごとに異なる。単位は MHz + gConfig->SetDefault("mpu-clock", 25); + // RAM 初期値は MAX にしておく + gConfig->SetDefault("ram-size", 12); + // SPC の入力クロック (5MHz = 200ns) + gConfig->Add("!spc-tCLF", 200); + + // デバイス + NEWDV(Power, new X68030PowerDevice()); + NEWDV(MPU, NewMPU680x0Device()); + NEWDV(Mainbus, new X68kMainbus()); + NEWDV(Keyboard, new X68030Keyboard()); + NEWDV(NMI, new NMIDevice()); + NEWDV(Renderer, new X68030Renderer()); - // デバイスに指示 - DevicePowerOn(); -} - - -// -// RXZ .r .x .z human68k console emulator -// + if (gMainApp.human_mode) { + NEWDV(Human68k, new Human68kDevice()); + } -// コンストラクタ -VM_RXZ::VM_RXZ() -{ - // デバイス (順序に注意) - // Scheduler (と BusErrDevice) は親コンストラクタで作成済み。 - gMPU.reset(new MPU680x0Device(0)); - gRAM.reset(new RAMDevice()); // required by Human68k - gRTC.reset(new RP5C15Device()); - human68k.reset(new Human68k()); + // バーストアクセスなし (回路図より) + auto mpu680x0 = GetMPU680x0Device(pMPU.get()); + if (mpu680x0) { + mpu680x0->EnableBurstAccess(false); + } } // デストラクタ -VM_RXZ::~VM_RXZ() -{ -} - -void -VM_RXZ::PowerButton() +VM_X68030::~VM_X68030() { - // RXZ の電源ボタンは電源オンにしか使わない。 - // - // 電源 ボタン - // ON PUSH (何も起きない) - // OFF PUSH 電源オン - - // デバイスに指示 - DevicePowerOn(); }