Diff for /xmil/vram/palettes.c between versions 1.5 and 1.18

version 1.5, 2004/08/07 07:19:56 version 1.18, 2005/02/04 06:42:12
Line 7 Line 7
 #include        "makescrn.h"  #include        "makescrn.h"
   
   
         RGB32   x1n_pal32[256];                 // xm_palette          UINT            xmil_palettes;
         RGB32   x1z_pal32[4096+8];              // GRPHPAL4096          RGB32           xmil_pal32[XMILPAL_MAX];                        // xm_palette
   
 #if defined(SUPPORT_16BPP)  #if defined(SUPPORT_16BPP)
         RGB16   x1n_pal16[256];                 // xmil_pal16          RGB16           xmil_pal16[XMILPAL_MAX];
         RGB16   x1z_pal16[4096+8];              // GRPHPAL16bit  #endif
   #if defined(SUPPORT_PALEVENT)
           PALEVENT        palevent;
 #endif  #endif
   
   #if defined(SUPPORT_TURBOZ)
 // drop  
         int             xm_palettes = 0;  
   
   
 extern  BYTE    dispmode;  
 extern  BYTE    pal_disp;  
   
   
 static const UINT16 pal4096banktbl[2][64] = {  static const UINT16 pal4096banktbl[2][64] = {
                         {       0x000, 0x008, 0x080, 0x088, 0x800, 0x808, 0x880, 0x888,                          {       0x000, 0x008, 0x080, 0x088, 0x800, 0x808, 0x880, 0x888,
                                 0x004, 0x00C, 0x084, 0x08C, 0x804, 0x80C, 0x884, 0x88C,                                  0x004, 0x00C, 0x084, 0x08C, 0x804, 0x80C, 0x884, 0x88C,
Line 43  static const UINT16 pal4096banktbl[2][64 Line 36  static const UINT16 pal4096banktbl[2][64
                                 0x110, 0x112, 0x130, 0x132, 0x310, 0x312, 0x330, 0x332,                                  0x110, 0x112, 0x130, 0x132, 0x310, 0x312, 0x330, 0x332,
                                 0x111, 0x113, 0x131, 0x133, 0x311, 0x313, 0x331, 0x333}};                                  0x111, 0x113, 0x131, 0x133, 0x311, 0x313, 0x331, 0x333}};
   
   static void pal4096to64(RGB32 *pal, const UINT16 *map) {
   
           UINT    r;
   
           r = 64;
           do {
                   pal->d = xmil_pal32[XMILPAL_4096G + (*map++)].d;
                   pal++;
           } while(--r);
   }
   #endif
   
   
   // ----
   
 void pal_makegrad(RGB32 *pal, int pals, UINT32 bg, UINT32 fg) {  void pal_makegrad(RGB32 *pal, int pals, UINT32 bg, UINT32 fg) {
   
Line 67  void pal_makegrad(RGB32 *pal, int pals,  Line 72  void pal_makegrad(RGB32 *pal, int pals, 
         }          }
 }  }
   
 void pals_cnv16pal(RGB16 *dst, const RGB32 *src, UINT pals) {  
   
         while(pals--) {  
                 *dst++ = scrnmng_makepal16(*src++);  
         }  
 }  
   
   
 // ----  // ----
   
 static  WORD    halfgrp = 0;  
 static  WORD    halftxt = 0;  
   
   
 typedef struct {  typedef struct {
         UINT8   blankcol;          UINT8   blankcol;
         UINT8   padding[3];          UINT8   padding;
         RGB32   text[24];          UINT16  skipline;
           RGB32   text[16];
   #if defined(SUPPORT_TURBOZ)
         RGB32   grph[2][16];          RGB32   grph[2][16];
         RGB32   grph64[2][64];          RGB32   grph64[2][64];
   #endif
 } PALS;  } PALS;
   
 static  PALS    pals;  static  PALS    pals;
   
   
   #if !defined(SUPPORT_TURBOZ)
   static void pal_settext(REG8 num) {
   
           RGB32   rgb;
   
           rgb.p.e = 0;
           if (!num) {
                   rgb.p.b = pals.blankcol;
                   rgb.p.g = pals.blankcol;
                   rgb.p.r = pals.blankcol;
           }
           else {
                   rgb.p.b = (num & 1)?0xff:0x00;
                   rgb.p.g = (num & 4)?0xff:0x00;
                   rgb.p.r = (num & 2)?0xff:0x00;
           }
           pals.text[num].d = rgb.d;
           pals.text[num+8].p.b = (UINT8)((pals.skipline * rgb.p.b) >> 8);
           pals.text[num+8].p.g = (UINT8)((pals.skipline * rgb.p.g) >> 8);
           pals.text[num+8].p.r = (UINT8)((pals.skipline * rgb.p.r) >> 8);
           crtc.e.palandply = 1;
   }
   #else
 void pal_settext(REG8 num) {  void pal_settext(REG8 num) {
   
         REG8    textpal;          REG8    textpal;
         REG8    black;          REG8    black;
         RGB32   rgb;          RGB32   rgb;
   
         textpal = crtc_TEXTPAL[num];          textpal = crtc.p.text[num];
         black = 0;          black = 0;
         rgb.p.e = 0;          rgb.p.e = 0;
         rgb.p.b = ((textpal >> 0) & 3) * 0x55;          rgb.p.b = ((textpal >> 0) & 3) * 0x55;
Line 118  void pal_settext(REG8 num) { Line 138  void pal_settext(REG8 num) {
                 rgb.p.g = pals.blankcol;                  rgb.p.g = pals.blankcol;
                 rgb.p.r = pals.blankcol;                  rgb.p.r = pals.blankcol;
         }          }
         x1z_pal32[4096 + num].d = rgb.d;          xmil_pal32[XMILPAL_4096T + num].d = rgb.d;
 #if defined(SUPPORT_16BPP)  #if defined(SUPPORT_16BPP)
         if (scrnmng_getbpp() == 16) {          if (scrnmng_getbpp() == 16) {
                 x1z_pal16[4096 + num] = scrnmng_makepal16(rgb);                  xmil_pal16[XMILPAL_4096T + num] = scrnmng_makepal16(rgb);
         }          }
 #endif  #endif
   
         pals.text[num].d = rgb.d;          pals.text[num].d = rgb.d;
         pals.text[num].p.e = num + START_EXT;          pals.text[num+8].p.b = (UINT8)((pals.skipline * rgb.p.b) >> 8);
           pals.text[num+8].p.g = (UINT8)((pals.skipline * rgb.p.g) >> 8);
         pals.text[num+8].p.b = (halftxt * rgb.p.b) / 255;          pals.text[num+8].p.r = (UINT8)((pals.skipline * rgb.p.r) >> 8);
         pals.text[num+8].p.g = (halftxt * rgb.p.g) / 255;          crtc.e.palandply = 1;
         pals.text[num+8].p.r = (halftxt * rgb.p.r) / 255;  
         pals.text[num+8].p.e = num + START_EXT + 0x08;  
   
         pals.text[num+16].p.b = (halfgrp * rgb.p.b) / 255;  
         pals.text[num+16].p.g = (halfgrp * rgb.p.g) / 255;  
         pals.text[num+16].p.r = (halfgrp * rgb.p.r) / 255;  
         pals.text[num+16].p.e = num + START_EXT + 0x10;  
   
         makescrn.palandply = 1;  
 }  }
   
 void pal_setgrph(REG8 bank, REG8 num) {  void pal_setgrph(REG8 bank, REG8 num) {
Line 147  void pal_setgrph(REG8 bank, REG8 num) { Line 157  void pal_setgrph(REG8 bank, REG8 num) {
         REG8    black;          REG8    black;
         RGB32   rgb;          RGB32   rgb;
   
         grphpal = crtc_GRPHPAL[bank][num];          grphpal = crtc.p.grph[bank][num];
         black = 0;          black = 0;
           rgb.p.e = 0;
         rgb.p.b = ((grphpal >> 0) & 0x0f) * 0x11;          rgb.p.b = ((grphpal >> 0) & 0x0f) * 0x11;
         if (rgb.p.b < pals.blankcol) {          if (rgb.p.b < pals.blankcol) {
                 black |= 1;                  black |= 1;
Line 167  void pal_setgrph(REG8 bank, REG8 num) { Line 178  void pal_setgrph(REG8 bank, REG8 num) {
                 rgb.p.r = pals.blankcol;                  rgb.p.r = pals.blankcol;
         }          }
         pals.grph64[bank][num].d = rgb.d;          pals.grph64[bank][num].d = rgb.d;
         pals.grph64[bank][num].p.e = num + START_PAL;  
         if (!(((num >> 3) ^ num) & 7)) {          if (!(((num >> 3) ^ num) & 7)) {
                 num &= 7;                  num &= 7;
                 pals.grph[bank][num+0].d = rgb.d;                  pals.grph[bank][num+0].d = rgb.d;
                 pals.grph[bank][num+0].p.e = num + START_EXT + 0x18;                  pals.grph[bank][num+8].p.b = (UINT8)((pals.skipline * rgb.p.b) >> 8);
                 pals.grph[bank][num+8].p.b = (halfgrp * rgb.p.b) / 0xff;                  pals.grph[bank][num+8].p.g = (UINT8)((pals.skipline * rgb.p.g) >> 8);
                 pals.grph[bank][num+8].p.g = (halfgrp * rgb.p.g) / 0xff;                  pals.grph[bank][num+8].p.r = (UINT8)((pals.skipline * rgb.p.r) >> 8);
                 pals.grph[bank][num+8].p.r = (halfgrp * rgb.p.r) / 0xff;  
                 pals.grph[bank][num+8].p.e = num + START_EXT + 0x20;  
         }          }
         makescrn.palandply = 1;          crtc.e.palandply = 1;
 }  }
   
 void pal_setgrph4096(UINT num) {  void pal_setgrph4096(UINT num) {
Line 186  void pal_setgrph4096(UINT num) { Line 194  void pal_setgrph4096(UINT num) {
         REG8    black;          REG8    black;
         RGB32   rgb;          RGB32   rgb;
   
         grphpal = crtc_PAL4096[num];          grphpal = crtc.p.grph4096[num];
         black = 0;          black = 0;
         rgb.p.e = 0;          rgb.p.e = 0;
         rgb.p.b = ((grphpal >> 0) & 0x0f) * 0x11;          rgb.p.b = ((grphpal >> 0) & 0x0f) * 0x11;
Line 206  void pal_setgrph4096(UINT num) { Line 214  void pal_setgrph4096(UINT num) {
                 rgb.p.g = pals.blankcol;                  rgb.p.g = pals.blankcol;
                 rgb.p.r = pals.blankcol;                  rgb.p.r = pals.blankcol;
         }          }
         x1z_pal32[num].d = rgb.d;          xmil_pal32[XMILPAL_4096G + num].d = rgb.d;
 #if defined(SUPPORT_16BPP)  #if defined(SUPPORT_16BPP)
         if (scrnmng_getbpp() == 16) {          if (scrnmng_getbpp() == 16) {
                 x1z_pal16[num] = scrnmng_makepal16(rgb);                  xmil_pal16[XMILPAL_4096G + num] = scrnmng_makepal16(rgb);
         }          }
 #endif  #endif
         makescrn.palandply = 1;          crtc.e.palandply = 1;
 }  }
   #endif
   
   
 // ----  // ----
   
 static void pal4096to64(RGB32 *pal, const UINT16 *map) {  void pal_update1(const UINT8 *rgbp) {
   
         UINT    r;  
   
         r = 64;          UINT    i;
         do {          UINT    j;
                 pal->d = x1z_pal32[*map++].d;          REG8    bit;
                 pal++;          UINT    c;
         } while(--r);          UINT    skip8;
           UINT    bcnt;
   
           skip8 = 0;
           if (!(crtc.s.SCRN_BITS & SCRN_24KHZ)) {
                   skip8 = 8;
           }
           for (i=0, bit=1; i<8; i++, bit<<=1) {
   #if defined(SUPPORT_TURBOZ)
                   if (!(crtc.s.EXTPALMODE & 0x80)) {
   #endif
                           c = 0;
                           if (rgbp[CRTC_PALB] & bit) {
                                   c += 1;
                           }
                           if (rgbp[CRTC_PALR] & bit) {
                                   c += 2;
                           }
                           if (rgbp[CRTC_PALG] & bit) {
                                   c += 4;
                           }
   #if defined(SUPPORT_TURBOZ)
                   }
                   else {
                           c = i;
                   }
   #endif
   #if !defined(SUPPORT_TURBOZ)
                   xmil_pal32[i].d = pals.text[c].d;
                   xmil_pal32[i+64].d = pals.text[c + skip8].d;
   #else
                   xmil_pal32[i].d = pals.grph[crtc.e.pal_disp][c].d;
                   xmil_pal32[i+64].d = pals.grph[crtc.e.pal_disp][c + skip8].d;
   #endif
                   if (rgbp[CRTC_PLY] & bit) {
                           for (j=i+8; j<64; j+=8) {
                                   xmil_pal32[j].d = xmil_pal32[i].d;
                                   xmil_pal32[j+64].d = xmil_pal32[i+64].d;
                           }
                   }
                   else {
                           bcnt = (rgbp[CRTC_BLACK] & 15) - 8;
                           for (j=i+8; j<64; j+=8) {
                                   bcnt--;
                                   if (bcnt) {
                                           c = j >> 3;
                                   }
                                   else {
                                           c = 0;
                                   }
                                   xmil_pal32[j].d = pals.text[c].d;
                                   xmil_pal32[j+64].d = pals.text[c + skip8].d;
                           }
                   }
           }
   #if defined(SUPPORT_16BPP)
           if (scrnmng_getbpp() == 16) {
                   for (i=0; i<xmil_palettes; i++) {
                           xmil_pal16[i] = scrnmng_makepal16(xmil_pal32[i]);
                   }
           }
   #endif
 }  }
   
 void palettes(void) {  void pal_update(void) {
   
         int             i, j;  #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_16BPP)
         BYTE    bit;          UINT    i;
         BYTE    c;  #endif
         BYTE    skip8 = 0;  
         BYTE    skip16 = 0;  
   
         if (pal_disp & PAL_4096) {  #if !defined(SUPPORT_TURBOZ)
                 switch(pal_disp & 0xf) {          pal_update1(crtc.s.rgbp);
           xmil_palettes = 64 + 64;
   #else
           if (!(crtc.e.dispmode & SCRN64_ENABLE)) {
                   pal_update1(crtc.s.rgbp);
                   xmil_palettes = 64 + 64;
                   scrndraw_changepalette();
                   return;
           }
           else if (crtc.e.pal_disp & PAL_4096) {
                   switch(crtc.e.pal_disp & 0xf) {
                         case PAL_4096H:                          case PAL_4096H:
                                 pal4096to64(x1n_pal32, pal4096banktbl[0]);                                  pal4096to64(xmil_pal32, pal4096banktbl[0]);
                                 xm_palettes = 64;                                  xmil_palettes = 64;
                                 break;                                  break;
   
                         case PAL_4096L:                          case PAL_4096L:
                                 pal4096to64(x1n_pal32, pal4096banktbl[1]);                                  pal4096to64(xmil_pal32, pal4096banktbl[1]);
                                 xm_palettes = 64;                                  xmil_palettes = 64;
                                 break;                                  break;
   
                         case (PAL_4096H | PAL_64x2):                          case (PAL_4096H | PAL_64x2):
                                 pal4096to64(&x1n_pal32[ 0], pal4096banktbl[0]);                                  pal4096to64(&xmil_pal32[ 0], pal4096banktbl[0]);
                                 pal4096to64(&x1n_pal32[64], pal4096banktbl[1]);                                  pal4096to64(&xmil_pal32[64], pal4096banktbl[1]);
                                 xm_palettes = 128;                                  xmil_palettes = 128;
                                 break;                                  break;
   
                         case (PAL_4096L | PAL_64x2):                          case (PAL_4096L | PAL_64x2):
                                 pal4096to64(&x1n_pal32[ 0], pal4096banktbl[0]);                                  pal4096to64(&xmil_pal32[ 0], pal4096banktbl[0]);
                                 pal4096to64(&x1n_pal32[64], pal4096banktbl[1]);                                  pal4096to64(&xmil_pal32[64], pal4096banktbl[1]);
                                 xm_palettes = 128;                                  xmil_palettes = 128;
                                 break;                                  break;
   
                         default:                                                // fullcolor!                          default:                                                // fullcolor!
                                 return;                                  return;
                 }                  }
                 for (i=0; i<8; i++) {                  for (i=0; i<8; i++) {
                         x1n_pal32[xm_palettes++].d = pals.text[i].d;                          xmil_pal32[xmil_palettes++].d = pals.text[i].d;
                 }                  }
         }          }
         else if ((dispmode & SCRN64_MASK) == SCRN64_INVALID) {  
                 if ((xmilcfg.SKIP_LINE) && (!(crtc.s.SCRN_BITS & SCRN_24KHZ))) {  
                         skip8 = 8;  
                         skip16 = 16;  
                 }  
                 for (i=0, bit=1; i<8; i++, bit<<=1) {  
                         if (!(crtc.s.EXTPALMODE & 0x80)) {  
                                 c = 0;  
                                 if (crtc.s.PAL_B & bit) {  
                                         c |= 1;  
                                 }  
                                 if (crtc.s.PAL_R & bit) {  
                                         c |= 2;  
                                 }  
                                 if (crtc.s.PAL_G & bit) {  
                                         c |= 4;  
                                 }  
                         }  
                         else {  
                                 c = i;  
                         }  
                         x1n_pal32[i].d = pals.grph[pal_disp][c].d;  
                         x1n_pal32[i+64].d = x1n_pal32[i+128].d  
                                                                                 = pals.grph[pal_disp][c+skip8].d;  
                         if (crtc.s.PLY & bit) {  
                                 for (j=i+8; j<64; j+=8) {  
                                         x1n_pal32[j].d = x1n_pal32[i].d;  
                                         x1n_pal32[j+64].d = x1n_pal32[j+128].d  
                                                                                                         = x1n_pal32[i+64].d;  
                                 }  
                         }  
                         else {  
                                 BYTE cnt = (crtc.s.BLACKPAL & 15) - 8;  
                                 for (j=i+8; j<64; j+=8) {  
                                         if (--cnt) {  
                                                 c = crtc.s.TEXT_PAL[j>>3];  
                                         }  
                                         else {  
                                                 c = 0;  
                                         }  
                                         x1n_pal32[j].d = pals.text[c].d;  
                                         x1n_pal32[j+64].d = pals.text[c+skip8].d;  
                                         x1n_pal32[j+128].d = pals.text[c+skip16].d;  
                                 }  
                         }  
                 }  
                 for (i=0; i<24; i++) {  
                         x1n_pal32[i+192].d = pals.text[i].d;  
                 }  
                 for (i=0; i<16; i++) {  
                         x1n_pal32[i+192+24].d = pals.grph[pal_disp][i].d;  
                 }  
                 xm_palettes = 64+64+64+24+16;  
         }  
         else {          else {
                 for (i=0; i<64; i++) {                  for (i=0; i<64; i++) {
                         x1n_pal32[i].d = pals.grph64[pal_disp][i].d;                          xmil_pal32[i].d = pals.grph64[crtc.e.pal_disp][i].d;
                 }                  }
                 for (i=0; i<8; i++) {                  for (i=0; i<8; i++) {
                         x1n_pal32[i+64].d = pals.text[i].d;                          xmil_pal32[i+64].d = pals.text[i].d;
                   }
                   xmil_palettes = 64 + 8;
           }
   #endif
   
   #if defined(SUPPORT_16BPP)
           if (scrnmng_getbpp() == 16) {
                   for (i=0; i<xmil_palettes; i++) {
                           xmil_pal16[i] = scrnmng_makepal16(xmil_pal32[i]);
                 }                  }
                 xm_palettes = 64+8;  
         }          }
   #endif
         scrndraw_changepalette();          scrndraw_changepalette();
 }  }
   
   #if defined(SUPPORT_PALEVENT)
   void pal_eventclear(void) {
   
           if ((!corestat.drawframe) ||
                   (!xmilcfg.RASTER) || (scrnmng_getbpp() == 8)) {
                   palevent.events = SUPPORT_PALEVENT;
           }
           else {
                   CopyMemory(palevent.rgbp, crtc.s.rgbp, CRTC_RGBPMAX);
                   palevent.events = 0;
           }
   }
   #endif
   
   
 // ----  // ----
   
 void reflesh_palette(void) {  void pal_reset(void) {
   
         REG8    i;          REG8    i;
   #if defined(SUPPORT_TURBOZ)
         REG8    j;          REG8    j;
         UINT    k;          UINT    k;
   #endif
   
         pals.blankcol = xmilcfg.BLKLIGHT;          pals.blankcol = 0;
         if ((!xmilcfg.SKIP_LINE) || (crtc.s.SCRN_BITS & SCRN_24KHZ)) {          pals.skipline = (xmilcfg.skipline)?xmilcfg.skiplight:0;
                 pals.blankcol >>= 1;  
         }  
         halfgrp = xmilcfg.LINEDEPTH;  
         switch(xmilcfg.TEXT400L) {  
                 case 0:  
                         halftxt = xmilcfg.LINEDEPTH;  
                         break;  
   
                 case 1:  
                         halftxt = 0xff;  
                         break;  
   
                 default:  
                         halftxt = xmilcfg.LINETEXT;  
                         break;  
         }  
   
         for (i=0; i<8; i++) {          for (i=0; i<8; i++) {
                 pal_settext(i);                  pal_settext(i);
         }          }
   #if defined(SUPPORT_TURBOZ)
         for (i=0; i<2; i++) {          for (i=0; i<2; i++) {
                 for (j=0; j<64; j++) {                  for (j=0; j<64; j++) {
                         pal_setgrph(i, j);                          pal_setgrph(i, j);
Line 373  void reflesh_palette(void) { Line 404  void reflesh_palette(void) {
         for (k=0; k<4096; k++) {          for (k=0; k<4096; k++) {
                 pal_setgrph4096(k);                  pal_setgrph4096(k);
         }          }
   #endif
 }  }
   

Removed from v.1.5  
changed lines
  Added in v.1.18


RetroPC.NET-CVS <cvs@retropc.net>