diff --git a/src/burn/drv/capcom/cps.h b/src/burn/drv/capcom/cps.h index 8914d568e..4d77d8e13 100644 --- a/src/burn/drv/capcom/cps.h +++ b/src/burn/drv/capcom/cps.h @@ -313,18 +313,23 @@ INT32 CtvReady(); // cps_obj.cpp extern INT32 nCpsObjectBank; - extern UINT8 *BootlegSpriteRam; - extern INT32 Cps1LockSpriteList910000; extern INT32 Cps1DetectEndSpriteList8000; +typedef INT32 (*Cps1ObjGetCallback)(); +extern Cps1ObjGetCallback Cps1ObjGetCallbackFunction; +typedef INT32 (*Cps1ObjDrawCallback)(INT32, INT32); +extern Cps1ObjDrawCallback Cps1ObjDrawCallbackFunction; + INT32 CpsObjInit(); INT32 CpsObjExit(); INT32 CpsObjGet(); +INT32 FcrashObjGet(); void CpsObjDrawInit(); INT32 Cps1ObjDraw(INT32 nLevelFrom,INT32 nLevelTo); INT32 Cps2ObjDraw(INT32 nLevelFrom,INT32 nLevelTo); +INT32 FcrashObjDraw(INT32 nLevelFrom,INT32 nLevelTo); // cps_scr.cpp #define SCROLL_2 0 diff --git a/src/burn/drv/capcom/cps_obj.cpp b/src/burn/drv/capcom/cps_obj.cpp index 3eebe003f..0a33e89f1 100644 --- a/src/burn/drv/capcom/cps_obj.cpp +++ b/src/burn/drv/capcom/cps_obj.cpp @@ -8,6 +8,9 @@ UINT8 *BootlegSpriteRam = NULL; INT32 Cps1LockSpriteList910000 = 0; INT32 Cps1DetectEndSpriteList8000 = 0; +Cps1ObjGetCallback Cps1ObjGetCallbackFunction = NULL; +Cps1ObjDrawCallback Cps1ObjDrawCallbackFunction = NULL; + // Our copy of the sprite table static UINT8 *ObjMem = NULL; @@ -75,6 +78,9 @@ INT32 CpsObjExit() nMax = 0; Cps1DetectEndSpriteList8000 = 0; + + Cps1ObjGetCallbackFunction = NULL; + Cps1ObjDrawCallbackFunction = NULL; return 0; } @@ -86,6 +92,10 @@ INT32 CpsObjGet() UINT8 *pg, *po; struct ObjFrame* pof; UINT8* Get = NULL; + + if (Cps1ObjGetCallbackFunction) { + return Cps1ObjGetCallbackFunction(); + } pof = of + nGetNext; @@ -192,6 +202,10 @@ INT32 Cps1ObjDraw(INT32 nLevelFrom,INT32 nLevelTo) INT32 i; UINT16 *ps; INT32 nPsAdd; struct ObjFrame *pof; (void)nLevelFrom; (void)nLevelTo; + + if (Cps1ObjDrawCallbackFunction) { + return Cps1ObjDrawCallbackFunction(nLevelFrom, nLevelTo); + } // Draw the earliest frame we have in history pof=of+nGetNext; @@ -405,3 +419,103 @@ INT32 Cps2ObjDraw(INT32 nLevelFrom, INT32 nLevelTo) return 0; } + +// Final crash sprites + +INT32 FcrashObjGet() +{ + INT32 i; + UINT8 *pg, *po; + struct ObjFrame* pof; + UINT8* Get = NULL; + + pof = of + nGetNext; + + pof->nCount = 0; + + po = pof->Obj; + pof->nShiftX = -0x40; + pof->nShiftY = -0x10; + + Get = CpsRam90 + 0x50c8; + + if (Get==NULL) return 1; + + // Make a copy of all active sprites in the list + for (pg = Get, i = 0; i < nMax; pg += 8, i++) { + // Okay - this sprite is active: + memcpy(po, pg, 8); // copy it over + + pof->nCount++; + po += 8; + } + + nGetNext++; + if (nGetNext >= nFrameCount) { + nGetNext = 0; + } + + return 0; +} + +INT32 FcrashObjDraw(INT32 nLevelFrom,INT32 nLevelTo) +{ + INT32 i; UINT16 *ps; INT32 nPsAdd; + struct ObjFrame *pof; + (void)nLevelFrom; (void)nLevelTo; + + // Draw the earliest frame we have in history + pof=of+nGetNext; + + // Point to Obj list + ps=(UINT16 *)pof->Obj; + + nPsAdd=4; + + // Go through all the Objs + for (i=0; inCount; i++,ps+=nPsAdd) { + INT32 x,y,n,a,bx,by,dx,dy; INT32 nFlip; + + n = BURN_ENDIAN_SWAP_INT16(ps[0]); + y = BURN_ENDIAN_SWAP_INT16(ps[-1]); + x = BURN_ENDIAN_SWAP_INT16(ps[2]); + a = BURN_ENDIAN_SWAP_INT16(ps[1]); + + bx = 1; + by = 1; + + x -= 16; + y = 224 - y; + + // Find the palette for the tiles on this sprite + CpstPal = CpsPal + ((a & 0x1F) << 4); + + nFlip=(a>>5)&3; + + // Take care with tiles if the sprite goes off the screen + if (x<0 || y<0 || x+(bx<<4)>384 || y+(by<<4)>224) { + nCpstType=CTT_16X16 | CTT_CARE; + } else { + nCpstType=CTT_16X16; + } + + nCpstFlip=nFlip; + for (dy=0;dy