bugfixing mouse

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

View file

@ -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)
@ -285,58 +285,48 @@ 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