==============================================================================
 BBS: ®® The Information and Technology Exchan
  To: DOUGLAS BAKER                Date: 11-11Ä91 (20:18)
From: WILBERT VAN.LEIJEN         Number: 2147   [101] PASCAL
Subj: 256 TEXT COLORS?           Status: Public
------------------------------------------------------------------------------
Hi Doug,

 > I was wondering if anyone knows if 256 text colors can be accessed
 > with a VGA adaptor. I figured that since such programs as VGADimmer
 > exist, (to change the brightness) I should be able to change the
 > intensity ofd each color to simulate the 256 colors. Any help and TP
 > 5.5 or 6.0 routines would be appreciated.

You can have no more than 16 colours in text mode.  These colours can be
selected on the VGA from 255 registers and changed at will.  Each register can
also be programmed to hold a specific Red, Blue and Green value ranging from
0..63, giving 64*64*64 = 262,144 unique colours.
The registers are referred to as the 'DAC registers'.

Program ShowDoug;

{$X+ }

uses Crt;

Const
  MinIntensity = 0;
  MaxIntensity = 63;

Type
  ColourRange  = MinIntensity..MaxIntensity;
  RGBType      = Record
                   r, g, b   : ColourRange;
                 end;

{ Store colour information to DAC register }

Procedure SetRegister(register : Byte; colour : ColourRange); Assembler;

ASM
        MOV     BH, colour
        MOV     BL, register
        MOV     AX, 1000h
        INT     10h
end;  { SetRegister }

{ Store the Red, Green and Blue intensity into a DAC register }

Procedure SetRGBValue(register : Byte; RGB : RGBType); Assembler;

ASM
        PUSH    DS
        LDS     SI, RGB
        XOR     BX, BX
        MOV     BL, register
        LODSB
        MOV     DH, AL
        LODSW
        XCHG    CX, AX
        XCHG    CH, CL
        MOV     AX, 1010h
        INT     10h
        POP     DS
end;  { SetRGBValue }

Var
  i, j, t : Integer;
  RGB : RGBType;

Begin
  ClrScr;
  Randomize;
  TextBackground(black);
  For i := 1 to 25 Do
    Begin
      t := 0;
      For j := 1 to 80 Do
        Begin
          TextColor(t);
          If j mod 5 = 0 Then
            Inc(t);
          If not ((j = 80) and (i = 25)) Then
            Write(#219);
      end;
    end;
  Repeat                          { fiddle with the registers }
    SetRegister(Random(16), Random(64));
    Delay(200);
  Until KeyPressed;
  ReadKey;
  Repeat                           { fiddle with the R, G, B values }
    RGB.r := Random(255);
    RGB.g := Random(255);
    RGB.b := Random(255);
    SetRGBValue(Random(64), RGB);
  Until KeyPressed;
end.


--- Dutchie V2.91d
 * Origin: Point Wilbert | 'I think, therefore I ASM'. (2:500/12.10956)
