[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
> Howdy, I am looking for some Pascal (no ASM please :) plasma or fire
> psudocode..
Here is a 100% Pascal fire. It isn't very fast (well, its downright slow),
but its all Pascal with no ASM (the video mode set is ASM, but that one is
easy to understand). Please do not send updates to me, as I already know
how to make it much faster.
}
Program Fire;
{ Alex Chalfin 12/26/94 }
{ Internet: achalfin@uceng.uc.edu }
{ FidoNet: 1:108/180 }
Uses Crt;
Var Buffer : Array[0..16000] of Byte;
Procedure SetBottom;
{ Set the bottom line of the buffer with hotspots }
Var x : Integer;
Begin
For x := 0 to 159 do
Buffer[99*160+x] := Random(2) * 255;
End;
Procedure CalcFire;
{ Calculate the rest of the fire buffer }
Var
x, y, ColorVal : Integer;
Begin
For y := 98 downto 0 do
For x := 159 downto 0 do
Begin
ColorVal := (Buffer[(Y+1)*160+x]+Buffer[(Y+1)*160+(x+1)]+
Buffer[(Y+1)*160+(x-1)]+Buffer[Y*160+x]) Shr 2;
If ColorVal > 0
Then ColorVal := ColorVal - 1;
Buffer[Y*160+x] := ColorVal;
End;
End;
Procedure CopyFire;
{ Copy the fire buffer, using 2x2 squares }
Var
x,y : Integer;
Begin
For y := 197 downto 0 do
For x := 319 downto 0 do
Mem[$A000:y*320+x] := Buffer[(y Shr 1)*160+(x Shr 1)];
End;
Procedure SetPalette;
{ Set a very basic fire palette }
Var
x : Integer;
Begin
For x := 255 Downto 0 do
Begin
Port[$3c8] := x;
Port[$3c9] := x Div 4;
Port[$3c9] := x Div 12;
Port[$3c9] := 0;
End;
End;
Begin
Asm { Sorry about the ASM, but it just sets the video mode }
Mov ax,13h { Set video mode $13 }
Int 10h
End;
FillChar(Buffer, Sizeof(Buffer), 0);
SetPalette; { Set up a simple fire palette }
Repeat
SetBottom;
CalcFire;
CopyFire;
Until KeyPressed;
Asm
Mov ax,3 { Return back to text mode }
Int 10h
End;
End.
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]