merge
This commit is contained in:
parent
1a283222f7
commit
c4b8a6b317
3 changed files with 84 additions and 118 deletions
54
src/boot.asm
54
src/boot.asm
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in a new issue