--- nono/vm/keyboard.cpp 2026/04/29 17:04:52 1.1.1.5 +++ nono/vm/keyboard.cpp 2026/04/29 17:04:55 1.1.1.6 @@ -74,13 +74,10 @@ std::unique_ptr gKeyboard; // コンストラクタ Keyboard::Keyboard() + : inherited("Keyboard") { - logname = "keyboard"; - devname = "Keyboard"; - pressed.resize(KC_max); - keyinput_event.dev = this; keyinput_event.func = (DeviceCallback_t)&Keyboard::KeyInputCallback; keyinput_event.time = 0; keyinput_event.SetName("Keyboard Input"); @@ -148,45 +145,30 @@ Keyboard::KeyInputCallback(Event& ev) } // キー入力を1つ処理する -void -Keyboard::KeyInput(uint keystat) +// キーを送信したら true を返す +bool +Keyboard::KeyInputCommon(uint keystat) { uint keycode = KC_CODE(keystat); bool ismake = KC_IS_MAKE(keystat); - assert(keycode < KC_max); - - // キーのプリプロセス - keystat = PreprocessKey(keystat); - keycode = KC_CODE(keystat); - if (keycode == KC_none) { - return; - } - // 対応する機種別キーコードがなければ無視。 // (ここでは調べるだけでまだ変換はしない) if (KeyToMDKey(keycode) == 0) { - return; + return false; } // このキーの状態が変化しないのなら何もしない。 - // X680x0 のキーリピートは X680x0Keyboard 側で処理する。 - // LUNA のキーボードにはリピートがないので、ここで何もしないだけでいい。 if (IsPressed(keycode) == ismake) { - return; - } - - // MD 固有の処理(?) - if (ProcessKey(keystat) == false) { - return; + return false; } // 処理することが確定したのでログ // (離すほうは押すほうよりログレベルを1つ上げてある) if (ismake) { - putlog(1, "MakeKey %d(%s)", keycode, GetName(keycode).c_str()); + putlog(1, "MakeKey %d(%s)", keycode, GetKeyName(keycode).c_str()); } else { - putlog(2, "BreakKey %d(%s)", keycode, GetName(keycode).c_str()); + putlog(2, "BreakKey %d(%s)", keycode, GetKeyName(keycode).c_str()); } // キーが押されてる間は VM の高速実行を抑制する @@ -207,11 +189,12 @@ Keyboard::KeyInput(uint keystat) // 機種依存のキー送信処理 SendStart(); + return true; } // キー名を返す (主にデバッグ用) const std::string -Keyboard::GetName(uint keycode) +Keyboard::GetKeyName(uint keycode) { if (keycode >= keyname.size()) { return string_format("(keycode=0x%x, out of range)", keycode);