fixing mouse struc + gfx

This commit is contained in:
Frater 2026-01-20 21:25:31 +01:00
commit 36cf876338
2 changed files with 59 additions and 8 deletions

View file

@ -32,6 +32,34 @@
%define CGA_STRIDE 80
%define CGA_ODD_BANK 0x2000
; ------------------------------------------------------------
; TABLE DE SAUT (VECTEURS API)
; Cette table doit être située au début du driver pour être
; accessible par la GUI à des offsets fixes.
; ------------------------------------------------------------
gfx_api_table:
jmp gfx_init ; Offset +0: Initialisation
jmp gfx_putpixel ; Offset +3: Dessin pixel
jmp gfx_getpixel ; Offset +6: Lecture pixel
jmp gfx_fill_rect ; Offset +9: Remplissage rectangle (Nouveau)
jmp gfx_invert_rect ; Offset +12: Inversion (Nouveau pour Menus)
jmp gfx_draw_hline ; Offset +15: Ligne horizontale rapide (Nouveau)
; ------------------------------------------------------------
; COMMENTAIRE SUR LA MÉTHODE D'APPEL
;
; Pour appeler une fonction du driver depuis votre GUI :
; 1. Définissez l'adresse de base du driver (ex: GFX_DRIVER_BASE)
; 2. Utilisez un call indirect via l'offset de la table.
;
; Exemple en ASM pour remplir un rectangle :
; call [GFX_DRIVER_BASE + 9] ; Appelle gfx_fill_rect
;
; Cette méthode isole totalement votre bibliothèque GUI du driver.
; Si vous changez le code du driver, tant que la table au début
; ne change pas d'ordre, la GUI n'a pas besoin d'être recompilée.
; ------------------------------------------------------------
; ------------------------------------------------------------
; initialise le mode graphique (via l'int 10h)
;
@ -83,6 +111,31 @@ gfx_calc_addr:
pop cx
ret
; ------------------------------------------------------------
; Dessine un pixel, accès VRAM direct.
;
; CX = x (0..639)
; DX = y (0..199)
; ES = Target Segment (usually VIDEO_SEG)
; BL = color (0=black, !=0=white)
; ------------------------------------------------------------
gfx_local_putpixel:
call gfx_calc_addr
; write
cmp bl, 0
je .clear
.set:
or byte [es:di], ah
jmp .done
.clear:
not ah
and byte [es:di], ah
.done:
ret
; ------------------------------------------------------------
; Dessine un pixel, accès VRAM direct.
;
@ -91,7 +144,7 @@ gfx_calc_addr:
; BL = color (0=black, !=0=white)
; ------------------------------------------------------------
gfx_putpixel:
pusha
push ax
push di
push es
@ -113,7 +166,7 @@ gfx_putpixel:
.done:
pop es
pop di
popa
pop ax
ret
; ------------------------------------------------------------
@ -121,7 +174,6 @@ gfx_putpixel:
; Out: AL=0/1
; ------------------------------------------------------------
gfx_getpixel:
push ax
push di
push es
@ -132,7 +184,6 @@ gfx_getpixel:
pop es
pop di
pop ax
ret
; ------------------------------------------------------------
@ -510,7 +561,7 @@ gfx_cursor_restorebg:
jl .no_odd_bank
neg dx ; Y est déja une ligne impaire, on retire l'offset
.no_odd_bank:
mov ax, BDA_MOUSE + mouse.bkg_buffer
mov si, ax ; DS:SI = buffer de sauvegarde
mov bx, 8

View file

@ -384,12 +384,12 @@ isr_mouse_handler:
mov word [BDA_MOUSE + mouse.y], 199
.y_ok_high:
; restaurer l'ancien arrière plan du curseur
;call gfx_cursor_restorebg
call gfx_cursor_restorebg
; sauvegarder le nouvel arrière plan du curseur
;call gfx_cursor_savebg
call gfx_cursor_savebg
;call gfx_cursor_draw
call gfx_cursor_draw
.done:
mov al, 0x20