fixed mouse handler + mouse cursor test
This commit is contained in:
parent
7b654e624c
commit
3bace5f64d
3 changed files with 122 additions and 147 deletions
78
src/boot.asm
78
src/boot.asm
|
|
@ -50,7 +50,7 @@ bits 16
|
|||
err_vganok db 'VGA Not Initialized',0
|
||||
;err_end db 'code completed successfully',0
|
||||
|
||||
cpt_txt db '0123456789A123456789B123456789C123456789D123456789E123456789F123456789',0
|
||||
cpt_txt db '0123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789',0
|
||||
helloworld db 'Hello World !',0
|
||||
|
||||
reset:
|
||||
|
|
@ -63,13 +63,12 @@ reset:
|
|||
|
||||
; installé une table d'interruption "dummy"
|
||||
call ivt_setup
|
||||
|
||||
call bda_setup
|
||||
|
||||
; test IRQ 0
|
||||
; Install IRQ 0 : timer_isr
|
||||
mov ax,cs
|
||||
mov dx,ax
|
||||
mov bx,test_isr
|
||||
mov bx,timer_isr
|
||||
mov ax,i8259_MASTER_INT
|
||||
|
||||
call ivt_setvector
|
||||
|
|
@ -101,7 +100,7 @@ reset:
|
|||
call mouse_reset
|
||||
;call mouse_init
|
||||
|
||||
; GFX_DRV GFX_CRS_UPDATE
|
||||
GFX_DRV GFX_CRS_UPDATE
|
||||
|
||||
GFX_SET_WRTIE_MODE GFX_TXT_BLACK_ON_WHITE
|
||||
|
||||
|
|
@ -140,74 +139,7 @@ reset:
|
|||
endless:
|
||||
mov ax,BDA_DATA_SEG
|
||||
mov ds,ax
|
||||
|
||||
;mov dx,0x300
|
||||
;call scr_gotoxy
|
||||
|
||||
;mov al, byte [BDA_TIMER]
|
||||
;call scr_puthex8
|
||||
|
||||
;cmp byte [BDA_TIMER],5
|
||||
;ja .skip2
|
||||
|
||||
;mov ax, [BDA_MOUSE + mouse.x]
|
||||
;add ax, 25
|
||||
;cmp ax,640
|
||||
;jb .moveok
|
||||
;
|
||||
mov ax,0
|
||||
.moveok:
|
||||
mov [BDA_MOUSE + mouse.x],ax
|
||||
;
|
||||
GFX_DRV GFX_CRS_UPDATE
|
||||
|
||||
cmp byte [BDA_MOUSE + mouse.buffer+1], 0
|
||||
jge .skip
|
||||
|
||||
;mov dx,0x400
|
||||
;call scr_gotoxy
|
||||
|
||||
;mov al, byte [BDA_MOUSE + mouse.buffer+1]
|
||||
;call scr_puthex8
|
||||
.skip:
|
||||
;cmp byte [BDA_MOUSE + mouse.buffer+2], 0
|
||||
;jge .skip2
|
||||
|
||||
;mov dx,0x404
|
||||
;call scr_gotoxy
|
||||
|
||||
;mov al, byte [BDA_MOUSE + mouse.buffer+2]
|
||||
;call scr_puthex8
|
||||
.skip2:
|
||||
;mov dx,0
|
||||
;call scr_gotoxy
|
||||
|
||||
;mov ax,[BDA_MOUSE] ; adresse début dump
|
||||
;mov si,ax
|
||||
mov cx, 0x20
|
||||
.dump:
|
||||
; test cx,0x000F
|
||||
; jnz .sameline
|
||||
; inc dh
|
||||
; xor dl,dl
|
||||
; call scr_gotoxy
|
||||
;.sameline:
|
||||
; mov al,[ds:si]
|
||||
; inc si
|
||||
|
||||
; push ds
|
||||
; push si
|
||||
|
||||
; call scr_puthex8
|
||||
; mov al,' '
|
||||
; call scr_putc
|
||||
|
||||
; pop si
|
||||
; pop ds
|
||||
|
||||
nop
|
||||
|
||||
loop .dump
|
||||
|
||||
jmp endless
|
||||
|
||||
|
|
@ -215,7 +147,7 @@ endless:
|
|||
; -----------------------------------------------------------
|
||||
; timer ISR (IRQ -> INT)
|
||||
; -----------------------------------------------------------
|
||||
test_isr:
|
||||
timer_isr:
|
||||
push ax
|
||||
|
||||
push fs
|
||||
|
|
|
|||
|
|
@ -594,64 +594,98 @@ cga_cursor_move:
|
|||
cga_cursor_draw:
|
||||
push ds
|
||||
push es
|
||||
push fs
|
||||
push gs
|
||||
pushad
|
||||
|
||||
; -----------------------------
|
||||
; ES = VRAM
|
||||
; -----------------------------
|
||||
mov ax, VIDEO_SEG
|
||||
mov es, ax
|
||||
|
||||
mov ax, BDA_DATA_SEG
|
||||
mov ds, ax
|
||||
; -----------------------------
|
||||
; GS:SI = sprite (AND puis XOR à +32)
|
||||
; -----------------------------
|
||||
mov ax, [BDA_MOUSE + mouse.cur_seg]
|
||||
mov gs, ax
|
||||
mov si, [BDA_MOUSE + mouse.cur_ofs]
|
||||
mov ax, VIDEO_SEG
|
||||
mov es, ax
|
||||
|
||||
; -----------------------------
|
||||
; Charger x,y
|
||||
; CX = x, DX = y
|
||||
; -----------------------------
|
||||
; --- CLIPPING VERTICAL (Y) ---
|
||||
mov dx, [BDA_MOUSE + mouse.y]
|
||||
cmp dx, 200
|
||||
jae .exit ; Trop bas ou négatif (si signé)
|
||||
|
||||
mov bp, 16 ; Hauteur max du sprite
|
||||
mov ax, 200
|
||||
sub ax, dx ; AX = nombre de lignes restantes à l'écran
|
||||
cmp bp, ax
|
||||
jbe .y_clip_ok
|
||||
mov bp, ax ; On réduit la boucle à la place restante
|
||||
.y_clip_ok:
|
||||
|
||||
; --- SETUP POINTEURS ---
|
||||
mov cx, [BDA_MOUSE + mouse.x]
|
||||
mov dx, [BDA_MOUSE + mouse.y]
|
||||
call cga_calc_addr ; DI = offset VRAM
|
||||
|
||||
; get DI = offset de départ x,y
|
||||
; on ignore le bitmask retourné
|
||||
call cga_calc_addr
|
||||
mov ax, [BDA_MOUSE + mouse.cur_seg]
|
||||
mov fs, ax
|
||||
mov si, [BDA_MOUSE + mouse.cur_ofs] ; FS:SI = Sprite data
|
||||
|
||||
mov ax, CGA_ODD_BANK
|
||||
; --- SETUP STRIDES ---
|
||||
mov bx, CGA_ODD_BANK ; Stride 1: Vers banque opposée
|
||||
mov dx, -CGA_ODD_BANK+80 ; Stride 2: Vers banque origine + 1 ligne
|
||||
test word [BDA_MOUSE + mouse.y], 1
|
||||
jz .strides_ok
|
||||
xchg bx, dx
|
||||
.strides_ok:
|
||||
|
||||
test cx, 0x0001 ; y est pair: +0x2000
|
||||
; --- SHIFT COUNT ---
|
||||
and cx, 7 ; CL = Shift (0..7)
|
||||
|
||||
jz .addr_even
|
||||
neg ax ; y impair: -0x2000
|
||||
|
||||
.addr_even:
|
||||
; conservation du pas entre les 2 banques de VRAM
|
||||
mov [BDA_MOUSE + mouse.cur_bank_add], ax
|
||||
|
||||
; calcul du bit rotation du curseur
|
||||
mov ax, cx
|
||||
and ax, 0x07
|
||||
mov [BDA_MOUSE + mouse.cur_bit_ofs], al
|
||||
|
||||
; curseur = 16 lignes
|
||||
mov cx, 16
|
||||
.row_loop:
|
||||
xor eax,eax
|
||||
xor ebx,ebx
|
||||
; --- CONSTRUCTION DU MASQUE AND (EAX) ---
|
||||
; On veut 11111111 (L) (R) 11111111 sur 32 bits, puis décalé
|
||||
mov eax, 0x0000FFFF ; Masque neutre
|
||||
mov ah, [fs:si] ; Octet sprite gauche
|
||||
mov al, [fs:si+1] ; Octet sprite droit
|
||||
not ax ; On inverse pour le masque AND (0=sprite, 1=fond)
|
||||
ror eax, 16 ; EAX = 1111 1111 | 1111 1111 | (InvL) | (InvR)
|
||||
|
||||
;
|
||||
; --- CONSTRUCTION DU MASQUE XOR (EBX) ---
|
||||
xor ebx, ebx
|
||||
mov bh, [fs:si+32] ; Sprite XOR gauche
|
||||
mov bl, [fs:si+33] ; Sprite XOR droit
|
||||
; EBX = 0000 0000 | 0000 0000 | (XorL) | (XorR)
|
||||
|
||||
.done:
|
||||
; --- DECALAGE DES MASQUES ---
|
||||
; On décale à droite pour aligner sur le pixel X exact
|
||||
; Pour EAX, on doit injecter des '1' à gauche lors du shift
|
||||
push ecx
|
||||
mov ch, cl ; Sauver shift
|
||||
shr ebx, cl ; EBX prêt
|
||||
|
||||
push edx
|
||||
mov edx, 0xFFFFFFFF
|
||||
shrd eax, edx, cl ; SHRD injecte les 1 de EAX dans ECX
|
||||
pop edx
|
||||
|
||||
; --- READ-MODIFY-WRITE (SÉCURISÉ) ---
|
||||
; On traite 3 octets (24 bits) pour couvrir le débordement du shift
|
||||
mov edx, [es:di] ; Lit 4 octets (b0, b1, b2, b3)
|
||||
|
||||
; Note: On travaille en Little-Endian ici, donc le shift visuel
|
||||
; est inverse. Pour simplifier, on applique les masques
|
||||
; directement si on considère EAX/EBX comme des flux de bits.
|
||||
|
||||
and edx, eax
|
||||
xor edx, ebx
|
||||
|
||||
; Réécriture partielle pour ne pas toucher au 4ème octet (b3)
|
||||
mov [es:di], dx ; Ecrit b0 et b1
|
||||
shr edx, 16
|
||||
mov [es:di+2], dl ; Ecrit b2 uniquement
|
||||
|
||||
; --- PROCHAINE LIGNE ---
|
||||
add di, bx
|
||||
xchg bx, dx ; Alternance banques
|
||||
add si, 2 ; Prochaine ligne du sprite
|
||||
dec bp
|
||||
jnz .row_loop
|
||||
|
||||
.exit:
|
||||
popad
|
||||
pop gs
|
||||
pop fs
|
||||
pop es
|
||||
pop ds
|
||||
ret
|
||||
|
|
|
|||
|
|
@ -50,18 +50,22 @@ mouse_reset:
|
|||
mov byte [fs:BDA_MOUSE + mouse.idx],0
|
||||
mov dword [fs:BDA_MOUSE + mouse.buffer],0
|
||||
mov byte [fs:BDA_MOUSE + mouse.packetlen],3 ; 3 bytes par défaut
|
||||
mov byte [fs:BDA_MOUSE + mouse.status],0
|
||||
mov word [fs:BDA_MOUSE + mouse.x],320 ; vous pouvez aussi préciser le centre
|
||||
mov word [fs:BDA_MOUSE + mouse.y],100 ; vous pouvez aussi préciser le centre
|
||||
; experiemntal
|
||||
mov word [fs:BDA_MOUSE + mouse.wheel],0
|
||||
mov byte [fs:BDA_MOUSE + mouse.cur_visible], 1
|
||||
mov word [fs:BDA_MOUSE + mouse.cur_x], 0
|
||||
mov word [fs:BDA_MOUSE + mouse.cur_y], 0
|
||||
mov byte [fs:BDA_MOUSE + mouse.cur_drawing], 0
|
||||
mov byte [fs:BDA_MOUSE + mouse.status],0
|
||||
|
||||
mov word [fs:BDA_MOUSE + mouse.x],320 ; vous pouvez aussi préciser le centre
|
||||
mov word [fs:BDA_MOUSE + mouse.y],100 ; vous pouvez aussi préciser le centre
|
||||
|
||||
mov byte [fs:BDA_MOUSE + mouse.cur_visible], 1
|
||||
mov word [fs:BDA_MOUSE + mouse.cur_x], 0
|
||||
mov word [fs:BDA_MOUSE + mouse.cur_y], 0
|
||||
mov byte [fs:BDA_MOUSE + mouse.cur_drawing], 0
|
||||
|
||||
mov ax, cs
|
||||
mov word [fs:BDA_MOUSE + mouse.cur_seg], ax
|
||||
mov word [fs:BDA_MOUSE + mouse.cur_ofs], mouse_arrow
|
||||
mov word [fs:BDA_MOUSE + mouse.cur_seg], ax
|
||||
mov word [fs:BDA_MOUSE + mouse.cur_ofs], mouse_arrow
|
||||
|
||||
; experiemntal
|
||||
mov word [fs:BDA_MOUSE + mouse.wheel],0
|
||||
ret
|
||||
|
||||
; ------------------------------------------------------------
|
||||
|
|
@ -276,7 +280,7 @@ isr_mouse_handler:
|
|||
mov ds,ax
|
||||
|
||||
; 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]
|
||||
mov byte [BDA_MOUSE + mouse.buffer + bx], al
|
||||
|
|
@ -288,37 +292,42 @@ isr_mouse_handler:
|
|||
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
|
||||
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é
|
||||
and al, 00001000b ; bit 3 = 1
|
||||
je .done_eoi ; allignement erroné
|
||||
|
||||
|
||||
|
||||
mov bl, [BDA_MOUSE + mouse.buffer] ; status
|
||||
mov [BDA_MOUSE + mouse.status], bl
|
||||
; debut du décodage des données
|
||||
mov bl, [BDA_MOUSE + mouse.buffer] ; status
|
||||
mov al,bl
|
||||
; --- BOUTONS (Optionnel mais recommandé) ---
|
||||
and al, 00000111b ; Bits 0, 1, 2 = Gauche, Droite, Milieu
|
||||
mov [BDA_MOUSE + mouse.status], al
|
||||
|
||||
movsx ax, byte [BDA_MOUSE + mouse.buffer+1] ; delta X
|
||||
test bl,00010000b ; signe X
|
||||
xor ax,ax
|
||||
mov al, byte [BDA_MOUSE + mouse.buffer+1] ; delta X
|
||||
test bl,00010000b ; signe X
|
||||
jz .x_pos
|
||||
neg ax ; X est négatif
|
||||
mov ah,0xff ; X est négatif
|
||||
.x_pos:
|
||||
add [BDA_MOUSE + mouse.x], ax
|
||||
|
||||
movsx ax, byte [BDA_MOUSE + mouse.buffer+2] ; delta Y
|
||||
test bl,00100000b ; signe Y
|
||||
xor ax,ax
|
||||
mov al, byte [BDA_MOUSE + mouse.buffer+2] ; delta Y
|
||||
test bl,00100000b ; signe Y
|
||||
jz .y_pos
|
||||
neg ax ; y est négatif
|
||||
mov ah,0xff ; y est négatif
|
||||
.y_pos:
|
||||
sub [BDA_MOUSE + mouse.y], ax
|
||||
|
||||
; check si il y a un 4eme byte a traiter
|
||||
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 et non fonctionnel
|
||||
movsx ax, byte [BDA_MOUSE + mouse.buffer+3] ; delta Wheel
|
||||
add word [BDA_MOUSE + mouse.wheel], ax
|
||||
|
||||
|
|
@ -328,8 +337,8 @@ isr_mouse_handler:
|
|||
; call gfx_cursor_move
|
||||
.done_eoi:
|
||||
mov al, 0x20
|
||||
out i8259_SLAVE_CMD, al ; EOI PIC esclave
|
||||
out i8259_MASTER_CMD, al ; EOI PIC maître
|
||||
out i8259_SLAVE_CMD, al ; EOI PIC esclave
|
||||
out i8259_MASTER_CMD, al ; EOI PIC maître
|
||||
|
||||
; restaurer tous les registres
|
||||
pop ds
|
||||
|
|
|
|||
Loading…
Reference in a new issue