--- nono/vm/x68kkbd.cpp 2026/04/29 17:05:29 1.1.1.15 +++ nono/vm/x68kkbd.cpp 2026/04/29 17:05:42 1.1.1.17 @@ -23,6 +23,7 @@ #include "x68kkbd.h" #include "mfp.h" +#include "monitor.h" #include "scc.h" #include "scheduler.h" #include "sysport.h" @@ -32,9 +33,9 @@ X68030Keyboard::X68030Keyboard() { led.resize(7); - monitor.func = ToMonitorCallback(&X68030Keyboard::MonitorUpdate); - monitor.SetSize(47, 5); - monitor.Regist(ID_MONITOR_KEYBOARD); + monitor = gMonitorManager->Regist(ID_MONITOR_KEYBOARD, this); + monitor->func = ToMonitorCallback(&X68030Keyboard::MonitorUpdate); + monitor->SetSize(47, 5); } // デストラクタ @@ -198,12 +199,10 @@ X68030Keyboard::KeyInput(uint keystat) // どのキーコードで問い合わせをされても KC_SHIFT_L と KC_SHIFT_R の OR が // [SHIFT] キーの状態である。 if (keycode == KC_SHIFT_L || keycode == KC_SHIFT_R) { - // KC_SHIFT_L, R に対する pressed は内部の OR 処理用 - pressed[keycode] = ismake; - if (keycode == KC_SHIFT_L && pressed[KC_SHIFT_R]) { - return; - } - if (keycode == KC_SHIFT_R && pressed[KC_SHIFT_L]) { + // それぞれのシフトキーが押されたことは覚えておく。 + SetPressed(keycode, ismake); + // 反対側のキーが押されていたら、いま押した・離したほうは無視する + if (IsPressed(keycode ^ 1)) { return; } keycode = KC_SHIFT;