

                    ColorCycling in Pascal
                    


Hier direkt alle ntigen Prozeduren, um das Colocycling in Pas-
cal zu ermglichen:


USES CRT;

PROCEDURE GetPal(ErsteFarbe,LetzteFarbe : BYTE; VAR Pal);
VAR Farbe,RGB  : BYTE;
    PalPointer : ^BYTE;
BEGIN
 PalPointer := @Pal;               {PalPointer auf Pal setzen}
 FOR Farbe := ErsteFarbe TO LetzteFarbe DO BEGIN
  PORT[$3C7] := Farbe;
  FOR RGB := 1 TO 3 DO BEGIN
   PalPointer^ := PORT[$3C9];
   Inc(PalPointer);                {Aufs nchste Element zeigen}
  END;
 END;
END;

PROCEDURE SetPal(ErsteFarbe,LetzteFarbe : BYTE; VAR Pal);
VAR Farbe,RGB  : BYTE;
    PalPointer : ^BYTE;
BEGIN
 WHILE PORT[$3DA] AND 8 = 0 DO;    {Vertikalen Retrace abwarten}
 PalPointer := @Pal;               {PalPointer auf Pal setzen}
 FOR Farbe := ErsteFarbe TO LetzteFarbe DO BEGIN
  PORT[$3C8] := Farbe;
  FOR RGB := 1 TO 3 DO BEGIN
   PORT[$3C9] := PalPointer^;
   Inc(PalPointer);
  END;
 END;
END;

PROCEDURE CyclePalette(ErsteFarbe,LetzteFarbe : BYTE);
VAR Pal   : ARRAY[1..768] OF BYTE;
    Hilfe : ARRAY[1..3] OF BYTE;
    Farbe : WORD;
BEGIN
 WHILE NOT KeyPressed DO BEGIN
  GetPal(ErsteFarbe,LetzteFarbe,Pal);
  Hilfe[1] := Pal[ErsteFarbe];
  Hilfe[2] := Pal[ErsteFarbe+1];
  Hilfe[3] := Pal[ErsteFarbe+2];
  FOR Farbe := ErsteFarbe+1 TO (LetzteFarbe+1)*3 DO
   Pal[Farbe-3] := Pal[Farbe];
  Pal[(LetzteFarbe+1)*3-2] := Hilfe[1];
  Pal[(LetzteFarbe+1)*3-1] := Hilfe[2];
  Pal[(LetzteFarbe+1)*3  ] := Hilfe[3];
  SetPal(ErsteFarbe,LetzteFarbe,Pal);
 END;
END;


Mit diesen Prozeduren kann man die Palette beliebig rotieren
lassen, allerdings nur linksherum. Es drfte aber nicht schwer
fallen, das ganze auch auf rechts umzustellen. Man kann auch
nur 'Ausschnitte' der Farbpalette rotieren lassen. Also nur
die Farben von 100-200 zum Beispiel.

Die Farbpalette wird in der Variablen Pal gespeichert - einem
768 Byte groem Puffer. In Pascal ist es mglich, Referenzpara-
meter zu bergeben (Procedure xy(VAR Referenzparameter);), ohne
den Typ anzugeben. So kann man auch Felder bergeben (in TP7 ist
dies ohnehin mglich). Allerdings kann man dann spter nicht mehr
mit FELD[xy] auf bestimmte Feldelemente zugreifen. Macht aber
nichts. Ich benutze dann einfach einen Zeiger, der das Feld fr
mich adressiert. Daher setze ich erst den Zeiger auf die Adresse
der Palette (mit PalPointer = @Pal) und erhhe danach dann immer
die Adresse des Zeigers, wenn ich das nchste Element haben will.
Naja, der Rest drfte klar sein. In SetPal verfahre ich genauso,
nur, da ich die RGB-Werte halt eintrage und nicht auslese. 
Auerdem frage ich hier noch den vertikalen Strahlenrcklauf ab 
(sonst gibt's Schnee!).

Wahrscheinlich geht das Ganze noch einfacher (zumindest in TP7).
Aber so funktioniert es schlielich auch. Solltet Ihr allerdings
eine wesentlich einfachere Mglichkeit gefunden haben: immer her
damit!

                                                      Kemil

