home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 18 / CD_ASCQ_18_111294_W.iso / dos / prg / pas / pasgraph / fire1.pas < prev    next >
Pascal/Delphi Source File  |  1994-07-29  |  3KB  |  114 lines

  1. Program Phire;
  2. {$G+}    { Enable 286 instructions }
  3. { coded by Phred  7/23/94     aka Alex Chalfin    }
  4. {               Internet: achalfin@uceng.uc.edu   }
  5. { A fast computer is HIGHLY recommended.          }
  6. { Inspired by Jare's fire code                    }
  7.  
  8. Var
  9.   Screen : Array[0..63999] of Byte ABSOLUTE $A000:$0000; { the VGA screen }
  10.   VScreen : Array[0..63999] of Byte;                { an offscreen buffer }
  11.   Lookup : Array[0..199] of Word;    { an Offset lookup table }
  12.  
  13. Procedure SetPalette; Near;
  14. { Sets the Palette }
  15.  
  16. Var
  17.   p : Array[0..767] of Byte;
  18.   x : integer;
  19.  
  20. Begin
  21.   for x := 0 to 255 do            { Generate fade from orange to black }
  22.     Begin
  23.       p[x*3] := (x * 63) Shr 8;
  24.       P[x*3+1] := (x * 22) Shr 8;
  25.       P[x*3+2] := 0;
  26.     End;
  27.   Port[$3C8] := 0;
  28.   For x := 0 to 255 do        { Set the palette }
  29.     Begin
  30.       Port[$3C9] := P[x*3];
  31.       Port[$3C9] := P[x*3+1];
  32.       Port[$3C9] := P[x*3+2];
  33.     End;
  34. End;
  35.  
  36. Procedure Burnin_Down_The_House;
  37.  
  38. Var
  39.   c : Integer;
  40.  
  41. Begin
  42.   Randomize;
  43.   Repeat
  44.     For c := 0 to 319 do    { Setup bottom line "hot spots" }
  45.       If Random(4) = 1
  46.         Then VScreen[LookUp[199] + c] := Random(3) * 255;
  47.     Asm
  48.       MOV  CX,28800         { Number of pixels to calculate }
  49.       PUSH CX               { Store count on stack }
  50.       MOV  AX,Offset VScreen
  51.       PUSH AX               { Store value on stack }
  52.       MOV  SI,AX
  53.       MOV  BX,199
  54.       SHL  BX,1
  55.       MOV  AX,Word Ptr [LookUp + BX]
  56.       ADD  SI,AX
  57.       DEC  SI            { DS:SI := VScreen[LookUp[198]+319] }
  58.      @Looper:
  59.       XOR  AX,AX
  60.       XOR  BX,BX
  61.       MOV  AL,DS:[SI+319]
  62.       ADD  BX,AX
  63.       MOV  AL,DS:[SI+320]
  64.       ADD  BX,AX
  65.       MOV  AL,DS:[SI+321]
  66.       ADD  BX,AX
  67.       MOV  AL,DS:[SI]
  68.       ADD  BX,AX    { Average the three pixels below and the one that its on}
  69.       SHR  BX,2     { Divide by 4 }
  70.       JZ  @Skip
  71.       DEC  BX       { Subtract 1 if value > 0 }
  72.      @Skip:
  73.       MOV  DS:[SI],BL  { Store pixel to screen }
  74.       DEC  SI          { Move to next pixel }
  75.       DEC  CX
  76.       JNZ @Looper
  77.     { Copy the screen Buffer using Double Word copies }
  78.       MOV  BX,110
  79.       SHL  BX,1
  80.       MOV  AX,Word Ptr [LookUp + BX]
  81.       MOV  DX,AX
  82.       POP  SI        { Restore starting offset of VScreen  }
  83.       MOV  AX,$A000
  84.       MOV  ES,AX     { DS:SI = starting location in buffer }
  85.       XOR  DI,DI     { ES:DI = Starting location in screen }
  86.       ADD  SI,DX
  87.       ADD  DI,DX
  88.       POP  CX        { Retrive Count off the stack }
  89.       SHR  CX,2      { divide by 4 to get # of double words.              }
  90.      db 66h          { Since TP won't allow 386 instructions, fake it.    }
  91.       REP  MOVSW     { This translates into REP MOVSD (move double words) }
  92.     End;
  93.   Until Port[$60] = 1;   { Until ESC is pressed }
  94. End;
  95.  
  96. Begin
  97.   Asm              { Initialize mode 13h VGA mode }
  98.     MOV  AX,13h
  99.     INT  10h
  100.   End;
  101.   For LookUp[0] := 1 to 199 do            { Calculate lookup table }
  102.     LookUp[LookUp[0]] := LookUp[0] * 320;
  103.   LookUp[0] := 0;
  104.   SetPalette;
  105.   FillChar(VScreen, 64000, 0);
  106.   Burnin_Down_The_House;
  107.   Asm
  108.     MOV  AX,3
  109.     INT  10h
  110.   End;
  111. End.
  112.  
  113. { End of Program }
  114.