static int CpsGetROMs(bool bLoad) { char* pRomName; struct BurnRomInfo ri; unsigned char* CpsCodeLoad = CpsCode; unsigned char* CpsRomLoad = CpsRom; unsigned char* CpsGfxLoad = CpsGfx; unsigned char* CpsZRomLoad = CpsZRom; unsigned char* CpsQSamLoad = (unsigned char*)CpsQSam; int nGfxNum = 0; if (bLoad) { if (!CpsCodeLoad || !CpsRomLoad || !CpsGfxLoad || !CpsZRomLoad || !CpsQSamLoad) { return 1; } } else { nCpsCodeLen = nCpsRomLen = nCpsGfxLen = nCpsZRomLen = nCpsQSamLen = 0; nGfxMaxSize = 0; if (BurnDrvGetHardwareCode() & HARDWARE_CAPCOM_CPS2_SIMM) { nGfxMaxSize = ~0U; } } for (int i = 0; !BurnDrvGetRomName(&pRomName, i, 0); i++) { BurnDrvGetRomInfo(&ri, i); // SIMM Graphics ROMs if (BurnDrvGetHardwareCode() & HARDWARE_CAPCOM_CPS2_SIMM) { if ((ri.nType & BRF_GRA) && (ri.nType & 8)) { if (bLoad) { Cps2LoadTilesSIM(CpsGfxLoad, i); CpsGfxLoad += ri.nLen * 8; i += 7; } else { nCpsGfxLen += ri.nLen; } continue; } // SIMM QSound sample ROMs if ((ri.nType & BRF_SND) && ((ri.nType & 15) == 13)) { if (bLoad) { BurnLoadRom(CpsQSamLoad, i, 1); BurnByteswap(CpsQSamLoad, ri.nLen); CpsQSamLoad += ri.nLen; } else { nCpsQSamLen += ri.nLen; } continue; } // Different interleave SIMM QSound sample ROMs if ((ri.nType & BRF_SND) && ((ri.nType & 15) == 15)) { if (bLoad) { BurnLoadRom(CpsQSamLoad + 1, i + 0, 2); BurnLoadRom(CpsQSamLoad + 0, i + 1, 2); i += 2; } else { nCpsQSamLen += ri.nLen; } continue; } } // 68K program ROMs if ((ri.nType & 7) == 1) { if (bLoad) { BurnLoadRom(CpsRomLoad, i, 1); CpsRomLoad += ri.nLen; } else { nCpsRomLen += ri.nLen; } continue; } // XOR tables if ((ri.nType & 7) == 2) { if (bLoad) { BurnLoadRom(CpsCodeLoad, i, 1); CpsCodeLoad += ri.nLen; } else { nCpsCodeLen += ri.nLen; } continue; } // Z80 program ROMs if ((ri.nType & 7) == 4) { if (bLoad) { BurnLoadRom(CpsZRomLoad, i, 1); CpsZRomLoad += ri.nLen; } else { nCpsZRomLen += ri.nLen; } continue; } // Normal Graphics ROMs if (ri.nType & BRF_GRA) { if (bLoad) { if ((ri.nType & 15) == 6) { Cps2LoadTilesSplit(CpsGfxLoad, i); CpsGfxLoad += (nGfxMaxSize == ~0U ? ri.nLen : nGfxMaxSize) * 4; i += 15; } else { Cps2LoadTiles(CpsGfxLoad, i); CpsGfxLoad += (nGfxMaxSize == ~0U ? ri.nLen : nGfxMaxSize) * 4; i += 3; } } else { if (ri.nLen > nGfxMaxSize) { nGfxMaxSize = ri.nLen; } if (ri.nLen < nGfxMaxSize) { nGfxMaxSize = ~0U; } nCpsGfxLen += ri.nLen; nGfxNum++; } continue; } // QSound sample ROMs if (ri.nType & BRF_SND) { if (bLoad) { BurnLoadRom(CpsQSamLoad, i, 1); BurnByteswap(CpsQSamLoad, ri.nLen); CpsQSamLoad += ri.nLen; } else { nCpsQSamLen += ri.nLen; } continue; } } if (bLoad) { #if 0 for (unsigned int i = 0; i < nCpsCodeLen / 4; i++) { ((unsigned int*)CpsCode)[i] ^= ((unsigned int*)CpsRom)[i]; } #endif cps2_decrypt_game_data(); // if (!nCpsCodeLen) return 1; } else { if (nGfxMaxSize != ~0U) { nCpsGfxLen = nGfxNum * nGfxMaxSize; } #if 1 && defined FBA_DEBUG if (!nCpsCodeLen) { bprintf(PRINT_IMPORTANT, _T(" - 68K ROM size:\t0x%08X (Decrypted with key)\n"), nCpsRomLen); } else { bprintf(PRINT_IMPORTANT, _T(" - 68K ROM size:\t0x%08X (XOR table size: 0x%08X)\n"), nCpsRomLen, nCpsCodeLen); } bprintf(PRINT_IMPORTANT, _T(" - Z80 ROM size:\t0x%08X\n"), nCpsZRomLen); bprintf(PRINT_IMPORTANT, _T(" - Graphics data:\t0x%08X\n"), nCpsGfxLen); bprintf(PRINT_IMPORTANT, _T(" - QSound data:\t0x%08X\n"), nCpsQSamLen); #endif if (/*!nCpsCodeLen ||*/ !nCpsRomLen || !nCpsGfxLen || !nCpsZRomLen || ! nCpsQSamLen) { return 1; } } return 0; }
static INT32 CpsGetROMs(bool bLoad) { struct BurnRomInfo ri; UINT8* CpsCodeLoad = CpsCode; UINT8* CpsRomLoad = CpsRom; UINT8* CpsGfxLoad = CpsGfx; UINT8* CpsZRomLoad = CpsZRom; UINT8* CpsQSamLoad = (UINT8*)CpsQSam; INT32 nGfxNum = 0; if (bLoad) { if (!CpsCodeLoad || !CpsRomLoad || !CpsGfxLoad || !CpsZRomLoad || !CpsQSamLoad) { return 1; } } else { nCpsCodeLen = nCpsRomLen = nCpsGfxLen = nCpsZRomLen = nCpsQSamLen = 0; nGfxMaxSize = 0; if (BurnDrvGetHardwareCode() & HARDWARE_CAPCOM_CPS2_SIMM) { nGfxMaxSize = ~0U; } } INT32 i = 0; do { ri.nLen = 0; ri.nType = 0; BurnDrvGetRomInfo(&ri, i); if ((ri.nType & 0x0f) == CPS2_PRG_68K) { if (bLoad) { BurnLoadRom(CpsRomLoad, i, 1); CpsRomLoad += ri.nLen; } else { nCpsRomLen += ri.nLen; } i++; } if ((ri.nType & 0x0f) == CPS2_PRG_68K_SIMM) { if (bLoad) { BurnLoadRom(CpsRomLoad + 0x000001, i + 0, 2); BurnLoadRom(CpsRomLoad + 0x000000, i + 1, 2); CpsRomLoad += ri.nLen * 2; i += 2; } else { nCpsRomLen += ri.nLen; i++; } } if ((ri.nType & 0x0f) == CPS2_PRG_68K_XOR_TABLE) { if (bLoad) { BurnLoadRom(CpsCodeLoad, i, 1); CpsCodeLoad += ri.nLen; } else { nCpsCodeLen += ri.nLen; } i++; } if ((ri.nType & 0x0f) == CPS2_GFX) { if (bLoad) { Cps2LoadTiles(CpsGfxLoad, i); CpsGfxLoad += (nGfxMaxSize == ~0U ? ri.nLen : nGfxMaxSize) * 4; i += 4; } else { if (ri.nLen > nGfxMaxSize) { nGfxMaxSize = ri.nLen; } if (ri.nLen < nGfxMaxSize) { nGfxMaxSize = ~0U; } nCpsGfxLen += ri.nLen; nGfxNum++; i++; } } if ((ri.nType & 0x0f) == CPS2_GFX_SIMM) { if (bLoad) { Cps2LoadTilesSIM(CpsGfxLoad, i); CpsGfxLoad += ri.nLen * 8; i += 8; } else { nCpsGfxLen += ri.nLen; i++; } } if ((ri.nType & 0x0f) == CPS2_GFX_SPLIT4) { if (bLoad) { Cps2LoadTilesSplit4(CpsGfxLoad, i); CpsGfxLoad += (nGfxMaxSize == ~0U ? ri.nLen : nGfxMaxSize) * 16; i += 16; } else { if (ri.nLen > nGfxMaxSize) { nGfxMaxSize = ri.nLen; } if (ri.nLen < nGfxMaxSize) { nGfxMaxSize = ~0U; } nCpsGfxLen += ri.nLen; nGfxNum++; i++; } } if ((ri.nType & 0x0f) == CPS2_GFX_SPLIT8) { if (bLoad) { Cps2LoadTilesSplit8(CpsGfxLoad, i); CpsGfxLoad += (nGfxMaxSize == ~0U ? ri.nLen : nGfxMaxSize) * 32; i += 32; } else { if (ri.nLen > nGfxMaxSize) { nGfxMaxSize = ri.nLen; } if (ri.nLen < nGfxMaxSize) { nGfxMaxSize = ~0U; } nCpsGfxLen += ri.nLen; nGfxNum++; i++; } } if ((ri.nType & 0x0f) == CPS2_PRG_Z80) { if (bLoad) { BurnLoadRom(CpsZRomLoad, i, 1); CpsZRomLoad += ri.nLen; } else { nCpsZRomLen += ri.nLen; } i++; } if ((ri.nType & 0x0f) == CPS2_QSND) { if (bLoad) { BurnLoadRom(CpsQSamLoad, i, 1); BurnByteswap(CpsQSamLoad, ri.nLen); CpsQSamLoad += ri.nLen; } else { nCpsQSamLen += ri.nLen; } i++; } if ((ri.nType & 0x0f) == CPS2_QSND_SIMM) { if (bLoad) { BurnLoadRom(CpsQSamLoad, i, 1); BurnByteswap(CpsQSamLoad, ri.nLen); CpsQSamLoad += ri.nLen; } else { nCpsQSamLen += ri.nLen; } i++; } if ((ri.nType & 0x0f) == CPS2_QSND_SIMM_BYTESWAP) { if (bLoad) { BurnLoadRom(CpsQSamLoad + 1, i + 0, 2); BurnLoadRom(CpsQSamLoad + 0, i + 1, 2); i += 2; } else { nCpsQSamLen += ri.nLen; i++; } } } while (ri.nLen); if (bLoad) { #if 0 for (UINT32 i = 0; i < nCpsCodeLen / 4; i++) { ((UINT32*)CpsCode)[i] ^= ((UINT32*)CpsRom)[i]; } #endif cps2_decrypt_game_data(); // if (!nCpsCodeLen) return 1; } else { if (nGfxMaxSize != ~0U) { nCpsGfxLen = nGfxNum * nGfxMaxSize; } #if 1 && defined FBA_DEBUG if (!nCpsCodeLen) { bprintf(PRINT_IMPORTANT, _T(" - 68K ROM size:\t0x%08X (Decrypted with key)\n"), nCpsRomLen); } else { bprintf(PRINT_IMPORTANT, _T(" - 68K ROM size:\t0x%08X (XOR table size: 0x%08X)\n"), nCpsRomLen, nCpsCodeLen); } bprintf(PRINT_IMPORTANT, _T(" - Z80 ROM size:\t0x%08X\n"), nCpsZRomLen); bprintf(PRINT_IMPORTANT, _T(" - Graphics data:\t0x%08X\n"), nCpsGfxLen); bprintf(PRINT_IMPORTANT, _T(" - QSound data:\t0x%08X\n"), nCpsQSamLen); #endif if (/*!nCpsCodeLen ||*/ !nCpsRomLen || !nCpsGfxLen || !nCpsZRomLen || ! nCpsQSamLen) { return 1; } } return 0; }