[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
>Well... Does anyone know how to make flames? is it a fractal
>or something? does anyone can explain it (Formula ETC.) ???
Actually, it's pretty simple. Look at this diagram...
{ ... . - A Pixel }
{ .X. X - Pixel we're on }
{ 123 1, 2, 3 - Pixels to be averaged }
{ - fill the bottom row with random numbers }
{ - for each row: }
{ - for each pixel: }
{ - average the three pixels below it and itself }
{ - decrease by one (if not already zero) }
{
If that wasn't very clear, here's some source (sorry there's asm).
}
{$A+,B-,D+,E+,F-,G+,I+,L-,N-,O-,P-,Q-,R-,S-,T-,V+,X+,Y+}
{$M 16384,0,655360}
Program Fire;
Uses Crt;
Const
VGASeg = $A000;
Type
VGAMem = Array[0..63999] Of Byte;
Var
VideoMem : VGAMem Absolute VGASeg:0;
OldMode,
Color : Byte;
I : Word;
Procedure InitMode13h; Assembler;
Asm
Mov AH, 0Fh { Get Current Video Mode }
Int 10h
Mov [OldMode], AL { Save it }
Mov AX, 13H { Init 320x200x256 Graphics }
Int 10H
End;
Procedure CloseMode13h; Assembler;
Asm
Xor AH, AH
Mov AL, [OldMode] { Init Old Video Mode }
Int 10H
End;
Procedure PutPixel(X, Y : Word; Color : Byte); Assembler;
Asm
Mov AX, VGASeg
Mov ES, AX
Mov BX, Y
Mov DI, X
Mov AH, BL
Add DI, AX
ShR AX, 2
Add DI, AX
Mov AL, Color
Mov ES:[DI], AL
End;
Procedure MakePalette;
Begin
Port[$3C6] := $FF;
Port[$3C8] := 0;
For I := 0 To 255 Do
Begin
Port[$3C9] := I ShR 2;
Port[$3C9] := I ShR 4;
Port[$3C9] := 0;
End;
End;
Procedure UpDateFire;
Begin
For I := 0 To 319 Do
If Random(2) = 1 Then
Putpixel(I, 199, 0) Else
Putpixel(I, I, 0);
Asm
Mov DI, 0A000h { ES := Pixel Location (Segment) }
Mov ES, DI
Mov DI, 63999-320 { DI := Current Pixel location (Offset) }
Mov CX, 32000 { Number of pixels to put (Counter) }
Xor DH, DH
@PixLoop:
Mov AL, ES:[DI] { AX := Average of colors }
Mov DL, ES:[DI+319] { DL := Temp Reg to hold colors }
Add AX, DX
Mov DL, ES:[DI+320]
Add AX, DX
Mov DL, ES:[DI+321]
Add AX, DX
ShR AX, 2
JZ @Skip
Dec AL
@Skip:
Mov ES:[DI], AL
Dec DI
Dec CX
JNZ @PixLoop
End;
End;
Begin
Randomize;
InitMode13h;
MakePalette;
Repeat
UpDateFire;
Until KeyPressed;
ReadKey;
CloseMode13h;
Writeln('This Program was written by Rick Haines in Turbo Pascal 7.0');
End.
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]