--- nono/vm/lunakbd.cpp 2026/04/29 17:04:39 1.1.1.5 +++ nono/vm/lunakbd.cpp 2026/04/29 17:04:45 1.1.1.7 @@ -41,7 +41,7 @@ LunaKeyboard::LunaKeyboard() for (int i = 1; i < 3; i++) { mouse_event[i].dev = this; mouse_event[i].func = (DeviceCallback_t)&LunaKeyboard::MouseCallback; - mouse_event[i].time = 0; + mouse_event[i].time = 2_msec * i; mouse_event[i].SetName(string_format("Mouse Slot%d", i)); } } @@ -55,7 +55,13 @@ LunaKeyboard::~LunaKeyboard() void LunaKeyboard::ResetHard() { - // マウスサンプリングは電源オン時は有効らしい + // 動作中のタイマーは一旦とめる + key_event.Stop(); + for (int i = 0; i < countof(mouse_event); i++) { + mouse_event[i].Stop(); + } + + // で、マウスサンプリングは電源オン時から有効らしい mouse_event[0].Start(); } @@ -168,7 +174,7 @@ LunaKeyboard::BreakKeyCommon(uint lunake void LunaKeyboard::SetKeyEvent(uint code) { - uint64 now = gScheduler->GetVirtTime(); + uint64 now = gMPU->GetVirtTime(); // t は現在の仮想時刻に対応するスロット uint64 t = (now / 2_msec) % 10; @@ -212,8 +218,10 @@ LunaKeyboard::MouseInput(int x, int y, b // キー入力コールバック // SIO に送信するタイミングで呼ばれる。 void -LunaKeyboard::KeyboardCallback(int code) +LunaKeyboard::KeyboardCallback(Event& ev) { + int& code = ev.code; + gSIO->Rx(1, code); key_sending = false; @@ -226,7 +234,7 @@ LunaKeyboard::KeyboardCallback(int code) // マウスサンプリングコールバック // 20msec ごとに呼ばれる。 void -LunaKeyboard::MouseSamplingCallback(int arg) +LunaKeyboard::MouseSamplingCallback(Event& ev) { int reset_x = 0; int reset_y = 0; @@ -276,13 +284,11 @@ LunaKeyboard::MouseSamplingCallback(int // 1バイト目はここで送信 gSIO->Rx(1, b); - // 2バイト目は 2msec 秒後に予約 - mouse_event[1].time = 2_msec; + // 2バイト目は 2msec 秒後に送信 mouse_event[1].code = (uint8)mouse_x; mouse_event[1].Start(); - // 3バイト目は 4msec 秒後に予約 - mouse_event[2].time = 4_msec; + // 3バイト目は 4msec 秒後に送信 mouse_event[2].code = (uint8)mouse_y; mouse_event[2].Start(); } else { @@ -297,15 +303,14 @@ LunaKeyboard::MouseSamplingCallback(int prev_m = mouse_m; // 20msec 後に再び自分を呼び出す - mouse_event[0].time = 20_msec; - mouse_event[0].Start(); + ev.Start(); } // マウスの後続バイトを送出するイベントコールバック void -LunaKeyboard::MouseCallback(int code) +LunaKeyboard::MouseCallback(Event& ev) { - gSIO->Rx(1, code); + gSIO->Rx(1, ev.code); } // ホストからの制御