home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 19
/
CD_ASCQ_19_010295.iso
/
dos
/
prg
/
noyau
/
cadres.asm
next >
Wrap
Assembly Source File
|
1994-05-25
|
6KB
|
297 lines
;
; Procédures de gestion d'écran en mode texte
;
; EQUALIZER - Art Of Code.
;
; Avril 1992
;
.MODEL SMALL
.286
.DATA
Longueur DB 00
Largeur DB 00
.CODE
PUBLIC Trace_Cadre
;***************************************************************
; Procédure de tracé de Cadres en mode texte 80*25
; *************************************************************
; Ah=x1 Al=y1 Bh=x2 Bl=y2 Dl=Attribut
Trace_Cadre PROC
Push ES
PUSH DS
PushA ; On empile les registres
Cmp Ah,01
JL Fin_Trace_Cadre
Cmp Ah,80
JG Fin_Trace_Cadre
Cmp Bh,80
JG Fin_Trace_Cadre
Cmp Bh,Ah
JL Fin_Trace_Cadre
Cmp Al,01
JL Fin_Trace_Cadre
Cmp Al,25
JG Fin_Trace_Cadre
Cmp Bl,25
JG Fin_Trace_Cadre
Cmp Bl,Al
Jl Fin_Trace_Cadre
Push BX
SUB Bh,Ah
SUB Bl,Al
INC Bl
CMP Bh,5
Jl Fin_Trace_Cadre2
CMP Bl,3
Jl Fin_Trace_Cadre2
POP BX
JMP Suite
Fin_Trace_Cadre:
JMP Fin_Cadre
Fin_Trace_Cadre2:
POP BX
JMP Fin_Cadre
Suite:
Push AX ; on sauve Ax
MOV ax,0B800h ; segment du Buffer Vidéo
MOV ES,AX ;
MOV AX,@DATA ; segment DATA
MOV DS,AX
XOR DI,DI ; Di=0000h
POP AX
MOV Dh,Dl
MOV Dl,218 ; Caractère = ┌
PUSH BX ; On sauve BX et AX
SUB bh,ah ; On calcule la Longueur et la largeur
MOV SI,OFFSET Longueur
MOV DS:[SI],Bh
SUB Bl,Al
MOV SI,OFFSET Largeur
MOV DS:[SI],Bl
POP BX
; On calcule DI
Xor DI,DI
DEC Al
DEC Ah
MOV BX,AX
MOV Bl,Bh
Xor Bh,Bh
ADD DI,BX
ADD DI,BX ; Di=2*(x-1)
XOR ah,Ah ; Ax=00yy
SAL AX,5
MOV BX,AX
SAL AX,2
ADD AX,BX
ADD DI,AX
MOV ES:[DI],DX
PUSH DI
add DI,2
MOV Dl,196 ;─
MOV SI,Offset Longueur
MOV CX,DS:[SI]
XOR Ch,Ch
DEC CX
PUSH CX
MOV AX,DX
CALL LIgne
POP CX
MOV Al,191 ;┐
STOSW
POP DI
MOV Dx,CX
MOV BX,Offset Largeur
MOV SI,BX
MOV CX,DS:[SI]
xor ch,ch
dec CX
cld
Ligne2:
PUSH CX
; Une Ligne
MOV AL,179 ;│
ADD DI,160
PUSH DI
stosw
Mov Al,20h ;' '
MOV CX,Dx
Call Ligne
MOV AL,179 ;│
stosw
POP DI
POP CX
LOOP LIgne2
; Fin de la ligne
MOV AL,192 ;└
ADD DI,160
STOSW
MOV AL,196 ;─
MOV CX,DX
CALL Ligne
MOV AL,217 ;┘
STOSW
POPA
Call Ombre
PushA
Fin_Cadre:
PopA
POP DS
POP ES
RET
Trace_Cadre ENDP
Ombre:
PushA
Cmp Bh,80
JGE Ombre_Bas
MOV DX,0B800h
MOV ES,DX
PUSH AX
PUSH BX
; On calcule DI
XOR DI,DI
MOV Bl,Bh
Xor Bh,Bh
ADD DI,BX
ADD DI,BX ; Di=2*(x-1)
XOR ah,Ah ; Ax=00yy
SAL AX,5
MOV BX,AX
SAL AX,1
SAL AX,1
ADD AX,BX
ADD DI,AX ; Di=2*x+160*y
POP BX
POP AX
INC DI ; Offset de l'octet d'attribut
MOV AX,@data
MOV DS,AX
MOV AX,Offset Largeur
MOV SI,AX
MOV CX,DS:[SI]
XOR Ch,Ch
MOV AX,0007h
Ombre_Droite:
MOV ES:[DI],Al
ADD DI,160
LOOP Ombre_Droite
Ombre_Bas:
POPA ; On calcule DI
pusha
CMP Bl,25
JGE Fin_Ombre
XOR DI,DI
PUSH BX
PUSH AX
PUSH BX
POP AX
POP BX
MOV BL,BH
Xor Bh,Bh
ADD DI,BX
ADD DI,BX ; Di=2*(x-1)
XOR ah,Ah ; Ax=00yy
SAL AX,5
MOV BX,AX
SAL AX,1
SAL AX,1
ADD AX,BX
ADD DI,AX ; Di=2*x+160*y
INC DI
POP BX
MOV AX,@DATA
MOV DS,AX
MOV AX,0B800h
MOV ES,AX
MOV AX,OFFSET Longueur
MOV SI,AX
MOV CX,DS:[SI]
XOR Ch,Ch
CMP Bh,80
Je Suite_Ombre_Bas
INC CX
Suite_Ombre_Bas:
XOR Ch,Ch
MOV AX,0007h
Boucle_Ombre_Bas:
MOV ES:[DI],Al
INC DI
INC DI
LOOP Boucle_Ombre_Bas
Fin_Ombre:
POPA
RET
Ligne:
CLD
boucle1:
STOSW
LOOP Boucle1
RET
PUBLIC Clear_Screen
Clear_Screen PROC
PUSHA
PUSH ES
PUSH DS
MOV Al,176
MOV ah,23
MOV BX,0B800h
MOV ES,BX
XOR DI,DI
MOV CX,80*25
REP STOSW
POP DS
POP ES
POPA
RET
Clear_Screen ENDP
PUBLIC Affiche_Chaine
; Affichage d'une chaine de caractères (sans attribut) terminée par 0
; DS:SI = Chaine
; DI = Destination à l'écran
;
Affiche_Chaine PROC
PUSHA
PUSH ES
mov ax,0B800h
mov es,ax
affiche_chaine_suite:
mov al,BYTE PTR ds:[si]
or al,al
jz fin_affichage
stosb
inc di
inc si
jmp affiche_chaine_suite
fin_affichage:
POP ES
POPA
RET
Affiche_Chaine ENDP
RET
END