|
|
| version 1.1, 2004/08/01 05:31:31 | version 1.17, 2004/08/20 08:41:41 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "scrnmng.h" | #include "scrnmng.h" |
| #include "pccore.h" | #include "pccore.h" |
| #include "x1_io.h" | #include "iocore.h" |
| #include "x1_crtc.h" | #include "scrndraw.h" |
| #include "draw.h" | |
| #include "palettes.h" | #include "palettes.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 | static const UINT16 pal4096banktbl[2][64] = { |
| int xm_palettes = 0; | { 0x000, 0x008, 0x080, 0x088, 0x800, 0x808, 0x880, 0x888, |
| 0x004, 0x00C, 0x084, 0x08C, 0x804, 0x80C, 0x884, 0x88C, | |
| 0x040, 0x048, 0x0C0, 0x0C8, 0x840, 0x848, 0x8C0, 0x8C8, | |
| 0x044, 0x04C, 0x0C4, 0x0CC, 0x844, 0x84C, 0x8C4, 0x8CC, | |
| 0x400, 0x408, 0x480, 0x488, 0xC00, 0xC08, 0xC80, 0xC88, | |
| 0x404, 0x40C, 0x484, 0x48C, 0xC04, 0xC0C, 0xC84, 0xC8C, | |
| void pals_cnv16pal(RGB16 *dst, const RGB32 *src, UINT pals) { | 0x440, 0x448, 0x4C0, 0x4C8, 0xC40, 0xC48, 0xCC0, 0xCC8, |
| 0x444, 0x44C, 0x4C4, 0x4CC, 0xC44, 0xC4C, 0xCC4, 0xCCC}, | |
| while(pals--) { | |
| *dst++ = scrnmng_makepal16(*src++); | { 0x000, 0x002, 0x020, 0x022, 0x200, 0x202, 0x220, 0x222, |
| } | 0x001, 0x003, 0x021, 0x023, 0x201, 0x203, 0x221, 0x223, |
| 0x010, 0x012, 0x030, 0x032, 0x210, 0x212, 0x230, 0x232, | |
| 0x011, 0x013, 0x031, 0x033, 0x211, 0x213, 0x231, 0x233, | |
| 0x100, 0x102, 0x120, 0x122, 0x300, 0x302, 0x320, 0x322, | |
| 0x101, 0x103, 0x121, 0x123, 0x301, 0x303, 0x321, 0x323, | |
| 0x110, 0x112, 0x130, 0x132, 0x310, 0x312, 0x330, 0x332, | |
| 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, DWORD bg, DWORD fg) { | // ---- |
| void pal_makegrad(RGB32 *pal, int pals, UINT32 bg, UINT32 fg) { | |
| int i; | int i; |
| if (pals >= 2) { | if (pals >= 2) { |
| pals--; | pals--; |
| for (i=0; i<=pals; i++) { | for (i=0; i<=pals; i++) { |
| pal[i].p.b = (BYTE) | pal[i].p.b = (UINT8) |
| ((((fg >> 0) & 0x0000ff) * i + | ((((fg >> 0) & 0x0000ff) * i + |
| ((bg >> 0) & 0x0000ff) * (pals-i)) / pals); | ((bg >> 0) & 0x0000ff) * (pals-i)) / pals); |
| pal[i].p.g = (BYTE) | pal[i].p.g = (UINT8) |
| ((((fg >> 8) & 0x0000ff) * i + | ((((fg >> 8) & 0x0000ff) * i + |
| ((bg >> 8) & 0x0000ff) * (pals-i)) / pals); | ((bg >> 8) & 0x0000ff) * (pals-i)) / pals); |
| pal[i].p.r = (BYTE) | pal[i].p.r = (UINT8) |
| ((((fg >> 16) & 0x0000ff) * i + | ((((fg >> 16) & 0x0000ff) * i + |
| ((bg >> 16) & 0x0000ff) * (pals-i)) / pals); | ((bg >> 16) & 0x0000ff) * (pals-i)) / pals); |
| pal[i].p.e = 0; | pal[i].p.e = 0; |
| Line 52 void pal_makegrad(RGB32 *pal, int pals, | Line 72 void pal_makegrad(RGB32 *pal, int pals, |
| } | } |
| } | } |
| // --------------------------------------------------------------------------- | |
| static BYTE blankcol = 0; | // ---- |
| static WORD halfgrp = 0; | |
| static WORD halftxt = 0; | typedef struct { |
| UINT8 blankcol; | |
| UINT8 padding; | |
| UINT16 skipline; | |
| RGB32 text[16]; | |
| #if defined(SUPPORT_TURBOZ) | |
| RGB32 grph[2][16]; | |
| RGB32 grph64[2][64]; | |
| #endif | |
| } PALS; | |
| RGB32 TEXTPALS[24]; | static PALS pals; |
| RGB32 GRPHPALS[2][16]; | |
| RGB32 GRPHPALS64[2][64]; | |
| void textpalette1(BYTE num) { | #if !defined(SUPPORT_TURBOZ) |
| static void pal_settext(REG8 num) { | |
| REG8 f; | RGB32 rgb; |
| RGB32 c; | |
| f = 0; | rgb.p.e = 0; |
| c.p.e = 0; | if (!num) { |
| c.p.b = (crtc_TEXTPAL[num] & 0x3) * 0x55; | rgb.p.b = pals.blankcol; |
| if (c.p.b < blankcol) { | rgb.p.g = pals.blankcol; |
| f |= 1; | rgb.p.r = pals.blankcol; |
| } | |
| c.p.g = ((crtc_TEXTPAL[num] & 0x30) >> 4) * 0x55; | |
| if (c.p.g < blankcol) { | |
| f |= 2; | |
| } | } |
| c.p.r = ((crtc_TEXTPAL[num] & 0x0c) >> 2) * 0x55; | else { |
| if (c.p.r < blankcol) { | rgb.p.b = (num & 1)?0xff:0x00; |
| f |= 4; | rgb.p.g = (num & 4)?0xff:0x00; |
| rgb.p.r = (num & 2)?0xff:0x00; | |
| } | } |
| if (f == 7) { | pals.text[num].d = rgb.d; |
| c.d = 0x010101 * blankcol; | 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); | |
| makescrn.palandply = 1; | |
| } | |
| #else | |
| void pal_settext(REG8 num) { | |
| REG8 textpal; | |
| REG8 black; | |
| RGB32 rgb; | |
| textpal = crtc.p.text[num]; | |
| black = 0; | |
| rgb.p.e = 0; | |
| rgb.p.b = ((textpal >> 0) & 3) * 0x55; | |
| if (rgb.p.b < pals.blankcol) { | |
| black |= 1; | |
| } | |
| rgb.p.g = ((textpal >> 4) & 3) * 0x55; | |
| if (rgb.p.g < pals.blankcol) { | |
| black |= 2; | |
| } | |
| rgb.p.r = ((textpal >> 2) & 3) * 0x55; | |
| if (rgb.p.r < pals.blankcol) { | |
| black |= 4; | |
| } | |
| if (black == 7) { | |
| rgb.p.b = pals.blankcol; | |
| rgb.p.g = pals.blankcol; | |
| rgb.p.r = pals.blankcol; | |
| } | } |
| x1z_pal32[4096+num].d = c.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(c); | xmil_pal16[XMILPAL_4096T + num] = scrnmng_makepal16(rgb); |
| } | } |
| #endif | #endif |
| 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); | |
| makescrn.palandply = 1; | |
| } | |
| TEXTPALS[num].d = c.d; | void pal_setgrph(REG8 bank, REG8 num) { |
| TEXTPALS[num].p.e = num + START_EXT; | |
| TEXTPALS[num+8].p.b = (halftxt * c.p.b) / 0x00ff; | UINT grphpal; |
| TEXTPALS[num+8].p.g = (halftxt * c.p.g) / 0x00ff; | REG8 black; |
| TEXTPALS[num+8].p.r = (halftxt * c.p.r) / 0x00ff; | RGB32 rgb; |
| TEXTPALS[num+8].p.e = num + START_EXT + 0x08; | |
| grphpal = crtc.p.grph[bank][num]; | |
| black = 0; | |
| rgb.p.e = 0; | |
| rgb.p.b = ((grphpal >> 0) & 0x0f) * 0x11; | |
| if (rgb.p.b < pals.blankcol) { | |
| black |= 1; | |
| } | |
| rgb.p.g = ((grphpal >> 8) & 0x0f) * 0x11; | |
| if (rgb.p.g < pals.blankcol) { | |
| black |= 2; | |
| } | |
| rgb.p.r = ((grphpal >> 4) & 0x0f) * 0x11; | |
| if (rgb.p.r < pals.blankcol) { | |
| black |= 4; | |
| } | |
| if (black == 7) { | |
| rgb.p.b = pals.blankcol; | |
| rgb.p.g = pals.blankcol; | |
| rgb.p.r = pals.blankcol; | |
| } | |
| pals.grph64[bank][num].d = rgb.d; | |
| if (!(((num >> 3) ^ num) & 7)) { | |
| num &= 7; | |
| pals.grph[bank][num+0].d = rgb.d; | |
| pals.grph[bank][num+8].p.b = (UINT8)((pals.skipline * rgb.p.b) >> 8); | |
| pals.grph[bank][num+8].p.g = (UINT8)((pals.skipline * rgb.p.g) >> 8); | |
| pals.grph[bank][num+8].p.r = (UINT8)((pals.skipline * rgb.p.r) >> 8); | |
| } | |
| makescrn.palandply = 1; | |
| } | |
| TEXTPALS[num+16].p.b = (halfgrp * c.p.b) / 0x00ff; | void pal_setgrph4096(UINT num) { |
| TEXTPALS[num+16].p.g = (halfgrp * c.p.g) / 0x00ff; | |
| TEXTPALS[num+16].p.r = (halfgrp * c.p.r) / 0x00ff; | |
| TEXTPALS[num+16].p.e = num + START_EXT + 0x10; | |
| palandply = 1; | UINT grphpal; |
| REG8 black; | |
| RGB32 rgb; | |
| grphpal = crtc.p.grph4096[num]; | |
| black = 0; | |
| rgb.p.e = 0; | |
| rgb.p.b = ((grphpal >> 0) & 0x0f) * 0x11; | |
| if (rgb.p.b < pals.blankcol) { | |
| black |= 1; | |
| } | |
| rgb.p.g = ((grphpal >> 8) & 0x0f) * 0x11; | |
| if (rgb.p.g < pals.blankcol) { | |
| black |= 2; | |
| } | |
| rgb.p.r = ((grphpal >> 4) & 0x0f) * 0x11; | |
| if (rgb.p.r < pals.blankcol) { | |
| black |= 4; | |
| } | |
| if (black == 7) { | |
| rgb.p.b = pals.blankcol; | |
| rgb.p.g = pals.blankcol; | |
| rgb.p.r = pals.blankcol; | |
| } | |
| xmil_pal32[XMILPAL_4096G + num].d = rgb.d; | |
| #if defined(SUPPORT_16BPP) | |
| if (scrnmng_getbpp() == 16) { | |
| xmil_pal16[XMILPAL_4096G + num] = scrnmng_makepal16(rgb); | |
| } | |
| #endif | |
| makescrn.palandply = 1; | |
| } | } |
| #endif | |
| void grphpalette1(BYTE bank, BYTE num) { | // ---- |
| RGB32 c; | void pal_update1(const UINT8 *rgbp) { |
| BYTE f = 0; | |
| c.p.b = (crtc_GRPHPAL[bank][num] & 0xf) * 0x11; | UINT i; |
| if (c.p.b < blankcol) { | UINT j; |
| f |= 1; | REG8 bit; |
| } | UINT c; |
| c.p.g = (crtc_GRPHPAL[bank][num] >> 8) * 0x11; | UINT skip8; |
| if (c.p.g < blankcol) { | UINT bcnt; |
| f |= 2; | |
| } | skip8 = 0; |
| c.p.r = ((crtc_GRPHPAL[bank][num] & 0xf0) >> 4) * 0x11; | if (!(crtc.s.SCRN_BITS & SCRN_24KHZ)) { |
| if (c.p.r < blankcol) { | skip8 = 8; |
| f |= 4; | } |
| } | for (i=0, bit=1; i<8; i++, bit<<=1) { |
| if (f == 7) { | #if defined(SUPPORT_TURBOZ) |
| c.d = 0x010101 * blankcol; | 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) | |
| GRPHPALS64[bank][num].d = c.d; | if (scrnmng_getbpp() == 16) { |
| GRPHPALS64[bank][num].p.e = num + START_PAL; | for (i=0; i<xmil_palettes; i++) { |
| if (!(((num >> 3) ^ num) & 7)) { | xmil_pal16[i] = scrnmng_makepal16(xmil_pal32[i]); |
| num &= 7; | } |
| GRPHPALS[bank][num+0].d = c.d; | |
| GRPHPALS[bank][num+0].p.e = num + START_EXT + 0x18; | |
| GRPHPALS[bank][num+8].p.b = (halfgrp * c.p.b) / 0xff; | |
| GRPHPALS[bank][num+8].p.g = (halfgrp * c.p.g) / 0xff; | |
| GRPHPALS[bank][num+8].p.r = (halfgrp * c.p.r) / 0xff; | |
| GRPHPALS[bank][num+8].p.e = num + START_EXT + 0x20; | |
| } | } |
| palandply = 1; | #endif |
| } | } |
| void pal_update(void) { | |
| void grphpal4096(WORD num) { | #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_16BPP) |
| UINT i; | |
| #endif | |
| RGB32 c; | #if !defined(SUPPORT_TURBOZ) |
| BYTE f = 0; | 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: | |
| pal4096to64(xmil_pal32, pal4096banktbl[0]); | |
| xmil_palettes = 64; | |
| break; | |
| case PAL_4096L: | |
| pal4096to64(xmil_pal32, pal4096banktbl[1]); | |
| xmil_palettes = 64; | |
| break; | |
| case (PAL_4096H | PAL_64x2): | |
| pal4096to64(&xmil_pal32[ 0], pal4096banktbl[0]); | |
| pal4096to64(&xmil_pal32[64], pal4096banktbl[1]); | |
| xmil_palettes = 128; | |
| break; | |
| case (PAL_4096L | PAL_64x2): | |
| pal4096to64(&xmil_pal32[ 0], pal4096banktbl[0]); | |
| pal4096to64(&xmil_pal32[64], pal4096banktbl[1]); | |
| xmil_palettes = 128; | |
| break; | |
| c.p.e = 0; | default: // fullcolor! |
| c.p.b = (crtc_PAL4096[num] & 0xf) * 0x11; | return; |
| if (c.p.b < blankcol) { | } |
| f |= 1; | for (i=0; i<8; i++) { |
| } | xmil_pal32[xmil_palettes++].d = pals.text[i].d; |
| c.p.g = (crtc_PAL4096[num] >> 8) * 0x11; | } |
| if (c.p.g < blankcol) { | |
| f |= 2; | |
| } | |
| c.p.r = ((crtc_PAL4096[num] & 0xf0) >> 4) * 0x11; | |
| if (c.p.r < blankcol) { | |
| f |= 4; | |
| } | } |
| if (f == 7) { | else { |
| c.d = 0x010101 * blankcol; | for (i=0; i<64; i++) { |
| xmil_pal32[i].d = pals.grph64[crtc.e.pal_disp][i].d; | |
| } | |
| for (i=0; i<8; i++) { | |
| xmil_pal32[i+64].d = pals.text[i].d; | |
| } | |
| xmil_palettes = 64 + 8; | |
| } | } |
| x1z_pal32[num].d = c.d; | #endif |
| #if defined(SUPPORT_16BPP) | #if defined(SUPPORT_16BPP) |
| if (scrnmng_getbpp() == 16) { | if (scrnmng_getbpp() == 16) { |
| x1z_pal16[num] = scrnmng_makepal16(c); | for (i=0; i<xmil_palettes; i++) { |
| xmil_pal16[i] = scrnmng_makepal16(xmil_pal32[i]); | |
| } | |
| } | } |
| #endif | #endif |
| palandply = 1; | 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) { | // ---- |
| BYTE i, j; | void pal_reset(void) { |
| WORD k; | |
| blankcol = xmilcfg.BLKLIGHT; | REG8 i; |
| if ((!xmilcfg.SKIP_LINE) || (crtc.SCRN_BITS & SCRN_24KHZ)) { | #if defined(SUPPORT_TURBOZ) |
| blankcol >>= 1; | REG8 j; |
| } | UINT k; |
| halfgrp = xmilcfg.LINEDEPTH; | #endif |
| switch(xmilcfg.TEXT400L) { | |
| case 0: | |
| halftxt = xmilcfg.LINEDEPTH; | |
| break; | |
| case 1: | |
| halftxt = 0xff; | |
| break; | |
| default: | |
| halftxt = xmilcfg.LINETEXT; | |
| break; | |
| } | |
| pals.blankcol = 0; | |
| pals.skipline = (xmilcfg.skipline)?xmilcfg.skiplight:0; | |
| for (i=0; i<8; i++) { | for (i=0; i<8; i++) { |
| textpalette1(i); | pal_settext(i); |
| } | } |
| for (j=0; j<2; j++) { | #if defined(SUPPORT_TURBOZ) |
| for (i=0; i<64; i++) { | for (i=0; i<2; i++) { |
| grphpalette1(j, i); | for (j=0; j<64; j++) { |
| pal_setgrph(i, j); | |
| } | } |
| } | } |
| for (k=0; k<4096; k++) { | for (k=0; k<4096; k++) { |
| grphpal4096(k); | pal_setgrph4096(k); |
| } | } |
| #endif | |
| } | } |