This commit is contained in:
Frater 2026-01-30 17:18:35 +01:00
commit c4b8a6b317
3 changed files with 84 additions and 118 deletions

View file

@ -104,52 +104,24 @@ reset:
; on active le mode graphique ; on active le mode graphique
GFX INIT GFX INIT
; DEMO
GFX GOTOXY, 290, 80
GFX TXT_MODE, GFX_TXT_WHITE_TRANSPARENT
GFX WRITE, cs, W_T
GFX GOTOXY, 290, 90
GFX TXT_MODE, GFX_TXT_BLACK_TRANSPARENT
GFX WRITE, cs, B_T
GFX GOTOXY, 290, 100
GFX TXT_MODE, GFX_TXT_WHITE
GFX WRITE, cs, W_B
GFX GOTOXY, 290, 110
GFX TXT_MODE, GFX_TXT_BLACK
GFX WRITE, cs, B_W
; call mouse_reset
call mouse_init call mouse_init
GFX TXT_MODE, GFX_TXT_BLACK
GFX GOTOXY, 0, 0
GFX WRITE, cs, cpt_txt
GFX TXT_MODE, GFX_TXT_WHITE_TRANSPARENT
GFX GOTOXY, 8,8
GFX WRITE, cs, helloworld
GFX MOUSE_MOVE GFX MOUSE_MOVE
GFX MOUSE_SHOW
GFX LINE_VERT, 55, 30, 147, 1 push cs
GFX LINE_VERT, 54, 31, 148, 0 pop ds
GUI WINDOW, 50,50,250,100,helloworld
; GFX RECTANGLE_DRAW, 50,50,250,100,0
;GFX LINE_VERT, 50, 50, 100, 0
;GFX LINE_VERT, 300, 50, 100, 0
;GFX LINE_HORIZ, 50, 300, 50, 0
;GFX LINE_HORIZ, 50, 300, 100, 0
mov cx,8
mov dx,24
.loopshift:
GFX GOTOXY, cx, dx
GFX WRITE, cs, helloworld
add dx,8
inc cx
cmp cx,16
jbe .loopshift
mov ax,BDA_DATA_SEG mov ax,BDA_DATA_SEG
mov ds,ax mov ds,ax

View file

