--- nono/vm/keyboard.h 2026/04/29 17:05:06 1.1.1.10 +++ nono/vm/keyboard.h 2026/04/29 17:05:17 1.1.1.12 @@ -4,12 +4,17 @@ // Licensed under nono-license.txt // +// +// キーボード (基本クラス) +// + #pragma once #include "device.h" -#include "event.h" #include "fixedqueue.h" -#include +#include "message.h" + +class Syncer; class Keyboard : public Device { @@ -19,7 +24,9 @@ class Keyboard : public Device public: virtual ~Keyboard() override; - virtual void ResetHard() override; + bool Init() override; + void ResetHard(bool poweron) override; + void PowerOff() override; // キーを押した (外部から呼ばれる) void MakeKey(uint keycode); @@ -28,7 +35,7 @@ class Keyboard : public Device // 文字入力によるキーエミュレーション (外部から呼ばれる) void CharInput(uint charcode); - // マウス入力 + // マウス入力。 // x, y は X, Y の前回からの移動量。 // X は画面右に動く方向をプラス、Y は画面下に動く方向をプラスとする。 // 移動量が VM で扱える範囲内か、それを越えていたらどうするかは @@ -59,10 +66,23 @@ class Keyboard : public Device // 状態を取得すること。 virtual bool IsShift() const = 0; + // キーボードを接続する + void Connect(bool connect); + + // キーボードが接続されていれば true を返す + bool IsConnected() const { return is_connected; } + // キー名を返す (主にデバッグ表示用) static const std::string GetKeyName(uint code); protected: + // キーボードの接続処理の実体 + void DoConnect(); + void DoDisconnect(); + + virtual void MDConnect() = 0; + virtual void MDDisconnect() = 0; + // キーコードには、 // o 共通キーコード(コードのみ)、 // o 共通キーコード(コードと Make/Break フラグあり)、 @@ -81,32 +101,18 @@ class Keyboard : public Device // キーを処理する (共通部分) 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; + // キーボードが接続されているとき true + bool is_connected {}; + // どのキーが押されているか (共通キーコード) std::vector pressed {}; - // アクティブカウンタ。 - // 0 のときは UI と対話していないことを示す。 - int active {}; - - // ホストから来たキー入力をバッファする。 - // 実際には固定長でない普通のキューで構わないんだけど、モニタ用に中身を - // 覗き見したいとか思うと、ほぼそのための FixedQueue を使うほうがいい。 - // 固定長である必要はないけど、無限に可変長である必要もないので。 - - // UI からの入力を VM スレッドへ引き渡すためのバッファ。 - FixedQueue inputqueue {}; - // 入力されたキーを VM へ送信するときのバッファ。 FixedQueue sendqueue {}; @@ -126,17 +132,18 @@ class Keyboard : public Device bool prev_l {}; bool prev_m {}; + Syncer *syncer {}; + private: - // キー入力を VM スレッドで処理するためのイベント - void KeyInputCallback(Event& ev); - Event keyinput_event { this }; - std::mutex mtx {}; + void KeyInputCallback(MessageID, uint32); static std::vector keyname; static std::vector char_key; }; -extern std::unique_ptr gKeyboard; +static inline Keyboard *GetKeyboard() { + return Object::GetObject(OBJ_KEYBOARD); +} // keystat は下位 8bit がキーコード。 // 上位(今の所 8bit) は各種フラグ。 @@ -226,6 +233,7 @@ extern std::unique_ptr gKeyboa #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 @@ -326,3 +334,6 @@ extern std::unique_ptr gKeyboa #define CC_left (0x8d) #define CC_right (0x8e) #define CC_down (0x8f) + +#define CC_disconnect (0x90) // キーボードを取り外す +#define CC_connect (0x91) // キーボードを接続する