--- nono/vm/vm_news.cpp 2026/04/29 17:05:17 1.1 +++ nono/vm/vm_news.cpp 2026/04/29 17:05:33 1.1.1.4 @@ -9,26 +9,24 @@ // #include "vm_news.h" -#include "busio.h" #include "config.h" +#include "console.h" #include "dipsw.h" -#include "interrupt.h" -#include "mainapp.h" -#include "mainbus.h" -#include "mainram.h" +#include "mainbus_news.h" #include "mpu680x0.h" -#include "newsctlr.h" #include "newsfb.h" -#include "newsio.h" -#include "prom.h" +#include "power.h" #include "renderer.h" -#include "romemu_news.h" -#include "scheduler.h" // コンストラクタ VM_NEWS::VM_NEWS() + : inherited("NWS-1750") { // 機種固有パラメータ + // 仮想コンソール。 + gConfig->SetDefault("hostcom-driver", "cons"); + // MPU 種別。 + gConfig->SetDefault("mpu-type", "68030"); // MPU クロックの初期値は機種ごとに異なる。単位は MHz gConfig->SetDefault("mpu-clock", 25); // RAM 初期値は? @@ -36,64 +34,24 @@ VM_NEWS::VM_NEWS() // RTC epoch は 1900年。 gConfig->SetDefault("rtc-epoch-year", 1900); - NEWDV(MPU, new MPU680x0Device()); - NEWDV(Interrupt, new NewsInterrupt()); - NEWDV(PROM, new NewsROMEmuDevice()); - NEWDV(MainRAM, new MainRAMDevice()); - NEWDV(NewsCtlr, new NewsCtlrDevice()); - NEWDV(NewsIO, new NewsIODevice()); - - NEWDV(Renderer, new NewsRenderer()); + NEWDV(Power, new PowerDevice()); + NEWDV(MPU, NewMPU680x0Device()); + NEWDV(Mainbus, new NewsMainbus()); + NEWDV(Console, new ConsoleDevice()); + NEWDV(Keyboard, new ConsoleKeyboard()); + NEWDV(Renderer, new ConsoleRenderer()); NEWDV(Newsfb, new NewsfbDevice()); NEWDV(Dipsw, new NewsDipswDevice()); - // 全域をバスエラーで埋める。 - // XXX バスエラーが起きるかどうかは知らないが - auto mainbus = dynamic_cast(pMainbus.get()); - for (int i = 0; i < mainbus->devtable.size() / 4; i++) { - auto buserr = dynamic_cast(pBusErr.get()); - mainbus->SetDevice(i, buserr); + // バーストアクセスがあるかどうかは分からないが + // Mainbus が LUNA-I と共通なので一応揃えておく。 + auto mpu680x0 = GetMPU680x0Device(pMPU.get()); + if (mpu680x0) { + mpu680x0->EnableBurstAccess(true); } - - // 少ないので手動で置いていく。 - auto newsio = dynamic_cast(pNewsIO.get()); - auto newsctlr = dynamic_cast(pNewsCtlr.get()); - auto prom = dynamic_cast(pPROM.get()); -#define A(addr) (((addr) >> 24) & 0x3f) - mainbus->SetDevice(A(0xe0'000000), newsio); - mainbus->SetDevice(A(0xe1'000000), newsctlr); - mainbus->SetDevice(A(0xf8'000000), prom); } // デストラクタ VM_NEWS::~VM_NEWS() { } - -// 初期化 -bool -VM_NEWS::Init() -{ - if (inherited::Init() == false) { - return false; - } - - auto mainbus = dynamic_cast(pMainbus.get()); - auto mainram = dynamic_cast(pMainRAM.get()); - - // RAM 容量が確定したので、ここで devtable に RAM を配置。 - int ram_size_MB = mainram->GetSizeMB(); - int i = 0; - while (ram_size_MB >= 16) { - // 16MB 単位にとりあえずしとく - mainbus->SetDevice(i++, mainram); - ram_size_MB -= 16; - } - - // $40'000000〜、$80'000000〜、$c0'000000〜はミラーっぽい。 - mainbus->CopyDevtable(0x40, 0, 0x40); - mainbus->CopyDevtable(0x80, 0, 0x40); - mainbus->CopyDevtable(0xc0, 0, 0x40); - - return true; -}