@ -77,8 +77,8 @@
%define WRITE 6 %define WRITE 6
%define LINE_VERT 7 %define LINE_VERT 7
%define LINE_HORIZ 8 %define LINE_HORIZ 8
%define DRAW_RECT 9 %define RECTANGLE_DRAW 9
%define FILL_RECT 10 %define RECTANGLE_FILL 10
%define MOUSE_HIDE 11 %define MOUSE_HIDE 11
%define MOUSE_SHOW 12 %define MOUSE_SHOW 12
%define MOUSE_MOVE 13 %define MOUSE_MOVE 13
@ -110,12 +110,6 @@ graph_driver:
dw cga_mouse_show ; déplacement du curseur dw cga_mouse_show ; déplacement du curseur
dw cga_mouse_cursor_move ; déplacement du curseur dw cga_mouse_cursor_move ; déplacement du curseur
; jmp gfx_fill_rect ; Remplissage rectangle (Nouveau)
; jmp gfx_invert_rect ; Offset +12: Inversion (Nouveau pour Menus)
; jmp gfx_draw_hline ; Offset +15: Ligne horizontale rapide (Nouveau)
%include "./common/cursor.asm" %include "./common/cursor.asm"
%include "./common/chartable.asm" %include "./common/chartable.asm"
@ -643,25 +637,21 @@ cga_line_horizontal:
.x_sorted: .x_sorted:
; 2. Calculer l'adresse de départ ; 2. Calculer l'adresse de départ
; On a besoin de l'adresse de l'octet contenant AX.
; AX (X_Start) et BX (X_End) sont conservés.
mov cx, ax ; CX = X_Start pour cga_calc_addr mov cx, ax ; CX = X_Start pour cga_calc_addr
mov dx, .y ; DX = Y mov dx, .y ; DX = Y
push bx ; Sauvegarde X_End [1] push bx ; Sauve X_End
call cga_calc_addr ; DI = Offset VRAM, AH = BitMask (on ne servira pas de AH ici) push ax ; <--- AJOUT CRITIQUE : Sauve X_Start (AX)
pop bx ; Récupère X_End [1] call cga_calc_addr ; DI = Offset VRAM (AX est détruit ici !)
pop ax ; <--- RESTAURATION : On récupère le bon X1
pop bx ; Restaure X_End
; 3. Préparer la couleur ; 3. Préparer la couleur
mov dl, .color ; DL = Couleur (0 ou 1) mov dl, .color ; DL = Couleur
; --- ANALYSE DES OCTETS --- ; --- ANALYSE DES OCTETS ---
; Index Octet Début = X1 >> 3
; Index Octet Fin = X2 >> 3
mov si, ax mov si, ax
shr si, 3 ; SI = Index octet start shr si, 3 ; SI = Index octet start (Calcul correct maintenant)
mov cx, bx mov cx, bx
shr cx, 3 ; CX = Index octet end shr cx, 3 ; CX = Index octet end
@ -675,30 +665,26 @@ cga_line_horizontal:
; ============================================ ; ============================================
; --- A. PARTIE GAUCHE (Start) --- ; --- A. PARTIE GAUCHE (Start) ---
; On doit dessiner du bit (AX&7) jusqu'au bit 0 (droite de l'octet)
; Masque = 0xFF >> (AX & 7)
push cx ; Sauve Index End push cx ; Sauve Index End
mov cx, ax mov cx, ax
and cx, 7 ; CL = X1 % 8 and cx, 7 ; CL = X1 % 8
mov dh, 0xFF mov dh, 0xFF
shr dh, cl ; DH = Masque Gauche (ex: 00111111) shr dh, cl ; DH = Masque Gauche
call .apply_mask ; Applique DH sur [ES:DI] selon couleur DL call .apply_mask ; Applique DH sur [ES:DI]
inc di ; Octet suivant inc di ; Octet suivant
inc si ; Index suivant inc si ; Index suivant
pop cx ; Restaure Index End pop cx ; Restaure Index End
; --- B. PARTIE CENTRALE (Full Bytes) --- ; --- B. PARTIE CENTRALE (Full Bytes) ---
; Tant que SI < CX, on remplit tout l'octet
cmp si, cx cmp si, cx
jge .do_right_part ; Si on a atteint le dernier octet, on saute jge .do_right_part
mov al, 0x00 ; Couleur Noir par défaut mov al, 0x00 ; Noir
cmp dl, 0 cmp dl, 0
jz .fill_loop jz .fill_loop
mov al, 0xFF ; Couleur Blanc mov al, 0xFF ; Blanc
.fill_loop: .fill_loop:
mov byte [es:di], al mov byte [es:di], al
@ -709,54 +695,49 @@ cga_line_horizontal:
.do_right_part: .do_right_part:
; --- C. PARTIE DROITE (End) --- ; --- C. PARTIE DROITE (End) ---
; On doit dessiner du bit 7 jusqu'au bit (BX&7)
; Masque = ~(0xFF >> ((BX & 7) + 1))
mov cx, bx mov cx, bx
and cx, 7 and cx, 7
inc cx ; +1 car on veut inclure le pixel inc cx
mov dh, 0xFF mov dh, 0xFF
shr dh, cl shr dh, cl
not dh ; DH = Masque Droite (ex: 11100000) not dh ; DH = Masque Droite
call .apply_mask call .apply_mask
jmp .done jmp .done
; ============================================ ; ============================================
; CAS SINGLE BYTE (Début et Fin dans le même octet) ; CAS SINGLE BYTE
; ============================================ ; ============================================
.single_byte: .single_byte:
; Masque Gauche = 0xFF >> (X1 & 7) ; Masque Gauche
mov cx, ax mov cx, ax
and cx, 7 and cx, 7
mov dh, 0xFF mov dh, 0xFF
shr dh, cl shr dh, cl
; Masque Droite = ~(0xFF >> ((X2 & 7) + 1)) ; Masque Droite
mov cx, bx mov cx, bx
and cx, 7 and cx, 7
inc cx inc cx
mov ah, 0xFF ; Utilise AH temporaire mov ah, 0xFF
shr ah, cl shr ah, cl
not ah not ah
; Intersection des masques ; Intersection
and dh, ah ; DH = Masque Final (ex: 00011100) and dh, ah
call .apply_mask call .apply_mask
jmp .done jmp .done
; --- Helper local : Applique le masque DH sur [ES:DI] --- ; --- Helper local ---
; Entrée : DH = Masque, DL = Couleur, DI = Adresse
.apply_mask: .apply_mask:
cmp dl, 0 cmp dl, 0
jz .apply_black jz .apply_black
or byte [es:di], dh ; Blanc : OR or byte [es:di], dh
ret ret
.apply_black: .apply_black:
not dh not dh
and byte [es:di], dh ; Noir : AND ~Masque and byte [es:di], dh
not dh ; Restaure le masque (optionnel si non réutilisé) not dh
ret ret
.done: .done:
@ -808,37 +789,11 @@ cga_draw_rect:
; Pour éviter les pixels en double dans les coins, on peut ajuster légèrement, ; Pour éviter les pixels en double dans les coins, on peut ajuster légèrement,
; mais pour un driver simple, tracer les 4 lignes brutes est acceptable. ; mais pour un driver simple, tracer les 4 lignes brutes est acceptable.
; Haut (x1,y1 -> x2,y1) GFX LINE_HORIZ, .x1, .x2, .y1, .color
push word .color GFX LINE_HORIZ, .x1, .x2, .y2, .color
push word .y1
push word .x2
push word .x1
call cga_line_horizontal
add sp, 8
; Bas (x1,y2 -> x2,y2) GFX LINE_VERT, .x1, .y1, .y2, .color
push word .color GFX LINE_VERT, .x2, .y1, .y2, .color
push word .y2
push word .x2
push word .x1
call cga_line_horizontal
add sp, 8
; Gauche (x1,y1 -> x1,y2)
push word .color
push word .y2
push word .y1
push word .x1
call cga_line_vertical
add sp, 8
; Droite (x2,y1 -> x2,y2)
push word .color
push word .y2
push word .y1
push word .x2
call cga_line_vertical
add sp, 8
popa popa
leave leave

