home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Interdit
/
pc-interdit.iso
/
graph
/
flames.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-10-09
|
5KB
|
135 lines
Uses Crt,ModeXLib;
Type Block=Array[0..99,0..319] of Byte;
Var
Src_Frame, {image précédente }
Dest_Frame:^Block; {image courante }
Procedure Scroll_Up;assembler;
{fait défiler l'image d'une ligne vers le haut et interpole }
asm
push ds
les di,Dest_Frame {pointeur sur image de destination }
lds si,Src_Frame {pointeur sur image source }
add si,320 {ligne 1 de l'image source }
mov cx,320*98 {fait défiler 99 lignes }
xor bl,bl {octet de poids fort fantôme }
@lp1:
xor ax,ax
xor bx,bx
mov al,[si-321] {cherche le premier point }
mov bl,[si-320] {ajoute le deuxième }
add ax,bx
mov bl,[si-319] {ajoute le suivant }
add ax,bx
mov bl,[si-1] {etc...}
add ax,bx
mov bl,[si+1]
add ax,bx
mov bl,[si+319]
add ax,bx
mov bl,[si+320]
adc ax,bx
mov bl,[si+321]
adc ax,bx
shr ax,3
or ax,ax {déjà 0 ?}
je @null
dec al {si non, décrémenter}
@null:
stosb {valeur en destination }
inc si {point suivant }
dec cx {autres points ?}
jne @lp1
pop ds
End;
Procedure New_Line; {reconstruit les lignes inférieures }
Var i,x:Word;
Begin
For x:=0 to 319 do Begin {remplit 3 lignes avec des valeurs aléatoires }
Dest_Frame^[97,x]:=Random(15)+64;
Dest_Frame^[98,x]:=Random(15)+64;
Dest_Frame^[99,x]:=Random(15)+64;
End;
For i:=0 to Random(45) do Begin {ajoute un nombre aléatoires de foyers brûlants }
x:=Random(320); {à des endroits au hasard }
asm
les di,Dest_Frame {adresse l'image de destination }
add di,98*320 {traite la ligne 98 (deuxième du bas) }
add di,x {ajoute l'abscisse x }
mov al,0ffh {couleur la plus claire }
mov es:[di-321],al {produit un foyer brûlant de grande taille (9 pixels)}
mov es:[di-320],al
mov es:[di-319],al
mov es:[di-1],al
mov es:[di],al
mov es:[di+1],al
mov es:[di+319],al
mov es:[di+320],al
mov es:[di+321],al
End;
End;
End;
{Les procédures Show_Screen et Prep_Pal ainsi que le programme
principal sont faciles à comprendre : }
Procedure Show_Screen; {copie l'écran dans la carte graphique }
Var temp:Pointer; {pour permuter les pointeurs }
Begin
asm
push ds
lds si,Dest_Frame {image finie comme source }
mov ax,0a000h {VGA comme destination }
mov es,ax
mov di,320*100 {à partir de la ligne 100}
mov cx,320*100/4 {copie 100 lignes comme Dwords}
db 66h {Operand Size Prefix (32 bits)}
rep movsw {copie}
pop ds
End;
temp:=Dest_Frame; {échange les pointeurs sur source et destination }
Dest_Frame:=Src_Frame;
Src_Frame:=temp;
End;
Procedure Prep_Pal; {prépare la palette pour Flames }
Var i:Word;
Begin
FillChar(Palette,80*3,0); {au début : tout noir }
For i:=0 to 7 do Begin
Palette[i*3+2]:=i*2; {couleurs 0-7 : bleu croissant }
Palette[(i+8)*3+2]:=16-i*2; {couleurs 8-15 : bleu décroissant }
End;
For i:=8 to 31 do {couleurs 8-31 : rouge croissant }
Palette[i*3]:=(i-8)*63 div 23;
For i:=32 to 55 do Begin {couleurs 32-55 : vert croissant, rouge constant }
Palette[i*3]:=63;
Palette[i*3+1]:=(i-32)*63 div 23;
End;
For i:=56 to 79 do Begin {couleurs 56-79: bleu croissant, rouge et vert const.}
Palette[i*3]:=63;
Palette[i*3+1]:=63;
Palette[i*3+2]:=(i-56)*63 div 23;
End;
FillChar(Palette[80*3],176*3,63); {le reste blanc }
SetPal; {réalise la palette }
End;
begin
Randomize; {initialise le générateur de nombres aléatoires }
GetMem(Src_Frame,320*100); {réserve de la mémoire pour l'image source et la met à 0 }
FillChar(Src_Frame^,320*100,0);
GetMem(Dest_Frame,320*100); {réserve de la mémoire pour l'image de destination et la met à 0 }
FillChar(Dest_Frame^,320*100,0);
Init_Mode13; {initialise le mode 13h }
Prep_Pal; {prépare la palette }
Repeat
Scroll_Up; {flammes montantes }
New_Line; {ajoute une nouvelle ligne en bas }
Show_Screen; {affiche l'écran }
Until KeyPressed;
TextMode(3);
end.