home *** CD-ROM | disk | FTP | other *** search
/ Game Developers Magazine 3 / GDM003.ZIP / PALETTE.C < prev    next >
C/C++ Source or Header  |  1994-02-17  |  3KB  |  132 lines

  1. // PALETTE.C - functions for programming the VGA colour palette.
  2.  
  3. // Written by Phil Inch for Game Developers Magazine (issue 3).
  4. // Contributed to the public domain.
  5.  
  6. // This program written and compiled with Borland C++ v3.1
  7. // Compatibility with other compilers is not guaranteed.
  8.  
  9. // Usage of this program is subject to the disclaimer printed
  10. // in the magazine.  You assume all risks associated with the use
  11. // of this program.
  12.  
  13. // Note that the ASM portions of this file are written to cope with the
  14. // LARGE memory model only.
  15.  
  16. // Users of Trident and some other video cards will notice a lot of "noise"
  17. // generated when the palette is modified.  This is a problem with the
  18. // video card and not with this program.  It can be stopped by waiting for
  19. // the VBI (vertical blanking interval) which will be explained in a later
  20. // issue.
  21.  
  22.  
  23. #include <stdio.h>
  24. #include <dos.h>
  25. #include <mem.h>
  26.  
  27. /* Set an individual palette register */
  28.  
  29. void    SetPal( char Pal, char Red, char Green, char Blue ) {
  30.     asm {
  31.     mov    dh, Red
  32.     mov    ch, Green
  33.     mov    cl, Blue
  34.     mov    ax, 0x1010
  35.     mov    bl, Pal
  36.     int    0x10
  37.     }
  38. }
  39.  
  40.  
  41. /* Set a block of 'Num' palette registers */
  42.  
  43. void    SetBlockPal( char Pal, char *Array, char Num ) {
  44.   asm {
  45.       push es
  46.     les di,Array
  47.     mov dx,di
  48.     xor    ch, ch
  49.     mov    cl, Num
  50.     mov ax, 0x1012
  51.     xor    bh, bh
  52.     mov    bl, Pal
  53.     int    0x10
  54.     pop    es
  55.     }
  56. }
  57.  
  58.  
  59. /* Get an individual palette register */
  60.  
  61. void    GetPal( char Pal, char *Red, char *Green, char *Blue ) {
  62.     asm {
  63.     mov    ax, 0x1015
  64.     mov    bl, Pal
  65.     int    0x10
  66.     }
  67.     *Red   = _DH;
  68.     *Green = _CH;
  69.     *Blue  = _CL;
  70. }
  71.  
  72.  
  73. /* Get a block of 'Num' palette registers */
  74.  
  75. void    GetBlockPal( char Pal, char *Array, char Num ) {
  76.   asm {
  77.       push     es
  78.     les di,Array
  79.     mov dx,di
  80.     xor    ch, ch
  81.     mov    cl, Num
  82.     mov    ax, 0x1017
  83.     xor    bh, bh
  84.     mov    bl, Pal
  85.     int    0x10
  86.     pop    es
  87.     }
  88. }
  89.  
  90.  
  91. /* Fade in (from black) the specified palette */
  92.  
  93. void FadePaletteIn( char *Array ) {
  94.   char tmpPal[768];
  95.   int diff, c;
  96.  
  97.   memset( tmpPal, 0, 768 );
  98.  
  99.   do {
  100.     delay(20); diff=0;
  101.     SetBlockPal( 1, tmpPal, 255 );
  102.     for ( c = 0; c < 765; c++ ) {
  103.       if ( tmpPal[c] != Array[c] ) {
  104.         tmpPal[c]++;
  105.         diff++;
  106.         }
  107.       }
  108.     } while (diff);
  109. }
  110.  
  111.  
  112. /* Fade out (to black) the current palette */
  113.  
  114. void FadePaletteOut( void ) {
  115.   char tmpPal[768];
  116.   int diff, c;
  117.  
  118.   GetBlockPal( 1, &(tmpPal[0]), 255 );
  119.  
  120.   do {
  121.     diff = 0;
  122.     delay(10);
  123.     SetBlockPal( 1, &(tmpPal[0]), 255 );
  124.     for ( c = 0; c < 765; c++ ) {
  125.       if ( tmpPal[c] ) {
  126.         tmpPal[c]--;
  127.         diff++;
  128.         }
  129.       }
  130.     } while (diff);
  131. }
  132.