[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]