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

{
>thanks for the example -- do you have any idea how to read the whole
>palette at one time, etc?

Here you go...  It will work on all computers.  I do not use the 286
string instructions, as they go too fast for some VL-Bus video cards causing
incorrect colours.  The first part waits for a full vertical retrace
before changing the colours to prevent "snow" at the top of the display on
slower computers.  The only time you'll see the snow is if you continuously
get or set the palette such as in a screen fade.
}

Procedure VGAGetPalette(Pal:Pointer); Assembler;
Asm
  { Wait for Vertical Retrace }
  MOV   DX,3DAh
@@WaitNotVSync:
  IN    AL,DX
(91 min left), (H)elp, More?   AND   AL,00001000b
  JNZ   @@WaitNotVSync
@@WaitVSync:
  IN    AL,DX
  AND   AL,00001000b
  JZ    @@WaitVSync

  LES   DI,[Pal]                    {;ES:DI:=Palette Pointer           }
  XOR   AX,AX                       {;Start with DAC 0                 }
  MOV   CX,256                      {;End with DAC 255                 }
  MOV   DX,3C7h                     {; |Send Starting DAC register     }
  OUT   DX,AL                       {;/                                }
  INC   DX                          {; |DX:=DAC Data register          }
  INC   DX                          {;/                                }
  CLD
@@DACLoop:
  IN    AL,DX                       {;Read Red Byte                    }
  STOSB                             {;Store Red Byte                   }
  IN    AL,DX                       {;Read Green Byte                  }
  STOSB                             {;Store Green Byte                 }
  IN    AL,DX                       {;Read Blue Byte                   }
  STOSB                             {;Store Blue Byte                  }
  LOOP  @@DACLoop                   {;Loop until CX=0                  }
End;


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