--- nono/vm/device.cpp 2026/04/29 17:04:28 1.1.1.1 +++ nono/vm/device.cpp 2026/04/29 17:04:55 1.1.1.7 @@ -1,6 +1,7 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "device.h" @@ -14,7 +15,8 @@ std::vector gDevices; // // コンストラクタ -Device::Device() +Device::Device(const std::string& objname_) + : inherited(objname_) { gDevices.push_back(this); } @@ -22,6 +24,14 @@ Device::Device() // デストラクタ Device::~Device() { + // 自分自身をリストから削除する + // XXX マルチスレッドな状況からは呼ばれないはず? + for (auto it = gDevices.begin(); it != gDevices.end(); ++it) { + if (*it == this) { + gDevices.erase(it); + break; + } + } } bool @@ -60,19 +70,14 @@ Device::ResetHard() { } -// MPU の RESET 命令によるリセット -void -Device::ResetSoft() -{ -} - // // IODevice // // コンストラクタ -IODevice::IODevice() +IODevice::IODevice(const std::string& objname_) + : inherited(objname_) { devaddr = 0; devlen = 0; @@ -112,7 +117,7 @@ IODevice::Write16(uint32 addr, uint32 da { int64 berr; - berr = Write8(addr, data >> 8) ; + berr = Write8(addr, data >> 8); if (berr < 0) return berr; berr = Write8(addr + 1, data & 0xff); @@ -138,7 +143,7 @@ IODevice::Write32(uint32 addr, uint32 da uint64 IODevice::Peek8(uint32 addr) { - return 0; + return 0xff; } @@ -146,10 +151,15 @@ IODevice::Peek8(uint32 addr) // バスエラー // +std::unique_ptr gBusErr; + // コンストラクタ BusErrDevice::BusErrDevice() + : inherited("(BusErr)") { - devname = "(BusErr)"; + ClearAlias(); + AddAlias("BusErr"); + devaddr = -1; // XXX どうしたもんか } @@ -160,36 +170,42 @@ BusErrDevice::~BusErrDevice() uint64 BusErrDevice::Read8(uint32 addr) { + putlog(1, "$%08x.b", addr); return (uint64)-1; } uint64 BusErrDevice::Read16(uint32 addr) { + putlog(1, "$%08x.w", addr); return (uint64)-1; } uint64 BusErrDevice::Read32(uint32 addr) { + putlog(1, "$%08x.l", addr); return (uint64)-1; } uint64 BusErrDevice::Write8(uint32 addr, uint32 data) { + putlog(1, "$%08x.b <- %02X", addr, data); return (uint64)-1; } uint64 BusErrDevice::Write16(uint32 addr, uint32 data) { + putlog(1, "$%08x.w <- %04X", addr, data); return (uint64)-1; } uint64 BusErrDevice::Write32(uint32 addr, uint32 data) { + putlog(1, "$%08x.l <- %08X", addr, data); return (uint64)-1; } @@ -204,30 +220,64 @@ BusErrDevice::Peek8(uint32 addr) // 何もしないデバイス // +std::unique_ptr gNopIO; + // コンストラクタ -NullDevice::NullDevice() +NopIODevice::NopIODevice() + : inherited("(NopIO)") { - devname = "(Null)"; + ClearAlias(); + AddAlias("NopIO"); } -NullDevice::~NullDevice() +NopIODevice::~NopIODevice() { } uint64 -NullDevice::Read8(uint32 addr) +NopIODevice::Read8(uint32 addr) { + putlog(1, "$%08x.b", addr); return 0xff; } uint64 -NullDevice::Write8(uint32 addr, uint32 data) +NopIODevice::Read16(uint32 addr) +{ + putlog(1, "$%08x.w", addr); + return 0xffff; +} + +uint64 +NopIODevice::Read32(uint32 addr) +{ + putlog(1, "$%08x.l", addr); + return 0xffffffff; +} + +uint64 +NopIODevice::Write8(uint32 addr, uint32 data) +{ + putlog(1, "$%08x.b <- $%02x", addr, data); + return 0; +} + +uint64 +NopIODevice::Write16(uint32 addr, uint32 data) +{ + putlog(1, "$%08x.w <- $%04x", addr, data); + return 0; +} + +uint64 +NopIODevice::Write32(uint32 addr, uint32 data) { + putlog(1, "$%08x.l <- $%08x", addr, data); return 0; } uint64 -NullDevice::Peek8(uint32 addr) +NopIODevice::Peek8(uint32 addr) { return 0xff; }