--- nono/vm/vm_x68k.cpp 2026/04/29 17:05:10 1.1.1.8 +++ nono/vm/vm_x68k.cpp 2026/04/29 17:06:00 1.1.1.17 @@ -9,67 +9,50 @@ // #include "vm_x68k.h" -#include "bus.h" #include "config.h" -#include "dmac.h" -#include "fdc.h" #include "human68k.h" -#include "interrupt.h" #include "mainapp.h" -#include "mfp.h" +#include "mainbus_x68k.h" #include "mpu680x0.h" #include "nmi.h" -#include "pedec.h" -#include "pluto.h" -#include "pio.h" #include "power.h" #include "renderer.h" -#include "rp5c15.h" -#include "romimg_x68k.h" -#include "scheduler.h" -#include "spc.h" +#include "sound.h" #include "x68kkbd.h" -#include "xiospace.h" // コンストラクタ VM_X68030::VM_X68030() + : inherited("X68030") { // 機種固有パラメータ + + // 実時間同期がちゃんと動作するにはゲスト 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); - - // この機種に不要なパラメータはここで削除する - // (機種が決まるより前に全機種の設定の和集合を用意してあるため) - gConfig->Delete("luna-dipsw1"); - gConfig->Delete("luna-dipsw2"); - gConfig->Delete("prom-image"); - gConfig->Delete("rtc-epoch-year"); - - // デバイス (順序に注意) - // BusErrDevice は親コンストラクタで作成済み。 - - NEWDV(MPU, new MPU680x0Device()); - NEWDV(Interrupt, new X68030Interrupt()); - NEWDV(RAM, new RAMDevice()); // required by XIOSpace - NEWDV(XIOSpace, new XIOSpaceDevice()); - NEWDV(IPLROM0, new IPLROM0Device()); - NEWDV(NMI, new NMIDevice()); + // デバイス + NEWDV(Power, new X68030PowerDevice()); + NEWDV(MPU, NewMPU680x0Device()); + NEWDV(Sound, new SoundRenderer()); + NEWDV(Mainbus, new X68kMainbus()); NEWDV(Keyboard, new X68030Keyboard()); - NEWDV(Renderer, new X68030Renderer()); + NEWDV(NMI, new NMIDevice()); + NEWDV(Renderer, new X68030VideoRenderer()); if (gMainApp.human_mode) { - NEWDV(Human68k, new Human68k()); + NEWDV(Human68k, new Human68kDevice()); } - // 割り当て - // 今は拡張メモリがないので、今は上位8ビット全領域がミラーになっている。 - for (int i = 0; i < countof(::devtable); i++) { - ::devtable[i] = gXIOSpace; + // バーストアクセスなし (回路図より) + auto mpu680x0 = GetMPU680x0Device(pMPU.get()); + if (mpu680x0) { + mpu680x0->EnableBurstAccess(false); } } @@ -77,86 +60,3 @@ VM_X68030::VM_X68030() 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; - - // スケジューラに指示 - gPower->MakePowerOn(); -} - -// ブートページを切り替える。 -void -VM_X68030::SwitchBootPage(Device *parent, bool isrom) -{ - if (gMainApp.human_mode) { - // Human モードではブートページを RAM に見せる。 - // 今のところ。 - return; - } - - // 共通処理 - inherited::SwitchBootPage(parent, isrom); - - // X68030 では XIOSpace が担当している - gXIOSpace->SwitchBootPage(isrom); -} - -// リセットについて -// -// PWRRESET -// 電源オン ----------+--> VIPS -// (7505) +--> VideoCtlr -// +--> OSCIAN2 -// | -// | +------+ -// +-->| | -// 本体 SWRESET | YUKI | IPLRESET -// リセット ------------->| |-----------> FPU -// スイッチ +------+ -// | -// ▽ -// RESET | -// |<-> MPU (68030) -// +--> PPI -// +--> PEDEC -// +--> SPC -// +--> ADPCM -// +--> FDC -// +--> MFP -// | -// | EXRESET -// +---|>-----------> 外部バス -// ▽ -// SYSRESET | -// |<-> SAKI ---+ -// | | BEC0,BEC1 -// +--> DMAC <--+ -// +--> CYNTHIA -// リセットされない? -// o CACHY -// o YM2151 (FM音源) -// o SCC - -// MPU の RESET 命令によるリセット -void -VM_X68030::ResetByMPU() -{ - gDMAC->ResetHard(false); - gFDC->ResetHard(false); - gMFP->ResetHard(false); - gPEDEC->ResetHard(false); - gPluto->ResetHard(false); - gPPI->ResetHard(false); - gSPC->ResetHard(false); -}