bugfixing mouse

This commit is contained in:
saintfrater 2026-01-27 16:47:09 +01:00
commit 7b654e624c

View file

@ -22,21 +22,21 @@
; ============================================================================= ; =============================================================================
; commandes ; commandes
%define MOUSE_CMD_RESET 0xFF %define MOUSE_CMD_RESET 0xFF
%define MOUSE_CMD_DEFAULT 0xF6 %define MOUSE_CMD_DEFAULT 0xF6
%define MOUSE_EN_STREAM 0xF4 %define MOUSE_EN_STREAM 0xF4
%define MOUSE_DIS_STREAM 0xF5 %define MOUSE_DIS_STREAM 0xF5
%define MOUSE_GET_ID 0xF2 %define MOUSE_GET_ID 0xF2
%define MOUSE_SET_RATE 0xF3 %define MOUSE_SET_RATE 0xF3
%define MOUSE_ACK 0xFA %define MOUSE_ACK 0xFA
%define I8042_CMD_EN_AUX 0xA8 %define I8042_CMD_EN_AUX 0xA8
%define I8042_CMD_RD_CBYTE 0x20 %define I8042_CMD_RD_CBYTE 0x20
%define I8042_CMD_WR_CBYTE 0x60 %define I8042_CMD_WR_CBYTE 0x60
%define I8042_CMD_DIS_KBD 0xAD %define I8042_CMD_DIS_KBD 0xAD
%define I8042_CMD_DIS_MOUSE 0xA7 %define I8042_CMD_DIS_MOUSE 0xA7
%define I8042_CMD_WRITE_AUX 0xD4 %define I8042_CMD_WRITE_AUX 0xD4
; ------------------------------------------------------------ ; ------------------------------------------------------------
; remise a zero des valeurs internes du "drivers" ; remise a zero des valeurs internes du "drivers"
@ -251,7 +251,7 @@ mouse_sendcmd:
; ------------------------------------------------------------ ; ------------------------------------------------------------
; interrupt handler ; interrupt handler
; ;
; buffer[0] = status ; buffer[0] = status (voir ci-dessous)
; buffer[1] = déplacement x ; buffer[1] = déplacement x
; buffer[2] = déplacement y (inversé) ; buffer[2] = déplacement y (inversé)
; buffer[4] = molette (si PacketLen = 4) ; buffer[4] = molette (si PacketLen = 4)
@ -276,7 +276,7 @@ isr_mouse_handler:
mov ds,ax mov ds,ax
; lire un octet depuis le contrôleur et le stocker dans le buffer ; lire un octet depuis le contrôleur et le stocker dans le buffer
in al, i8042_PS2_DATA ; lire octet souris in al, i8042_PS2_DATA ; lire octet souris
movzx bx, byte [BDA_MOUSE + mouse.idx] movzx bx, byte [BDA_MOUSE + mouse.idx]
mov byte [BDA_MOUSE + mouse.buffer + bx], al mov byte [BDA_MOUSE + mouse.buffer + bx], al
@ -285,61 +285,51 @@ isr_mouse_handler:
; vérifier si le packet est complet ; vérifier si le packet est complet
mov al, [BDA_MOUSE + mouse.packetlen] mov al, [BDA_MOUSE + mouse.packetlen]
cmp byte [BDA_MOUSE + mouse.idx], al cmp byte [BDA_MOUSE + mouse.idx], al
jb .done jb .done_eoi
; packet complet, on decode les données (ou on jette si c'est incorrect)
mov byte [BDA_MOUSE + mouse.idx], 0 ; reset de l'index de lecture
; check bit 3 octet 0 pour assurer que le bloc est ok:
mov al, byte [BDA_MOUSE + mouse.buffer]
and al, 00001000b ; bit 3 = 1
je .done_eoi ; allignement erroné
; packet complet, on decode les données
mov byte [BDA_MOUSE + mouse.idx], 0
mov bl, [BDA_MOUSE + mouse.buffer] ; status mov bl, [BDA_MOUSE + mouse.buffer] ; status
mov [BDA_MOUSE + mouse.status], bl mov [BDA_MOUSE + mouse.status], bl
xor ax,ax movsx ax, byte [BDA_MOUSE + mouse.buffer+1] ; delta X
mov al, byte [BDA_MOUSE + mouse.buffer+1] ; delta X
test bl,00010000b ; signe X test bl,00010000b ; signe X
jz .x_pos jz .x_pos
or al, 0xF0 neg ax ; X est négatif
.x_pos: .x_pos:
cbw
add [BDA_MOUSE + mouse.x], ax add [BDA_MOUSE + mouse.x], ax
xor ax,ax movsx ax, byte [BDA_MOUSE + mouse.buffer+2] ; delta Y
mov al, byte [BDA_MOUSE + mouse.buffer+2] ; delta Y
test bl,00100000b ; signe Y test bl,00100000b ; signe Y
jz .y_pos jz .y_pos
or al, 0xF0 neg ax ; y est négatif
.y_pos: .y_pos:
cbw
sub [BDA_MOUSE + mouse.y], ax sub [BDA_MOUSE + mouse.y], ax
mov al, [BDA_MOUSE + mouse.packetlen]
cmp al,4
jne .done_eoi
; si packetlen = 4, gérer la molette; experimental ; si packetlen = 4, gérer la molette; experimental
movsx ax, byte [BDA_MOUSE + mouse.buffer+3] ; delta Wheel movsx ax, byte [BDA_MOUSE + mouse.buffer+3] ; delta Wheel
cbw
add word [BDA_MOUSE + mouse.wheel], ax add word [BDA_MOUSE + mouse.wheel], ax
; clamp X
cmp word [BDA_MOUSE + mouse.x], 0
jge .x_ok_low
mov word [BDA_MOUSE + mouse.x], 0
.x_ok_low:
cmp word [BDA_MOUSE + mouse.x], 639
jle .x_ok_high
mov word [BDA_MOUSE + mouse.x], 639
.x_ok_high:
; clamp Y
cmp word [BDA_MOUSE + mouse.y], 0
jge .y_ok_low
mov word [BDA_MOUSE + mouse.y], 0
.y_ok_low:
cmp word [BDA_MOUSE + mouse.y], 199
jle .y_ok_high
mov word [BDA_MOUSE + mouse.y], 199
.y_ok_high:
; call gfx_cursor_move
.done: .done:
; update la position du curseur sur l'écran
; en ce moment c'est commented out (debug)
; call gfx_cursor_move
.done_eoi:
mov al, 0x20 mov al, 0x20
out i8259_SLAVE_CMD, al ; EOI PIC esclave out i8259_SLAVE_CMD, al ; EOI PIC esclave
out i8259_MASTER_CMD, al ; EOI PIC maître out i8259_MASTER_CMD, al ; EOI PIC maître
; restaurer tous les registres ; restaurer tous les registres
pop ds pop ds