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