diff --git a/VKernel/Kernel/drivers/input/mouse/mouse.vp b/VKernel/Kernel/drivers/input/mouse/mouse.vp index f6c950a..aa730bd 100644 --- a/VKernel/Kernel/drivers/input/mouse/mouse.vp +++ b/VKernel/Kernel/drivers/input/mouse/mouse.vp @@ -17,8 +17,8 @@ define MOUSE_MIDDLE = 0x04 class mouse_packet: flags: uint8 - dx: int8 - dy: int8 + dx: uint8 # 原始幅值字节(符号在 flags.bit4) + dy: uint8 # 原始幅值字节(符号在 flags.bit5) buttons: uint8 packets: [MOUSE_BUF_SIZE]mouse_packet @@ -29,8 +29,8 @@ mse_irq_cnt: static uint64 = 0 cycle: static uint8 = 0 byte1: static uint8 = 0 -byte2: static int8 = 0 -byte3: static int8 = 0 +byte2: static uint8 = 0 +byte3: static uint8 = 0 mouse_x: static int32 = 0 mouse_y: static int32 = 0 diff --git a/VKernel/Kernel/services/desktop.vp b/VKernel/Kernel/services/desktop.vp index bcd45b8..baa302a 100644 --- a/VKernel/Kernel/services/desktop.vp +++ b/VKernel/Kernel/services/desktop.vp @@ -913,8 +913,16 @@ def _update_mouse() -> int: if mouse.has_data(): pkt: mouse.mouse_packet mouse.read_packet(&pkt) - pkt_dx = int32(pkt.dx) - pkt_dy = -int32(pkt.dy) + # PS/2 协议:dx/dy 字节是“幅值”,符号在 flags 的 bit4(X)/bit5(Y)。 + # 若按 int8 直接解释,|位移| ≥ 128 时字节最高位会被当成符号位 → 方向翻转 + # (向右快移被读成负数 → 光标一路向左撞到 x=0,“飞没了”)。 + # 故按协议用“幅值 + 符号位”重建真正的带符号位移(驱动存的是原始 uint8 幅值)。 + dx_mag: int = int(pkt.dx) + dy_mag: int = int(pkt.dy) + if (pkt.flags & 0x10) != 0: dx_mag = dx_mag - 256 + if (pkt.flags & 0x20) != 0: dy_mag = dy_mag - 256 + pkt_dx = int32(dx_mag) + pkt_dy = -int32(dy_mag) pkt_btn = pkt.buttons elif usb_mouse.has_data(): upkt: usb_mouse.usb_mouse_packet