--- nono/vm/keyboard.h 2026/04/29 17:05:10 1.1.1.11 +++ nono/vm/keyboard.h 2026/04/29 17:05:42 1.1.1.15 @@ -14,13 +14,28 @@ #include "fixedqueue.h" #include "message.h" -class Keyboard : public Device +class Syncer; + +// 文字入力しか持たないキーボードの下位クラス。 +class DumbKeyboard : public Device { using inherited = Device; + public: + DumbKeyboard(); + ~DumbKeyboard() override; + + // 文字入力によるキーエミュレーション (外部から呼ばれる) + virtual void CharInput(uint charcode) = 0; +}; + +// 通常のキーボード +class Keyboard : public DumbKeyboard +{ + using inherited = DumbKeyboard; protected: Keyboard(); public: - virtual ~Keyboard() override; + ~Keyboard() override; bool Init() override; void ResetHard(bool poweron) override; @@ -31,7 +46,7 @@ class Keyboard : public Device // キーを離した (外部から呼ばれる) void BreakKey(uint keycode); // 文字入力によるキーエミュレーション (外部から呼ばれる) - void CharInput(uint charcode); + void CharInput(uint charcode) override; // マウス入力。 // x, y は X, Y の前回からの移動量。 @@ -53,9 +68,6 @@ class Keyboard : public Device return pressed[keycode]; } - // 全てのキーの押し下げ状態取得 (ソフトウェアキーボードなどから) - const std::vector& GetPressed() const { return pressed; } - // LED 状態取得 (ソフトウェアキーボードなどから) const std::vector& GetLED() const { return led; } @@ -96,16 +108,14 @@ class Keyboard : public Device // キーを1つ処理する virtual void KeyInput(uint keystat) = 0; + // キーの押し下げ状態を設定する + void SetPressed(uint keycode, bool ismake); + // キーを処理する (共通部分) bool KeyInputCommon(uint keystat); - // アクティブカウンタを 1 増やす。 - // 0 -> 1 の遷移でスケジューラに通知する。 - void Acquire(); - - // アクティブカウンタを 1 減らす。 - // 1 -> 0 の遷移でスケジューラに通知する。 - void Release(); + // キーが1つでも押されていれば true + bool Any() const; // キーを VM に送信する MD 処理 virtual void SendStart() = 0; @@ -116,10 +126,6 @@ class Keyboard : public Device // どのキーが押されているか (共通キーコード) std::vector pressed {}; - // アクティブカウンタ。 - // 0 のときは UI と対話していないことを示す。 - int active {}; - // 入力されたキーを VM へ送信するときのバッファ。 FixedQueue sendqueue {}; @@ -139,14 +145,19 @@ class Keyboard : public Device bool prev_l {}; bool prev_m {}; + Syncer *syncer {}; + private: - void KeyInputCallback(MessageID, uint32); + void KeyInputMessage(MessageID, uint32); static std::vector keyname; static std::vector char_key; }; -extern Keyboard *gKeyboard; +// フルキーボードの取得 (シリアルキーボードは含まない) +static inline Keyboard *GetKeyboard() { + return Object::GetObject(OBJ_KEYBOARD); +} // keystat は下位 8bit がキーコード。 // 上位(今の所 8bit) は各種フラグ。 @@ -236,6 +247,7 @@ extern Keyboard *gKeyboard; #define KC_minus (0x2c) #define KC_circum (0x2d) // ^~ #define KC_backslash (0x2e) // \| +#define KC_buzzer (0x2f) // [LUNA] ブザー発声 (キーではない) #define KC_OPT1 (0x30) // [X68k] OPT.1 #define KC_OPT2 (0x31) // [X68k] OPT.2