From c5124b35e302b3ed08a7298ddef4830f1b240db0 Mon Sep 17 00:00:00 2001 From: Frater <13979047+saintfrater@users.noreply.github.com> Date: Thu, 29 Jan 2026 21:08:53 +0100 Subject: [PATCH] gestion souris OK + clipping x > 639 & y > 199 --- doc/assets/Capture-2026-01-29 210122.png | Bin 0 -> 29804 bytes readme.md | 4 +- src/bda.asm | 2 - src/boot.asm | 52 +++- src/common/debug_cga.asm | 17 +- src/drivers/gfx_cgam.asm | 375 ++++++++++------------- src/drivers/mouse_ps2.asm | 31 +- 7 files changed, 226 insertions(+), 255 deletions(-) create mode 100644 doc/assets/Capture-2026-01-29 210122.png diff --git a/doc/assets/Capture-2026-01-29 210122.png b/doc/assets/Capture-2026-01-29 210122.png new file mode 100644 index 0000000000000000000000000000000000000000..ef709b4e2b009eb1de6eddc7853133d28aa783e1 GIT binary patch literal 29804 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 AX aligned with "cl" %macro ALING_BYTE 0 @@ -88,7 +105,6 @@ graph_driver: xchg ah,al %endmacro - %macro GFX_SET_WRTIE_MODE 1 push fs @@ -101,21 +117,6 @@ graph_driver: pop ax %endmacro -; ------------------------------------------------------------ -; 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) ; @@ -139,7 +140,6 @@ cga_init: cga_none: ret - ; ------------------------------------------------------------ ; Calcule DI + AH=mask pour (CX=x, DX=y) en mode CGA 640x200 ; @@ -243,83 +243,6 @@ get_glyph_offset: add si, font8x8 ret -; --------------------------------------------------------------------------- -; cga_putc_aligned -; In : AL = char (ASCII) -; Uses: DS:GFX_CUR_* (baseDI, shift, etc.) -; Out: avance le curseur d'un caractère (8 pixels) sans recalcul complet -; Notes: -; - Nécessite une font 8x8 accessible en CS (voir get_glyph8x8_cs_si) -; - Transparent: bits 0 du glyph ne touchent pas le fond -; --------------------------------------------------------------------------- - -%ifdef FULL_MODE_ALLIGNED -cga_putc_aligned: - ; Base offset VRAM pour la scanline Y - mov di, [fs:BDA_GFX + gfx.cur_offset] - mov bx, [fs:BDA_GFX + gfx.cur_line_ofs] - mov dl, [fs:BDA_GFX + gfx.cur_mode] - - mov cx,4 -.row_loop: - ; AL = byte glyph pour cette scanline - mov ax, [cs:si] - add si,2 - - cmp dl,0 - jne .black_transparent - - ; white with transparent - or [es:di], al - or [es:di+bx], ah - jmp .next - -.black_transparent: - cmp dl,1 - jne .transparent_white - - ; black with transparent - not ax - and [es:di], al - and [es:di+bx], ah - jmp .next - -.transparent_white: - cmp dl,2 - jne .black_white - - ; transparent on white - not ax - or [es:di], al - or [es:di+bx], ah - jmp .next - -.black_white: - cmp dl,3 - jne .white_transparent - - ; white on black - mov [es:di], al - mov [es:di+bx], ah - jmp .next - -.white_transparent: - not ax - mov [es:di], al - mov [es:di+bx], ah - -.next: - add di,CGA_STRIDE - - loop .row_loop - - ; Avancer curseur d'un caractère (8 pixels) - inc word [fs:BDA_GFX + gfx.cur_offset] - add word [fs:BDA_GFX + gfx.cur_x], 8 - - ret -%endif - ; --------------------------------------------------------------------------- ; cga_putc_unalign ; In : AL = char (ASCII) @@ -328,61 +251,6 @@ cga_putc_aligned: ; - x non aligné (x&7 != 0) ; - écrit sur 2 bytes (di et di+1) dans chaque banque ; --------------------------------------------------------------------------- -cga_putc_unaligned: - ; Base offset VRAM pour la scanline Y - mov di, [fs:BDA_GFX + gfx.cur_offset] - mov bx, [fs:BDA_GFX + gfx.cur_line_ofs] - mov ch, [fs:BDA_GFX + gfx.cur_mode] - mov cl, [fs:BDA_GFX + gfx.cur_shift] - - ; mov bx, 0x2000 ; Banque +1 - - mov bp,4 -.row_loop: - - ; ligne "paire" du gylphe - mov al, [cs:si] - inc si - ALING_BYTE - push ax - - ; ligne "impaire" du gylphe - mov al, [cs:si] - inc si - ALING_BYTE - pop dx - xchg ax, dx - - cmp ch,0 - ja .black_transparent - -; white with transparent - or [es:di], ax - or [es:di+bx], dx - jmp .next - -.black_transparent: -; cmp ch,1 -; jne .transparent_white - -; black with transparent - not ax - not dx - and [es:di], ax - and [es:di+bx], dx -; jmp .next -.next: - add di,CGA_STRIDE - - dec bp - jnz .row_loop - - ; Avancer curseur d'un caractère (8 pixels) - inc word [fs:BDA_GFX + gfx.cur_offset] - add word [fs:BDA_GFX + gfx.cur_x], 8 - - ret - cga_putc: pusha push fs @@ -395,17 +263,76 @@ cga_putc: call get_glyph_offset -%ifdef FULL_MODE_ALLIGNED - cmp byte [fs:BDA_GFX + gfx.cur_shift], 0 - jne .unaligned + ; Base offset VRAM pour la scanline Y + mov di, [fs:BDA_GFX + gfx.cur_offset] + mov bx, [fs:BDA_GFX + gfx.cur_line_ofs] + mov ch, [fs:BDA_GFX + gfx.cur_mode] + mov cl, [fs:BDA_GFX + gfx.cur_shift] + mov bp,4 +.row_loop: + ; gestion du fond de texte + test ch, 00000010b ; transparent background ? + jz .skip_attribut ; oui - call cga_putc_aligned - jmp .done -.unaligned: -%endif + test ch, 00000001b ; background blanc ? + je .bkg_black + + ; background = white + mov ax, 0xFF00 + shr ax, cl + xchg al, ah + or [es:di], ax + or [es:di+bx], ax + jmp .skip_attribut + +.bkg_black: ; OK + ; background = black + mov ax, 0xFF00 + shr ax, cl + xchg al, ah + not ax + and [es:di], ax + and [es:di+bx], ax + +.skip_attribut: + ; ligne "paire" du gylphe + xor ax, ax + mov al, [cs:si] + inc si + ALING_BYTE + mov dx,ax + + ; ligne "impaire" du gylphe + mov al, [cs:si] + inc si + ALING_BYTE + xchg ax, dx + + test ch,00000001b + jz .black_text + + ; white text + not ax + not dx + and [es:di], ax + and [es:di+bx], dx + + jmp .next + +.black_text: + or [es:di], ax + or [es:di+bx], dx + +.next: + add di,CGA_STRIDE + + dec bp + jnz .row_loop + + ; Avancer curseur d'un caractère (8 pixels) + inc word [fs:BDA_GFX + gfx.cur_offset] + add word [fs:BDA_GFX + gfx.cur_x], 8 - call cga_putc_unaligned -.done: pop es pop fs popa @@ -569,6 +496,9 @@ cga_cursor_move: mov ax, BDA_DATA_SEG mov ds, ax + cmp byte [BDA_MOUSE + mouse.cur_visible], 0 + je .done + cmp byte [BDA_MOUSE + mouse.cur_drawing],0 jne .done mov byte [BDA_MOUSE + mouse.cur_drawing],1 @@ -594,7 +524,7 @@ cga_cursor_move: ; Stocke 16 DWORDs: chaque DWORD contient (b0|b1<<8|b2<<16) dans les 24 bits bas. ; ----------------------------------------------- cga_cursor_savebg: - cmp byte [BDA_MOUSE + mouse.bkg_saved], 0 + cmp byte [BDA_MOUSE + mouse.bkg_saved], 0 ; le buffer n'a pas encore été restauré jne .done mov byte [BDA_MOUSE + mouse.bkg_saved], 1 @@ -608,38 +538,22 @@ cga_cursor_savebg: ; calcule ES:DI pour (x,y) call cga_calc_addr - ; bank_add = +0x2000 si DI<0x2000 sinon -0x2000 - mov bx, 02000h - cmp di, bx - jl .bank_ok - neg bx -.bank_ok: mov [BDA_MOUSE + mouse.cur_addr_start], di - mov [BDA_MOUSE + mouse.cur_bank_add], bx - - ; DS:SI = buffer (64 bytes) lea si, [BDA_MOUSE + mouse.bkg_buffer] - mov bp, 8 ; 8 itérations = 16 lignes (pair/impair via bank) -.rowpair: + mov cx,16 +.row_loop: ; ---- ligne bank courant ---- mov eax, [es:di] ; lit b0 b1 b2 b3 - and eax, 00FFFFFFh ; ne garder que 3 bytes mov [ds:si], eax ; stocke 4 bytes (le byte haut sera 0) add si, 4 - ; ---- ligne bank opposé ---- - add di, bx ; +0x2000 ou -0x2000 - mov eax, [es:di] - and eax, 00FFFFFFh - mov [ds:si], eax - add si, 4 - - sub di, bx - add di, CGA_STRIDE*2 ; avance de 2 lignes dans bank courant - dec bp - jnz .rowpair - + xor di, 0x2000 + test di, 0x2000 + jnz .next_line + add di, CGA_STRIDE ; avance de 2 lignes dans bank courant +.next_line: + loop .row_loop .done: ret @@ -657,35 +571,20 @@ cga_cursor_restorebg: ; restaurer depuis la dernière position sauvegardée mov di, [BDA_MOUSE + mouse.cur_addr_start] - mov bx, [BDA_MOUSE + mouse.cur_bank_add] - lea si, [BDA_MOUSE + mouse.bkg_buffer] - - mov bp, 8 -.rowpair: + mov cx, 16 +.row_loop: ; ---- ligne bank courant ---- - mov eax, [ds:si] ; saved (24 bits bas) + mov eax, [ds:si] ; saved (32 bits) + mov [es:di], eax ; restore line add si, 4 - mov ecx, [es:di] ; dst actuel - and ecx, 0FF000000h ; garder b3 - and eax, 00FFFFFFh - or eax, ecx - mov [es:di], eax - ; ---- ligne bank opposé ---- - add di, bx - mov eax, [ds:si] - add si, 4 - mov ecx, [es:di] - and ecx, 0FF000000h - and eax, 00FFFFFFh - or eax, ecx - mov [es:di], eax - - sub di, bx - add di, CGA_STRIDE*2 - dec bp - jnz .rowpair + xor di, 0x2000 + test di, 0x2000 + jnz .next_line + add di, CGA_STRIDE ; avance de 2 lignes dans bank courant +.next_line: + loop .row_loop .done: ret @@ -720,6 +619,38 @@ cga_cursor_draw: mov bp, ax .y_ok: + ; On calcule si les 4 octets vont dépasser la ligne (80 octets) + ; X est en bits (0-639). X >> 3 donne l'octet de départ (0-79). + ; Si StartByte >= 77, on déborde. + + mov cx, [BDA_MOUSE + mouse.x] + shr cx, 3 ; CX = Byte Offset (0-79) + xor esi, esi ; ESI = Masque de protection (0 = tout dessiner) + + cmp cx, 76 ; 76 est le dernier offset sûr (76,77,78,79) + jbe .mask_ready ; Si <= 76, pas de débordement + + ; Calcul du débordement + ; Si CX=77 (Déborde 1 byte) -> Masque 0x000000FF (LSB car bswap) + ; Si CX=78 (Déborde 2 bytes)-> Masque 0x0000FFFF + ; Si CX=79 (Déborde 3 bytes)-> Masque 0x00FFFFFF + + cmp cx, 77 + jne .check_78 + mov esi, 0x000000FF + jmp .mask_ready +.check_78: + cmp cx, 78 + jne .check_79 + mov esi, 0x0000FFFF + jmp .mask_ready +.check_79: + mov esi, 0x00FFFFFF ; Cas extrême (bord droit) + +.mask_ready: + ; On sauvegarde ce masque pour l'utiliser dans la boucle + ; On utilise la pile pour libérer les registres + push esi ; [ESP] contient maintenant le masque ; --- ADRESSAGE --- mov cx, [BDA_MOUSE + mouse.x] @@ -747,18 +678,25 @@ cga_cursor_draw: ; --- MASQUE AND (EAX) --- mov eax, 0xFFFFFFFF - mov ax, [gs:si] ; masque AND - xchg al, ah ; Redresser pour l'ordre des pixels CGA + mov ax, [gs:si] ; masque AND + xchg al, ah ; Redresser pour l'ordre des pixels CGA bswap eax ror eax, cl + or eax, [esp+2] ; Force les bits clippés à 1 (garde le fond) + ; --- MASQUE XOR (EBX) --- xor ebx, ebx - mov bx, [gs:si+32] ; masque XOR + mov bx, [gs:si+32] ; masque XOR xchg bl, bh bswap ebx ror ebx, cl + mov edx, [esp+2] ; charge le masque de protection + not edx ; inverse le masque de protection + and ebx, edx ; applique le masque de protection + + ; --- LECTURE ET MODIFICATION (EDX) --- mov edx, [es:di] ; lecture des 16 bits a la position du curseur bswap edx @@ -780,6 +718,7 @@ cga_cursor_draw: dec bp jnz .row_loop + pop esi .exit_total: pop es pop ds diff --git a/src/drivers/mouse_ps2.asm b/src/drivers/mouse_ps2.asm index b3b60df..cc347ef 100644 --- a/src/drivers/mouse_ps2.asm +++ b/src/drivers/mouse_ps2.asm @@ -287,9 +287,15 @@ isr_mouse_handler: ; lire un octet depuis le contrôleur et le stocker dans le buffer in al, i8042_PS2_DATA ; lire octet souris - inc byte [BDA_MOUSE + mouse.blinker] - movzx bx, byte [BDA_MOUSE + mouse.idx] + cmp bl,0 + jne .read_packet + + ; check bit 3 octet 0 pour assurer que le bloc est ok: + test al, 00001000b ; bit 3 = 1 + jz .done_eoi ; allignement erroné + +.read_packet: mov byte [BDA_MOUSE + mouse.buffer + bx], al inc byte [BDA_MOUSE + mouse.idx] @@ -301,11 +307,6 @@ isr_mouse_handler: ; 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é - ; debut du décodage des données mov bl, [BDA_MOUSE + mouse.buffer] ; status mov al,bl @@ -331,28 +332,28 @@ isr_mouse_handler: ; --- CLAMPING X --- ; Check minimum (0) - cmp word [fs:BDA_MOUSE + mouse.x], 0 + cmp word [BDA_MOUSE + mouse.x], 0 jge .check_x_max - mov word [fs:BDA_MOUSE + mouse.x], 0 + mov word [BDA_MOUSE + mouse.x], 0 jmp .done_x .check_x_max: ; Check maximum (e.g., 639 for graphics, or pixel width) - cmp word [fs:BDA_MOUSE + mouse.x], GFX_WIDTH-1 ; Replace with variable or define + cmp word [BDA_MOUSE + mouse.x], GFX_WIDTH-1 ; Replace with variable or define jle .done_x - mov word [fs:BDA_MOUSE + mouse.x], GFX_WIDTH-1 + mov word [BDA_MOUSE + mouse.x], GFX_WIDTH-1 .done_x: ; --- CLAMPING Y --- ; Check minimum (0) - cmp word [fs:BDA_MOUSE + mouse.y], 0 + cmp word [BDA_MOUSE + mouse.y], 0 jge .check_y_max - mov word [fs:BDA_MOUSE + mouse.y], 0 + mov word [BDA_MOUSE + mouse.y], 0 jmp .done_y .check_y_max: ; Check maximum - cmp word [fs:BDA_MOUSE + mouse.y], GFX_HEIGHT-1 ; Replace with variable or define + cmp word [BDA_MOUSE + mouse.y], GFX_HEIGHT-1 ; Replace with variable or define jle .done_y - mov word [fs:BDA_MOUSE + mouse.y], GFX_HEIGHT-1 + mov word [BDA_MOUSE + mouse.y], GFX_HEIGHT-1 .done_y: ; check si il y a un 4eme byte a traiter