--- nono/vm/prom.h 2026/04/29 17:04:59 1.1.1.6 +++ nono/vm/prom.h 2026/04/29 17:05:24 1.1.1.10 @@ -4,37 +4,38 @@ // Licensed under nono-license.txt // +// +// PROM (LUNA-I, LUNA-88K 共通) +// + #pragma once #include "rom.h" -#include "stopwatch.h" - -class PROMDevice; class PROM0Device : public IODevice { using inherited = IODevice; public: PROM0Device(); - virtual ~PROM0Device() override; + ~PROM0Device() override; bool Init() override; - void ResetHard() override; + void ResetHard(bool poweron) override; - uint64 Read8(uint32 addr) override; - uint64 Read16(uint32 addr) override; - uint64 Read32(uint32 addr) override; - uint64 Write8(uint32 addr, uint32 data) override; - uint64 Write16(uint32 addr, uint32 data) override; - uint64 Write32(uint32 addr, uint32 data) override; - uint64 Peek8(uint32 addr) override; + busdata Read8(uint32 addr) override; + busdata Read16(uint32 addr) override; + busdata Read32(uint32 addr) override; + busdata Write8(uint32 addr, uint32 data) override; + busdata Write16(uint32 addr, uint32 data) override; + busdata Write32(uint32 addr, uint32 data) override; + busdata Peek8(uint32 addr) override; private: // アドレスデコーダ static uint32 Decoder(uint32 addr); // 書き込みの共通部分 - uint64 Write(); + busdata Write(); IODevice *prom {}; }; @@ -44,20 +45,27 @@ class PROMDevice : public ROMDevice using inherited = ROMDevice; public: PROMDevice(); - virtual ~PROMDevice() override; + ~PROMDevice() override; bool Init() override; - bool PowerOn() override; - uint64 Read8(uint32 addr) override; + int GetROMVer() const { return romver; } private: bool InitLuna1(); bool InitLuna88k(); - // パフォーマンス測定用 - Stopwatch sw {}; + // PROM バージョン。 + // 100倍した整数形式で持つ。0 ならバージョン不明。 + int romver {}; }; -extern std::unique_ptr gPROM0; -extern std::unique_ptr gPROM; +static inline PROM0Device *GetPROM0Device() { + return Object::GetObject(OBJ_PROM_BOOT); +} + +// PROM(現物)と ROMEMU の共通層である ROMDevice を返す。 +// 区別が必要なら呼び出し側でもう一度 dynamic_cast<> すること。 +static inline ROMDevice *GetPROMDevice() { + return Object::GetObject(OBJ_PROM); +}