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

    ==============================================================================
     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)

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