--- nono/vm/x68kkbd.h 2026/04/29 17:04:53 1.1.1.6 +++ nono/vm/x68kkbd.h 2026/04/29 17:05:32 1.1.1.15 @@ -4,19 +4,37 @@ // Licensed under nono-license.txt // +// +// X68k キーボード +// + #pragma once #include "keyboard.h" -#include "scheduler.h" +#include "event.h" +#include + +class MFPDevice; +class SCCDevice; +class SysportDevice; class X68030Keyboard : public Keyboard { using inherited = Keyboard; + + // マウスステータスデータ + static const uint8 YUNFL = 0x80; + static const uint8 YOVFL = 0x40; + static const uint8 XUNFL = 0x20; + static const uint8 XOVFL = 0x10; + static const uint8 SW_R = 0x02; + static const uint8 SW_L = 0x01; + public: X68030Keyboard(); - virtual ~X68030Keyboard() override; + ~X68030Keyboard() override; - void ResetHard() override; + bool Init() override; // シフト状態なら true を返す bool IsShift() const override; @@ -24,6 +42,9 @@ class X68030Keyboard : public Keyboard // マウス入力 void MouseInput(int x, int y, bool rb, bool lb, bool mb) override; + // マウスデータを VM に送信する MD 処理 + void MouseSendStart() override; + // ホストからの制御コマンド void Command(uint32 data) override; @@ -32,22 +53,40 @@ class X68030Keyboard : public Keyboard void Ready(); private: + DECLARE_MONITOR_CALLBACK(MonitorUpdate); + + // キーボードの接続と取り外し + void MDConnect() override; + void MDDisconnect() override; + // MD キーコードに変換 - uint KeyToMDKey(uint keycode) const override; + uint KeyToMDKey(uint keystat) const override; - // 入力されたキーを前処理し、フィルタする。 - uint PreprocessKey(uint keystat) override; + // キーを1つ処理する + void KeyInput(uint keystat) override; // キーイベントを登録(追加)する void SendStart() override; + // キーリピートイベント + void ReptCallback(Event& ev); + + // マウスイベント + void MouseCallback(Event& ev); + // 変換テーブル static const uint keycode2x68kkey_table[KC_max]; - // キーリピート開始時間 [msec] - uint32 rept_delay {}; - // キーリピート間隔 [msec] - uint32 rept_time {}; + // キーリピート開始時間 + uint rept_delay_data {}; // 設定値 + uint64 rept_delay {}; // [nsec] + // キーリピート間隔 + uint rept_time_data {}; // 設定値 + uint64 rept_time {}; // [nsec] + // キーリピートイベント + Event rept_event { this }; + // リピートしている共通キーコード + uint rept_key {}; // LED 暗さ (0 明るい <-> 3 暗い) uint32 led_darkness {}; @@ -61,6 +100,18 @@ class X68030Keyboard : public Keyboard // 5: ひらがな // 6: 全角 + // マウス送信データ + std::array mouse_data {}; + + MFPDevice *mfp {}; + SCCDevice *scc {}; + SysportDevice *sysport {}; + + // マウスイベント + Event mouse_event { this }; + + Monitor *monitor {}; + // X680x0 キーコード static const uint NoKey = 0; static const uint X68kKey_ESC = 0x01;