diff --git a/src/burn/drv/capcom/cps.cpp b/src/burn/drv/capcom/cps.cpp index 4f33fbe67..5388c9f45 100644 --- a/src/burn/drv/capcom/cps.cpp +++ b/src/burn/drv/capcom/cps.cpp @@ -1004,6 +1004,8 @@ INT32 CpsExit() BurnFree(CpsGfx); BurnFree(CpsCode); + + bCpsUpdatePalEveryFrame = 0; nCPS68KClockspeed = 0; Cps = 0; diff --git a/src/burn/drv/capcom/cps.h b/src/burn/drv/capcom/cps.h index 0094b23cc..605661e75 100644 --- a/src/burn/drv/capcom/cps.h +++ b/src/burn/drv/capcom/cps.h @@ -132,12 +132,11 @@ extern void SetCpsBId(INT32 CpsBId, INT32 bStars); // cps_pal.cpp extern UINT32* CpsPal; // Hicolor version of palette -extern UINT32* CpsObjPal; // Pointer to lagged obj palette -extern INT32 nLagObjectPalettes; // Lag object palettes by one frame if non-zero +extern INT32 nCpsPalCtrlReg; +extern INT32 bCpsUpdatePalEveryFrame; INT32 CpsPalInit(); INT32 CpsPalExit(); -INT32 CpsPalUpdate(UINT8 *pNewPal,INT32 bRecalcAll); -INT32 CpsStarPalUpdate(UINT8* pNewPal, INT32 nLayer, INT32 bRecalcAll); +INT32 CpsPalUpdate(UINT8 *pNewPal); // cps_mem.cpp extern UINT8 *CpsRam90; @@ -169,6 +168,17 @@ inline static UINT8* CpsFindGfxRam(INT32 nAddr,INT32 nLen) return NULL; } +inline static void GetPalette(INT32 nStart, INT32 nCount) +{ + // Update Palette (Ghouls points to the wrong place on boot up I think) + INT32 nPal = (BURN_ENDIAN_SWAP_INT16(*((UINT16*)(CpsReg + 0x0A))) << 8) & 0xFFFC00; + + UINT8* Find = CpsFindGfxRam(nPal, 0xc00 << 1); + if (Find) { + memcpy(CpsSavePal + (nStart << 10), Find + (nStart << 10), nCount << 10); + } +} + // cps_rw.cpp // Treble Winner - Added INP(1FD) for sf2ue #define CPSINPSET INP(000) INP(001) INP(006) INP(007) INP(008) INP(010) INP(011) INP(012) INP(018) INP(019) INP(020) INP(021) INP(029) INP(176) INP(177) INP(179) INP(186) INP(1fd) diff --git a/src/burn/drv/capcom/cps_config.cpp b/src/burn/drv/capcom/cps_config.cpp index 85391b028..81864bc8b 100644 --- a/src/burn/drv/capcom/cps_config.cpp +++ b/src/burn/drv/capcom/cps_config.cpp @@ -835,6 +835,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x6a; MaskAddr[2] = 0x6c; MaskAddr[3] = 0x6e; + + nCpsPalCtrlReg = 0x70; CpsLayEn[1] = 0x02; CpsLayEn[2] = 0x04; @@ -861,6 +863,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x68; MaskAddr[2] = 0x66; MaskAddr[3] = 0x64; + + nCpsPalCtrlReg = 0x62; CpsLayEn[1] = 0x02; CpsLayEn[2] = 0x04; @@ -887,6 +891,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x6c; MaskAddr[2] = 0x6a; MaskAddr[3] = 0x68; + + nCpsPalCtrlReg = 0x66; CpsLayEn[1] = 0x20; CpsLayEn[2] = 0x10; @@ -913,6 +919,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x70; MaskAddr[2] = 0x68; MaskAddr[3] = 0x72; + + nCpsPalCtrlReg = 0x6a; CpsLayEn[1] = 0x02; //CpsLayEn[2] = 0x0c; @@ -941,6 +949,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x6c; MaskAddr[2] = 0x6e; MaskAddr[3] = 0x70; + + nCpsPalCtrlReg = 0x72; CpsLayEn[1] = 0x02; CpsLayEn[2] = 0x08; @@ -967,6 +977,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x6a; MaskAddr[2] = 0x6c; MaskAddr[3] = 0x6e; + + nCpsPalCtrlReg = 0x70; CpsLayEn[1] = 0x08; CpsLayEn[2] = 0x10; @@ -993,6 +1005,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x68; MaskAddr[2] = 0x66; MaskAddr[3] = 0x64; + + nCpsPalCtrlReg = 0x62; CpsLayEn[1] = 0x02; CpsLayEn[2] = 0x04; @@ -1019,6 +1033,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x66; MaskAddr[2] = 0x68; MaskAddr[3] = 0x6a; + + nCpsPalCtrlReg = 0x6c; CpsLayEn[1] = 0x20; CpsLayEn[2] = 0x02; @@ -1045,6 +1061,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x56; MaskAddr[2] = 0x58; MaskAddr[3] = 0x5a; + + nCpsPalCtrlReg = 0x5c; CpsLayEn[1] = 0x08; CpsLayEn[2] = 0x20; @@ -1071,6 +1089,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x46; MaskAddr[2] = 0x48; MaskAddr[3] = 0x4a; + + nCpsPalCtrlReg = 0x4c; CpsLayEn[1] = 0x04; CpsLayEn[2] = 0x02; @@ -1097,6 +1117,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x48; MaskAddr[2] = 0x46; MaskAddr[3] = 0x44; + + nCpsPalCtrlReg = 0x42; CpsLayEn[1] = 0x10; CpsLayEn[2] = 0x0a; @@ -1123,6 +1145,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x50; MaskAddr[2] = 0x4e; MaskAddr[3] = 0x4c; + + nCpsPalCtrlReg = 0x4a; CpsLayEn[1] = 0x08; CpsLayEn[2] = 0x10; @@ -1149,6 +1173,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0xd8; MaskAddr[2] = 0xd6; MaskAddr[3] = 0xd4; + + nCpsPalCtrlReg = 0xd2; CpsLayEn[1] = 0x10; CpsLayEn[2] = 0x08; @@ -1175,6 +1201,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x64; MaskAddr[2] = 0x62; MaskAddr[3] = 0x60; + + nCpsPalCtrlReg = 0x70; CpsLayEn[1] = 0x20; CpsLayEn[2] = 0x04; @@ -1201,6 +1229,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x6c; MaskAddr[2] = 0x6a; MaskAddr[3] = 0x68; + + nCpsPalCtrlReg = 0x70; CpsLayEn[1] = 0x30; CpsLayEn[2] = 0x08; @@ -1227,6 +1257,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x6c; MaskAddr[2] = 0x6a; MaskAddr[3] = 0x68; + + nCpsPalCtrlReg = 0x70; CpsLayEn[1] = 0x20; CpsLayEn[2] = 0x12; @@ -1253,6 +1285,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x64; MaskAddr[2] = 0x62; MaskAddr[3] = 0x60; + + nCpsPalCtrlReg = 0x70; CpsLayEn[1] = 0x20; CpsLayEn[2] = 0x10; @@ -1279,6 +1313,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x6c; MaskAddr[2] = 0x6a; MaskAddr[3] = 0x68; + + nCpsPalCtrlReg = 0x70; CpsLayEn[1] = 0x20; CpsLayEn[2] = 0x04; @@ -1305,6 +1341,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x6c; MaskAddr[2] = 0x6a; MaskAddr[3] = 0x68; + + nCpsPalCtrlReg = 0x70; CpsLayEn[1] = 0x20; CpsLayEn[2] = 0x14; @@ -1331,6 +1369,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x00; MaskAddr[2] = 0x00; MaskAddr[3] = 0x00; + + nCpsPalCtrlReg = 0x52; CpsLayEn[1] = 0x14; CpsLayEn[2] = 0x02; @@ -1357,6 +1397,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x6a; MaskAddr[2] = 0x6c; MaskAddr[3] = 0x6e; + + nCpsPalCtrlReg = 0x70; CpsLayEn[1] = 0x02; CpsLayEn[2] = 0x04; @@ -1383,6 +1425,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x66; MaskAddr[2] = 0x68; MaskAddr[3] = 0x6a; + + nCpsPalCtrlReg = 0x6c; CpsLayEn[1] = 0x10; CpsLayEn[2] = 0x08; @@ -1409,6 +1453,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x4e; MaskAddr[2] = 0x40; MaskAddr[3] = 0x42; + + nCpsPalCtrlReg = 0x44; CpsLayEn[1] = 0x16; CpsLayEn[2] = 0x16; @@ -1435,6 +1481,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x56; MaskAddr[2] = 0x48; MaskAddr[3] = 0x4a; + + nCpsPalCtrlReg = 0x4c; CpsLayEn[1] = 0x04; CpsLayEn[2] = 0x02; @@ -1461,6 +1509,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x42; MaskAddr[2] = 0x68; MaskAddr[3] = 0x6a; + + nCpsPalCtrlReg = 0x6c; CpsLayEn[1] = 0x04; CpsLayEn[2] = 0x08; @@ -1487,6 +1537,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x6e; MaskAddr[2] = 0x70; MaskAddr[3] = 0x72; + + nCpsPalCtrlReg = 0x5c; CpsLayEn[1] = 0x04; CpsLayEn[2] = 0x08; @@ -1513,6 +1565,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x50; MaskAddr[2] = 0x4e; MaskAddr[3] = 0x4c; + + nCpsPalCtrlReg = 0x4a; CpsLayEn[1] = 0xff; CpsLayEn[2] = 0xff; @@ -1539,6 +1593,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x50; MaskAddr[2] = 0x4e; MaskAddr[3] = 0x4c; + + nCpsPalCtrlReg = 0x4a; // s2m3 & sf2m8 (untested none of them write this) CpsLayEn[1] = 0x02; CpsLayEn[2] = 0x02; @@ -1565,6 +1621,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x6a; MaskAddr[2] = 0x6c; MaskAddr[3] = 0x6e; + + nCpsPalCtrlReg = 0x6a; CpsLayEn[1] = 0x02; CpsLayEn[2] = 0x04; @@ -1591,6 +1649,8 @@ void SetCpsBId(INT32 CpsBId, INT32 bStars) MaskAddr[1] = 0x6c; MaskAddr[2] = 0x6a; MaskAddr[3] = 0x68; + + nCpsPalCtrlReg = 0x66; CpsLayEn[1] = 0x02; CpsLayEn[2] = 0x04; diff --git a/src/burn/drv/capcom/cps_draw.cpp b/src/burn/drv/capcom/cps_draw.cpp index d77871720..6077d4e6f 100644 --- a/src/burn/drv/capcom/cps_draw.cpp +++ b/src/burn/drv/capcom/cps_draw.cpp @@ -234,7 +234,6 @@ static void Cps1Layers() for (i = 0; i < 2; i++) { if (LayerCont & CpsLayEn[4 + i]) { - CpsStarPalUpdate(CpsSavePal, i, CpsRecalcPal); DrawStar(i); } } @@ -464,8 +463,8 @@ static void DoDraw(INT32 Recalc) { CtvReady(); // Point to correct tile drawing functions - // Update Palette - CpsPalUpdate(CpsSavePal, Recalc); // recalc whole palette if needed + if (bCpsUpdatePalEveryFrame) GetPalette(0, 6); + if (Recalc || bCpsUpdatePalEveryFrame) CpsPalUpdate(CpsSavePal); // recalc whole palette if needed CpsClearScreen(); diff --git a/src/burn/drv/capcom/cps_obj.cpp b/src/burn/drv/capcom/cps_obj.cpp index 3d5f3b792..f5af9f60f 100644 --- a/src/burn/drv/capcom/cps_obj.cpp +++ b/src/burn/drv/capcom/cps_obj.cpp @@ -225,7 +225,7 @@ INT32 Cps1ObjDraw(INT32 nLevelFrom,INT32 nLevelTo) y+=pof->nShiftY; // Find the palette for the tiles on this sprite - CpstPal = CpsObjPal + ((a & 0x1F) << 4); + CpstPal = CpsPal + ((a & 0x1F) << 4); nFlip=(a>>5)&3; @@ -347,7 +347,7 @@ INT32 Cps2ObjDraw(INT32 nLevelFrom, INT32 nLevelTo) n |= (BURN_ENDIAN_SWAP_INT16(ps[1]) & 0x6000) << 3; // high bits of address // Find the palette for the tiles on this sprite - CpstPal = CpsObjPal + ((a & 0x1F) << 4); + CpstPal = CpsPal + ((a & 0x1F) << 4); nFlip = (a >> 5) & 3; // Find out sprite size diff --git a/src/burn/drv/capcom/cps_pal.cpp b/src/burn/drv/capcom/cps_pal.cpp index f45f13f30..54e95432b 100644 --- a/src/burn/drv/capcom/cps_pal.cpp +++ b/src/burn/drv/capcom/cps_pal.cpp @@ -1,141 +1,30 @@ #include "cps.h" +#include "bitswap.h" + // CPS (palette) static UINT8* CpsPalSrc = NULL; // Copy of current input palette - UINT32* CpsPal = NULL; // Hicolor version of palette -UINT32* CpsObjPal = NULL; - -INT32 nLagObjectPalettes; - -inline static UINT32 CalcColCPS1(UINT16 a) -{ - INT32 r, g, b, f; - const INT32 F_OFFSET = 0x0F; - -#ifndef LSB_FIRST - a = BURN_ENDIAN_SWAP_INT16(a); -#endif - - // Format is FFFF RRRR GGGG BBBB - f = (a & 0xF000) >> 12; - - r = (a & 0x0F00) >> 4; // Red - r |= r >> 4; - g = (a & 0x00F0); // Green - g |= g >> 4; - b = (a & 0x000F); // Blue - b |= b << 4; - - f += F_OFFSET; - r *= f; r /= F_OFFSET + 0x0F; - g *= f; g /= F_OFFSET + 0x0F; - b *= f; b /= F_OFFSET + 0x0F; - - return BurnHighCol(r, g, b, 0); -} - -static UINT32 CalcColCPS2(UINT16 a) -{ - INT32 r, g, b, f; - const INT32 F_OFFSET = 0x0F; - -#ifndef LSB_FIRST - a = BURN_ENDIAN_SWAP_INT16(a); -#endif - - // Format is FFFF RRRR GGGG BBBB - f = (a & 0xF000) >> 12; - - r = (a & 0x0F00) >> 4; // Red - r |= r >> 4; - g = (a & 0x00F0); // Green - g |= g >> 4; - b = (a & 0x000F); // Blue - b |= b << 4; - - f += F_OFFSET; - r *= f; r /= F_OFFSET + 0x0F; - g *= f; g /= F_OFFSET + 0x0F; - b *= f; b /= F_OFFSET + 0x0F; - - return BurnHighCol(r, g, b, 0); -} - -static INT32 CalcAll() -{ - UINT16* ps; - - if (Cps == 2) { - if (nLagObjectPalettes) { - ps = (UINT16*)CpsPalSrc + 0x0C00; - for (INT32 i = 0x0C00; i < 0x0E00; i++, ps++) { - CpsPal[i ^ 15] = CalcColCPS2(*ps); - } - ps = (UINT16*)CpsPalSrc + 0x0200; - for (INT32 i = 0x0200; i < 0x0800; i++, ps++) { - CpsPal[i ^ 15] = CalcColCPS2(*ps); - } - - memcpy(CpsPal + 0x0E00, CpsPal + 0x0C00, 0x0200 << 2); - } else { - ps = (UINT16*)CpsPalSrc; - for (INT32 i = 0x0000; i < 0x0800; i++, ps++) { - CpsPal[i ^ 15] = CalcColCPS2(*ps); - } - } - - } else { - ps = (UINT16*)CpsPalSrc; - for (INT32 i = 0x0000; i < 0x0c00; i++, ps++) { - CpsPal[i ^ 15] = CalcColCPS1(*ps); - } - } - - return 0; -} - -static void CalcAllStar(INT32 nLayer) -{ - UINT16* ps = (UINT16*)CpsPalSrc; - INT32 nOffset = 0x0800 + (nLayer << 9); - - for (INT32 i = 0; i < 128; i++, ps++) { - CpsPal[(i + nOffset) ^ 15] = CalcColCPS1(*(ps + nOffset)); - } -} +INT32 nCpsPalCtrlReg; +INT32 bCpsUpdatePalEveryFrame = 0; // Some of the hacks need this as they don't write to CpsReg 0x0a INT32 CpsPalInit() { INT32 nLen = 0; - nLen = 0x1000 * sizeof(UINT16); + nLen = 0xc00 * sizeof(UINT16); CpsPalSrc = (UINT8*)BurnMalloc(nLen); if (CpsPalSrc == NULL) { return 1; } memset(CpsPalSrc, 0, nLen); - // The star layer palettes are at the end of the normal palette, so double the size - nLen = 0x1000 * sizeof(UINT32); + nLen = 0xc00 * sizeof(UINT32); CpsPal = (UINT32*)BurnMalloc(nLen); if (CpsPal == NULL) { return 1; } - // Set CpsPal to initial values - CalcAll(); - if (CpsStar) { - CalcAllStar(0); - CalcAllStar(1); - } - - if (nLagObjectPalettes) { - CpsObjPal = CpsPal + 0x0C00; - } else { - CpsObjPal = CpsPal; - } - return 0; } @@ -146,154 +35,39 @@ INT32 CpsPalExit() return 0; } -// Update CpsPal with the new palette at pNewPal (length 0x1000 bytes) -INT32 CpsPalUpdate(UINT8* pNewPal, INT32 bRecalcAll) +// Update CpsPal with the new palette at pNewPal (length 0xc00 bytes) +INT32 CpsPalUpdate(UINT8* pNewPal) { - INT32 i; UINT16 *ps, *pn; - // If we are recalculating the whole palette, just copy to CpsPalSrc - // and recalculate it all - if (bRecalcAll) { - ps = (UINT16*)CpsPalSrc; - pn = (UINT16*)pNewPal; + ps = (UINT16*)CpsPalSrc; + pn = (UINT16*)pNewPal; - if (nLagObjectPalettes) { - INT32 nBuffer = 0x0C00 + ((GetCurrentFrame() & 1) << 9); + memcpy(ps, pn, 0xc00 * sizeof(UINT16)); + + INT32 nCtrl = CpsReg[nCpsPalCtrlReg]; + UINT16 *PaletteRAM = (UINT16*)CpsPalSrc; + + for (INT32 nPage = 0; nPage < 6; nPage++) { + if (BIT(nCtrl, nPage)) { + for (INT32 Offset = 0; Offset < 0x200; ++Offset) { + INT32 Palette = *(PaletteRAM++); + INT32 r, g, b, Bright; + + Bright = 0x0f + ((Palette >> 12) << 1); - memcpy(ps + 0x0200, pn + 0x0200, 0x0600 << 1); - memcpy(ps + nBuffer, pn, 0x0200 << 1); - memcpy(ps + 0x0E00, pn, 0x0200 << 1); - - CpsObjPal = CpsPal + nBuffer; + r = ((Palette >> 8) & 0x0f) * 0x11 * Bright / 0x2d; + g = ((Palette >> 4) & 0x0f) * 0x11 * Bright / 0x2d; + b = ((Palette >> 0) & 0x0f) * 0x11 * Bright / 0x2d; + + CpsPal[(0x200 * nPage) + (Offset ^ 15)] = BurnHighCol(r, g, b, 0); + } } else { - memcpy(ps, pn, 0x0c00 << 1); - } - - CalcAll(); - - return 0; - } - - if (Cps == 2) { - if (nLagObjectPalettes) { - INT32 nBuffer = 0x0C00 + ((GetCurrentFrame() & 1) << 9); - - ps = (UINT16*)CpsPalSrc + (nBuffer ^ 0x0200); - pn = (UINT16*)pNewPal; - CpsObjPal = CpsPal + (nBuffer ^ 0x0200); - - for (i = 0; i < 0x0200; i++, ps++, pn++) { - UINT16 n; - n = *pn; - if (*ps == n) { - continue; // Colour hasn't changed - great! - } - - *ps = n; // Update our copy of the palette - - CpsObjPal[i ^ 15] = CalcColCPS2(n); + if (PaletteRAM != (UINT16*)CpsPalSrc) { + PaletteRAM += 0x200; } - - ps = (UINT16*)CpsPalSrc + 0x0200; - pn = (UINT16*)pNewPal + 0x0200; - - for (i = 0x0200; i < 0x0800; i++, ps++, pn++) { - UINT16 n; - n = *pn; - if (*ps == n) { - continue; // Colour hasn't changed - great! - } - - *ps = n; // Update our copy of the palette - - CpsPal[i ^ 15] = CalcColCPS2(n); - } - - CpsObjPal = CpsPal + nBuffer; - } else { - ps = (UINT16*)CpsPalSrc; - pn = (UINT16*)pNewPal; - - for (i = 0x0000; i < 0x0800; i++, ps++, pn++) { - UINT16 n = *pn; - if (*ps == n) { - continue; // Colour hasn't changed - great! - } - - *ps = n; // Update our copy of the palette - - CpsPal[i ^ 15] = CalcColCPS2(n); - } - } - } else { - ps = (UINT16*)CpsPalSrc; - pn = (UINT16*)pNewPal; - - for (i = 0x0000; i < 0x0c00; i++, ps++, pn++) { - UINT16 n = *pn; - if (*ps == n) { - continue; // Colour hasn't changed - great! - } - - *ps = n; // Update our copy of the palette - - CpsPal[i ^ 15] = CalcColCPS1(n); } } return 0; } - -INT32 CpsStarPalUpdate(UINT8* pNewPal, INT32 nLayer, INT32 bRecalcAll) -{ - INT32 i; - UINT16 *ps, *pn; - - if (nLayer == 0) { - ps = (UINT16*)CpsPalSrc + 0x0800; - pn = (UINT16*)pNewPal + 0x0800; - - if (bRecalcAll) { - memcpy(ps, pn, 256); - CalcAllStar(nLayer); - return 0; - } - - // Star layer 0 - for (i = 0x0800; i < 0x0880; i++, ps++, pn++) { - UINT16 n = *pn; - if (*ps == n) { - continue; // Colour hasn't changed - great! - } - - *ps = n; // Update our copy of the palette - - CpsPal[i ^ 15] = CalcColCPS1(n); - } - } else { - ps = (UINT16*)CpsPalSrc + 0x0A00; - pn = (UINT16*)pNewPal + 0x0A00; - - if (bRecalcAll) { - memcpy(ps, pn, 256); - CalcAllStar(nLayer); - return 0; - } - - // Star layer 1 - for (i = 0x0A00; i < 0x0A80; i++, ps++, pn++) { - UINT16 n = *pn; - if (*ps == n) { - continue; // Colour hasn't changed - great! - } - - *ps = n; // Update our copy of the palette - - CpsPal[i ^ 15] = CalcColCPS1(n); - } - } - - return 0; -} - diff --git a/src/burn/drv/capcom/cps_run.cpp b/src/burn/drv/capcom/cps_run.cpp index f5e0ca2fc..137659bba 100644 --- a/src/burn/drv/capcom/cps_run.cpp +++ b/src/burn/drv/capcom/cps_run.cpp @@ -97,10 +97,6 @@ static const eeprom_interface cps2_eeprom_interface = INT32 CpsRunInit() { - nLagObjectPalettes = 0; - - if (Cps == 2) nLagObjectPalettes = 1; - SekInit(0, 0x68000); // Allocate 68000 if (CpsMemInit()) { // Memory init @@ -175,29 +171,6 @@ INT32 CpsRunExit() return 0; } -// nStart = 0-3, nCount=1-4 -inline static void GetPalette(INT32 nStart, INT32 nCount) -{ - // Update Palette (Ghouls points to the wrong place on boot up I think) - INT32 nPal = (BURN_ENDIAN_SWAP_INT16(*((UINT16*)(CpsReg + 0x0A))) << 8) & 0xFFF800; - - UINT8* Find = CpsFindGfxRam(nPal, 0x1000); - if (Find) { - memcpy(CpsSavePal + (nStart << 10), Find + (nStart << 10), nCount << 10); - } -} - -static void GetStarPalette() -{ - INT32 nPal = (BURN_ENDIAN_SWAP_INT16(*((UINT16*)(CpsReg + 0x0A))) << 8) & 0xFFF800; - - UINT8* Find = CpsFindGfxRam(nPal, 256); - if (Find) { - memcpy(CpsSavePal + 4096, Find + 4096, 256); - memcpy(CpsSavePal + 5120, Find + 5120, 256); - } -} - inline static void CopyCpsReg(INT32 i) { memcpy(CpsSaveReg[i], CpsReg, 0x0100); @@ -320,11 +293,6 @@ INT32 Cps1Frame() memcpy(CpsSaveReg[0], CpsReg, 0x100); // Registers correct now - GetPalette(0, 6); // Get palette - if (CpsStar) { - GetStarPalette(); - } - if (CpsDrawSpritesInReverse) { if (i == 3) CpsObjGet(); // Get objects } @@ -425,7 +393,6 @@ INT32 Cps2Frame() ScheduleIRQ(); } - GetPalette(0, 4); // Get palettes CpsObjGet(); // Get objects for (i = 0; i < 3; i++) { diff --git a/src/burn/drv/capcom/cps_rw.cpp b/src/burn/drv/capcom/cps_rw.cpp index d95714fd3..71cef00a0 100644 --- a/src/burn/drv/capcom/cps_rw.cpp +++ b/src/burn/drv/capcom/cps_rw.cpp @@ -319,6 +319,11 @@ static void CpsWritePort(const UINT32 ia, UINT8 d) return; } CpsReg[(ia ^ 1) & 0xFF] = d; + + if (ia == 0x10b) { + GetPalette(0, 6); + CpsPalUpdate(CpsSavePal); + } return; } diff --git a/src/burn/drv/capcom/d_cps1.cpp b/src/burn/drv/capcom/d_cps1.cpp index b404dd46f..0d4ecf95d 100644 --- a/src/burn/drv/capcom/d_cps1.cpp +++ b/src/burn/drv/capcom/d_cps1.cpp @@ -10381,6 +10381,13 @@ static INT32 CawingbInit() return 0; } +static INT32 Cps1demoInit() +{ + bCpsUpdatePalEveryFrame = 1; + + return DrvInit(); +} + void __fastcall DinopicScrollWrite(UINT32 a, UINT16 d) { if (a == 0x980000) { @@ -11086,6 +11093,9 @@ void __fastcall Sf2m3WriteWord(UINT32 a, UINT16 d) case 0x80010a: { CpsReg[0x0a] = d & 0xff; CpsReg[0x0b] = d >> 8; + + GetPalette(0, 6); + CpsPalUpdate(CpsSavePal); return; } @@ -11632,7 +11642,7 @@ struct BurnDriver BurnDrvCpsCps1demo = { NULL, NULL, NULL, NULL, BDF_GAME_WORKING | BDF_DEMO, 2, HARDWARE_CAPCOM_CPS1, GBF_MISC, 0, NULL, Cps1demoRomInfo, Cps1demoRomName, NULL, NULL, FfightInputInfo, FfightDIPInfo, - DrvInit, DrvExit, Cps1Frame, CpsRedraw, CpsAreaScan, + Cps1demoInit, DrvExit, Cps1Frame, CpsRedraw, CpsAreaScan, &CpsRecalcPal, 0x1000, 384, 224, 4, 3 }; @@ -13412,7 +13422,7 @@ struct BurnDriver BurnDrvCpsCps1frog = { NULL, NULL, NULL, NULL, BDF_GAME_WORKING | BDF_HOMEBREW, 2, HARDWARE_CAPCOM_CPS1, GBF_MISC, 0, NULL, Cps1frogRomInfo, Cps1frogRomName, NULL, NULL, FfightInputInfo, FfightDIPInfo, - DrvInit, DrvExit, Cps1Frame, CpsRedraw, CpsAreaScan, + Cps1demoInit, DrvExit, Cps1Frame, CpsRedraw, CpsAreaScan, &CpsRecalcPal, 0x1000, 384, 224, 4, 3 };