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

{
From: mysticm@ephsa.sat.tx.us (Eric Miller)

> first everything seemed to work out fine. Then I noticed that only
> palettes 0 (black) to 8 (white) changed OUTCLUDING palette 7 (brown).
> Colors beyond 8 (-> 15) didn't change.
>  So where's the problem? Have I understood something wrong?
>  All help will be _grrrrreatly_ appreciated!!!!

  No, you're just uninformed.  On VGA+ cards, you have to
256 palette entries.  In 16 color text mode, the first sixteen
of these entries aren't mapped to the 16 attributes like you
would expect.  The latter half are mapped down aways,
attribute 15 being palette 63, for example.  I wonder if this
is some offset from EGA days...looks like it.

 Anyways, here is some code to help...you have to get a
table from the video bios that gives you the 16 palette numbers
for the text attributes, and the palette number for the border color.
}
PROGRAM Text_Fade;
{$G+ , $N+ }
Uses Crt, Dos;
 
TYPE
  TDacTable = array[0..16] of Byte;
  { 0..15 - dac registers for text palette }
  {    16 - border register ?              }
 
VAR
  DacTable: TDacTable;
  CRTAddress, StatusReg: word;
 
PROCEDURE InitDAC(VAR T: TDacTable);
VAR
  Regs: Registers;
BEGIN
  Regs.AX := $1009;
  Intr($10, Regs);
  T := TDacTable(Ptr(Regs.ES, Regs.DX)^);
END;
 
PROCEDURE waitvsync; assembler;
ASM
  MOV DX,StatusReg
 
    @WaitNotVSyncLoop:
    in   al,dx
    and  al,8
    jnz  @WaitNotVSyncLoop
  @WaitVSyncLoop:
    in   al,dx
    and  al,8
    jz   @WaitVSyncLoop
end;
 
PROCEDURE SetTextColor(C, R, G, B: Byte;
                       T: TDacTable);
BEGIN
  C := DacTable[C];
  ASM
    MOV DX, 968
    MOV AL, C
    OUT DX, AL
    INC DX
    MOV AL, R
    OUT DX, AL
    MOV AL, G
    OUT DX, AL
    MOV AL, B
    OUT DX, AL
  END;
END;
 
 
PROCEDURE SetVGA3(C, R, G, B: Byte);
BEGIN
  C := DacTable[C];
  Port[968] := C;
  Port[969]  := R; Port[969] := G; Port[969] := B;
END;
 
VAR V, C: byte;

     
 
BEGIN
 
 IF ODD(port[$3CC])
  THEN CRTAddress:=$3D4
  ELSE CRTAddress:=$3B4;
 StatusReg:=CRTAddress+6;
 
 InitDac(DacTable);
 TextAttr := $07;
 ClrScr;
 
 TextAttr := $17;
 Writeln('Funky VGA palette setting, dood!');
 TextAttr := $71;
 Writeln('Funky VGA palette setting, dood!');
 
 WHILE NOT Keypressed DO
 BEGIN
 FOR V := 63 DOWNTO 0 DO
   BEGIN
     SetTextColor(1, V, 63-V, V, DacTable);
     SetTextColor(7, 63-V, V, 63-V, DacTable);
     IF V MOD 2 = 0 THEN waitvsync;
   END;
 FOR V := 0 TO 63 DO
   BEGIN
     SetVGA3(1, V, 63-V, V);
     SetVGA3(7, 63-V, V, 63-V);
     IF V MOD 2 = 0 THEN waitvsync;
   END;
 end;

 WHILE Readkey <> #13 DO;
  textmode(lastmode);
END.


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