daimakaib uses bootleg sprite ram

This commit is contained in:
Barry Harris 2012-05-10 09:13:08 +00:00
parent c1d9183637
commit 9938a5563b
3 changed files with 70 additions and 4 deletions

View File

@ -358,6 +358,7 @@ INT32 CpsObjGet();
INT32 FcrashObjGet();
INT32 KodbObjGet();
INT32 DinopicObjGet();
INT32 DaimakaibObjGet();
INT32 WofhObjGet();
void CpsObjDrawInit();
INT32 Cps1ObjDraw(INT32 nLevelFrom,INT32 nLevelTo);

View File

@ -564,6 +564,67 @@ INT32 DinopicObjGet()
return 0;
}
INT32 DaimakaibObjGet()
{
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;
// writes a blank sprite, followed by end of sprite list marker, start at 0x10 to ignore these
Get = CpsBootlegSpriteRam + 0x1010;
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++) {
UINT16* ps = (UINT16*)pg;
INT32 n, y, x, a;
y = BURN_ENDIAN_SWAP_INT16(ps[-1]);
if (y == 0x8000) { // end of sprite list
break;
}
n = BURN_ENDIAN_SWAP_INT16(ps[0]);
a = BURN_ENDIAN_SWAP_INT16(ps[1]);
x = BURN_ENDIAN_SWAP_INT16(ps[2]);
n = GfxRomBankMapper(GFXTYPE_SPRITES, n);
if (n == -1) continue;
n |= (y & 0x6000) << 3; // high bits of address
po[0] = n & 0xff;
po[1] = n >> 8;
po[2] = a & 0xff;
po[3] = a >> 8;
po[4] = x & 0xff;
po[5] = x >> 8;
po[6] = y & 0xff;
po[7] = y >> 8;
pof->nCount++;
po += 8;
}
nGetNext++;
if (nGetNext >= nFrameCount) {
nGetNext = 0;
}
return 0;
}
INT32 WofhObjGet()
{
INT32 i;

View File

@ -11411,16 +11411,20 @@ static INT32 DaimakaibInit()
Ghouls = 1;
Port6SoundWrite = 1;
Cps1OverrideLayers = 1;
Cps1DisableBgHi = 1;
Cps1ObjGetCallbackFunction = DaimakaibObjGet;
Cps1ObjDrawCallbackFunction = FcrashObjDraw;
CpsMemScanCallbackFunction = CpsBootlegSpriteRamScanCallback;
INT32 nRet = DrvInit();
CpsBootlegSpriteRam = (UINT8*)BurnMalloc(0x4000);
SekOpen(0);
SekMapHandler(1, 0x880000, 0x88ffff, SM_READ | SM_WRITE);
SekMapMemory(CpsBootlegSpriteRam, 0x990000, 0x991fff, SM_RAM);
SekMapHandler(1, 0x880000, 0x88ffff, SM_WRITE);
SekSetWriteWordHandler(1, Daimakaib88WriteWord);
SekMapHandler(2, 0x980000, 0x98ffff, SM_READ | SM_WRITE);
SekMapHandler(2, 0x980000, 0x98ffff, SM_WRITE);
SekSetWriteWordHandler(2, Daimakaib98WriteWord);
// There are also writes in the 0x99xxxx area (unknown)
SekClose();
return nRet;