View file

@ -56,7 +56,7 @@
; ------------------------------------------------------------ ; ------------------------------------------------------------
gui_driver: gui_driver:
dw draw_white dw draw_window
; ============================================================================= ; =============================================================================
; Fonction : draw_window ; Fonction : draw_window
@ -68,7 +68,7 @@ gui_driver:
; Arg4 : Hauteur (Word) ; Arg4 : Hauteur (Word)
; Arg5 : Pointeur vers titre (DS:Offset) (Word) ; Arg5 : Pointeur vers titre (DS:Offset) (Word)
; ============================================================================= ; =============================================================================
draw_window: draw_window_source:
push bp push bp
mov bp, sp mov bp, sp
@ -118,7 +118,6 @@ draw_window:
; ---------------------------------------------------- ; ----------------------------------------------------
; On dessine un rectangle BLANC par dessus l'ombre ; On dessine un rectangle BLANC par dessus l'ombre
; Cela crée le corps et "découpe" l'ombre pour ne laisser que le bord visible. ; Cela crée le corps et "découpe" l'ombre pour ne laisser que le bord visible.
mov bx, .x mov bx, .x
add bx, .w ; BX = x2 add bx, .w ; BX = x2
mov dx, .y mov dx, .y
@ -310,6 +309,46 @@ draw_window:
call cga_write call cga_write
add sp, 6 add sp, 6
popa
leave
ret
draw_window:
push bp
mov bp, sp
; --- Arguments ---
%define .x word [bp+4]
%define .y word [bp+6]
%define .w word [bp+8]
%define .h word [bp+10]
%define .title word [bp+12]
; ---- Variables Locales ---
pusha
; ----------------------------------------------------
; Ombre Portée (Drop Shadow)
; ----------------------------------------------------
; On dessine un rectangle noir décalé de +1,+1
; x1+1, y1+1, x2+1, y2+1 -> NOIR
mov ax, .x
add ax, .w
inc ax ; x2 + 1
mov bx, ax ; BX = right limit
mov ax, .y
add ax, .h
inc ax ; y2 + 1
mov dx, ax ; DX = bottom limit
mov ax, .x
inc ax ; x1 + 1
mov cx, .y
inc cx ; y1 + 1
GFX RECTANGLE_DRAW, ax, cx, bx, dx, 0
popa popa
leave leave
ret ret