--- nono/vm/keyboard.h 2026/04/29 17:05:03 1.1.1.9 +++ nono/vm/keyboard.h 2026/04/29 17:05:06 1.1.1.10 @@ -81,14 +81,23 @@ class Keyboard : public Device // キーを処理する (共通部分) bool KeyInputCommon(uint keystat); + // アクティブカウンタを 1 増やす。 + // 0 -> 1 の遷移でスケジューラに通知する。 + void Acquire(); + + // アクティブカウンタを 1 減らす。 + // 1 -> 0 の遷移でスケジューラに通知する。 + void Release(); + // キーを VM に送信する MD 処理 virtual void SendStart() = 0; // どのキーが押されているか (共通キーコード) std::vector pressed {}; - // 現在押されているキーの総数 - int num_of_pressed {}; + // アクティブカウンタ。 + // 0 のときは UI と対話していないことを示す。 + int active {}; // ホストから来たキー入力をバッファする。 // 実際には固定長でない普通のキューで構わないんだけど、モニタ用に中身を @@ -129,29 +138,44 @@ class Keyboard : public Device extern std::unique_ptr gKeyboard; +// keystat は下位 8bit がキーコード。 +// 上位(今の所 8bit) は各種フラグ。 +// +// 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +// +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +// |M/B|UI | LED | 0 | KM_* | Keycode | +// +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ +// | | | | +// | | | +-- キャラクタ入力でのモディファイヤフラグ +// | | +------------------ LUNA の LED キー送信フラグ +// | +------------------------ char 入力モードでキーコードを UI に通知 +// | (inputqueue 内で使用する) +// +---------------------------- キーの Make/Break + +#define KM_SHIFT (0x0100) // char モードで SHIFT 押下 +#define KM_CTRL (0x0200) // char モードで CTRL 押下 + +#define KC_FLAG_LED_MAKE (0x1000) // LUNA LED キーの押下を送信 +#define KC_FLAG_LED_BREAK (0x2000) // LUNA LED キーの開放を送信 +#define KC_FLAG_LED_DROP (0x3000) // LUNA LED キーを送信しない + +#define KC_FLAG_POST (0x4000) // キーコードを UI に通知 + +#define KC_FLAG_MAKE (0x0000) // キー押下 (値は 0 だが便宜上) +#define KC_FLAG_BREAK (0x8000) // キー開放 + +// keystat のアクセスマクロ +#define KC_CODE(x) ((x) & 0x00ff) // keycode を取得 +#define KC_FLAG_LED(x) ((x) & 0x3000) // LUNA LED キー動作を取得 +#define KC_IS_POST(x) (((x) & KC_FLAG_POST) != 0) // UI に通知なら true +#define KC_IS_MAKE(x) (((x) & KC_FLAG_BREAK) == 0) // キー押下なら true +#define KC_IS_BREAK(x) (((x) & KC_FLAG_BREAK) != 0) // キー開放なら true + // 抽象化キーボードレイヤーでのキーコード。 // wxWidgets で受け取ったキーコードをこれに変換して VM に入力する。 // VM のキーボードデバイスがこれを当該機種ごとのキーコードなり何なりに // 変換して入力する。 -// keystat のフラグ -#define KC_FLAG_MAKE (0x0000) // 押した -#define KC_FLAG_BREAK (0x8000) // 離した -#define KC_IS_MAKE(x) (((x) & KC_FLAG_BREAK) == 0) -#define KC_IS_BREAK(x) (((x) & KC_FLAG_BREAK) != 0) - -// char 入力モードでの押下ならキーコードを UI に通知する必要があるため、 -// inputqueue 内でこの情報を保持するためのフラグ。 -#define KC_FLAG_POST (0x4000) -#define KC_IS_POST(x) (((x) & KC_FLAG_POST) != 0) - -// 文字入力エミュレーション時に同時押しするキーのためのモディファイヤフラグ。 -#define KM_SHIFT (0x0100) -#define KM_CTRL (0x0200) - -// keystat からキーコードだけ取り出す -#define KC_CODE(x) ((x) & 0x00ff) - #define KC_none (0) #define KC_BREAK (0x01) // [X68k] BREAK @@ -161,7 +185,7 @@ extern std::unique_ptr gKeyboa #define KC_kigou (0x05) // [X68k] 記号入力 #define KC_touroku (0x06) // [X68k] 登録 #define KC_HELP (0x07) // [X68k] HELP -#define KC_HOME (0x08) // [X68k] HOME +#define KC_SHIFT (0x08) // [X68k] SHIFT (左右の区別なし) #define KC_TAB (0x09) #define KC_CTRL (0x0a) #define KC_kana (0x0b) // かな @@ -202,7 +226,6 @@ extern std::unique_ptr gKeyboa #define KC_minus (0x2c) #define KC_circum (0x2d) // ^~ #define KC_backslash (0x2e) // \| -#define KC_UNDO (0x2f) // [X68k] UNDO #define KC_OPT1 (0x30) // [X68k] OPT.1 #define KC_OPT2 (0x31) // [X68k] OPT.2 @@ -221,6 +244,8 @@ extern std::unique_ptr gKeyboa #define KC_hira (0x3e) // [X68k] ひらがな #define KC_zenkaku (0x3f) // [X68k] 全角 +#define KC_HOME (0x40) // [X68k] HOME +#define KC_UNDO (0x41) // [X68k] UNDO #define KC_A (0x42) #define KC_S (0x43) #define KC_D (0x44) @@ -234,6 +259,8 @@ extern std::unique_ptr gKeyboa #define KC_colon (0x4c) #define KC_bracketright (0x4d) // ']' +#define KC_XF1 (0x50) // [X68k] XF1 +#define KC_XF2 (0x51) // [X68k] XF2 #define KC_Z (0x52) #define KC_X (0x53) #define KC_C (0x54) @@ -245,6 +272,9 @@ extern std::unique_ptr gKeyboa #define KC_period (0x5a) #define KC_slash (0x5b) #define KC_underscore (0x5c) +#define KC_XF3 (0x5d) // [X68k] XF3 +#define KC_XF4 (0x5e) // [X68k] XF4 +#define KC_XF5 (0x5f) // [X68k] XF5 #define KC_PAD_plus (0x61) #define KC_PAD_minus (0x62) @@ -277,14 +307,7 @@ extern std::unique_ptr gKeyboa #define KC_PAD_equal (0x7e) #define KC_PAD_comma (0x7f) -#define KC_XF1 (0x80) // [X68k] XF1 -#define KC_XF2 (0x81) // [X68k] XF2 -#define KC_XF3 (0x82) // [X68k] XF3 -#define KC_XF4 (0x83) // [X68k] XF4 -#define KC_XF5 (0x84) // [X68k] XF5 -#define KC_SHIFT (0x85) // [X68k] SHIFT (左右の区別なし) - -#define KC_max (0x86) +#define KC_max (0x80) // 文字入力モードの拡張部分 #define CC_NUL (0x80) // NUL (Ctrl + @)