--- nono/vm/vm_x68k.cpp 2026/04/29 17:04:59 1.1.1.7 +++ nono/vm/vm_x68k.cpp 2026/04/29 17:05:14 1.1.1.9 @@ -4,6 +4,10 @@ // Licensed under nono-license.txt // +// +// VM (X68030) +// + #include "vm_x68k.h" #include "bus.h" #include "config.h" @@ -14,9 +18,11 @@ #include "mainapp.h" #include "mfp.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" @@ -25,10 +31,6 @@ #include "x68kkbd.h" #include "xiospace.h" -// -// X68030 VM -// - // コンストラクタ VM_X68030::VM_X68030() { @@ -40,33 +42,26 @@ VM_X68030::VM_X68030() // SPC の入力クロック (5MHz = 200ns) gConfig->Add("!spc-tCLF", 200); - // この機種に不要なパラメータはここで削除する - // (機種が決まるより前に全機種の設定の和集合を用意してあるため) - gConfig->Delete("luna-dipsw1"); - gConfig->Delete("luna-dipsw2"); - gConfig->Delete("prom-image"); - // デバイス (順序に注意) // BusErrDevice は親コンストラクタで作成済み。 - - gMPU.reset(new MPU680x0Device()); // required by Scheduler - gScheduler.reset(new Scheduler()); // required by * - gInterrupt.reset(new X68030Interrupt()); - gRAM.reset(new RAMDevice()); // required by XIOSpace - gXIOSpace.reset(new XIOSpaceDevice()); - gIPLROM0.reset(new IPLROM0Device()); - - gKeyboard.reset(new X68030Keyboard()); - gRenderer.reset(new X68030Renderer()); + 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(Keyboard, new X68030Keyboard()); + NEWDV(Renderer, new X68030Renderer()); if (gMainApp.human_mode) { - human68k.reset(new Human68k()); + NEWDV(Human68k, new Human68k()); } // 割り当て // 今は拡張メモリがないので、今は上位8ビット全領域がミラーになっている。 for (int i = 0; i < countof(::devtable); i++) { - ::devtable[i] = gXIOSpace.get(); + ::devtable[i] = gXIOSpace; } } @@ -75,23 +70,6 @@ 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; - - // スケジューラに指示 - gScheduler->RequestPowerOn(); -} - // ブートページを切り替える。 void VM_X68030::SwitchBootPage(Device *parent, bool isrom) @@ -118,19 +96,28 @@ VM_X68030::SwitchBootPage(Device *parent // | // | +------+ // +-->| | -// 本体 SWRESET | YUKI | IPLRESET -// リセット ------------->| |-----------> FPU +// 本体 SWRESET | YUKI | +// リセット ------------->| | // スイッチ +------+ +// | IPLRESET +// | +// +--> FPU // | // ▽ // RESET | // |<-> MPU (68030) -// +--> PPI -// +--> PEDEC -// +--> SPC -// +--> ADPCM -// +--> FDC -// +--> MFP +// +--> PPI (8255) +// +--> SPC (MB89352) +// +--> ADPCM (MSM6258) +// +--> FDC (uPD72065B) +// +--> MFP (MC68901) +// | +// | +-------+ +// +-->| PEDEC | +// | +-------+ +// | | +// | +-- OPMIC -----> OPM(YM2151) +// | +-- SCCRD/WR --> SCC(Z8530) // | // | EXRESET // +---|>-----------> 外部バス @@ -142,18 +129,16 @@ VM_X68030::SwitchBootPage(Device *parent // +--> CYNTHIA // リセットされない? // o CACHY -// o YM2151 (FM音源) -// o SCC // MPU の RESET 命令によるリセット void VM_X68030::ResetByMPU() { - gDMAC->ResetHard(); - gFDC->ResetHard(); - gMFP->ResetHard(); - gPEDEC->ResetHard(); - gPluto->ResetHard(); - gPPI->ResetHard(); - gSPC->ResetHard(); + gDMAC->ResetHard(false); + gFDC->ResetHard(false); + gMFP->ResetHard(false); + gPEDEC->ResetHard(false); + gPluto->ResetHard(false); + gPPI->ResetHard(false); + gSPC->ResetHard(false); }