--- nono/vm/rom.cpp 2026/04/29 17:04:59 1.1.1.7 +++ nono/vm/rom.cpp 2026/04/29 17:05:25 1.1.1.12 @@ -4,8 +4,10 @@ // Licensed under nono-license.txt // -// ROM の共通部分 // +// ROM の基本クラス +// + // IODevice // | // | +-----------+ @@ -18,8 +20,8 @@ // | +-- CGROMDevice (X680x0 の CGROM) // | +-- LunaPROMEmuDevice (LUNA PROM エミュレーションの共通部分) // | | -// | +-- Luna1PROMEmuDevice (LUNA1 の PROM エミュレーション) -// | +-- Luna88kPROMEmuDevice (LUNA88K の PROM エミュレーション) +// | +-- Luna1PROMEmuDevice (LUNA-I の PROM エミュレーション) +// | +-- Luna88kPROMEmuDevice (LUNA-88K の PROM エミュレーション) // | // +-- PROM0Device (LUNA* のブートページ切り替え用プロキシ) // +-- IPLROM0Device (X680x0 のブートページ切り替え用プロキシ) @@ -36,8 +38,8 @@ // ROM 共通部 // -ROMDevice::ROMDevice(const std::string& objname_) - : inherited(objname_) +ROMDevice::ROMDevice(int objid_) + : inherited(objid_) { mask = 0xffffffff; } @@ -93,7 +95,6 @@ ROMDevice::LoadROM(const char *name, int // 大きすぎるほうはワーニングだけでいいか warnx("%s is too large (ignore %zd bytes)", filename.c_str(), (ssize_t)st.st_size - size); - return false; } // 読み込む @@ -113,54 +114,85 @@ ROMDevice::LoadROM(const char *name, int return true; } -uint64 +busdata ROMDevice::Read8(uint32 addr) { - gMPU->AddCycle(wait); - return mem[addr & mask]; + busdata data; + data = mem[addr & mask]; + data |= wait; + putlog(4, "$%08x.B -> $%02x", addr, data.Data()); + return data; } -uint64 +busdata ROMDevice::Read16(uint32 addr) { - gMPU->AddCycle(wait); - uint16 data; - data = *(uint16 *)&mem[addr & mask]; - return be16toh(data); + busdata data; + data = be16toh(*(const uint16 *)&mem[addr & mask]); + data |= wait; + putlog(4, "$%08x.W -> $%04x", addr, data.Data()); + return data; } -uint64 +busdata ROMDevice::Read32(uint32 addr) { - gMPU->AddCycle(wait); - uint32 data; - data = *(uint32 *)&mem[addr & mask]; - return be32toh(data); + busdata data; + data = be32toh(*(const uint32 *)&mem[addr & mask]); + data |= wait; + putlog(4, "$%08x.L -> $%08x", addr, data.Data()); + return data; } -uint64 +busdata ROMDevice::Write8(uint32 addr, uint32 data) { - gMPU->AddCycle(wait); // ? - return write_op; + busdata r = write_op; + putlog(4, "$%08x.B <- $%02x", addr, data); + r |= wait; + return r; } -uint64 +busdata ROMDevice::Write16(uint32 addr, uint32 data) { - gMPU->AddCycle(wait); // ? - return write_op; + busdata r = write_op; + putlog(4, "$%08x.W <- $%04x", addr, data); + r |= wait; + return r; } -uint64 +busdata ROMDevice::Write32(uint32 addr, uint32 data) { - gMPU->AddCycle(wait); // ? - return write_op; + busdata r = write_op; + putlog(4, "$%08x.L <- $%08x", addr, data); + r |= wait; + return r; } -uint64 +busdata ROMDevice::Peek8(uint32 addr) { return mem[addr & mask]; } + +// アクセスウェイト [clock] を設定。 +void +ROMDevice::SetWait(uint32 wait_) +{ + uint32 clock_nsec = mpu->GetClock_nsec(); + + wait = busdata::Wait(wait_ * clock_nsec); +} + +// ファイル名を返す。なければ NULL を返す。 +const char * +ROMDevice::GetFilename() const +{ + if (filename.empty()) { + return NULL; + } else { + return filename.c_str(); + } +}