--- nono/vm/x68kkbd.h 2026/04/29 17:04:45 1.1.1.5 +++ nono/vm/x68kkbd.h 2026/04/29 17:04:59 1.1.1.8 @@ -8,43 +8,69 @@ #include "keyboard.h" #include "scheduler.h" +#include 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_L = 0x02; + static const uint8 SW_R = 0x01; + public: X68030Keyboard(); virtual ~X68030Keyboard() override; void ResetHard() override; - // キーを押した - void MakeKey(uint) override; - // キーを離した - void BreakKey(uint) override; + // シフト状態なら true を返す + bool IsShift() const override; + // マウス入力 void MouseInput(int x, int y, bool rb, bool lb, bool mb) override; + // マウスデータを VM に送信する MD 処理 + void MouseSendStart() override; + // ホストからの制御コマンド void Command(uint32 data) override; + // ホストからの Ready 通知 + // (実際のハードウェアでは単にキーボードが待っている) + void Ready(); + private: - // キーデータ送信 - void SendKey(uint data); + // MD キーコードに変換 + uint KeyToMDKey(uint keycode) const override; - // 共通キーコードから LUNA キーコードへの変換 - uint keycode2x68kkey(uint); + // キーを1つ処理する + void KeyInput(uint keystat) override; - // 変換テーブル - static const uint keycode2x68kkey_table[133]; + // キーイベントを登録(追加)する + void SendStart() override; + + // キーリピートイベント + void ReptCallback(Event& ev); - // キー名テーブル - static const char * const keyname[128]; + // マウスイベント + void MouseCallback(Event& ev); - // キーリピート開始時間 [msec] - uint32 rept_delay {}; - // キーリピート間隔 [msec] - uint32 rept_time {}; + // 変換テーブル + static const uint keycode2x68kkey_table[KC_max]; + + // キーリピート開始時間 + uint64 rept_delay {}; + // キーリピート間隔 + uint64 rept_time {}; + // キーリピートイベント + Event rept_event { this }; + // リピートしている共通キーコード + uint rept_key {}; // LED 暗さ (0 明るい <-> 3 暗い) uint32 led_darkness {}; @@ -58,6 +84,9 @@ class X68030Keyboard : public Keyboard // 5: ひらがな // 6: 全角 + // マウスイベント + std::array mouse_event {}; + // X680x0 キーコード static const uint NoKey = 0; static const uint X68kKey_ESC = 0x01;