--- nono/vm/romimg_x68k.cpp 2026/04/29 17:04:32 1.1.1.1 +++ nono/vm/romimg_x68k.cpp 2026/04/29 17:04:55 1.1.1.6 @@ -1,22 +1,111 @@ // // nono -// Copyright (C) 2019 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "romimg_x68k.h" #include "cgrom.h" #include "mainapp.h" -#include "mystring.h" #include "pluto.h" #include "scheduler.h" +std::unique_ptr gCGROM; +std::unique_ptr gIPLROM0; +std::unique_ptr gIPLROM1; +std::unique_ptr gIPLROM2; + +// +// IPLROM0 は IPLROM(1) のブートページ担当。 +// これ自身はメモリ領域を持たず IPLROM1 へのプロキシとして動作する。 +// +// X680x0 のブートページは $000000..$00ffff の 64KB で、 +// ここへのアクセスは $ff0000..$ffffff (IPLROM1 の後半 64KB) が見える。 +// ROM へアクセスがあればブートページを RAM に切り替える。 +// そのため、RAM 側も ROM 側もこいつが応対する必要がある。 + +IPLROM0Device::IPLROM0Device() + : inherited("IPLROM(0)") +{ + ClearAlias(); + AddAlias("IPLROM0"); + + mask = 0x10000 - 1; +} + +IPLROM0Device::~IPLROM0Device() +{ +} + +bool +IPLROM0Device::Init() +{ + iplrom1 = gIPLROM1.get(); + return true; +} + +void +IPLROM0Device::ResetHard() +{ + gVM->SwitchBootPage(this, true); +} + +uint64 +IPLROM0Device::Read8(uint32 addr) +{ + if (addr < 0x10000) { + return iplrom1->Read8(addr + 0x10000); + } else { + gVM->SwitchBootPage(this, false); + return iplrom1->Read8(addr); + } +} + +uint64 +IPLROM0Device::Read16(uint32 addr) +{ + if (addr < 0x10000) { + return iplrom1->Read16(addr + 0x10000); + } else { + gVM->SwitchBootPage(this, false); + return iplrom1->Read16(addr); + } +} + +uint64 +IPLROM0Device::Read32(uint32 addr) +{ + if (addr < 0x10000) { + return iplrom1->Read32(addr + 0x10000); + } else { + gVM->SwitchBootPage(this, false); + return iplrom1->Read32(addr); + } +} + +// Write は RAM 領域へも ROM 領域へも発生しないはずなので基底のを使う。 + +uint64 +IPLROM0Device::Peek8(uint32 addr) +{ + if (addr < 0x10000) { + return iplrom1->Peek8(addr + 0x10000); + } else { + return iplrom1->Peek8(addr); + } +} + + // // IPLROM(1) // IPLROM1Device::IPLROM1Device() + : inherited("IPLROM(1)") { - devname = "IPLROM(1)"; + ClearAlias(); + AddAlias("IPLROM1"); + devaddr = 0xfe0000; devlen = 0x020000; mask = devlen - 1; @@ -49,8 +138,11 @@ IPLROM1Device::Init() // IPLROM2Device::IPLROM2Device() + : inherited("IPLROM(2)") { - devname = "IPLROM(2)"; + ClearAlias(); + AddAlias("IPLROM2"); + devaddr = 0xfc0000; devlen = 0x020000; mask = devlen - 1; @@ -79,8 +171,8 @@ IPLROM2Device::Init() // CGROMDevice::CGROMDevice() + : inherited("CGROM") { - devname = "CGROM"; devaddr = 0xf00000; devlen = 768 * 1024; mask = 1024 * 1024 - 1;