--- nono/vm/x68kkbd.cpp 2026/04/29 17:04:56 1.1.1.6 +++ nono/vm/x68kkbd.cpp 2026/04/29 17:05:03 1.1.1.8 @@ -19,6 +19,7 @@ #include "x68kkbd.h" #include "mfp.h" +#include "scc.h" #include "sysport.h" // コンストラクタ @@ -29,6 +30,14 @@ X68030Keyboard::X68030Keyboard() rept_event.func = (DeviceCallback_t)&X68030Keyboard::ReptCallback; rept_event.time = 0; rept_event.SetName("Keyboard Repeat"); + + for (int i = 0; i < mouse_event.size(); i++) { + mouse_event[i].dev = this; + mouse_event[i].func = (DeviceCallback_t)&X68030Keyboard::MouseCallback; + // 700us 後から 11bit を 4800 bps の速度で送る + mouse_event[i].time = 700_usec + 1_sec * 11 * (i + 1) / 4800; + mouse_event[i].SetName(string_format("Mouse Data %d", i)); + } } // デストラクタ @@ -51,6 +60,10 @@ X68030Keyboard::ResetHard() led[i] = false; } led_darkness = 0; + + for (int i = 0; i < mouse_event.size(); i++) { + mouse_event[i].Stop(); + } } // 共通キーコードを X680x0 キーコードに変換して返す。 @@ -97,8 +110,9 @@ X68030Keyboard::KeyInput(uint keystat) return; } keycode = KC_SHIFT; + // keycode を変更したので keystat も更新 - keystat = keycode | (ismake ? KC_FLAG_MAKE : KC_FLAG_BREAK); + keystat = (keystat & 0xff00) | keycode; } // 共通処理へ @@ -210,6 +224,62 @@ X68030Keyboard::Ready() void X68030Keyboard::MouseInput(int x, int y, bool rb, bool lb, bool mb) { + // ホストからマウスイベントのたびに呼ばれるので、ここで積算。 + // 20msec ごとのサンプリングのタイミングで積算結果を処理する。 + // X68k のマウスの Y 方向は下に動く方向がプラス。 + mouse_x += x; + mouse_y += y; + mouse_r = rb; + mouse_l = lb; +} + +// マウスデータを VM に送信 +void +X68030Keyboard::MouseSendStart() +{ + uint8 status = 0; + + // 最後のバイトを送るまでは、次は受け付けられない + if (mouse_event[2].IsRunning()) { + return; + } + + if (mouse_x > 127) { + status |= XOVFL; + mouse_x = 127; + } + if (mouse_x < -128) { + status |= XUNFL; + mouse_x = -128; + } + if (mouse_y > 127) { + status |= YOVFL; + mouse_y = 127; + } + if (mouse_y < -128) { + status |= YUNFL; + mouse_y = -128; + } + status |= mouse_l ? SW_L : 0; + status |= mouse_r ? SW_R : 0; + + mouse_event[0].code = status; + mouse_event[1].code = mouse_x; + mouse_event[2].code = mouse_y; + + mouse_x = 0; + mouse_y = 0; + + mouse_event[0].Start(); + mouse_event[1].Start(); + mouse_event[2].Start(); +} + +void +X68030Keyboard::MouseCallback(Event& ev) +{ + // LUNA とオブジェクトが違うだけ + gSCC->Rx(1, ev.code); } // ホストからの制御