[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]

    { GrafCont initializes the graphics mode and handles pallete fades. }

    unit GrafCont;

    interface

    uses
      Crt, Dos, Graph;

    type
      Palette256 = array[0..255, 0..2] of Byte;
      Palette16 = array[0..15, 0..2] of Byte;

    var
      Mode           : byte;

    procedure Init256VGA;
    procedure Init16VGA;
    procedure SetVGAPalette256(PalBuf: Palette256);
    procedure GetVGAPalette256(var PalBuf: Palette256);
    procedure SetVGAPalette16(PalBuf: Palette16);
    procedure GetVGAPalette16(var PalBuf: Palette16);
    procedure GetRGBPalette(PalNum: integer; var R, G, B: byte);
    procedure FadeOutScreen256;
    procedure FadeOutScreen16;
    procedure FadeInScreen256(PalToMake: Palette256);
    procedure FadeInScreen16(PalToMake: Palette16);

    implementation

    procedure Init256VGA;
       {This procedure relies on BGI drivers obtained for Pascal.
        You may need to create a new procedure based on your own
        method for turning on the graphics mode.}

       var
         graphmode      : integer;
         graphdriver    : integer;

       begin
       graphdriver := VGA256Graph;  {Defined as an OBJ}
       graphmode := 0;
       initgraph(graphdriver, graphmode, '');
       end;

    procedure Init16VGA;
       var
         graphdriver    : integer;
         graphmode      : integer;

       begin
       graphdriver := 9;
       graphmode := 2;
       initgraph(graphdriver, graphmode, '');
       end;

    procedure SetVGAPalette256;
    var
      ColorOn : byte;

    begin
      Port[$3C8] := 0;
      for ColorOn := 0 to 255 do
          begin
          Port[$3C9] := PalBuf[ColorOn, 0];
          Port[$3C9] := PalBuf[ColorOn, 1];
          Port[$3C9] := PalBuf[ColorOn, 2];
          end;
    end;

    procedure GetVGAPalette256;
    var
      ColorOn : byte;

    begin
      Port[$3C8] := 1;
      for ColorOn := 0 to 255 do
          begin
          PalBuf[ColorOn, 0] := Port[$3C9];
          PalBuf[ColorOn, 1] := Port[$3C9];
          PalBuf[ColorOn, 2] := Port[$3C9];
          end;
      PalBuf[0, 0] := 0;
      PalBuf[0, 1] := 0;
      PalBuf[0, 2] := 0;
    end;

    procedure SetVGAPalette16;
    var
      ColorOn : byte;

    begin
      Port[$3C8] := 0;
      for ColorOn := 0 to 15 do
          begin
          Port[$3C9] := PalBuf[ColorOn, 0];
          Port[$3C9] := PalBuf[ColorOn, 1];
          Port[$3C9] := PalBuf[ColorOn, 2];
          end;
    end;

    procedure GetVGAPalette16;
    var
      ColorOn : byte;

    begin
      Port[$3C8] := 1;
      for ColorOn := 0 to 15 do
          begin
          PalBuf[ColorOn, 0] := Port[$3C9];
          PalBuf[ColorOn, 1] := Port[$3C9];
          PalBuf[ColorOn, 2] := Port[$3C9];
          end;
      PalBuf[0, 0] := 0;
      PalBuf[0, 1] := 0;
      PalBuf[0, 2] := 0;
    end;

    procedure GetRGBPalette;

    begin
      Port[$3C8] := PalNum;
      R := Port[$3C9];
      G := Port[$3C9];
      B := Port[$3C9];
    end;

    procedure FadeOutScreen256;
       var
         Count        : word;
         ColorOn      : byte;
         PalToMake    : Palette256;
         PaletteStuff : Palette256;

       begin
       GetVGAPalette256(PaletteStuff);
       PalToMake := PaletteStuff;
       for Count := 63 downto 0 do
           begin
           Port[$3C8] := 0;
           PaletteStuff := PalToMake;
           Delay(1);
           for ColorOn := 0 to 255 do
               begin
               PaletteStuff[ColorOn, 0] := (PaletteStuff[ColorOn, 0] * Count) div 63;
               PaletteStuff[ColorOn, 1] := (PaletteStuff[ColorOn, 1] * Count) div 63;
               PaletteStuff[ColorOn, 2] := (PaletteStuff[ColorOn, 2] * Count) div 63;
               Port[$3C9] := PaletteStuff[ColorOn, 0];
               Port[$3C9] := PaletteStuff[ColorOn, 1];
               Port[$3C9] := PaletteStuff[ColorOn, 2];
               end;
           end;
       end;

    procedure FadeOutText;
       var
         Count        : word;
         ColorOn      : byte;
         PalToMake    : Palette256;
         PaletteStuff : Palette256;

       begin
       GetVGAPalette256(PaletteStuff);
       PalToMake := PaletteStuff;
       for Count := 63 downto 0 do
           begin
           Port[$3C8] := 0;
           PaletteStuff := PalToMake;
           Delay(20);
           for ColorOn := 0 to 255 do
               begin
               PaletteStuff[ColorOn, 0] := (PaletteStuff[ColorOn, 0] * Count) div 63;
               PaletteStuff[ColorOn, 1] := (PaletteStuff[ColorOn, 1] * Count) div 63;
               PaletteStuff[ColorOn, 2] := (PaletteStuff[ColorOn, 2] * Count) div 63;
               Port[$3C9] := PaletteStuff[ColorOn, 0];
               Port[$3C9] := PaletteStuff[ColorOn, 1];
               Port[$3C9] := PaletteStuff[ColorOn, 2];
               end;
           end;
       end;

    procedure FadeInScreen256;
       var
         Count        : byte;
         ColorOn      : byte;
         PaletteStuff : Palette256;
         FastPal      : Palette256;

       begin
       GetVGAPalette256(PaletteStuff);
       for Count := 0 to 63 do
           begin
           Port[$3C8] := 0;
           PaletteStuff := PalToMake;
           Delay(1);
           for ColorOn := 0 to 255 do
               begin
               PaletteStuff[ColorOn, 0] := (PaletteStuff[ColorOn, 0] * Count) div 63;
               PaletteStuff[ColorOn, 1] := (PaletteStuff[ColorOn, 1] * Count) div 63;
               PaletteStuff[ColorOn, 2] := (PaletteStuff[ColorOn, 2] * Count) div 63;
               Port[$3C9] := PaletteStuff[ColorOn, 0];
               Port[$3C9] := PaletteStuff[ColorOn, 1];
               Port[$3C9] := PaletteStuff[ColorOn, 2];
               end;
           end;
       end;

    procedure FadeOutScreen16;
       var
         Count        : word;
         ColorOn      : byte;
         PalToMake    : Palette16;
         PaletteStuff : Palette16;

       begin
       GetVGAPalette16(PaletteStuff);
       PalToMake := PaletteStuff;
       for Count := 63 downto 0 do
           begin
           Port[$3C8] := 0;
           PaletteStuff := PalToMake;
           Delay(5);
           for ColorOn := 0 to 15 do
               begin
               PaletteStuff[ColorOn, 0] := (PaletteStuff[ColorOn, 0] * Count) div 63;
               PaletteStuff[ColorOn, 1] := (PaletteStuff[ColorOn, 1] * Count) div 63;
               PaletteStuff[ColorOn, 2] := (PaletteStuff[ColorOn, 2] * Count) div 63;
               Port[$3C9] := PaletteStuff[ColorOn, 0];
               Port[$3C9] := PaletteStuff[ColorOn, 1];
               Port[$3C9] := PaletteStuff[ColorOn, 2];
               end;
           end;
       end;

    procedure FadeInScreen16;
       var
         Count        : byte;
         ColorOn      : byte;
         PaletteStuff : Palette16;
         FastPal      : Palette16;

       begin
       GetVGAPalette16(PaletteStuff);
       for Count := 0 to 63 do
           begin
           Port[$3C8] := 0;
           PaletteStuff := PalToMake;
           Delay(5);
           for ColorOn := 0 to 15 do
               begin
               PaletteStuff[ColorOn, 0] := (PaletteStuff[ColorOn, 0] * Count) div 63;
               PaletteStuff[ColorOn, 1] := (PaletteStuff[ColorOn, 1] * Count) div 63;
               PaletteStuff[ColorOn, 2] := (PaletteStuff[ColorOn, 2] * Count) div 63;
               Port[$3C9] := PaletteStuff[ColorOn, 0];
               Port[$3C9] := PaletteStuff[ColorOn, 1];
               Port[$3C9] := PaletteStuff[ColorOn, 2];
               end;
           end;
       end;

    end.

[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]