--- nono/vm/romimg_x68k.cpp 2026/04/29 17:05:18 1.1.1.10 +++ nono/vm/romimg_x68k.cpp 2026/04/29 17:05:43 1.1.1.14 @@ -9,39 +9,40 @@ // // IODevice -// | -// +-- ROMDevice (LoadROM()、ウェイト、マスク等を持つ) -// | | -// | +-- PROMDevice (LUNA* の PROM) -// | | -// | | +---------------+ -// | +--| IPLROM1Device | (X680x0 の IPLROM 後半) -// | | +---------------+ -// | | -// | | +---------------+ -// | +--| IPLROM2Device | (X680x0 の IPLROM 前半) -// | | +---------------+ -// | | -// | | +-------------+ -// | +--| CGROMDevice | (X680x0 の CGROM) -// | | +-------------+ -// | | -// | +-- LunaPROMEmuDevice (LUNA PROM エミュレーションの共通部分) -// | | -// | +-- Luna1PROMEmuDevice (LUNA-I の PROM エミュレーション) -// | +-- Luna88kPROMEmuDevice (LUNA-88K の PROM エミュレーション) -// | -// +-- PROM0Device (LUNA* のブートページ切り替え用プロキシ) -// | -// | +---------------+ -// +--| IPLROM0Device | (X680x0 のブートページ切り替え用プロキシ) -// +---------------+ +// | +// +- ROMDevice (LoadROM()、ウェイト、マスク等を持つ) +// | +- PROMDevice (LUNA* の PROM) +// | | +// | | +---------------+ +// | +-| IPLROM1Device | (X680x0 の IPLROM 後半) +// | | +---------------+ +// | | +// | | +---------------+ +// | +-| IPLROM2Device | (X680x0 の IPLROM 前半) +// | | +---------------+ +// | | +// | | +-------------+ +// | +-| CGROMDevice | (X680x0 の CGROM) +// | | +-------------+ +// | | +// | +- ROMEmuDevice +// | +- LunaPROMEmuDevice (LUNA PROM エミュレーションの共通部分) +// | | +- Luna1PROMEmuDevice (LUNA-I の PROM エミュレーション) +// | | +- Luna88kPROMEmuDevice (LUNA-88K の PROM エミュレーション) +// | +- NewsROMEmuDevice (NEWS の ROM エミュレーション) +// | +- ROM30EmuDevice (X68030 の ROM30 エミュレーション) +// | +- Virt68kROMEmuDevice (virt-m68k の IPLROM 相当の何か) +// | +// +- PROM0Device (LUNA* のブートページ切り替え用プロキシ) +// | +// | +---------------+ +// +-| IPLROM0Device | (X680x0 のブートページ切り替え用プロキシ) +// +---------------+ #include "romimg_x68k.h" #include "builtinrom.h" #include "config.h" -#include "mainapp.h" -#include "vm.h" +#include "mainbus.h" // // IPLROM0 @@ -71,10 +72,6 @@ IPLROM0Device::~IPLROM0Device() bool IPLROM0Device::Init() { - if (inherited::Init() == false) { - return false; - } - iplrom1 = GetIPLROM1Device(); return true; @@ -84,7 +81,8 @@ IPLROM0Device::Init() void IPLROM0Device::ResetHard(bool poweron) { - gVM->SwitchBootPageToROM(this); + auto mainbus = GetMainbusDevice(); + mainbus->SwitchBootPageToROM(); } // Read の共通処理。 @@ -94,41 +92,28 @@ IPLROM0Device::ReadDecoder(uint32 addr) { // ROM アドレスがアクセスされたら切り替える if (addr >= 0xff0000) { - gVM->SwitchBootPageToRAM(this); + auto mainbus = GetMainbusDevice(); + mainbus->SwitchBootPageToRAM(); } // どちらにしてもアクセスは ROM のアドレス return addr | 0xff0000; } -uint64 -IPLROM0Device::Read8(uint32 addr) -{ - addr = ReadDecoder(addr); - return iplrom1->Read8(addr); -} - -uint64 -IPLROM0Device::Read16(uint32 addr) +busdata +IPLROM0Device::Read(busaddr addr) { - addr = ReadDecoder(addr); - return iplrom1->Read16(addr); -} - -uint64 -IPLROM0Device::Read32(uint32 addr) -{ - addr = ReadDecoder(addr); - return iplrom1->Read32(addr); + addr.ChangeAddr(ReadDecoder(addr.Addr())); + return iplrom1->Read(addr); } // Write は RAM 領域へも ROM 領域へも発生しないはずなので基底のを使う。 -uint64 -IPLROM0Device::Peek8(uint32 addr) +busdata +IPLROM0Device::Peek1(uint32 addr) { addr |= 0xff0000; - return iplrom1->Peek8(addr); + return iplrom1->Peek1(addr); } @@ -141,7 +126,7 @@ IPLROM1Device::IPLROM1Device() : inherited(OBJ_IPLROM1) { // X680x0 では ROM への書き込みはバスエラー - write_op = -1; + write_op = BusData::BusErr; } // デストラクタ @@ -153,20 +138,10 @@ IPLROM1Device::~IPLROM1Device() bool IPLROM1Device::Init() { - if (inherited::Init() == false) { - return false; - } - std::string name; uint devlen = 0x020000; mask = devlen - 1; - // ベンチマークモードは先に処理。この辺どうするか。 - if (gMainApp.benchmark_mode != 0) { - name = string_format("BENCH%02d.ROM", gMainApp.benchmark_mode); - return LoadROM(name.c_str(), devlen); - } - const ConfigItem& item = gConfig->Find("iplrom1-image"); name = item.AsString(); if (name.empty()) { @@ -189,7 +164,7 @@ IPLROM2Device::IPLROM2Device() : inherited(OBJ_IPLROM2) { // X680x0 では ROM への書き込みはバスエラー - write_op = -1; + write_op = BusData::BusErr; } // デストラクタ @@ -201,17 +176,9 @@ IPLROM2Device::~IPLROM2Device() bool IPLROM2Device::Init() { - if (inherited::Init() == false) { - return false; - } - uint devlen = 0x020000; mask = devlen - 1; - if (gMainApp.benchmark_mode != 0) { - return true; - } - const ConfigItem& item = gConfig->Find("iplrom2-image"); std::string name = item.AsString(); if (name.empty()) { @@ -233,7 +200,7 @@ CGROMDevice::CGROMDevice() : inherited(OBJ_CGROM) { // X680x0 では ROM への書き込みはバスエラー - write_op = -1; + write_op = BusData::BusErr; } // デストラクタ @@ -245,10 +212,6 @@ CGROMDevice::~CGROMDevice() bool CGROMDevice::Init() { - if (inherited::Init() == false) { - return false; - } - uint devlen = 768 * 1024; mask = 1024 * 1024 - 1;