home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / graph / flames.pas < prev    next >
Pascal/Delphi Source File  |  1994-10-09  |  5KB  |  135 lines

  1. Uses Crt,ModeXLib;
  2. Type Block=Array[0..99,0..319] of Byte;
  3. Var
  4.   Src_Frame,                    {image précédente }
  5.   Dest_Frame:^Block;            {image courante }
  6.  
  7. Procedure Scroll_Up;assembler;
  8. {fait défiler l'image d'une ligne vers le haut et interpole }
  9. asm
  10.   push ds
  11.   les di,Dest_Frame     {pointeur sur image de destination }
  12.   lds si,Src_Frame      {pointeur sur image source }
  13.   add si,320            {ligne 1 de l'image source }
  14.   mov cx,320*98         {fait défiler 99 lignes }
  15.   xor bl,bl             {octet de poids fort fantôme }
  16. @lp1:
  17.   xor ax,ax
  18.   xor bx,bx
  19.   mov al,[si-321]       {cherche le premier point }
  20.   mov bl,[si-320]       {ajoute le deuxième }
  21.   add ax,bx
  22.   mov bl,[si-319]       {ajoute le suivant }
  23.   add ax,bx
  24.   mov bl,[si-1]         {etc...}
  25.   add ax,bx
  26.   mov bl,[si+1]
  27.   add ax,bx
  28.   mov bl,[si+319]
  29.   add ax,bx
  30.   mov bl,[si+320]
  31.   adc ax,bx
  32.   mov bl,[si+321]
  33.   adc ax,bx
  34.   shr ax,3
  35.  
  36.   or ax,ax              {déjà 0 ?}
  37.   je @null
  38.   dec al                {si non, décrémenter}
  39. @null:
  40.   stosb                 {valeur en destination }
  41.   inc si                {point suivant }
  42.   dec cx                {autres points ?}
  43.   jne @lp1
  44.   pop ds
  45. End;
  46.  
  47. Procedure New_Line;     {reconstruit les lignes inférieures }
  48. Var i,x:Word;
  49. Begin
  50.   For x:=0 to 319 do Begin {remplit 3 lignes avec des valeurs aléatoires }
  51.     Dest_Frame^[97,x]:=Random(15)+64;
  52.     Dest_Frame^[98,x]:=Random(15)+64;
  53.     Dest_Frame^[99,x]:=Random(15)+64;
  54.   End;
  55.   For i:=0 to Random(45) do Begin {ajoute un nombre aléatoires de foyers brûlants }
  56.     x:=Random(320);               {à des endroits au hasard }
  57.     asm
  58.       les di,Dest_Frame   {adresse l'image de destination }
  59.       add di,98*320       {traite la ligne 98 (deuxième du bas) }
  60.       add di,x            {ajoute l'abscisse x }
  61.       mov al,0ffh         {couleur la plus claire }
  62.       mov es:[di-321],al  {produit un foyer brûlant de grande taille (9 pixels)}
  63.       mov es:[di-320],al
  64.       mov es:[di-319],al
  65.       mov es:[di-1],al
  66.       mov es:[di],al
  67.       mov es:[di+1],al
  68.       mov es:[di+319],al
  69.       mov es:[di+320],al
  70.       mov es:[di+321],al
  71.     End;
  72.   End;
  73. End;
  74.  
  75. {Les procédures Show_Screen et Prep_Pal ainsi que le programme
  76. principal sont faciles à comprendre : }
  77.  
  78. Procedure Show_Screen;     {copie l'écran dans la carte graphique }
  79. Var temp:Pointer;          {pour permuter les pointeurs }
  80. Begin
  81. asm
  82.   push ds
  83.   lds si,Dest_Frame        {image finie comme source }
  84.   mov ax,0a000h            {VGA comme destination }
  85.   mov es,ax
  86.   mov di,320*100           {à partir de la ligne 100}
  87.   mov cx,320*100/4         {copie 100 lignes comme Dwords}
  88. db 66h                     {Operand Size Prefix (32 bits)}
  89.   rep movsw                {copie}
  90.   pop ds
  91. End;
  92.   temp:=Dest_Frame;     {échange les pointeurs sur source et destination }
  93.   Dest_Frame:=Src_Frame;
  94.   Src_Frame:=temp;
  95. End;
  96.  
  97. Procedure Prep_Pal;             {prépare la palette pour Flames }
  98. Var i:Word;
  99. Begin
  100.   FillChar(Palette,80*3,0);     {au début : tout noir }
  101.   For i:=0 to 7 do Begin
  102.     Palette[i*3+2]:=i*2;        {couleurs 0-7 : bleu croissant }
  103.     Palette[(i+8)*3+2]:=16-i*2; {couleurs 8-15 : bleu décroissant }
  104.   End;
  105.   For i:=8 to 31 do             {couleurs 8-31 : rouge croissant }
  106.     Palette[i*3]:=(i-8)*63 div 23;
  107.   For i:=32 to 55 do Begin      {couleurs 32-55 : vert croissant, rouge constant }
  108.     Palette[i*3]:=63;
  109.     Palette[i*3+1]:=(i-32)*63 div 23;
  110.   End;
  111.   For i:=56 to 79 do Begin      {couleurs 56-79: bleu croissant, rouge et vert const.}
  112.     Palette[i*3]:=63;
  113.     Palette[i*3+1]:=63;
  114.     Palette[i*3+2]:=(i-56)*63 div 23;
  115.   End;
  116.   FillChar(Palette[80*3],176*3,63);  {le reste blanc }
  117.   SetPal;                            {réalise la palette }
  118. End;
  119.  
  120. begin
  121.   Randomize;                 {initialise le générateur de nombres aléatoires }
  122.   GetMem(Src_Frame,320*100); {réserve de la mémoire pour l'image source et la met à 0 }
  123.   FillChar(Src_Frame^,320*100,0);
  124.   GetMem(Dest_Frame,320*100);   {réserve de la mémoire pour l'image de destination et la met à 0 }
  125.   FillChar(Dest_Frame^,320*100,0);
  126.   Init_Mode13;                    {initialise le mode 13h }
  127.   Prep_Pal;                       {prépare la palette }
  128.   Repeat
  129.     Scroll_Up;                    {flammes montantes }
  130.     New_Line;                     {ajoute une nouvelle ligne en bas }
  131.     Show_Screen;                  {affiche l'écran }
  132.   Until KeyPressed;
  133.   TextMode(3);
  134. end.
  135.