{
15 minutes ago I suddenly got a idea to a fullscreen plasma (320*200). But
I have promised my group mates to do no more plasmas so here it is and it
is all yours. It is not 320*200, because I did not do it in assembler since I
am not going to use the routine myself, but it should be pretty easy to
convert.
-+--+--+--- CUT -+--+--+--- }
PROGRAM _320_100_PLASMA;
VAR
FT :ARRAY [0..511] OF BYTE;
SINT :ARRAY [0..255] OF BYTE;
I1,A,B,D,C,OD,COLOR :BYTE;
X,Y,K,I :WORD;
BEGIN
{SET 320*200*256}
ASM
MOV AX,0013H; INT 10H;
{THIS THINGGY DOUBLES THE HEIGT OF THE PIXELS}
mov dx,3d4h
mov al,9
out dx,al
inc dx
in al,dx
and al,0e0h
add al,3
out dx,al
END;
{DO PALETTE}
PORT [$3C8]:=0;
FOR I:=0 TO 255 DO
BEGIN
PORT [$3C9]:=I DIV 4;
PORT [$3C9]:=I DIV 5;
PORT [$3C9]:=I DIV 6
END;
{DO TABLES}
FOR I:=0 TO 511 DO FT [I]:=ROUND (64+63*SIN (I/40.74));
FOR I:=0 TO 255 DO SINT [I]:=ROUND (128+127*SIN (I/40.74));
{MAIN LOOP}
REPEAT
INC (I1); {GRID COUNTER}
DEC (C,2);
INC (OD,1);
D:=OD;
FOR Y:=0 TO 100 DO
BEGIN
K:=Y*320+Y AND 1; {CALCULATE OFFSET AND ADD ONE EVERY SECOND LINE}
K:=K-(I1 AND 1)*320; {MOVE GRID ONE PIXEL DOWN EVERY SECOND FRAME}
INC (D,2);
A:=SINT [(C+Y) AND 255];
B:=SINT [(D) AND 255];
FOR X:=0 TO 159 DO
BEGIN
COLOR:=FT [A+B]+FT [Y+B];
MEM [$A000:K]:=COLOR;
INC (A,1+COLOR SHR 7);
INC (B,2); INC (K,2);
{OFFSET OF PLASMA PIXEL, INCREASED BY TWO TO CREATE THE GRID}
END;
END;
UNTIL PORT [$60]<128; {EXIT IF KEY PRESSED} END.