--- nono/vm/mfp.h 2026/04/29 17:04:45 1.1.1.6 +++ nono/vm/mfp.h 2026/04/29 17:05:17 1.1.1.13 @@ -4,10 +4,19 @@ // Licensed under nono-license.txt // +// +// MFP (MC68901) +// + #pragma once #include "device.h" -#include "scheduler.h" +#include "event.h" +#include "monitor.h" +#include + +class InterruptDevice; +class X68030Keyboard; struct MFP { @@ -175,8 +184,7 @@ struct MFP uint16 udr; }; -class MFPDevice - : public IODevice +class MFPDevice : public IODevice { using inherited = IODevice; @@ -186,21 +194,29 @@ class MFPDevice MFPDevice(); virtual ~MFPDevice() override; - void ResetHard() override; - void ResetSoft() override; - void MonitorUpdate(TextScreen&) override; + bool Init() override; + void ResetHard(bool poweron) override; // 割り込みアクノリッジ int InterruptAcknowledge(); + // HSync 入力 + void SetHSync(bool hsync); + // VDisp 入力 void SetVDisp(bool vdisp); + // 電源ボタン状態入力 + void SetPowSW(bool powsw); + + // ALARM 信号入力 + void SetAlarmOut(bool alarm); + // KEY CTRL 状態を設定する void SetKeyCtrl(bool ctrl); - // RR 線の状態を返す - bool IsRR() const; + // キーボードからの送信が可能なら true を返す。 + bool RxIsReady() const; // キーボードからデータを受信 void Rx(uint32 data); @@ -208,12 +224,11 @@ class MFPDevice protected: // BusIO インタフェース static const uint32 NPORT = 0x20; - 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 Reset(); void SetTCR(int ch, uint32 data); uint8 GetTDR(int ch) const; void SetTDR(int ch, uint32 data); @@ -225,6 +240,12 @@ class MFPDevice void SetRSR(uint32 data); void SetUDR(uint32 data); + // RSR::BF ビットの状態を変える + void SetBF(); + void ClearBF(); + // MFP の RR 線の状態を返す + bool IsRR() const; + // イベントコールバック void TimerCallback(Event& ev); void KeyCallback(Event& ev); @@ -235,15 +256,16 @@ class MFPDevice // 割り込み信号線の状態を変える void ChangeInterrupt(); + DECLARE_MONITOR_CALLBACK(MonitorUpdate); + struct MFP mfp {}; - Event event[4] {}; - Event key_event {}; + std::array event {}; + Event key_event { this }; - // Receiver Ready 線の状態 - bool rr {}; + Monitor monitor { this }; - // システムポート#4 の KEY CTRL 状態 - bool key_ctrl {}; + InterruptDevice *interrupt {}; + X68030Keyboard *keyboard {}; static const char *intrname[]; static const char *gpipname[]; @@ -252,4 +274,6 @@ class MFPDevice static const int timer_vector[4]; }; -extern std::unique_ptr gMFP; +static inline MFPDevice *GetMFPDevice() { + return Object::GetObject(OBJ_MFP); +}