--- nono/vm/prom.cpp 2026/04/29 17:05:20 1.1.1.13 +++ nono/vm/prom.cpp 2026/04/29 17:05:42 1.1.1.17 @@ -9,32 +9,34 @@ // // 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 "prom.h" #include "config.h" #include "ethernet.h" #include "mainapp.h" -#include "vm.h" +#include "mainbus.h" +#include "mpu.h" // // PROM0 @@ -64,10 +66,6 @@ PROM0Device::~PROM0Device() bool PROM0Device::Init() { - if (inherited::Init() == false) { - return false; - } - prom = GetPROMDevice(); return true; @@ -77,7 +75,8 @@ PROM0Device::Init() void PROM0Device::ResetHard(bool poweron) { - gVM->SwitchBootPageToROM(this); + auto mainbus = GetMainbusDevice(); + mainbus->SwitchBootPageToROM(); } // アドレスデコーダ @@ -91,25 +90,11 @@ PROM0Device::Decoder(uint32 addr) return addr; } -uint64 -PROM0Device::Read8(uint32 addr) +busdata +PROM0Device::Read(busaddr addr) { - addr = Decoder(addr); - return prom->Read8(addr); -} - -uint64 -PROM0Device::Read16(uint32 addr) -{ - addr = Decoder(addr); - return prom->Read16(addr); -} - -uint64 -PROM0Device::Read32(uint32 addr) -{ - addr = Decoder(addr); - return prom->Read32(addr); + addr.ChangeAddr(Decoder(addr.Addr())); + return prom->Read(addr); } // LUNA では PROM へのライトアクセスでブートページを RAM に切り替えている。 @@ -120,38 +105,23 @@ PROM0Device::Read32(uint32 addr) // よってアドレスを定めず PROM 全域への書き込みで最初の1回だけ発動する // ようにしておく。サイズも今の所ワード(16bit)アクセスは確認してないけど // 統一的に対処しておく。 -uint64 -PROM0Device::Write() +busdata +PROM0Device::Write(busaddr addr, uint32 data) { - gVM->SwitchBootPageToRAM(this); + auto mainbus = GetMainbusDevice(); + mainbus->SwitchBootPageToRAM(); // バスエラーは起きない - return 0; + busdata r = 0; + r |= busdata::Size(addr.GetSize()); + return r; } -uint64 -PROM0Device::Write8(uint32 addr, uint32 data) -{ - return Write(); -} - -uint64 -PROM0Device::Write16(uint32 addr, uint32 data) -{ - return Write(); -} - -uint64 -PROM0Device::Write32(uint32 addr, uint32 data) -{ - return Write(); -} - -uint64 -PROM0Device::Peek8(uint32 addr) +busdata +PROM0Device::Peek1(uint32 addr) { addr = Decoder(addr); - return prom->Peek8(addr); + return prom->Peek1(addr); } @@ -176,25 +146,20 @@ PROMDevice::~PROMDevice() bool PROMDevice::Init() { - if (inherited::Init() == false) { - return false; - } - VMType vmtype = gMainApp.GetVMType(); switch (vmtype) { case VMType::LUNA1: if (gMainApp.msxdos_mode) { return true; - } else { - return InitLuna1(); } + return InitLuna1(); case VMType::LUNA88K: return InitLuna88k(); default: - PANIC("unknown vmtype %d", (int)vmtype); + PANIC("unknown vmtype %u", (uint)vmtype); } } @@ -212,7 +177,7 @@ PROMDevice::InitLuna1() } // XXX アクセスウェイトは未調査。とりあえず RAM と同程度にしておく - wait = 1; + wait = busdata::Wait(1 * mpu->GetClock_nsec()); // ROM バージョンを確認。確認されてるのは // V4.02 (Wed Oct 12 17:07:11 1988) @@ -231,7 +196,7 @@ PROMDevice::InitLuna1() if (romver == 0) { putmsg(0, "Unknown PROM version"); } else { - putmsg(1, "v%d.%02d detected", romver / 100, romver % 100); + putmsg(1, "v%u.%02u detected", romver / 100, romver % 100); } if (romver == 422) { @@ -245,7 +210,7 @@ PROMDevice::InitLuna1() // MAC アドレスは12桁の16進数文字列として書き込まれている。例えば // 前半の 00:00:0A 部分は 30 30 30 30 30 41 "00000A" という感じ。 - macaddr_t macaddr {}; + MacAddr macaddr {}; if (EthernetDevice::GetConfigMacAddr(0, &macaddr, true) == false) { // エラーメッセージは表示済み return false; @@ -297,7 +262,7 @@ PROMDevice::InitLuna88k() } // XXX アクセスウェイトは未調査。とりあえず RAM と同程度にしておく - wait = 3; + wait = busdata::Wait(3 * mpu->GetClock_nsec()); // ROM バージョンを照合。どこかに日付が埋まってるっぽい。 // @@ -329,7 +294,7 @@ PROMDevice::InitLuna88k() if (romver == 0) { putmsg(0, "Unknown PROM version"); } else { - putmsg(1, "v%d.%02d detected", romver / 100, romver % 100); + putmsg(1, "v%u.%02u detected", romver / 100, romver % 100); } return true;