--- nono/vm/pio.h 2026/04/29 17:04:45 1.1.1.5 +++ nono/vm/pio.h 2026/04/29 17:04:59 1.1.1.8 @@ -12,13 +12,12 @@ // Intel 82C55 の仕様書にはコントロールポートからの読み出しは明記してある。 // NEC uPD8255 の仕様書にはコントロールポートからの読み出しについての記載が // ない (禁止とも書いてない)。 -class i8255Device - : public IODevice +class i8255Device : public IODevice { using inherited = IODevice; public: - i8255Device(); + i8255Device(const std::string& objname_); virtual ~i8255Device() override; void ResetHard() override; @@ -54,8 +53,7 @@ class i8255Device }; -class PPIDevice - : public i8255Device +class PPIDevice : public i8255Device { using inherited = i8255Device; private: @@ -68,13 +66,12 @@ class PPIDevice protected: // BusIO インタフェース static const uint32 NPORT = 4; - uint64 Read(uint32 addr); - uint64 Write(uint32 addr, uint32 data); - uint64 Peek(uint32 addr); + uint64 Read(uint32 offset); + uint64 Write(uint32 offset, uint32 data); + uint64 Peek(uint32 offset); }; -class PIO0Device - : public i8255Device +class PIO0Device : public i8255Device { using inherited = i8255Device; public: @@ -83,8 +80,6 @@ class PIO0Device bool Init() override; - void MonitorUpdate(TextScreen&) override; - // DIP-SW1 の状態を取得 (ROM エミュレーション用) // // b7 b6 b5 b4 b3 b2 b1 b0 @@ -97,9 +92,9 @@ class PIO0Device protected: // BusIO インタフェース static const uint32 NPORT = 4; - uint64 Read(uint32 addr); - uint64 Write(uint32 addr, uint32 data); - uint64 Peek(uint32 addr); + uint64 Read(uint32 offset); + uint64 Write(uint32 offset, uint32 data); + uint64 Peek(uint32 offset); private: uint32 GetPA() const; @@ -107,18 +102,22 @@ class PIO0Device uint32 GetPC() const; void SetPC(int, int) override; + DECLARE_MONITOR_CALLBACK(MonitorUpdate); + bool dipsw1[8] {}; bool dipsw2[8] {}; + bool msb_first {}; // DIP-SW の1番が MSB なら true (LUNA88K) bool int1rq {}; // $01 INT1 割り込み要求 bool int1en {}; // $04 INT1 割り込み許可 bool int5rq {}; // $08 INT5 割り込み要求 bool int5en {}; // $10 INT5 割り込み許可 bool parity {}; // $40 パリティ有効/無効 bool xp_reset {}; // $80 XP リセット + + Monitor monitor { this }; }; -class PIO1Device - : public i8255Device +class PIO1Device : public i8255Device { using inherited = i8255Device; public: @@ -130,9 +129,9 @@ class PIO1Device protected: // BusIO インタフェース static const uint32 NPORT = 4; - uint64 Read(uint32 addr); - uint64 Write(uint32 addr, uint32 data); - uint64 Peek(uint32 addr); + uint64 Read(uint32 offset); + uint64 Write(uint32 offset, uint32 data); + uint64 Peek(uint32 offset); private: void SetPC(int, int) override; @@ -140,8 +139,11 @@ class PIO1Device bool power {}; // パワーダウン (false で電源オフ指示) bool xp_intreq {}; // XP 割り込み要求。あり(true)なら %0 - Event poffevent {}; // 電源オフイベント + + // 電源オフイベント + Event poffevent { this }; }; +extern std::unique_ptr gPPI; extern std::unique_ptr gPIO0; extern std::unique_ptr gPIO1;