{
> Any one out there have code to do this
>
> Rotate_PAL_Up(count : byte; from,to: byte):
>   ie.  Rotate_Pal_Up(10,100,120);
>   will rotate the pal up 10 times between the ranges of 100   and 12
> back after 120...
>
> Rotate_Pal_Down(c,f,t : byte);  basicly same as abov! Thanks!

You asked for the palette cycling routine, here you are! As you can see,
there is NO cycling routine in this piece of code which does all the job.
There are several smaller routines (GetRGB, SetRGB etc.) and then the actual
cycling routine which uses other smaller routines. That's because all these
routines are from my own vga util library and I was too lazy to put them to
together to a one piece of code... :)
}

Program CyclePaletteExample;

Uses crt;

Type  PaletteType                 = Record
       red                        : Byte;
       green                      : Byte;
       blue                       : Byte;
      End;

Var   rgb                         : PaletteType;
      pal                         : Array [0..255] of PaletteType;

Var   aa1                         : Word; {Some temp variables}
      aa5                         : Byte;

Procedure SetRGB(col, r, g, b : Byte);

Begin
 ASM
  CLI
 END;
 Port[$3C8] := col;
 Port[$3C9] := r;
 Port[$3C9] := g;
 Port[$3C9] := b;
 ASM
  STI
 END;
End;

Procedure GetRGB(col : Byte);

Begin
 Port[$3C7] := col;
 rgb.red := Port[$3C9];
 rgb.green := Port[$3C9];
 rgb.blue := Port[$3C9];
End;

Procedure SetPalette;

Begin
 For aa5 := 0 to 255 Do SetRGB(aa5,pal[aa5].red,pal[aa5].green,pal[aa5].blue);
End;

Procedure GetPalette;

Begin
 For aa5 := 0 to 255 Do Begin
  GetRGB(aa5);
  pal[aa5] := rgb;
 End;
End;

Procedure CyclePalette(s, e, n, d : Byte);

Var c1 : PaletteType;

Begin
 If d = 1 then Begin
  aa1 := 0;
  Repeat
   c1 := pal[e];
   For aa5 := e downto s + 1 Do Begin
    pal[aa5] := pal[aa5 - 1];
   End;
   pal[s] := c1;
   Inc(aa1);
   SetPalette; {Sets cycled palette}
  Until aa1 = n;
 End;
 If d = 2 then Begin
  aa1 := 0;
  Repeat
   c1 := pal[s];
   For aa5 := s to e - 1 Do Begin
    pal[aa5] := pal[aa5 + 1];
   End;
   pal[e] := c1;
   Inc(aa1);
   SetPalette; {Sets cycled palette}
  Until aa1 = n;
 End;
End;

Begin
 ASM
  MOV  AX,$13 {Video mode is now 13h = 320 x 200 and 256 colors}
  INT  $10
 End;
 For aa1 := 0 to 255 Do Mem[$A000:aa1] := aa1; {Draw 255 pixels}
 GetPalette; {Loads palette from vga's registers}
 Repeat
  CyclePalette(1,255,1,1); {Palette cycling!}
 Until KeyPressed; {Press any key to continue! :)}
 ASM
  MOV  AX,$3 {Back to the text mode}
  INT  $10
 End;
End.

{
Example:

CyclePalette(120, 140, 10, 1) would rotate colors between the ranges
120 and 140 10 times.

The last parameter (d) is the direction of palette rotation:

1       From the first specified color to the last specified color
2       From the last specified color to the first specified color
}
