--- nono/vm/device.cpp 2026/04/29 17:04:52 1.1.1.6 +++ nono/vm/device.cpp 2026/04/29 17:05:18 1.1.1.9 @@ -4,20 +4,22 @@ // Licensed under nono-license.txt // -#include "device.h" -#include "vm.h" +// +// デバイスの基本クラスなど +// -// 全デバイスリスト -std::vector gDevices; +#include "device.h" +#include "mpu.h" +#include "scheduler.h" // // Device // // コンストラクタ -Device::Device() +Device::Device(int objid_) + : inherited(objid_) { - gDevices.push_back(this); } // デストラクタ @@ -34,6 +36,9 @@ Device::Create() bool Device::Init() { + mpu = GetMPUDevice(); + scheduler = GetScheduler(); + return true; } @@ -43,22 +48,40 @@ Device::Apply() return true; } -bool -Device::PowerOn() +void +Device::ResetHard(bool poweron) { - return true; } -bool +void Device::PowerOff() { - return true; } -// 本体リセットスイッチによるリセット +// ログ表示。 +// VM デバイスでは、仮想時間、PC、オブジェクト名を表示する。 void -Device::ResetHard() +Device::putlogn(const char *fmt, ...) const { + char buf[1024]; + va_list ap; + uint64 vt; + int len; + + vt = scheduler->GetVirtTime(); + len = snprintf(buf, sizeof(buf), "%4d.%03d'%03d'%03d %08x %s ", + (int)(vt / 1000 / 1000 / 1000), + (int)((vt / 1000 / 1000) % 1000), + (int)((vt / 1000) % 1000), + (int)(vt % 1000), + mpu->GetPPC(), + GetName().c_str()); + + va_start(ap, fmt); + vsnprintf(buf + len, sizeof(buf) - len, fmt, ap); + va_end(ap); + + WriteLog(buf); } @@ -67,10 +90,9 @@ Device::ResetHard() // // コンストラクタ -IODevice::IODevice() +IODevice::IODevice(int objid_) + : inherited(objid_) { - devaddr = 0; - devlen = 0; } // デストラクタ @@ -78,6 +100,17 @@ IODevice::~IODevice() { } +// 初期化 +bool +IODevice::Init() +{ + if (inherited::Init() == false) { + return false; + } + + return true; +} + uint64 IODevice::Read8(uint32 addr) { @@ -136,21 +169,64 @@ IODevice::Peek8(uint32 addr) return 0xff; } +uint64 +IODevice::Poke8(uint32 addr, uint32 data) +{ + return (uint64)-1; +} + +uint64 +IODevice::Poke(uint32 addr, uint32 data) +{ + return (uint64)-1; +} + // -// バスエラー +// IOContainerDevice // -std::unique_ptr gBusErr; +// コンストラクタ +IOContainerDevice::IOContainerDevice(int objid_) + : inherited(objid_) +{ +} + +// デストラクタ +IOContainerDevice::~IOContainerDevice() +{ +} + +// このアドレスを担当する IODevice を再帰的に探して返す。 +IODevice * +IOContainerDevice::FindDevice(uint32 addr) const +{ + IODevice *d = GetDevice(addr); + IOContainerDevice *cd = dynamic_cast(d); + + if (cd) { + // 次段はコンテナデバイス + return cd->FindDevice(addr); + } else { + // 次段は終端のデバイス + return d; + } +} + + +// +// バスエラー +// // コンストラクタ BusErrDevice::BusErrDevice() + : inherited(OBJ_BUSERR) { - logname = "buserr"; - devname = "(BusErr)"; - devaddr = -1; // XXX どうしたもんか + ClearAlias(); + AddAlias("BusErr"); } +// デストラクタ BusErrDevice::~BusErrDevice() { } @@ -208,63 +284,63 @@ BusErrDevice::Peek8(uint32 addr) // 何もしないデバイス // -std::unique_ptr gNull; - // コンストラクタ -NullDevice::NullDevice() +NopIODevice::NopIODevice() + : inherited(OBJ_NOPIO) { - logname = "null"; - 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::Read16(uint32 addr) +NopIODevice::Read16(uint32 addr) { putlog(1, "$%08x.w", addr); return 0xffff; } uint64 -NullDevice::Read32(uint32 addr) +NopIODevice::Read32(uint32 addr) { putlog(1, "$%08x.l", addr); return 0xffffffff; } uint64 -NullDevice::Write8(uint32 addr, uint32 data) +NopIODevice::Write8(uint32 addr, uint32 data) { putlog(1, "$%08x.b <- $%02x", addr, data); return 0; } uint64 -NullDevice::Write16(uint32 addr, uint32 data) +NopIODevice::Write16(uint32 addr, uint32 data) { putlog(1, "$%08x.w <- $%04x", addr, data); return 0; } uint64 -NullDevice::Write32(uint32 addr, uint32 data) +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; }