[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{$G+} { Enable 286 Instructions }
Unit Palette;
{ Programmed By David Dahl }
(* PUBLIC DOMAIN *)
Interface
Type PaletteRec = Record
Red,
Green,
Blue : Byte;
End;
PaletteType = Array[0..255] of PaletteRec;
PalettePtr = ^PaletteType;
Procedure SetPalette (Var PalBuf : PaletteType);
Procedure GetPalette (Var PalBuf : PaletteType);
Procedure BlackPalette;
Procedure FadeInFromBlack (Var Palin : PaletteType);
Procedure FadeInFromBlackQ (Var Palin : PaletteType;
Intensity : Word);
Procedure FadeOutToBlack (Var Palin : PaletteType);
Procedure FadeFromPalToPal (Var OldPal, NewPal : PaletteType);
Procedure FadeFromPalToPalQ (Var OldPal, NewPal : PaletteType;
Color : Word);
Var BlackP : PaletteType;
WhiteP : PaletteType;
TempPal : PaletteType;
Implementation
{-[ Set Value Of All DAC Registers ]--------------------------------------}
Procedure SetPalette (Var PalBuf : PaletteType); Assembler;
Asm
PUSH DS
XOR AX, AX { Palette Start = 0 }
MOV CX, 0300h / 2
LDS SI, PalBuf { Load DS:SI With Address Of PalBuf (For OUTSB) }
MOV DX, 03C8h { Tell VGA Card What DAC Color To Start With }
OUT DX, AL
INC DX { Set DX To Equal DAC Data Port }
MOV BX, DX
CLD
{ Wait For V-sync }
MOV DX, 03DAh
@VSYNC0:
IN AL, DX
TEST AL, 8
JZ @VSYNC0
MOV DX, BX
REP
OUTSB
MOV BX, DX
{ Wait For V-sync }
MOV DX, 03DAh
@VSYNC1:
IN AL, DX
TEST AL, 8
JZ @VSYNC1
MOV DX, BX
MOV CX, 0300h / 2
REP
OUTSB
POP DS
End;
{-[ Get Value Of All DAC Registers ]--------------------------------------}
Procedure GetPalette (Var PalBuf : PaletteType); Assembler;
Asm
PUSH DS
XOR AX, AX { Palette Start = 0 }
MOV CX, 0300h
LES DI, PalBuf { Load ES:DI With Address Of PalBuf (For INSB) }
MOV DX, 03C7h { Tell VGA Card What DAC Color To Start With }
OUT DX, AL
INC DX { Set DX To Equal DAC Data Port }
INC DX
CLD
REP
INSB
POP DS
End;
Procedure BlackPalette;
Begin
SetPalette (BlackP);
End;
Procedure FadeInFromBlack (Var Palin : PaletteType);
Var DAC,
Intensity : Word;
Begin
For Intensity := 0 to 32 do
Begin
For DAC := 0 to 255 do
Begin
TempPal[DAC].Red := (Palin[DAC].Red * Intensity) DIV 32;
TempPal[DAC].Green := (Palin[DAC].Green * Intensity) DIV 32;
TempPal[DAC].Blue := (Palin[DAC].Blue * Intensity) DIV 32;
End;
SetPalette (TempPal);
End;
End;
Procedure FadeInFromBlackQ (Var Palin : PaletteType;
Intensity : Word);
Const DAC : Word = 0;
Begin
For DAC := 0 to 255 do
Begin
TempPal[DAC].Red := (Palin[DAC].Red * Intensity) DIV 32;
TempPal[DAC].Green := (Palin[DAC].Green * Intensity) DIV 32;
TempPal[DAC].Blue := (Palin[DAC].Blue * Intensity) DIV 32;
End;
SetPalette (TempPal);
End;
Procedure FadeOutToBlack (Var Palin : PaletteType);
Var DAC,
Intensity : Word;
Begin
For Intensity := 32 downto 0 do
Begin
For DAC := 0 to 255 do
Begin
TempPal[DAC].Red := (Palin[DAC].Red * Intensity) DIV 32;
TempPal[DAC].Green := (Palin[DAC].Green * Intensity) DIV 32;
TempPal[DAC].Blue := (Palin[DAC].Blue * Intensity) DIV 32;
End;
SetPalette (TempPal);
End;
End;
Procedure FadeFromPalToPal (Var OldPal, NewPal : PaletteType);
Var DAC,
Color : Word;
Begin
For Color := 32 downto 0 do
Begin
For DAC := 0 to 255 do
Begin
TempPal[DAC].Red := ((OldPal[DAC].Red * Color) DIV 32) +
((NewPal[DAC].Red * (32 - Color)) DIV 32);
TempPal[DAC].Green := ((OldPal[DAC].Green * Color) DIV 32) +
((NewPal[DAC].Green * (32 - Color)) DIV 32);
TempPal[DAC].Blue := ((OldPal[DAC].Blue * Color) DIV 32) +
((NewPal[DAC].Blue * (32 - Color)) DIV 32);
End;
SetPalette (TempPal);
End;
End;
Procedure FadeFromPalToPalQ (Var OldPal, NewPal : PaletteType;
Color : Word);
Const DAC : Word = 0;
Begin
For DAC := 0 to 255 do
Begin
TempPal[DAC].Red := ((OldPal[DAC].Red * (32 - Color)) DIV 32)+
((NewPal[DAC].Red * Color) DIV 32);
TempPal[DAC].Green := ((OldPal[DAC].Green * (32 - Color)) DIV 32)+
((NewPal[DAC].Green * Color) DIV 32);
TempPal[DAC].Blue := ((OldPal[DAC].Blue * (32 - Color)) DIV 32)+
((NewPal[DAC].Blue * Color) DIV 32);
End;
SetPalette (TempPal);
End;
Var Counter : Word;
Begin
For Counter := 0 to 255 do
Begin
BlackP[Counter].Red := 0;
BlackP[Counter].Green := 0;
BlackP[Counter].Blue := 0;
End;
For Counter := 0 to 255 do
Begin
WhiteP[Counter].Red := 63;
WhiteP[Counter].Green := 63;
WhiteP[Counter].Blue := 63;
End;
End.
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]