--- nono/vm/x68kkbd.cpp 2026/04/29 17:05:33 1.1.1.16 +++ nono/vm/x68kkbd.cpp 2026/04/29 17:06:00 1.1.1.20 @@ -22,11 +22,13 @@ // SHIFT キーについては keyboard.cpp のコメントを参照。 #include "x68kkbd.h" +#include "event.h" #include "mfp.h" #include "monitor.h" #include "scc.h" #include "scheduler.h" #include "sysport.h" +#include "uimessage.h" // コンストラクタ X68030Keyboard::X68030Keyboard() @@ -34,7 +36,7 @@ X68030Keyboard::X68030Keyboard() led.resize(7); monitor = gMonitorManager->Regist(ID_MONITOR_KEYBOARD, this); - monitor->func = ToMonitorCallback(&X68030Keyboard::MonitorUpdate); + monitor->SetCallback(&X68030Keyboard::MonitorScreen); monitor->SetSize(47, 5); } @@ -55,14 +57,14 @@ X68030Keyboard::Init() scc = GetSCCDevice(); sysport = GetSysportDevice(); - rept_event.func = ToEventCallback(&X68030Keyboard::ReptCallback); - rept_event.time = 0; - rept_event.SetName("Keyboard Repeat"); - scheduler->RegistEvent(rept_event); - - mouse_event.func = ToEventCallback(&X68030Keyboard::MouseCallback); - mouse_event.SetName("Mouse"); - scheduler->RegistEvent(mouse_event); + auto evman = GetEventManager(); + rept_event = evman->Regist(this, + ToEventCallback(&X68030Keyboard::ReptCallback), + "Keyboard Repeat"); + + mouse_event = evman->Regist(this, + ToEventCallback(&X68030Keyboard::MouseCallback), + "Mouse"); return true; } @@ -82,7 +84,7 @@ X68030Keyboard::MDConnect() // XXX マウスの接続取り外しは未定 scheduler->StopEvent(mouse_event); - mouse_event.code = 0; + mouse_event->code = 0; } // キーボード取り外し時の MD 固有処理 @@ -91,12 +93,12 @@ X68030Keyboard::MDDisconnect() { scheduler->StopEvent(rept_event); scheduler->StopEvent(mouse_event); - mouse_event.code = 0; + mouse_event->code = 0; } // モニター void -X68030Keyboard::MonitorUpdate(Monitor *, TextScreen& screen) +X68030Keyboard::MonitorScreen(Monitor *, TextScreen& screen) { int y; @@ -117,9 +119,9 @@ X68030Keyboard::MonitorUpdate(Monitor *, // キーリピート screen.Puts(0, y, "Key Repeat:"); screen.Print(12, y++, "Delay $%x(%4umsec)", - rept_delay_data, (uint)(rept_delay / 1_msec)); + rept_delay_data, (uint)tsec_to_msec(rept_delay)); screen.Print(12, y++, "Repeat $%x(%4umsec)", - rept_time_data, (uint)(rept_time / 1_msec)); + rept_time_data, (uint)tsec_to_msec(rept_time)); // マウス int mx = mouse_x; @@ -149,7 +151,7 @@ X68030Keyboard::MonitorUpdate(Monitor *, int n = 6 - i; screen.Puts(12 + i * 5, y, TA::OnOff(led[n]), ledname[i]); if (led[n] == 0) { - val |= 1 << n; + val |= 1U << n; } } screen.Print(5, y, "$%02x", val); @@ -199,12 +201,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; @@ -224,7 +224,7 @@ X68030Keyboard::KeyInput(uint keystat) if (ismake) { // いま起きているリピートは中止 rept_key = keycode; - rept_event.time = rept_delay; + rept_event->time = rept_delay; scheduler->RestartEvent(rept_event); } else { if (keycode == rept_key) { @@ -236,14 +236,14 @@ X68030Keyboard::KeyInput(uint keystat) } void -X68030Keyboard::ReptCallback(Event& ev) +X68030Keyboard::ReptCallback(Event *ev) { // リピート sendqueue.Enqueue(KeyToMDKey(rept_key)); SendStart(); // 二回目以降のリピートは rept_time 間隔で発生 - rept_event.time = rept_time; + rept_event->time = rept_time; scheduler->StartEvent(rept_event); } @@ -331,8 +331,8 @@ X68030Keyboard::MouseSendStart() uint8 status = 0; // 最後のバイトを送るまでは、次は受け付けられない。 - // 送信中かどうかは mouse_event.code で判断している。 - if (mouse_event.code != 0) { + // 送信中かどうかは mouse_event->code で判断している。 + if (mouse_event->code != 0) { return; } @@ -365,14 +365,14 @@ X68030Keyboard::MouseSendStart() // 1バイト目は MSCTRL が立ち下がってから 700us 以上後から送信。 // さらに1バイトの送信に 2.3msec かかる(このすぐ下参照)。 - mouse_event.time = 700_usec + 2300_usec; - mouse_event.code = 1; + mouse_event->time = 700_usec + 2300_usec; + mouse_event->code = 1; scheduler->RestartEvent(mouse_event); } // マウスデータのイベントコールバック void -X68030Keyboard::MouseCallback(Event& ev) +X68030Keyboard::MouseCallback(Event *ev) { // マウスは 4800bps で、ストップビット 2 なので11ビット。 // 1/4800 * 11 = 2.29166 msec なので、1バイトあたり 2.3 msec にしておく。 @@ -382,16 +382,16 @@ X68030Keyboard::MouseCallback(Event& ev) // code 3 なら3バイト目 (mouse_data[2]) の送信完了時刻が来た。 // 3バイト目を送信してイベントループ終了。 - scc->Rx(1, mouse_data[mouse_event.code - 1]); + scc->Rx(1, mouse_data[mouse_event->code - 1]); - if (mouse_event.code < 3) { + if (mouse_event->code < 3) { // 次のイベント - mouse_event.time = 2300_usec; - mouse_event.code++; + mouse_event->time = 2300_usec; + mouse_event->code++; scheduler->StartEvent(mouse_event); } else { // 3 バイト目の送信が終わった。 - mouse_event.code = 0; + mouse_event->code = 0; } } @@ -423,6 +423,7 @@ X68030Keyboard::Command(uint32 data) // 0 が明るく 3 が暗いので、明るさというより暗さ。 led_darkness = (data & 3); putlog(1, "Command LED brightness %u", led_darkness); + uimessage->Post(UIMessage::KEYBOARD); } else if (data < 0x5c) { // $58-$5b 本体からのディスプレイ制御許可 @@ -439,14 +440,14 @@ X68030Keyboard::Command(uint32 data) rept_delay_data = data & 15; rept_delay = 200_msec + rept_delay_data * 100_msec; putlog(1, "Command Repeat Delay %u (%u msec)", rept_delay_data, - (uint)(rept_delay / 1_msec)); + (uint)tsec_to_msec(rept_delay)); } else if (data < 0x80) { // $70-$7f リピート間隔 rept_time_data = data & 15; rept_time = 30_msec + rept_time_data * rept_time_data * 5_msec; putlog(1, "Command Repeat time %d (%u msec)", rept_time_data, - (uint)(rept_time / 1_msec)); + (uint)tsec_to_msec(rept_time)); } else { // $80-$ff LED 制御 @@ -458,6 +459,7 @@ X68030Keyboard::Command(uint32 data) led[i] = ((data & b) == 0); b <<= 1; } + uimessage->Post(UIMessage::KEYBOARD); } } @@ -467,7 +469,7 @@ X68030Keyboard::Command(uint32 data) X68030Keyboard::keycode2x68kkey_table[KC_max] = { NoKey, // [00] X68kKey_BREAK, // [01] - X68kKey_COPY, // [02] + NoKey, // [02] X68kKey_romaji, // [03] X68kKey_code, // [04] X68kKey_kigou, // [05] @@ -485,7 +487,7 @@ X68030Keyboard::keycode2x68kkey_table[KC X68kKey_ESC, // [10] X68kKey_BS, // [11] X68kKey_enter, // [12] - X68kKey_INS, // [13] + NoKey, // [13] X68kKey_space, // [14] X68kKey_DEL, // [15] NoKey, // [16] @@ -499,8 +501,8 @@ X68030Keyboard::keycode2x68kkey_table[KC X68kKey_right, // [1e] X68kKey_down, // [1f] - X68kKey_ROLLUP, // [20] - X68kKey_ROLLDOWN, // [21] + X68kKey_INS, // [20] + X68kKey_COPY, // [21] X68kKey_1, // [22] X68kKey_2, // [23] X68kKey_3, // [24] @@ -516,8 +518,8 @@ X68030Keyboard::keycode2x68kkey_table[KC X68kKey_backslash, // [2e] NoKey, // [2f] - X68kKey_OPT1, // [30] - X68kKey_OPT2, // [31] + NoKey, // [30] + NoKey, // [31] X68kKey_Q, // [32] X68kKey_W, // [33] X68kKey_E, // [34] @@ -533,7 +535,7 @@ X68030Keyboard::keycode2x68kkey_table[KC X68kKey_hira, // [3e] X68kKey_zenkaku, // [3f] - X68kKey_HOME, // [40] + NoKey, // [40] X68kKey_UNDO, // [41] X68kKey_A, // [42] X68kKey_S, // [43] @@ -547,8 +549,8 @@ X68030Keyboard::keycode2x68kkey_table[KC X68kKey_semicolon, // [4b] X68kKey_colon, // [4c] X68kKey_bracketright, // [4d] - NoKey, // [4e] - NoKey, // [4f] + X68kKey_OPT1, // [4e] + X68kKey_OPT2, // [4f] X68kKey_XF1, // [50] X68kKey_XF2, // [51] @@ -567,7 +569,7 @@ X68030Keyboard::keycode2x68kkey_table[KC X68kKey_XF4, // [5e] X68kKey_XF5, // [5f] - NoKey, // [60] + X68kKey_HOME, // [60] X68kKey_PAD_plus, // [61] X68kKey_PAD_minus, // [62] X68kKey_PAD_7, // [63] @@ -584,8 +586,8 @@ X68030Keyboard::keycode2x68kkey_table[KC X68kKey_PAD_enter, // [6e] X68kKey_PAD_CLR, // [6f] - NoKey, // [70] - NoKey, // [71] + X68kKey_ROLLUP, // [70] + X68kKey_ROLLDOWN, // [71] X68kKey_F1, // [72] X68kKey_F2, // [73] X68kKey_F3, // [74]