

                       Plasma in Pascal
                       

Hier findet Ihr nicht viel. Lediglich das Proggy in Pascal und
eine kleine Erluterung.

Ein fertiges Programm findet Ihr hier, im Pfad 'SOURCES\' den
Quellkot h -code und im Pfad 'PROGS\' (wie schon gesagt) das
fertige, ausfhrbare Programm.


PROGRAM Plasma;

USES CRT;
VAR j : BYTE;

PROCEDURE SetMode(Modus : BYTE); ASSEMBLER;
ASM
 XOR AH,AH
 MOV AL,Modus
 INT 10h
END;

PROCEDURE NewCol(xl,yo,x,y,xr,yu : INTEGER);
VAR Col : INTEGER;
BEGIN
 IF MEM[$A000:y*320+x] = 0 THEN BEGIN
  Col := xr - xl + yu - yo;
  Col := Random(Col*3)-Col;
  Col := Col + (MEM[$A000:yo*320+xl]+MEM[$A000:yu*320+xr]) SHR 1;
  IF Col < 1 THEN Col := 1; IF Col > 189 THEN Col := 189;
  MEM[$A000:y*320+x] := Col;
 END;
END;

PROCEDURE SetRGB(Nr,r,g,b : BYTE);
BEGIN
 IF NR <> 0 THEN BEGIN
  PORT[$03C8] := Nr;
  PORT[$03C9] := r; PORT[$03C9] := g; PORT[$03C9] := b;
 END;
END;

PROCEDURE SetPal(j : BYTE);
VAR i : BYTE;
BEGIN
 FOR i := 1 TO 63 DO BEGIN
  SetRGB(i+j,0,63-i,i);
  SetRGB(i+63+j,i,0,63-i);
  SetRGB(i+126+j,63-i,i,0);
 END;
END;

PROCEDURE SubDivide(x1,y1,x2,y2 : WORD);
VAR Col : INTEGER;
    x,y : WORD;
BEGIN
 IF x2-x1 > 1 THEN BEGIN
  x := (x1+x2) SHR 1; y := (y1+y2) SHR 1;

  NewCol(x1,y1,x,y1,x2,y1);
  NewCol(x2,y1,x2,y,x2,y2);
  NewCol(x1,y2,x,y2,x2,y2);
  NewCol(x1,y1,x1,y,x1,y2);

  Col := (MEM[$A000:y1*320+x] + MEM[$A000:y*320+x2] +
          MEM[$A000:y2*320+x] + MEM[$A000:y*320+x1]) SHR 2;
  MEM[$A000:y*320+x] := Col;
  {WHILE NOT KeyPressed DO;
  IF ReadKey = #0 THEN;}

  SubDivide(x1,y1,x,y);
  SubDivide(x,y,x2,y2);
  SubDivide(x1,y,x,y2);
  SubDivide(x,y1,x2,y);

 END;
END;

BEGIN
 Randomize;
 SetMode($13);
 j := 0; SetPal(j); Inc(j);
 SubDivide(0,0,319,199);
 WHILE NOT KeyPressed DO BEGIN
  SetPal(j); Inc(j); Delay(10);
 END;
 SetMode($03);
END.


Das Programm stammt in der Grundidee brigens nicht von mir, son-
dern aus der neuesten DOS (3/95 Seite 218). Allerdings habe ich
es (meiner Meinung nach) noch um einiges verbessert und vor
allen Dingen: den Aufbau noch verschnellert. Da aber im Programm
nichts von einer Copyright-Meldung stand, gehe ich davon aus,
da ich es hier frei verwenden darf (wozu sollten sie auch sonst
dort abgedruckt werden?).
Und noch etwas: In der Prozedur SubDivide findet sich nach dem
Setzen des Punktes zwei Programmzeilen in Kommentarklammern ({}).
Wenn Ihr sie weglasst, knnt Ihr Euch das Setzen der fnf Punkte
anschauen (er wartet jeweils auf Tastendruck!).
Und noch etwas/2: Punkte setzen und auslesen mache ich mittels
der MEM-Anweisung. Ich schreibe also die Farbe (Col) direkt in
den Video-Speicher (geht am schnellsten).
Und noch etwas/3.3b: Ich habe die DIV-Anweisungen, die sich in
meiner Beschreibung wiederfinden durch SHR-Anweisungen ersetzt -
geht schneller!
Ach ja: Ihr solltet brigens auch ruhig mal etwas mit der Pro-
zedur 'SetPal' herumspielen - man kann noch einiges mit der Pa-
lette machen!


Tja, gut.  Ich hoffe, da war gut... Wie immer: wenn noch Fragen
offen sein sollten: her damit. Ansonsten: ausprobieren und Klappe
halten!

                                                      Kemil

