// Allocate space and load up a rom static int LoadUp(unsigned char** pRom, int* pnRomLen, int nNum) { unsigned char *Rom; struct BurnRomInfo ri; ri.nLen = 0; BurnDrvGetRomInfo(&ri, nNum); // Find out how big the rom is if (ri.nLen <= 0) { return 1; } // Load the rom Rom = (unsigned char*)malloc(ri.nLen); if (Rom == NULL) { return 1; } if (BurnLoadRom(Rom,nNum,1)) { free(Rom); return 1; } // Success *pRom = Rom; *pnRomLen = ri.nLen; return 0; }
static int CheckRomsBoot() { #ifdef USE_OLD_AUDIT int ret = AUDIT_FULLPASS; BurnRomInfo ri; int state = STAT_NOFIND; for (int i = 0; i < nRomCount; i++) { memset(&ri, 0, sizeof(ri)); BurnDrvGetRomInfo(&ri, i); // Find information about the wanted rom state = RomFind[i].nState; // Get the state of the rom in the archive file if (state != STAT_OK && ri.nType) { if (ri.nCrc == 0) { continue; // no_dump } if (!(ri.nType & BRF_OPT)) { return AUDIT_FAIL; } ret = AUDIT_PARTPASS; } } return ret; #else return 0; #endif }
static INT32 LoadUpSplit(UINT8** pRom, INT32* pnRomLen, INT32 nNum, INT32 nNumRomsGroup) { UINT8 *Rom; struct BurnRomInfo ri; UINT32 nRomSize[8], nTotalRomSize = 0; INT32 i; ri.nLen = 0; for (i = 0; i < nNumRomsGroup; i++) { BurnDrvGetRomInfo(&ri, nNum + i); nRomSize[i] = ri.nLen; } for (i = 0; i < nNumRomsGroup; i++) { nTotalRomSize += nRomSize[i]; } if (!nTotalRomSize) return 1; Rom = (UINT8*)BurnMalloc(nTotalRomSize); if (Rom == NULL) return 1; INT32 Offset = 0; for (i = 0; i < nNumRomsGroup; i++) { if (i > 0) Offset += nRomSize[i - 1]; if (BurnLoadRom(Rom + Offset, nNum + i, 1)) { BurnFree(Rom); return 1; } } *pRom = Rom; *pnRomLen = nTotalRomSize; return 0; }
// Allocate space and load up a rom static INT32 LoadUp(UINT8** pRom, INT32* pnRomLen, INT32 nNum) { UINT8 *Rom; struct BurnRomInfo ri; ri.nLen = 0; BurnDrvGetRomInfo(&ri, nNum); // Find out how big the rom is if (ri.nLen <= 0) { return 1; } // Load the rom Rom = (UINT8*)BurnMalloc(ri.nLen); if (Rom == NULL) { return 1; } if (BurnLoadRom(Rom,nNum,1)) { BurnFree(Rom); return 1; } // Success *pRom = Rom; *pnRomLen = ri.nLen; return 0; }
static int LoadUpSplit(unsigned char** pRom, int* pnRomLen, int nNum) { unsigned char *Rom; struct BurnRomInfo ri; unsigned int nRomSize[4], nTotalRomSize; int i; ri.nLen = 0; for (i = 0; i < 4; i++) { BurnDrvGetRomInfo(&ri, nNum + i); nRomSize[i] = ri.nLen; } nTotalRomSize = nRomSize[0] + nRomSize[1] + nRomSize[2] + nRomSize[3]; if (!nTotalRomSize) return 1; Rom = (unsigned char*)malloc(nTotalRomSize); if (Rom == NULL) return 1; int Offset = 0; for (i = 0; i < 4; i++) { if (i > 0) Offset += nRomSize[i - 1]; if (BurnLoadRom(Rom + Offset, nNum + i, 1)) { free(Rom); return 1; } } *pRom = Rom; *pnRomLen = nTotalRomSize; return 0; }
// Find rom number i from the pBzipDriver game static int FindRom(int i) { struct BurnRomInfo ri; int nRet; memset(&ri, 0, sizeof(ri)); nRet = BurnDrvGetRomInfo(&ri, i); if (nRet != 0) { // Failure: no such rom return -2; } if (ri.nCrc) { // Search by crc first nRet = FindRomByCrc(ri.nCrc); if (nRet >= 0) { return nRet; } } for (int nAka = 0; nAka < 0x10000; nAka++) { // Failing that, search for possible names char *szPossibleName = NULL; nRet = BurnDrvGetRomName(&szPossibleName, i, nAka); if (nRet) { // No more rom names break; } nRet = FindRomByName(ANSIToTCHAR(szPossibleName, NULL, 0)); if (nRet >= 0) { return nRet; } } return -1; // Couldn't find the rom }
// Load a rom and separate out the bytes by nGap // Dest is the memory block to insert the rom into static int LoadRom(unsigned char *Dest,int i,int nGap,int bXor) { int nRet=0,nLen=0; if (BurnExtLoadRom==NULL) return 1; // Load function was not defined by the application // Find the length of the rom (as given by the current driver) { struct BurnRomInfo ri; ri.nType=0; ri.nLen=0; BurnDrvGetRomInfo(&ri,i); if (ri.nType==0) return 0; // Empty rom slot - don't load anything and return success nLen=ri.nLen; } if (nLen<=0) return 1; if (nGap>1 || bXor) { unsigned char *Load=NULL; unsigned char *pd=NULL,*pl=NULL,*LoadEnd=NULL; int nLoadLen=0; // Allocate space for the file Load=(unsigned char *)malloc(nLen); if (Load==NULL) return 1; memset(Load,0,nLen); // Load in the file nRet=BurnExtLoadRom(Load,&nLoadLen,i); if (nRet!=0) { free(Load); return 1; } if (nLoadLen<0) nLoadLen=0; if (nLoadLen>nLen) nLoadLen=nLen; // Loaded rom okay. Now insert into Dest LoadEnd=Load+nLoadLen; pd=Dest; pl=Load; // Quickly copy in the bytes with a gap of 'nGap' between each byte if (bXor) { do { *pd ^= *pl++; pd+=nGap; } while (pl<LoadEnd); } else { do { *pd = *pl++; pd+=nGap; } while (pl<LoadEnd); } free(Load); } else { // If no XOR, and gap of 1, just copy straight in nRet=BurnExtLoadRom(Dest,NULL,i); if (nRet!=0) return 1; } return 0; }
static inline unsigned int getRomCount() { unsigned int count = 0; for (count = 0; ; count++) { if (BurnDrvGetRomInfo(NULL, count)) { break; } } return count; }
// get all romsets info, only do once int getAllRomsetInfo() { if (getinfo) { return 0; } char* sname = NULL; BurnRomInfo ri; unsigned int romCount = 0; string name = ""; unsigned int tempBurnDrvSelect = nBurnDrvSelect; // get all romset basic info for (nBurnDrvSelect = 0; nBurnDrvSelect < nBurnDrvCount; nBurnDrvSelect++) { // get game info GameInfo* gameInfo = new GameInfo; gameInfo->parent = BurnDrvGetTextA(DRV_PARENT) ? BurnDrvGetTextA(DRV_PARENT) : ""; gameInfo->board = BurnDrvGetTextA(DRV_BOARDROM) ? BurnDrvGetTextA(DRV_BOARDROM) : ""; name = BurnDrvGetTextA(DRV_NAME); // get rom info romCount = getRomCount(); for (unsigned int i = 0; i < romCount; i++) { memset(&ri, 0, sizeof(ri)); BurnDrvGetRomInfo(&ri, i); // doesn't contain rom name RomInfo romInfo; BurnDrvGetRomName(&sname, i, 0); // get rom name romInfo.name = sname; romInfo.size = ri.nLen; romInfo.type = ri.nType; if (ri.nCrc == 0) { romInfo.state = STAT_OK; // pass no_dump rom } else { romInfo.state = STAT_NOFIND; } gameInfo->roms[ri.nCrc] = romInfo; } // add gameinfo to list allGameMap[name] = gameInfo; } nBurnDrvSelect = tempBurnDrvSelect; getAllRomsetCloneInfo(); getinfo = true; return 0; }
static int CheckRoms() { BurnRomInfo ri; int state = STAT_NOFIND; int error; for (int i = 0; i < nRomCount; i++) { memset(&ri, 0, sizeof(ri)); BurnDrvGetRomInfo(&ri, i); // Find information about the wanted rom if (!(ri.nType & BRF_OPT) && (ri.nCrc != 0)) { state = RomFind[i].nState; // Get the state of the rom in the archive file error = GetBArchiveError(state); if (state == STAT_NOFIND && ri.nType) { // (A type of 0 means empty slot - no rom) char* szName = "Unknown"; RomDescribe(&ri); BurnDrvGetRomName(&szName, i, 0); FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_NOTFOUND), szName); } if (error == 0) { nBArchiveError |= 0x2000; } if (ri.nType & BRF_ESS) { // essential rom - without it the game may not run at all nBArchiveError |= error << 0; } if (ri.nType & BRF_PRG) { // rom which contains program information nBArchiveError |= error << 1; } if (ri.nType & BRF_GRA) { // rom which contains graphics information nBArchiveError |= error << 2; } if (ri.nType & BRF_SND) { // rom which contains sound information nBArchiveError |= error << 3; } } } if (nBArchiveError & 0x0F0F) { nBArchiveError |= 0x4000; } return 0; }
// Check the roms to see if they code, graphics etc are complete static int CheckRoms() { nBzipError = 0; // Assume romset is fine for (int i = 0; i < nRomCount; i++) { struct BurnRomInfo ri; memset(&ri, 0, sizeof(ri)); BurnDrvGetRomInfo(&ri, i); // Find information about the wanted rom if (ri.nCrc && (ri.nType & BRF_OPT) == 0 && (ri.nType & BRF_NODUMP)) { int nState = RomFind[i].nState; // Get the state of the rom in the zip file int nError = GetBZipError(nState); if (nState == 0 && ri.nType) { // (A type of 0 means empty slot - no rom) char* szName = "Unknown"; RomDescribe(&BzipDetail, &ri); BurnDrvGetRomName(&szName, i, 0); BzipDetail.Add(_T("%hs was not found.\n"), szName); } if (nError == 0) { nBzipError |= 0x2000; } if (ri.nType & BRF_ESS) { // essential rom - without it the game may not run at all nBzipError |= nError << 0; } if (ri.nType & BRF_PRG) { // rom which contains program information nBzipError |= nError << 1; } if (ri.nType & BRF_GRA) { // rom which contains graphics information nBzipError |= nError << 2; } if (ri.nType & BRF_SND) { // rom which contains sound information nBzipError |= nError << 3; } } } if (nBzipError & 0x0F0F) { nBzipError |= 0x4000; } return 0; }
static int CheckRomsBoot() { for (int i = 0; i < nRomCount; i++) { struct BurnRomInfo ri; int nState; memset(&ri, 0, sizeof(ri)); BurnDrvGetRomInfo(&ri, i); // Find information about the wanted rom nState = RomFind[i].nState; // Get the state of the rom in the zip file if (nState != 1 && ri.nType && ri.nCrc) { if (!(ri.nType & BRF_OPT) && !(ri.nType & BRF_NODUMP)) { return 2; } return 1; } } return 0; }
// Check the roms to see if they code, graphics etc are complete static int CheckRoms() { nBzipError = 0; // Assume romset is fine for (int i = 0; i < nRomCount; i++) { struct BurnRomInfo ri; memset(&ri, 0, sizeof(ri)); BurnDrvGetRomInfo(&ri, i); // Find information about the wanted rom if (ri.nCrc && (ri.nType & 0x80) == 0) { int nState = RomFind[i].nState; // Get the state of the rom in the zip file if (nState == 0 && ri.nType) { // (A type of 0 means empty slot - no rom) char* szName = "Unknown"; RomDescribe(&BzipDetail, &ri); BurnDrvGetRomName(&szName, i, 0); BzipDetail.Add(_T("%hs was not found.\n"), szName); } if (ri.nType & 0x90) { // essential rom - without it the game may not run at all nBzipError |= GetBZipError(nState) << 0; } if (ri.nType & 0x01) { // rom which contains graphics information nBzipError |= GetBZipError(nState) << 1; } if (ri.nType & 0x02) { // rom which contains sound information nBzipError |= GetBZipError(nState) << 2; } } } if (!nZipsFound) { nBzipError |= 0x08; // No data at all! } return 0; }
// Load a rom and separate out the bytes by nGap // Dest is the memory block to insert the rom into static INT32 LoadRom(UINT8 *Dest, INT32 i, INT32 nGap, INT32 bXor) { INT32 nRet = 0, nLen = 0; if (BurnExtLoadRom == NULL) return 1; // Load function was not defined by the application // Find the length of the rom (as given by the current driver) { struct BurnRomInfo ri; ri.nType=0; ri.nLen=0; BurnDrvGetRomInfo(&ri,i); if (ri.nType==0) return 0; // Empty rom slot - don't load anything and return success nLen=ri.nLen; } char* RomName = ""; //add by emufan BurnDrvGetRomName(&RomName, i, 0); if (nLen<=0) return 1; if (nGap>1 || bXor) { UINT8 *Load=NULL; UINT8 *pd=NULL,*pl=NULL,*LoadEnd=NULL; INT32 nLoadLen=0; // Allocate space for the file Load=(UINT8 *)malloc(nLen); if (Load==NULL) return 1; memset(Load,0,nLen); // Load in the file nRet=BurnExtLoadRom(Load,&nLoadLen,i); //if (bDoIpsPatch) IpsApplyPatches(Load, RomName); if (nRet!=0) { if (Load) { free(Load); Load = NULL; } return 1; } if (nLoadLen<0) nLoadLen=0; if (nLoadLen>nLen) nLoadLen=nLen; // Loaded rom okay. Now insert into Dest LoadEnd=Load+nLoadLen; pd=Dest; pl=Load; // Quickly copy in the bytes with a gap of 'nGap' between each byte if (bXor) { do { *pd ^= *pl++; pd+=nGap; } while (pl<LoadEnd); } else { do { *pd = *pl++; pd+=nGap; } while (pl<LoadEnd); } if (Load) { free(Load); Load = NULL; } } else { // If no XOR, and gap of 1, just copy straight in nRet=BurnExtLoadRom(Dest,NULL,i); //if (bDoIpsPatch) IpsApplyPatches(Dest, RomName); if (nRet!=0) 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; }
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 pgmGetRoms(bool bLoad) { INT32 kov2 = (strncmp(BurnDrvGetTextA(DRV_NAME), "kov2", 4) == 0) ? 1 : 0; char* pRomName; struct BurnRomInfo ri; struct BurnRomInfo pi; UINT8 *PGMUSER0Load = PGMUSER0; UINT8 *PGM68KROMLoad = PGM68KROM; UINT8 *PGMTileROMLoad = PGMTileROM + 0x180000; UINT8 *PGMSPRMaskROMLoad = PGMSPRMaskROM; UINT8 *PGMSNDROMLoad = ICSSNDROM + 0x400000; UINT8 *PGMARMROMLoad = PGMARMROM; if (kov2 && bLoad) { PGMSNDROMLoad += 0x400000; } for (INT32 i = 0; !BurnDrvGetRomName(&pRomName, i, 0); i++) { BurnDrvGetRomInfo(&ri, i); if ((ri.nType & BRF_PRG) && (ri.nType & 0x0f) == 1) { if (bLoad) { BurnDrvGetRomInfo(&pi, i+1); if (ri.nLen == 0x80000 && pi.nLen == 0x80000) { BurnLoadRom(PGM68KROMLoad + 0, i + 0, 2); BurnLoadRom(PGM68KROMLoad + 1, i + 1, 2); PGM68KROMLoad += pi.nLen; i += 1; } else { BurnLoadRom(PGM68KROMLoad, i, 1); } PGM68KROMLoad += ri.nLen; } else { nPGM68KROMLen += ri.nLen; } continue; } if ((ri.nType & BRF_GRA) && (ri.nType & 0x0f) == 2) { if (bLoad) { BurnLoadRom(PGMTileROMLoad, i, 1); PGMTileROMLoad += ri.nLen; } else { nPGMTileROMLen += ri.nLen; } continue; } if ((ri.nType & BRF_GRA) && (ri.nType & 0x0f) == 3) { if (bLoad) { } else { nPGMSPRColROMLen += ri.nLen; } continue; } if ((ri.nType & BRF_GRA) && (ri.nType & 0x0f) == 4) { if (bLoad) { if (strcmp(BurnDrvGetTextA(DRV_NAME), "pgm3in1") == 0) { if ((PGMSPRMaskROMLoad - PGMSPRMaskROM) == 0x1000000) PGMSPRMaskROMLoad -= 0x100000; } BurnLoadRom(PGMSPRMaskROMLoad, i, 1); PGMSPRMaskROMLoad += ri.nLen; } else { nPGMSPRMaskROMLen += ri.nLen; } continue; } if ((ri.nType & BRF_SND) && (ri.nType & 0x0f) == 5) { if (bLoad) { BurnLoadRom(PGMSNDROMLoad, i, 1); PGMSNDROMLoad += ri.nLen; } else { nPGMSNDROMLen += ri.nLen; } continue; } if ((ri.nType & BRF_PRG) && (ri.nType & 0x0f) == 7) { if (bLoad) { if (BurnDrvGetHardwareCode() & HARDWARE_IGS_USE_ARM_CPU) { if (ri.nLen == 0x3e78) PGMARMROMLoad += 0x188; BurnLoadRom(PGMARMROMLoad, i, 1); } } continue; } if ((ri.nType & BRF_PRG) && (ri.nType & 0x0f) == 8) { if (BurnDrvGetHardwareCode() & HARDWARE_IGS_USE_ARM_CPU) { if (bLoad) { BurnLoadRom(PGMUSER0Load, i, 1); PGMUSER0Load += ri.nLen; } else { nPGMExternalARMLen += ri.nLen; } } continue; } } if (!bLoad) { nPGMTileROMLen += 0x180000; if (nPGMTileROMLen < 0x400000) nPGMTileROMLen = 0x400000; nPGMSNDROMLen += 0x400000; if (kov2) nPGMSNDROMLen += 0x400000; nPGMSNDROMLen = ((nPGMSNDROMLen-1) | 0xfffff) + 1; nICSSNDROMLen = nPGMSNDROMLen; if (nPGMExternalARMLen == 0) nPGMExternalARMLen = 0x200000; } return 0; }
static int __cdecl BArchiveBurnLoadRom(unsigned char* Dest, int* pnWrote, int i) { if (i < 0 || i >= nRomCount || !RomFind) { return 1; } BurnRomInfo ri; memset(&ri, 0, sizeof(ri)); BurnDrvGetRomInfo(&ri, i); // Get info // show what we're doing char* pszRomName = NULL; BurnDrvGetRomName(&pszRomName, i, 0); if (pszRomName == NULL) { pszRomName = "unknown"; } TCHAR szText[MAX_PATH]; _stprintf(szText, _T("Loading")); if (ri.nType & (BRF_PRG | BRF_GRA | BRF_SND | BRF_BIOS)) { if (ri.nType & BRF_BIOS) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("BIOS ")); } if (ri.nType & BRF_PRG) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("program ")); } if (ri.nType & BRF_GRA) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("graphics ")); } if (ri.nType & BRF_SND) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("sound ")); } _stprintf(szText + _tcslen(szText), _T("(%hs)..."), pszRomName); } else { _stprintf(szText + _tcslen(szText), _T(" %hs..."), pszRomName); } ProgressUpdateBurner(ri.nLen ? 1.0 / ((double)nTotalSize / ri.nLen) : 0, szText, 0); #if defined (_WIN32) // Check for messages: MSG Msg; while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { DispatchMessage(&Msg); } #endif #ifndef LOAD_OPT_ROM // skip loading optional rom if (ri.nType & BRF_OPT) { return 0; } #endif if (RomFind[i].nState == STAT_NOFIND) { // Rom not found in archive at all return 1; } int nWantZip = RomFind[i].nArchive; // Which archive file it is in if (nCurrentArc != nWantZip) { // If we haven't got the right archive file currently open archiveClose(); nCurrentArc = -1; if (archiveOpen(szBArchiveName[nWantZip])) { return 1; } nCurrentArc = nWantZip; } // Read in file and return how many bytes we read if (archiveLoadFile(Dest, ri.nLen, RomFind[i].nPos, pnWrote)) { // Error loading from the archive file FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_DISK), pszRomName, getFilenameW(szBArchiveName[nCurrentArc])); FBAPopupDisplay(PUF_TYPE_WARNING); return 1; } return 0; }
int BArchiveOpen(bool bootApp) { if (szBArchiveName == NULL) { return 1; } BArchiveClose(); // Make sure nothing is open // Count the number of roms needed for (nRomCount = 0; ; nRomCount++) { if (BurnDrvGetRomInfo(NULL, nRomCount)) { break; } } if (nRomCount <= 0) { return 1; } // Create an array for holding lookups for each rom -> archive entries unsigned int nMemLen = nRomCount * sizeof(ROMFIND); RomFind = (ROMFIND*)malloc(nMemLen); if (RomFind == NULL) { return 1; } memset(RomFind, 0, nMemLen); // Locate each archive file bool bFound = false; int checkvalue = ARC_NONE; TCHAR szFullName[MAX_PATH] = _T(""); char* szName = NULL; for (int y = 0, z = 0; y < BZIP_MAX && z < BZIP_MAX; y++) { // Get archive name without extension if (BurnDrvGetArchiveName(&szName, y, false)) { break; } bFound = false; for (int d = 0; d < DIRS_MAX; d++) { // if (bFound) { // break; // } if (!_tcsicmp(szAppRomPaths[d], _T(""))) { continue; // skip empty path } // check the archived rom file, modified by regret _stprintf(szFullName, _T("%s%hs"), szAppRomPaths[d], szName); checkvalue = archiveCheck(szFullName, (nLoadMenuShowX & CHECK7ZIP) ? 0 : 1); if (checkvalue == ARC_NONE) { continue; } bFound = true; szBArchiveName[z] = (TCHAR*)malloc(MAX_PATH * sizeof(TCHAR)); if (!szBArchiveName[z]) { continue; } _tcscpy(szBArchiveName[z], szFullName); if (!bootApp) { FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_FOUND), szName, szBArchiveName[z]); } z++; #if 0 // Look further in the last path specified, so you can put files with ROMs // used only by FB Alpha there without causing problems with dat files if (d < DIRS_MAX - 2) { d = DIRS_MAX - 2; } else { if (d >= DIRS_MAX - 1) { break; } } #endif } if (!bootApp && !bFound) { FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_NOTFOUND), szName); } } if (!bootApp) { FBAPopupAddText(PUF_TEXT_DEFAULT, _T("\n")); } // Locate the ROM data in the archive files int nFind = -1; BurnRomInfo ri; for (int z = 0; z < BZIP_MAX; z++) { if (!szBArchiveName[z]) { continue; } if (archiveOpen(szBArchiveName[z])) { continue; } archiveGetList(&List, &nListCount); // Get the list of entries nCurrentArc = z; for (int i = 0; i < nRomCount; i++) { if (RomFind[i].nState == STAT_OK) { continue; // Already found this and it's okay } nFind = findRom(i, List, nListCount); if (nFind < 0) { // Couldn't find this rom at all continue; } RomFind[i].nArchive = z; // Remember which archive file it is in RomFind[i].nPos = nFind; RomFind[i].nState = STAT_OK; // Set to found okay memset(&ri, 0, sizeof(ri)); BurnDrvGetRomInfo(&ri, i); // Get info about the rom // if size good & nodump, try to load the file with correct filename if (!(ri.nType & BRF_OPT) && (ri.nCrc != 0)) { nTotalSize += ri.nLen; } if (List[nFind].nLen == ri.nLen) { if (ri.nCrc) { // If we know the CRC if (List[nFind].nCrc != ri.nCrc) { // Length okay, but CRC wrong if (!(nLoadMenuShowX & DISABLECRC)) { // disable crc check RomFind[i].nState = STAT_CRC; } } } } else { if (nLoadMenuShowX & DISABLECRC) { ri.nLen = List[nFind].nLen; // disable size check } else { if (List[nFind].nLen < ri.nLen) { RomFind[i].nState = STAT_SMALL; // Too small } else { RomFind[i].nState = STAT_LARGE; // Too big } } } if (!bootApp) { if (RomFind[i].nState != STAT_OK) { RomDescribe(&ri); if (RomFind[i].nState == STAT_CRC) { FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_CRC), getFilenameA(List[nFind].szName), List[nFind].nCrc, ri.nCrc); } if (RomFind[i].nState == STAT_SMALL) { FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_SMALL), getFilenameA(List[nFind].szName), List[nFind].nLen >> 10, ri.nLen >> 10); } if (RomFind[i].nState == STAT_LARGE) { FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_LARGE), getFilenameA(List[nFind].szName), List[nFind].nLen >> 10, ri.nLen >> 10); } } }
static int __cdecl BzipBurnLoadRom(unsigned char* Dest, int* pnWrote, int i) { struct BurnRomInfo ri; int nWantZip = 0; TCHAR szText[128]; char* pszRomName = NULL; //int nRet = 0; if (i < 0 || i >= nRomCount) { return 1; } ri.nLen = 0; BurnDrvGetRomInfo(&ri, i); // Get info // show what we're doing BurnDrvGetRomName(&pszRomName, i, 0); if (pszRomName == NULL) { pszRomName = "unknown"; } sprintf(szText, "%-12s ... %4dKb", pszRomName, ri.nLen/1024 ); if (ri.nType & (BRF_PRG | BRF_GRA | BRF_SND | BRF_BIOS)) { if (ri.nType & BRF_BIOS) { sprintf (szText + strlen(szText), " %s", "BIOS "); } if (ri.nType & BRF_PRG) { sprintf (szText + strlen(szText), " %s", "program "); } if (ri.nType & BRF_GRA) { sprintf (szText + strlen(szText), " %s", "graphics "); } if (ri.nType & BRF_SND) { sprintf (szText + strlen(szText), " %s", "sound "); } } ProgressUpdateBurner(ri.nLen ? 1.0 / ((double)nTotalSize / ri.nLen) : 0, szText, 0); // FIXME: eliminate later in favor of ProgressUpdateBurner show_rom_loading_text(szText, ri.nLen, nTotalSize); if (RomFind[i].nState == 0) { // Rom not found in zip at all TCHAR szTemp[128] = _T(""); _stprintf(szTemp, "%s (not found)\n",szText); fprintf(stderr,szTemp); ProgressError(szTemp, 1); return 1; } nWantZip = RomFind[i].nZip; // Which zip file it is in if (nCurrentZip != nWantZip) { // If we haven't got the right zip file currently open ZipClose(); nCurrentZip = -1; if (ZipOpen(szBzipName[nWantZip])) { printf("%s (open zip err: %s)\n", szText, szBzipName[nWantZip]); return 1; } nCurrentZip = nWantZip; } // Read in file and return how many bytes we read if (ZipLoadFile(Dest, ri.nLen, pnWrote, RomFind[i].nPos)) { printf("%s (ERR)\n", szText); return 1; } printf("%s (OK)\n", szText); return 0; }
static INT32 GalLoadRoms(bool bLoad) { struct BurnRomInfo ri; ri.nType = 0; ri.nLen = 0; INT32 nOffset = -1; UINT32 i; INT32 nRet = 0; if (!bLoad) { do { ri.nLen = 0; ri.nType = 0; BurnDrvGetRomInfo(&ri, ++nOffset); if ((ri.nType & 0xff) == GAL_ROM_Z80_PROG1) { GalZ80Rom1Size += ri.nLen; GalZ80Rom1Num++; } if ((ri.nType & 0xff) == GAL_ROM_Z80_PROG2) { GalZ80Rom2Size += ri.nLen; GalZ80Rom2Num++; } if ((ri.nType & 0xff) == GAL_ROM_Z80_PROG3) { GalZ80Rom3Size += ri.nLen; GalZ80Rom3Num++; } if ((ri.nType & 0xff) == GAL_ROM_TILES_SHARED) { GalTilesSharedRomSize += ri.nLen; GalTilesSharedRomNum++; } if ((ri.nType & 0xff) == GAL_ROM_TILES_CHARS) { GalTilesCharRomSize += ri.nLen; GalTilesCharRomNum++; } if ((ri.nType & 0xff) == GAL_ROM_TILES_SPRITES) { GalTilesSpriteRomSize += ri.nLen; GalTilesSpriteRomNum++; } if ((ri.nType & 0xff) == GAL_ROM_PROM) { GalPromRomSize += ri.nLen; GalPromRomNum++; } if ((ri.nType & 0xff) == GAL_ROM_S2650_PROG1) { GalS2650Rom1Size += ri.nLen; GalS2650Rom1Num++; } } while (ri.nLen); if (GalTilesSharedRomSize) { GalNumChars = GalTilesSharedRomSize / 16; GalNumSprites = GalTilesSharedRomSize / 64; CharPlaneOffsets[1] = GalTilesSharedRomSize * 4; SpritePlaneOffsets[1] = GalTilesSharedRomSize * 4; } if (GalTilesCharRomSize) { GalNumChars = GalTilesCharRomSize / 16; CharPlaneOffsets[1] = GalTilesCharRomSize * 4; } if (GalTilesSpriteRomSize) { GalNumSprites = GalTilesSpriteRomSize / 64; SpritePlaneOffsets[1] = GalTilesSpriteRomSize * 4; } #if 1 && defined FBA_DEBUG if (GalZ80Rom1Size) bprintf(PRINT_NORMAL, _T("Z80 #1 Rom Size: 0x%X (%i roms)\n"), GalZ80Rom1Size, GalZ80Rom1Num); if (GalZ80Rom2Size) bprintf(PRINT_NORMAL, _T("Z80 #2 Rom Size: 0x%X (%i roms)\n"), GalZ80Rom2Size, GalZ80Rom2Num); if (GalZ80Rom3Size) bprintf(PRINT_NORMAL, _T("Z80 #3 Rom Size: 0x%X (%i roms)\n"), GalZ80Rom3Size, GalZ80Rom3Num); if (GalS2650Rom1Size) bprintf(PRINT_NORMAL, _T("S2650 #1 Rom Size: 0x%X (%i roms)\n"), GalS2650Rom1Size, GalS2650Rom1Num); if (GalTilesSharedRomSize) bprintf(PRINT_NORMAL, _T("Shared Tile Rom Size: 0x%X (%i roms, 0x%X Chars, 0x%X Sprites)\n"), GalTilesSharedRomSize, GalTilesSharedRomNum, GalNumChars, GalNumSprites); if (GalTilesCharRomSize) bprintf(PRINT_NORMAL, _T("Char Rom Size: 0x%X (%i roms, 0x%X Chars)\n"), GalTilesCharRomSize, GalTilesCharRomNum, GalNumChars); if (GalTilesSpriteRomSize) bprintf(PRINT_NORMAL, _T("Sprite Rom Size: 0x%X (%i roms, 0x%X Sprites)\n"), GalTilesSpriteRomSize, GalTilesSpriteRomNum, GalNumSprites); if (GalPromRomSize) bprintf(PRINT_NORMAL, _T("PROM Rom Size: 0x%X (%i roms)\n"), GalPromRomSize, GalPromRomNum); #endif } if (bLoad) { INT32 Offset; // Z80 #1 Program Roms Offset = 0; for (i = 0; i < GalZ80Rom1Num; i++) { nRet = BurnLoadRom(GalZ80Rom1 + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; } // Z80 #2 Program Roms if (GalZ80Rom2Size) { Offset = 0; for (i = GAL_ROM_OFFSET_Z80_PROG2; i < GAL_ROM_OFFSET_Z80_PROG2 + GalZ80Rom2Num; i++) { nRet = BurnLoadRom(GalZ80Rom2 + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; } } // Z80 #3 Program Roms if (GalZ80Rom3Size) { Offset = 0; for (i = GAL_ROM_OFFSET_Z80_PROG3; i < GAL_ROM_OFFSET_Z80_PROG3 + GalZ80Rom3Num; i++) { nRet = BurnLoadRom(GalZ80Rom3 + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; } } // Shared Tile Roms if (GalTilesSharedRomSize) { Offset = 0; GalTempRom = (UINT8*)BurnMalloc(GalTilesSharedRomSize); for (i = GAL_ROM_OFFSET_TILES_SHARED; i < GAL_ROM_OFFSET_TILES_SHARED + GalTilesSharedRomNum; i++) { nRet = BurnLoadRom(GalTempRom + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; } GfxDecode(GalNumChars, 2, 8, 8, CharPlaneOffsets, CharXOffsets, CharYOffsets, 0x40, GalTempRom, GalChars); GfxDecode(GalNumSprites, 2, 16, 16, SpritePlaneOffsets, SpriteXOffsets, SpriteYOffsets, 0x100, GalTempRom, GalSprites); BurnFree(GalTempRom); } // Char Tile Roms if (GalTilesCharRomSize) { Offset = 0; GalTempRom = (UINT8*)BurnMalloc(GalTilesCharRomSize); for (i = GAL_ROM_OFFSET_TILES_CHARS; i < GAL_ROM_OFFSET_TILES_CHARS + GalTilesCharRomNum; i++) { nRet = BurnLoadRom(GalTempRom + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; } GfxDecode(GalNumChars, 2, 8, 8, CharPlaneOffsets, CharXOffsets, CharYOffsets, 0x40, GalTempRom, GalChars); BurnFree(GalTempRom); } // Sprite Tile Roms if (GalTilesSpriteRomSize) { Offset = 0; GalTempRom = (UINT8*)BurnMalloc(GalTilesSpriteRomSize); for (i = GAL_ROM_OFFSET_TILES_SPRITES; i < GAL_ROM_OFFSET_TILES_SPRITES + GalTilesSpriteRomNum; i++) { nRet = BurnLoadRom(GalTempRom + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; } GfxDecode(GalNumSprites, 2, 16, 16, SpritePlaneOffsets, SpriteXOffsets, SpriteYOffsets, 0x100, GalTempRom, GalSprites); BurnFree(GalTempRom); } // Prom if (GalPromRomSize) { Offset = 0; for (i = GAL_ROM_OFFSET_PROM; i < GAL_ROM_OFFSET_PROM + GalPromRomNum; i++) { nRet = BurnLoadRom(GalProm + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; } } // S2650 #1 Program Roms if (GalS2650Rom1Size) { Offset = 0; for (i = GAL_ROM_OFFSET_S2650_PROG1; i < GAL_ROM_OFFSET_S2650_PROG1 + GalS2650Rom1Num; i++) { nRet = BurnLoadRom(GalS2650Rom1 + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; } } } return nRet; }
static int pgmGetRoms(bool bLoad) { int kov2 = (strncmp(BurnDrvGetTextA(DRV_NAME), "kov2", 4) == 0) ? 1 : 0; char* pRomName; struct BurnRomInfo ri; struct BurnRomInfo pi; unsigned char *PGMUSER0Load = PGMUSER0; unsigned char *PGM68KROMLoad = PGM68KROM; unsigned char *PGMTileROMLoad = PGMTileROM + 0x180000; unsigned char *PGMSPRMaskROMLoad = PGMSPRMaskROM; unsigned char *PGMSNDROMLoad = ICSSNDROM + 0x400000; if (kov2 && bLoad) { PGMSNDROMLoad += 0x400000; } for (int i = 0; !BurnDrvGetRomName(&pRomName, i, 0); i++) { BurnDrvGetRomInfo(&ri, i); if ((ri.nType & BRF_PRG) && (ri.nType & 0x0f) == 1) { if (bLoad) { BurnDrvGetRomInfo(&pi, i+1); if (ri.nLen == 0x80000 && pi.nLen == 0x80000) { BurnLoadRom(PGM68KROMLoad + 0, i + 0, 2); BurnLoadRom(PGM68KROMLoad + 1, i + 1, 2); PGM68KROMLoad += pi.nLen; i += 1; } else { BurnLoadRom(PGM68KROMLoad, i, 1); } PGM68KROMLoad += ri.nLen; } else { nPGM68KROMLen += ri.nLen; } continue; } if ((ri.nType & BRF_GRA) && (ri.nType & 0x0f) == 2) { if (bLoad) { BurnLoadRom(PGMTileROMLoad, i, 1); PGMTileROMLoad += ri.nLen; } else { nPGMTileROMLen += ri.nLen; } continue; } if ((ri.nType & BRF_GRA) && (ri.nType & 0x0f) == 3) { if (bLoad) { } else { nPGMSPRColROMLen += ri.nLen; } continue; } if ((ri.nType & BRF_GRA) && (ri.nType & 0x0f) == 4) { if (bLoad) { BurnLoadRom(PGMSPRMaskROMLoad, i, 1); PGMSPRMaskROMLoad += ri.nLen; } else { nPGMSPRMaskROMLen += ri.nLen; } continue; } if ((ri.nType & BRF_SND) && (ri.nType & 0x0f) == 5) { if (bLoad) { BurnLoadRom(PGMSNDROMLoad, i, 1); PGMSNDROMLoad += ri.nLen; } else { nPGMSNDROMLen += ri.nLen; } continue; } if ((ri.nType & BRF_PRG) && (ri.nType & 0x0f) == 7) { if (bLoad) { if (BurnDrvGetHardwareCode() & HARDWARE_IGS_USE_ARM_CPU) { BurnLoadRom(PGMARMROM, i, 1); } } continue; } if ((ri.nType & BRF_PRG) && (ri.nType & 0x0f) == 8) { if (BurnDrvGetHardwareCode() & HARDWARE_IGS_USE_ARM_CPU) { if (bLoad) { BurnLoadRom(PGMUSER0, i, 1); PGMUSER0Load += ri.nLen; } else { nPGMExternalARMLen += ri.nLen; } } continue; } } if (!bLoad) { nPGMTileROMLen += 0x180000; if (nPGMTileROMLen < 0x400000) nPGMTileROMLen = 0x400000; nPGMSNDROMLen += 0x400000; if (kov2) nPGMSNDROMLen += 0x400000; nPGMSNDROMLen = ((nPGMSNDROMLen-1) | 0xfffff) + 1; nICSSNDROMLen = (nPGMSNDROMLen-1) & 0xf00000; if (nPGMExternalARMLen == 0) nPGMExternalARMLen = 0x200000; bprintf (0, _T("%5.5x, %d\n"), nPGMExternalARMLen, nBurnFPS); } return 0; }
static int __cdecl BArchiveBurnLoadRom(unsigned char* Dest, int* pnWrote, int i) { if (i < 0 || i >= nRomCount || !RomFind) { return 1; } BurnRomInfo ri; memset(&ri, 0, sizeof(ri)); BurnDrvGetRomInfo(&ri, i); // Get info // show what we're doing char* pszRomName = NULL; BurnDrvGetRomName(&pszRomName, i, 0); if (pszRomName == NULL) { pszRomName = "unknown"; } TCHAR szText[MAX_PATH]; _stprintf(szText, _T("Loading")); if (ri.nType & (BRF_PRG | BRF_GRA | BRF_SND | BRF_BIOS)) { if (ri.nType & BRF_BIOS) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("BIOS ")); } if (ri.nType & BRF_PRG) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("program ")); } if (ri.nType & BRF_GRA) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("graphics ")); } if (ri.nType & BRF_SND) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("sound ")); } _stprintf(szText + _tcslen(szText), _T("(%hs)..."), pszRomName); } else { _stprintf(szText + _tcslen(szText), _T(" %hs..."), pszRomName); } ProgressUpdateBurner(ri.nLen ? 1.0 / ((double)nTotalSize / ri.nLen) : 0, szText, 0); #ifndef LOAD_OPT_ROM // skip loading optional rom if (ri.nType & BRF_OPT) { return 0; } #endif if (RomFind[i].nState == STAT_NOFIND) { // Rom not found in archive at all return 1; } int nWantZip = RomFind[i].nArchive; // Which archive file it is in if (nCurrentArc != nWantZip) { // If we haven't got the right archive file currently open archiveClose(); nCurrentArc = -1; if (archiveOpen(szBArchiveName[nWantZip])) { return 1; } nCurrentArc = nWantZip; } // Read in file and return how many bytes we read if (archiveLoadFile(Dest, ri.nLen, RomFind[i].nPos, pnWrote)) { // Error loading from the archive file return 1; } return 0; }
int BzipOpen(bool bootApp) { int nMemLen; // Zip name number nZipsFound = 0; // Haven't found zips yet nTotalSize = 0; if (szBzipName == NULL) { return 1; } BzipClose(); // Make sure nothing is open if(!bootApp) { // reset information strings BzipText.Reset(); BzipDetail.Reset(); } // Count the number of roms needed for (nRomCount = 0; ; nRomCount++) { if (BurnDrvGetRomInfo(NULL, nRomCount)) { break; } } if (nRomCount <= 0) { return 1; } // Create an array for holding lookups for each rom -> zip entries nMemLen = nRomCount * sizeof(struct RomFind); RomFind = (struct RomFind*)malloc(nMemLen); if (RomFind == NULL) { return 1; } memset(RomFind, 0, nMemLen); for (int z = 0; z < BZIP_MAX; z++) { char* szName = NULL; if (BurnDrvGetZipName(&szName, z)) { break; } for (int d = 0; d < DIRS_MAX; d++) { free(szBzipName[z]); szBzipName[z] = (TCHAR*)malloc(MAX_PATH * sizeof(TCHAR)); _stprintf(szBzipName[z], _T("%s%hs"), szAppRomPaths[d], szName); if (ZipOpen(TCHARToANSI(szBzipName[z], NULL, 0)) == 0) { // Open the rom zip file nZipsFound++; nCurrentZip = z; break; } } if (nCurrentZip >= 0) { if (!bootApp) { BzipText.Add(_T("Found %s;\n"), szBzipName[z]); } ZipGetList(&List, &nListCount); // Get the list of entries for (int i = 0; i < nRomCount; i++) { struct BurnRomInfo ri; int nFind; if (RomFind[i].nState == 1) { // Already found this and it's okay continue; } memset(&ri, 0, sizeof(ri)); nFind = FindRom(i); if (nFind < 0) { // Couldn't find this rom at all continue; } RomFind[i].nZip = z; // Remember which zip file it is in RomFind[i].nPos = nFind; RomFind[i].nState = 1; // Set to found okay BurnDrvGetRomInfo(&ri, i); // Get info about the rom if ((ri.nType & BRF_OPT) == 0 && (ri.nType & BRF_NODUMP) == 0) { nTotalSize += ri.nLen; } if (List[nFind].nLen == ri.nLen) { if (ri.nCrc) { // If we know the CRC if (List[nFind].nCrc != ri.nCrc) { // Length okay, but CRC wrong RomFind[i].nState = 2; } } } else { if (List[nFind].nLen < ri.nLen) { RomFind[i].nState = 3; // Too small } else { RomFind[i].nState = 4; // Too big } } if (!bootApp) { if (RomFind[i].nState != 1) { RomDescribe(&BzipDetail, &ri); if (RomFind[i].nState == 2) { BzipDetail.Add(_T("%hs has a CRC of %.8X. (It should be %.8X.)\n"), GetFilenameA(List[nFind].szName), List[nFind].nCrc, ri.nCrc); } if (RomFind[i].nState == 3) { BzipDetail.Add(_T("%hs is %dk which is incomplete. (It should be %dkB.)\n"), GetFilenameA(List[nFind].szName), List[nFind].nLen >> 10, ri.nLen >> 10); } if (RomFind[i].nState == 4) { BzipDetail.Add(_T("%hs is %dk which is too big. (It should be %dkB.)\n"), GetFilenameA(List[nFind].szName), List[nFind].nLen >> 10, ri.nLen >> 10); } } } }
int BzipOpen(bool bootApp) { int nMemLen; // Zip name number nTotalSize = 0; nBzipError = 0; if (szBzipName == NULL) return 1; BzipClose(); // Make sure nothing is open // Count the number of roms needed for (nRomCount = 0; ; nRomCount++) { if (BurnDrvGetRomInfo(NULL, nRomCount)) { break; } } if (nRomCount <= 0) { return 1; } // Create an array for holding lookups for each rom -> zip entries nMemLen = nRomCount * sizeof(struct RomFind); RomFind = (struct RomFind*)malloc(nMemLen); if (RomFind == NULL) { return 1; } memset(RomFind, 0, nMemLen); for (int y = 0; y < BZIP_MAX; y++) { free(szBzipName[y]); szBzipName[y] = NULL; } // Locate each zip file for (int y = 0, z = 0; y < BZIP_MAX && z < BZIP_MAX; y++) { char* szName = NULL; bool bFound = false; if (BurnDrvGetZipName(&szName, y)) { break; } for (int d = 0; d < DIRS_MAX; d++) { char szFullName[MAX_PATH]; sprintf(szFullName, "%s%s", szAppRomPaths[d], szName); if (ZipOpen(szFullName) == 0) { // Open the rom zip file ZipClose(); bFound = true; szBzipName[z] = (TCHAR*)malloc(MAX_PATH * sizeof(TCHAR)); strcpy(szBzipName[z], szFullName); z++; } } } // Locate the ROM data in the zip files for (int z = 0; z < BZIP_MAX; z++) { if (szBzipName[z] == NULL) { continue; } if (ZipOpen(szBzipName[z]) == 0) { // Open the rom zip file nCurrentZip = z; ZipGetList(&List, &nListCount); // Get the list of entries for (int i = 0; i < nRomCount; i++) { struct BurnRomInfo ri; int nFind; if (RomFind[i].nState == 1) { // Already found this and it's okay continue; } memset(&ri, 0, sizeof(ri)); nFind = FindRom(i); if (nFind < 0) { // Couldn't find this rom at all continue; } RomFind[i].nZip = z; // Remember which zip file it is in RomFind[i].nPos = nFind; RomFind[i].nState = 1; // Set to found okay BurnDrvGetRomInfo(&ri, i); // Get info about the rom if ((ri.nType & BRF_OPT) == 0) { nTotalSize += ri.nLen; } if (List[nFind].nLen == ri.nLen) { if (ri.nCrc) { // If we know the CRC if (List[nFind].nCrc != ri.nCrc) { // Length okay, but CRC wrong //if (ndisablecrc == 1) { RomFind[i].nState = 2; //} else { // RomFind[i].nState = 1; //} } } } else { //if (nLoadMenuShowX & IDC_CHECKCRC) { // ri.nLen = List[nFind].nLen; // RomFind[i].nState = 1; //} else { if (List[nFind].nLen < ri.nLen) { RomFind[i].nState = 3; // Too small } else { RomFind[i].nState = 4; // Too big } } } } BzipListFree(); } ZipClose(); // Close the last zip file if open nCurrentZip = -1; } if (!bootApp) { // Check the roms to see if the code, graphics etc are complete CheckRoms(); BurnExtLoadRom = BzipBurnLoadRom; // Okay to call our function to load each rom } else { return CheckRomsBoot(); } return 0; }
INT32 write_datfile(INT32 bType, FILE* fDat) { INT32 nRet=0; UINT32 nOldSelect=0; UINT32 nGameSelect=0; UINT32 nParentSelect,nBoardROMSelect; fprintf(fDat, "<?xml version=\"1.0\"?>\n"); fprintf(fDat, "<!DOCTYPE datafile PUBLIC \"-//FB Alpha//DTD ROM Management Datafile//EN\" \"http://www.logiqx.com/Dats/datafile.dtd\">\n\n"); fprintf(fDat, "<datafile>\n"); fprintf(fDat, "\t<header>\n"); fprintf(fDat, "\t\t<name>" APP_TITLE "</name>\n"); if (bType == DAT_ARCADE_ONLY) _ftprintf(fDat, _T("\t\t<description>") _T(APP_TITLE) _T(" v%s") _T(" Arcade Games</description>\n"), szAppBurnVer); if (bType == DAT_MEGADRIVE_ONLY) _ftprintf(fDat, _T("\t\t<description>") _T(APP_TITLE) _T(" v%s") _T(" Megadrive Games</description>\n"), szAppBurnVer); if (bType == DAT_PCENGINE_ONLY) _ftprintf(fDat, _T("\t\t<description>") _T(APP_TITLE) _T(" v%s") _T(" PC-Engine Games</description>\n"), szAppBurnVer); if (bType == DAT_TG16_ONLY) _ftprintf(fDat, _T("\t\t<description>") _T(APP_TITLE) _T(" v%s") _T(" TurboGrafx 16 Games</description>\n"), szAppBurnVer); if (bType == DAT_SGX_ONLY) _ftprintf(fDat, _T("\t\t<description>") _T(APP_TITLE) _T(" v%s") _T(" SuprGrafx Games</description>\n"), szAppBurnVer); fprintf(fDat, "\t\t<category>Standard DatFile</category>\n"); _ftprintf(fDat, _T("\t\t<version>%s</version>\n"), szAppBurnVer); fprintf(fDat, "\t\t<author>" APP_TITLE "</author>\n"); fprintf(fDat, "\t\t<homepage>http://www.barryharris.me.uk/</homepage>\n"); fprintf(fDat, "\t\t<url>http://www.barryharris.me.uk/</url>\n"); fprintf(fDat, "\t\t<clrmamepro forcenodump=\"ignore\"/>\n"); fprintf(fDat, "\t</header>\n"); nOldSelect=nBurnDrvActive; // preserve the currently selected driver // Go over each of the games for (nGameSelect=0;nGameSelect<nBurnDrvCount;nGameSelect++) { char sgName[32]; char spName[32]; char sbName[32]; char ssName[32]; UINT32 i=0; INT32 nPass=0; nBurnDrvActive=nGameSelect; // Switch to driver nGameSelect if ((BurnDrvGetFlags() & BDF_BOARDROM) || !strcmp(BurnDrvGetTextA(DRV_NAME), "neogeo")) { continue; } if ((((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_MEGADRIVE) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_PCENGINE_PCENGINE) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_PCENGINE_TG16) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_PCENGINE_SGX) ) && (bType == DAT_ARCADE_ONLY)) { continue; } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_SEGA_MEGADRIVE) && (bType == DAT_MEGADRIVE_ONLY)) { continue; } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_PCENGINE_PCENGINE) && (bType == DAT_PCENGINE_ONLY)) { continue; } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_PCENGINE_TG16) && (bType == DAT_TG16_ONLY)) { continue; } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_PCENGINE_SGX) && (bType == DAT_SGX_ONLY)) { continue; } strcpy(sgName, BurnDrvGetTextA(DRV_NAME)); strcpy(spName, ""); // make sure this string is empty before we start strcpy(sbName, ""); // make sure this string is empty before we start strcpy(ssName, ""); // make sure this string is empty before we start // Check to see if the game has a parent if (BurnDrvGetTextA(DRV_PARENT)) { nParentSelect=-1U; while (BurnDrvGetTextA(DRV_PARENT)) { strcpy(spName, BurnDrvGetTextA(DRV_PARENT)); for (i=0;i<nBurnDrvCount;i++) { nBurnDrvActive=i; if (!strcmp(spName, BurnDrvGetTextA(DRV_NAME))) { nParentSelect=i; break; } } } nBurnDrvActive=nGameSelect; // restore driver select } else nParentSelect=nGameSelect; // Check to see if the game has a BoardROM if (BurnDrvGetTextA(DRV_BOARDROM)) { nBoardROMSelect=-1U; strcpy(sbName, BurnDrvGetTextA(DRV_BOARDROM)); for (i=0;i<nBurnDrvCount;i++) { nBurnDrvActive=i; if (!strcmp(sbName, BurnDrvGetTextA(DRV_NAME))) { nBoardROMSelect=i; break; } } nBurnDrvActive=nGameSelect; // restore driver select } else nBoardROMSelect=nGameSelect; if (BurnDrvGetTextA(DRV_SAMPLENAME)) { strcpy(ssName, BurnDrvGetTextA(DRV_SAMPLENAME)); } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_MEGADRIVE) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_PCENGINE_TG16) ) { // remove the md_ or tg_ char Temp[35]; INT32 Length; if (sgName[0]) { Length = strlen(sgName); memset(Temp, 0, 35); strcpy(Temp, sgName); memset(sgName, 0, 32); for (INT32 pos = 0; pos < Length; pos++) { sgName[pos] = Temp[pos + 3]; } } if (spName[0]) { Length = strlen(spName); memset(Temp, 0, 35); strcpy(Temp, spName); memset(spName, 0, 32); for (INT32 pos = 0; pos < Length; pos++) { spName[pos] = Temp[pos + 3]; } } } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_PCENGINE_PCENGINE) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_PCENGINE_SGX) ) { // remove the pce__ or sgx__ char Temp[36]; INT32 Length; if (sgName[0]) { Length = strlen(sgName); memset(Temp, 0, 36); strcpy(Temp, sgName); memset(sgName, 0, 32); for (INT32 pos = 0; pos < Length; pos++) { sgName[pos] = Temp[pos + 4]; } } if (spName[0]) { Length = strlen(spName); memset(Temp, 0, 36); strcpy(Temp, spName); memset(spName, 0, 32); for (INT32 pos = 0; pos < Length; pos++) { spName[pos] = Temp[pos + 4]; } } } // Report problems if (nParentSelect==-1U) fprintf(fDat, "# Missing parent %s. It needs to be added to " APP_TITLE "!\n\n", spName); if (nBoardROMSelect==-1U) fprintf(fDat, "# Missing boardROM %s. It needs to be added to " APP_TITLE "!\n\n", sbName); // Write the header if (nParentSelect!=nGameSelect && nParentSelect!=-1U) { if (!strcmp(ssName, "") || !strcmp(ssName, sgName)) { fprintf(fDat, "\t<game name=\"%s\" cloneof=\"%s\" romof=\"%s\">\n", sgName, spName, spName); } else { fprintf(fDat, "\t<game name=\"%s\" cloneof=\"%s\" romof=\"%s\" sampleof=\"%s\">\n", sgName, spName, spName, ssName); } } else { // Add "romof" (but not 'cloneof') line for games that have boardROMs if (nBoardROMSelect!=nGameSelect && nBoardROMSelect!=-1U) { fprintf(fDat, "\t<game name=\"%s\" romof=\"%s\">\n", sgName, sbName); } else { if (!strcmp(ssName, "") || !strcmp(ssName, sgName)) { fprintf(fDat, "\t<game name=\"%s\">\n", sgName); } else { fprintf(fDat, "\t<game name=\"%s\" sampleof=\"%s\">\n", sgName, ssName); } } } char szGameName[255]; char szGameNameBuffer[255]; char szManufacturer[255]; char szManufacturerBuffer[255]; memset(szGameName, 0, 255); memset(szGameNameBuffer, 0, 255); memset(szManufacturer, 0, 255); memset(szManufacturerBuffer, 0, 255); strcpy(szGameName, DecorateGameName(nBurnDrvActive)); ReplaceAmpersand(szGameNameBuffer, szGameName); memset(szGameName, 0, 255); strcpy(szGameName, szGameNameBuffer); memset(szGameNameBuffer, 0, 255); ReplaceLessThan(szGameNameBuffer, szGameName); memset(szGameName, 0, 255); strcpy(szGameName, szGameNameBuffer); memset(szGameNameBuffer, 0, 255); ReplaceGreaterThan(szGameNameBuffer, szGameName); strcpy(szManufacturer, BurnDrvGetTextA(DRV_MANUFACTURER)); ReplaceAmpersand(szManufacturerBuffer, szManufacturer); memset(szManufacturer, 0, 255); strcpy(szManufacturer, szManufacturerBuffer); memset(szManufacturerBuffer, 0, 255); ReplaceLessThan(szManufacturerBuffer, szManufacturer); memset(szManufacturer, 0, 255); strcpy(szManufacturer, szManufacturerBuffer); memset(szManufacturerBuffer, 0, 255); ReplaceGreaterThan(szManufacturerBuffer, szManufacturer); fprintf(fDat, "\t\t<description>%s</description>\n", szGameNameBuffer); fprintf(fDat, "\t\t<year>%s</year>\n", BurnDrvGetTextA(DRV_DATE)); fprintf(fDat, "\t\t<manufacturer>%s</manufacturer>\n", szManufacturerBuffer); // Write the individual ROM info for (nPass=0; nPass<2; nPass++) { nBurnDrvActive=nGameSelect; // Skip pass 0 if possible (pass 0 only needed for old-style clrMAME format) if (nPass==0 /*&& (nBoardROMSelect==nGameSelect || nBoardROMSelect==-1U)*/) continue; // Go over each of the files needed for this game (upto 0x0100) for (i=0, nRet=0; nRet==0 && i<0x100; i++) { INT32 nRetTmp=0; struct BurnRomInfo ri; INT32 nLen; UINT32 nCrc; char *szPossibleName=NULL; INT32 j, nMerged=0; memset(&ri,0,sizeof(ri)); // Get info on this file nBurnDrvActive=nGameSelect; nRet=BurnDrvGetRomInfo(&ri,i); nRet+=BurnDrvGetRomName(&szPossibleName,i,0); if (ri.nLen==0) continue; if (nRet==0) { struct BurnRomInfo riTmp; char *szPossibleNameTmp; nLen=ri.nLen; nCrc=ri.nCrc; // Check for files from boardROMs if (nBoardROMSelect!=nGameSelect && nBoardROMSelect!=-1U) { nBurnDrvActive=nBoardROMSelect; nRetTmp=0; // Go over each of the files needed for this game (upto 0x0100) for (j=0; nRetTmp==0 && j<0x100; j++) { memset(&riTmp,0,sizeof(riTmp)); nRetTmp+=BurnDrvGetRomInfo(&riTmp,j); nRetTmp+=BurnDrvGetRomName(&szPossibleNameTmp,j,0); if (nRetTmp==0) { if (riTmp.nLen && riTmp.nCrc==nCrc && !strcmp(szPossibleName, szPossibleNameTmp)) { // This file is from a boardROM nMerged|=2; nRetTmp++; } } } } if (!nMerged && nParentSelect!=nGameSelect && nParentSelect!=-1U) { nBurnDrvActive=nParentSelect; nRetTmp=0; // Go over each of the files needed for this game (upto 0x0100) for (j=0; nRetTmp==0 && j<0x100; j++) { memset(&riTmp,0,sizeof(riTmp)); nRetTmp+=BurnDrvGetRomInfo(&riTmp,j); nRetTmp+=BurnDrvGetRomName(&szPossibleNameTmp,j,0); if (nRetTmp==0) { if (riTmp.nLen && riTmp.nCrc==nCrc && !strcmp(szPossibleName, szPossibleNameTmp)) { // This file is from a parent set nMerged|=1; nRetTmp++; } } } } nBurnDrvActive=nGameSelect; // Switch back to game } char szPossibleNameBuffer[255]; char szPossibleNameBuffer2[255]; memset(szPossibleNameBuffer, 0, 255); memset(szPossibleNameBuffer2, 0, 255); ReplaceAmpersand(szPossibleNameBuffer, szPossibleName); strcpy(szPossibleNameBuffer2, szPossibleNameBuffer); memset(szPossibleNameBuffer, 0, 255); ReplaceLessThan(szPossibleNameBuffer, szPossibleNameBuffer2); memset(szPossibleNameBuffer2, 0, 255); strcpy(szPossibleNameBuffer2, szPossibleNameBuffer); memset(szPossibleNameBuffer, 0, 255); ReplaceGreaterThan(szPossibleNameBuffer, szPossibleNameBuffer2); // File info if (nPass==1 && !nMerged) { if (ri.nType & BRF_NODUMP) { fprintf(fDat, "\t\t<rom name=\"%s\" size=\"%d\" status=\"nodump\"/>\n", szPossibleNameBuffer, ri.nLen); } else { fprintf(fDat, "\t\t<rom name=\"%s\" size=\"%d\" crc=\"%08x\"/>\n", szPossibleNameBuffer, ri.nLen, ri.nCrc); } } if (nPass==1 && nMerged) { // Files from parent/boardROMs if (ri.nType & BRF_NODUMP) { fprintf(fDat, "\t\t<rom name=\"%s\" merge=\"%s\" size=\"%d\" status=\"nodump\"/>\n", szPossibleNameBuffer, szPossibleNameBuffer, ri.nLen); } else { fprintf(fDat, "\t\t<rom name=\"%s\" merge=\"%s\" size=\"%d\" crc=\"%08x\"/>\n", szPossibleNameBuffer, szPossibleNameBuffer, ri.nLen, ri.nCrc); } } } // samples if (strcmp(ssName, "")) { for (i=0, nRet=0; nRet==0 && i<0x100; i++) { struct BurnSampleInfo si; char *szPossibleName=NULL; memset(&si,0,sizeof(si)); // Get info on this file nBurnDrvActive=nGameSelect; nRet=BurnDrvGetSampleInfo(&si,i); nRet+=BurnDrvGetSampleName(&szPossibleName,i,0); if (si.nFlags==0) continue; if (nPass == 1) { char szPossibleNameBuffer[255]; char szPossibleNameBuffer2[255]; memset(szPossibleNameBuffer, 0, 255); memset(szPossibleNameBuffer2, 0, 255); ReplaceAmpersand(szPossibleNameBuffer, szPossibleName); strcpy(szPossibleNameBuffer2, szPossibleNameBuffer); memset(szPossibleNameBuffer, 0, 255); ReplaceLessThan(szPossibleNameBuffer, szPossibleNameBuffer2); memset(szPossibleNameBuffer2, 0, 255); strcpy(szPossibleNameBuffer2, szPossibleNameBuffer); memset(szPossibleNameBuffer, 0, 255); ReplaceGreaterThan(szPossibleNameBuffer, szPossibleNameBuffer2); fprintf(fDat, "\t\t<sample name=\"%s\" />\n", szPossibleNameBuffer); } } } } fprintf(fDat, "\t</game>\n"); } // Do another pass over each of the games to find boardROMs for (nBurnDrvActive=0; nBurnDrvActive<nBurnDrvCount; nBurnDrvActive++) { INT32 i, nPass; if (!(BurnDrvGetFlags() & BDF_BOARDROM)) { continue; } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_SEGA_MEGADRIVE) && (bType == DAT_MEGADRIVE_ONLY)) { continue; } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_PCENGINE_PCENGINE) && (bType == DAT_PCENGINE_ONLY)) { continue; } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_PCENGINE_TG16) && (bType == DAT_TG16_ONLY)) { continue; } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_PCENGINE_SGX) && (bType == DAT_SGX_ONLY)) { continue; } fprintf(fDat, "\t<game isbios=\"yes\" name=\"%s\">\n", BurnDrvGetTextA(DRV_NAME)); fprintf(fDat, "\t\t<description>%s</description>\n", DecorateGameName(nBurnDrvActive)); fprintf(fDat, "\t\t<year>%s</year>\n", BurnDrvGetTextA(DRV_DATE)); fprintf(fDat, "\t\t<manufacturer>%s</manufacturer>\n", BurnDrvGetTextA(DRV_MANUFACTURER)); for (nPass=0; nPass<2; nPass++) { // No meta information needed (pass 0 only needed for old-style clrMAME format) if (nPass==0) continue; // Go over each of the individual files (upto 0x0100) for (i=0; i<0x100; i++) { struct BurnRomInfo ri; char *szPossibleName=NULL; memset(&ri,0,sizeof(ri)); nRet=BurnDrvGetRomInfo(&ri,i); nRet+=BurnDrvGetRomName(&szPossibleName,i,0); if (ri.nLen==0) continue; if (nRet==0) { char szPossibleNameBuffer[255]; char szPossibleNameBuffer2[255]; memset(szPossibleNameBuffer, 0, 255); memset(szPossibleNameBuffer2, 0, 255); ReplaceAmpersand(szPossibleNameBuffer, szPossibleName); strcpy(szPossibleNameBuffer2, szPossibleNameBuffer); memset(szPossibleNameBuffer, 0, 255); ReplaceLessThan(szPossibleNameBuffer, szPossibleNameBuffer2); memset(szPossibleNameBuffer2, 0, 255); strcpy(szPossibleNameBuffer2, szPossibleNameBuffer); memset(szPossibleNameBuffer, 0, 255); ReplaceGreaterThan(szPossibleNameBuffer, szPossibleNameBuffer2); fprintf(fDat, "\t\t<rom name=\"%s\" size=\"%d\" crc=\"%08x\"/>\n", szPossibleNameBuffer, ri.nLen, ri.nCrc); } } } fprintf(fDat, "\t</game>\n"); } // Restore current driver nBurnDrvActive=nOldSelect; fprintf(fDat, "</datafile>"); return 0; }
static int __cdecl BzipBurnLoadRom(unsigned char* Dest, int* pnWrote, int i) { #if defined (BUILD_WIN32) MSG Msg; #endif struct BurnRomInfo ri; int nWantZip = 0; TCHAR szText[128]; char* pszRomName = NULL; int nRet = 0; if (i < 0 || i >= nRomCount) { return 1; } ri.nLen = 0; BurnDrvGetRomInfo(&ri, i); // Get info // show what we're doing BurnDrvGetRomName(&pszRomName, i, 0); if (pszRomName == NULL) { pszRomName = "unknown"; } _stprintf(szText, _T("Loading")); if (ri.nType & (BRF_PRG | BRF_GRA | BRF_SND | BRF_BIOS)) { if (ri.nType & BRF_BIOS) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("BIOS ")); } if (ri.nType & BRF_PRG) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("program ")); } if (ri.nType & BRF_GRA) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("graphics ")); } if (ri.nType & BRF_SND) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("sound ")); } _stprintf(szText + _tcslen(szText), _T("(%hs)..."), pszRomName); } else { _stprintf(szText + _tcslen(szText), _T(" %hs..."), pszRomName); } ProgressUpdateBurner(ri.nLen ? 1.0 / ((double)nTotalSize / ri.nLen) : 0, szText, 0); #if defined (BUILD_WIN32) // Check for messages: while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { DispatchMessage(&Msg); } #endif if (RomFind[i].nState == 0) { // Rom not found in zip at all TCHAR szTemp[128] = _T(""); _stprintf(szTemp, "%s (not found)\n",szText); fprintf(stderr, szTemp); AppError(szTemp, 1); return 1; } nWantZip = RomFind[i].nZip; // Which zip file it is in if (nCurrentZip != nWantZip) { // If we haven't got the right zip file currently open ZipClose(); nCurrentZip = -1; if (ZipOpen(TCHARToANSI(szBzipName[nWantZip], NULL, 0))) { return 1; } nCurrentZip = nWantZip; } // Read in file and return how many bytes we read if (ZipLoadFile(Dest, ri.nLen, pnWrote, RomFind[i].nPos)) { // Error loading from the zip file TCHAR szTemp[128] = _T(""); _stprintf(szTemp, _T("%s reading %.30hs from %.30s"), nRet == 2 ? _T("CRC error") : _T("Error"), pszRomName, GetFilenameW(szBzipName[nCurrentZip])); fprintf(stderr, szTemp); AppError(szTemp, 1); return 1; } fprintf(stderr, "%s (OK)\n", szText); return 0; }
INT32 TaitoLoadRoms(INT32 bLoad) { struct BurnRomInfo ri; ri.nType = 0; ri.nLen = 0; INT32 nOffset = -1; UINT32 i = 0; INT32 nRet = 0; if (!bLoad) { do { ri.nLen = 0; ri.nType = 0; BurnDrvGetRomInfo(&ri, ++nOffset); if ((ri.nType & 0xff) == TAITO_68KROM1 || (ri.nType & 0xff) == TAITO_68KROM1_BYTESWAP || (ri.nType & 0xff) == TAITO_68KROM1_BYTESWAP_JUMPING || (ri.nType & 0xff) == TAITO_68KROM1_BYTESWAP32) { Taito68KRom1Size += ri.nLen; Taito68KRom1Num++; } if ((ri.nType & 0xff) == TAITO_68KROM2 || (ri.nType & 0xff) == TAITO_68KROM2_BYTESWAP) { Taito68KRom2Size += ri.nLen; Taito68KRom2Num++; } if ((ri.nType & 0xff) == TAITO_68KROM3 || (ri.nType & 0xff) == TAITO_68KROM3_BYTESWAP) { Taito68KRom3Size += ri.nLen; Taito68KRom3Num++; } if ((ri.nType & 0xff) == TAITO_Z80ROM1) { TaitoZ80Rom1Size += ri.nLen; TaitoZ80Rom1Num++; } if ((ri.nType & 0xff) == TAITO_Z80ROM2) { TaitoZ80Rom2Size += ri.nLen; TaitoZ80Rom2Num++; } if ((ri.nType & 0xff) == TAITO_CHARS || (ri.nType & 0xff) == TAITO_CHARS_BYTESWAP) { TaitoCharRomSize += ri.nLen; TaitoCharRomNum++; } if ((ri.nType & 0xff) == TAITO_CHARSB || (ri.nType & 0xff) == TAITO_CHARSB_BYTESWAP) { TaitoCharBRomSize += ri.nLen; TaitoCharBRomNum++; } if ((ri.nType & 0xff) == TAITO_SPRITESA || (ri.nType & 0xff) == TAITO_SPRITESA_BYTESWAP || (ri.nType & 0xff) == TAITO_SPRITESA_BYTESWAP32 || (ri.nType & 0xff) == TAITO_SPRITESA_TOPSPEED) { TaitoSpriteARomSize += ri.nLen; TaitoSpriteARomNum++; } if ((ri.nType & 0xff) == TAITO_SPRITESB || (ri.nType & 0xff) == TAITO_SPRITESB_BYTESWAP || (ri.nType & 0xff) == TAITO_SPRITESB_BYTESWAP32) { TaitoSpriteBRomSize += ri.nLen; TaitoSpriteBRomNum++; } if ((ri.nType & 0xff) == TAITO_ROAD) { TaitoRoadRomSize += ri.nLen; TaitoRoadRomNum++; } if ((ri.nType & 0xff) == TAITO_SPRITEMAP) { TaitoSpriteMapRomSize += ri.nLen; TaitoSpriteMapRomNum++; } if ((ri.nType & 0xff) == TAITO_YM2610A) { TaitoYM2610ARomSize += ri.nLen; TaitoYM2610ARomNum++; } if ((ri.nType & 0xff) == TAITO_YM2610B) { TaitoYM2610BRomSize += ri.nLen; TaitoYM2610BRomNum++; } if ((ri.nType & 0xff) == TAITO_MSM5205 || (ri.nType & 0xff) == TAITO_MSM5205_BYTESWAP) { TaitoMSM5205RomSize += ri.nLen; TaitoMSM5205RomNum++; } if ((ri.nType & 0xff) == TAITO_CHARS_PIVOT) { TaitoCharPivotRomSize += ri.nLen; TaitoCharPivotRomNum++; } if ((ri.nType & 0xff) == TAITO_MSM6295) { TaitoMSM6295RomSize += ri.nLen; TaitoMSM6295RomNum++; } if ((ri.nType & 0xff) == TAITO_ES5505 || (ri.nType & 0xff) == TAITO_ES5505_BYTESWAP) { TaitoES5505RomSize += ri.nLen; TaitoES5505RomNum++; } if ((ri.nType & 0xff) == TAITO_DEFAULT_EEPROM) { TaitoDefaultEEPromSize += ri.nLen; TaitoDefaultEEPromNum++; } } while (ri.nLen); #if 1 && defined FBA_DEBUG if (Taito68KRom1Size) bprintf(PRINT_IMPORTANT, _T("68K #1 Rom Length %06X, (%i roms)\n"), Taito68KRom1Size, Taito68KRom1Num); if (Taito68KRom2Size) bprintf(PRINT_IMPORTANT, _T("68K #2 Rom Length %06X, (%i roms)\n"), Taito68KRom2Size, Taito68KRom2Num); if (Taito68KRom3Size) bprintf(PRINT_IMPORTANT, _T("68K #3 Rom Length %06X, (%i roms)\n"), Taito68KRom3Size, Taito68KRom3Num); if (TaitoZ80Rom1Size) bprintf(PRINT_IMPORTANT, _T("Z80 #1 Rom Length %06X, (%i roms)\n"), TaitoZ80Rom1Size, TaitoZ80Rom1Num); if (TaitoZ80Rom2Size) bprintf(PRINT_IMPORTANT, _T("Z80 #2 Rom Length %06X, (%i roms)\n"), TaitoZ80Rom2Size, TaitoZ80Rom2Num); if (TaitoCharRomSize) bprintf(PRINT_IMPORTANT, _T("Char Rom Length %08X, (%i roms, 0x%06X tiles)\n"), TaitoCharRomSize, TaitoCharRomNum, TaitoNumChar); if (TaitoCharBRomSize) bprintf(PRINT_IMPORTANT, _T("Char B Rom Length %08X, (%i roms, 0x%06X tiles)\n"), TaitoCharBRomSize, TaitoCharBRomNum, TaitoNumCharB); if (TaitoSpriteARomSize) bprintf(PRINT_IMPORTANT, _T("Sprite A Rom Length %08X, (%i roms, 0x%06X tiles)\n"), TaitoSpriteARomSize, TaitoSpriteARomNum, TaitoNumSpriteA); if (TaitoSpriteBRomSize) bprintf(PRINT_IMPORTANT, _T("Sprite B Rom Length %08X, (%i roms, 0x%06X tiles)\n"), TaitoSpriteBRomSize, TaitoSpriteBRomNum, TaitoNumSpriteB); if (TaitoRoadRomSize) bprintf(PRINT_IMPORTANT, _T("Road Rom Length %08X, (%i roms)\n"), TaitoRoadRomSize, TaitoRoadRomNum); if (TaitoSpriteMapRomSize) bprintf(PRINT_IMPORTANT, _T("Sprite Map Rom Length %08X, (%i roms)\n"), TaitoSpriteMapRomSize, TaitoSpriteMapRomNum); if (TaitoYM2610ARomSize) bprintf(PRINT_IMPORTANT, _T("YM2610 Samples Rom Length %08X, (%i roms)\n"), TaitoYM2610ARomSize, TaitoYM2610ARomNum); if (TaitoYM2610BRomSize) bprintf(PRINT_IMPORTANT, _T("YM2610 Delta-T Rom Length %08X, (%i roms)\n"), TaitoYM2610BRomSize, TaitoYM2610BRomNum); if (TaitoMSM5205RomSize) bprintf(PRINT_IMPORTANT, _T("MSM5205 Rom Length %08X, (%i roms)\n"), TaitoMSM5205RomSize, TaitoMSM5205RomNum); if (TaitoCharPivotRomSize) bprintf(PRINT_IMPORTANT, _T("Pivot Char Rom Length %08X, (%i roms, 0x%06X tiles)\n"), TaitoCharPivotRomSize, TaitoCharPivotRomNum, TaitoNumCharPivot); if (TaitoMSM6295RomSize) bprintf(PRINT_IMPORTANT, _T("MSM6295 Rom Length %08X, (%i roms)\n"), TaitoMSM6295RomSize, TaitoMSM6295RomNum); if (TaitoES5505RomSize) bprintf(PRINT_IMPORTANT, _T("ES5505 Rom Length %08X, (%i roms)\n"), TaitoES5505RomSize, TaitoES5505RomNum); if (TaitoDefaultEEPromSize) bprintf(PRINT_IMPORTANT, _T("Default EEPROM Length %08X, (%i roms)\n"), TaitoDefaultEEPromSize, TaitoDefaultEEPromNum); #endif } if (bLoad) { INT32 Offset = 0; i = 0; while (i < Taito68KRom1Num) { BurnDrvGetRomInfo(&ri, i + 0); if ((ri.nType & 0xff) == TAITO_68KROM1_BYTESWAP) { nRet = BurnLoadRom(Taito68KRom1 + Offset + 1, i + 0, 2); if (nRet) return 1; nRet = BurnLoadRom(Taito68KRom1 + Offset + 0, i + 1, 2); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 1); Offset += ri.nLen; i += 2; } if ((ri.nType & 0xff) == TAITO_68KROM1_BYTESWAP32) { nRet = BurnLoadRom(Taito68KRom1 + Offset + 1, i + 0, 4); if (nRet) return 1; nRet = BurnLoadRom(Taito68KRom1 + Offset + 0, i + 1, 4); if (nRet) return 1; nRet = BurnLoadRom(Taito68KRom1 + Offset + 3, i + 2, 4); if (nRet) return 1; nRet = BurnLoadRom(Taito68KRom1 + Offset + 2, i + 3, 4); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 1); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 2); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 3); Offset += ri.nLen; i += 4; } if ((ri.nType & 0xff) == TAITO_68KROM1_BYTESWAP_JUMPING) { nRet = BurnLoadRom(Taito68KRom1 + Offset + 0, i + 0, 2); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; i++; } if ((ri.nType & 0xff) == TAITO_68KROM1) { nRet = BurnLoadRom(Taito68KRom1 + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } } if (Taito68KRom2Size) { Offset = 0; i = Taito68KRom1Num; while (i < Taito68KRom1Num + Taito68KRom2Num) { BurnDrvGetRomInfo(&ri, i + 0); if ((ri.nType & 0xff) == TAITO_68KROM2_BYTESWAP) { nRet = BurnLoadRom(Taito68KRom2 + Offset + 1, i + 0, 2); if (nRet) return 1; nRet = BurnLoadRom(Taito68KRom2 + Offset + 0, i + 1, 2); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 1); Offset += ri.nLen; i += 2; } if ((ri.nType & 0xff) == TAITO_68KROM2) { nRet = BurnLoadRom(Taito68KRom2 + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } } } if (Taito68KRom3Size) { Offset = 0; i = Taito68KRom1Num + Taito68KRom2Num; while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num) { BurnDrvGetRomInfo(&ri, i + 0); if ((ri.nType & 0xff) == TAITO_68KROM3_BYTESWAP) { nRet = BurnLoadRom(Taito68KRom3 + Offset + 1, i + 0, 2); if (nRet) return 1; nRet = BurnLoadRom(Taito68KRom3 + Offset + 0, i + 1, 2); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 1); Offset += ri.nLen; i += 2; } if ((ri.nType & 0xff) == TAITO_68KROM3) { nRet = BurnLoadRom(Taito68KRom3 + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } } } if (TaitoZ80Rom1Size) { Offset = 0; for (i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num; i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num; i++) { BurnLoadRom(TaitoZ80Rom1 + Offset, i, 1); BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; } } if (TaitoZ80Rom2Size) { Offset = 0; for (i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num; i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num; i++) { BurnLoadRom(TaitoZ80Rom2 + Offset, i, 1); BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; } } if (TaitoCharRomSize) { UINT8 *TempRom = (UINT8*)BurnMalloc(TaitoCharRomSize); memset(TempRom, 0, TaitoCharRomSize); Offset = 0; i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num; while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum) { BurnDrvGetRomInfo(&ri, i + 0); if ((ri.nType & 0xff) == TAITO_CHARS) { nRet = BurnLoadRom(TempRom + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } if ((ri.nType & 0xff) == TAITO_CHARS_BYTESWAP) { nRet = BurnLoadRom(TempRom + Offset + 0, i + 0, 2); if (nRet) return 1; nRet = BurnLoadRom(TempRom + Offset + 1, i + 1, 2); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 1); Offset += ri.nLen; i += 2; } } if (TaitoNumChar) { GfxDecode(TaitoNumChar, TaitoCharNumPlanes, TaitoCharWidth, TaitoCharHeight, TaitoCharPlaneOffsets, TaitoCharXOffsets, TaitoCharYOffsets, TaitoCharModulo, TempRom, TaitoChars); } else { memcpy (TaitoChars, TempRom, Offset); } BurnFree(TempRom); } if (TaitoCharBRomSize) { UINT8 *TempRom = (UINT8*)BurnMalloc(TaitoCharBRomSize); memset(TempRom, 0, TaitoCharBRomSize); Offset = 0; i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum; while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum) { BurnDrvGetRomInfo(&ri, i + 0); if ((ri.nType & 0xff) == TAITO_CHARSB) { nRet = BurnLoadRom(TempRom + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } if ((ri.nType & 0xff) == TAITO_CHARSB_BYTESWAP) { nRet = BurnLoadRom(TempRom + Offset + 0, i + 0, 2); if (nRet) return 1; nRet = BurnLoadRom(TempRom + Offset + 1, i + 1, 2); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 1); Offset += ri.nLen; i += 2; } } GfxDecode(TaitoNumCharB, TaitoCharBNumPlanes, TaitoCharBWidth, TaitoCharBHeight, TaitoCharBPlaneOffsets, TaitoCharBXOffsets, TaitoCharBYOffsets, TaitoCharBModulo, TempRom, TaitoCharsB); BurnFree(TempRom); } if (TaitoSpriteARomSize) { UINT8 *TempRom = (UINT8*)BurnMalloc(TaitoSpriteARomSize); memset(TempRom, 0, TaitoSpriteARomSize); Offset = 0; i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum; while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum) { BurnDrvGetRomInfo(&ri, i + 0); if ((ri.nType & 0xff) == TAITO_SPRITESA) { nRet = BurnLoadRom(TempRom + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } if ((ri.nType & 0xff) == TAITO_SPRITESA_BYTESWAP) { nRet = BurnLoadRom(TempRom + Offset + 0, i + 0, 2); if (nRet) return 1; nRet = BurnLoadRom(TempRom + Offset + 1, i + 1, 2); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 1); Offset += ri.nLen; i += 2; } if ((ri.nType & 0xff) == TAITO_SPRITESA_BYTESWAP32) { nRet = BurnLoadRom(TempRom + Offset + 0, i + 0, 4); if (nRet) return 1; nRet = BurnLoadRom(TempRom + Offset + 1, i + 1, 4); if (nRet) return 1; nRet = BurnLoadRom(TempRom + Offset + 2, i + 2, 4); if (nRet) return 1; nRet = BurnLoadRom(TempRom + Offset + 3, i + 3, 4); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 1); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 2); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 3); Offset += ri.nLen; i += 4; } if ((ri.nType & 0xff) == TAITO_SPRITESA_TOPSPEED) { nRet = BurnLoadRom(TempRom + 0x000003, i + 0, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x100003, i + 1, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x000007, i + 2, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x100007, i + 3, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x000002, i + 4, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x100002, i + 5, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x000006, i + 6, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x100006, i + 7, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x000001, i + 8, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x100001, i + 9, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x000005, i + 10, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x100005, i + 11, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x000000, i + 12, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x100000, i + 13, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x000004, i + 14, 8); if (nRet) return 1; nRet = BurnLoadRom(TempRom + 0x100004, i + 15, 8); if (nRet) return 1; i += 16; } } if (TaitoSpriteAInvertRom) { for (UINT32 j = 0; j < TaitoSpriteARomSize; j++) { TempRom[j] ^= 0xff; } } if (TaitoNumSpriteA) { GfxDecode(TaitoNumSpriteA, TaitoSpriteANumPlanes, TaitoSpriteAWidth, TaitoSpriteAHeight, TaitoSpriteAPlaneOffsets, TaitoSpriteAXOffsets, TaitoSpriteAYOffsets, TaitoSpriteAModulo, TempRom, TaitoSpritesA); } else { memcpy (TaitoSpritesA, TempRom, Offset); } BurnFree(TempRom); } if (TaitoSpriteBRomSize) { UINT8 *TempRom = (UINT8*)BurnMalloc(TaitoSpriteBRomSize); memset(TempRom, 0, TaitoSpriteBRomSize); Offset = 0; i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum; while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum) { BurnDrvGetRomInfo(&ri, i + 0); if ((ri.nType & 0xff) == TAITO_SPRITESB) { nRet = BurnLoadRom(TempRom + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } if ((ri.nType & 0xff) == TAITO_SPRITESB_BYTESWAP) { nRet = BurnLoadRom(TempRom + Offset + 0, i + 0, 2); if (nRet) return 1; nRet = BurnLoadRom(TempRom + Offset + 1, i + 1, 2); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 1); Offset += ri.nLen; i += 2; } if ((ri.nType & 0xff) == TAITO_SPRITESB_BYTESWAP32) { nRet = BurnLoadRom(TempRom + Offset + 0, i + 0, 4); if (nRet) return 1; nRet = BurnLoadRom(TempRom + Offset + 1, i + 1, 4); if (nRet) return 1; nRet = BurnLoadRom(TempRom + Offset + 2, i + 2, 4); if (nRet) return 1; nRet = BurnLoadRom(TempRom + Offset + 3, i + 3, 4); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 1); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 2); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 3); Offset += ri.nLen; i += 4; } } GfxDecode(TaitoNumSpriteB, TaitoSpriteBNumPlanes, TaitoSpriteBWidth, TaitoSpriteBHeight, TaitoSpriteBPlaneOffsets, TaitoSpriteBXOffsets, TaitoSpriteBYOffsets, TaitoSpriteBModulo, TempRom, TaitoSpritesB); BurnFree(TempRom); } if (TaitoRoadRomSize) { Offset = 0; for (i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum; i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum; i++) { BurnLoadRom(TC0150RODRom + Offset, i, 1); BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; } } if (TaitoSpriteMapRomSize) { Offset = 0; for (i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum; i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum; i++) { BurnLoadRom(TaitoSpriteMapRom + Offset, i, 1); BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; } } if (TaitoYM2610ARomSize) { Offset = 0; for (i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum; i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum; i++) { BurnLoadRom(TaitoYM2610ARom + Offset, i, 1); BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; } } if (TaitoYM2610BRomSize) { Offset = 0; for (i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum; i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum; i++) { BurnLoadRom(TaitoYM2610BRom + Offset, i, 1); BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; } } if (TaitoMSM5205RomSize) { Offset = 0; i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum; while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum) { BurnDrvGetRomInfo(&ri, i + 0); if ((ri.nType & 0xff) == TAITO_MSM5205) { nRet = BurnLoadRom(TaitoMSM5205Rom + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } if ((ri.nType & 0xff) == TAITO_MSM5205_BYTESWAP) { nRet = BurnLoadRom(TaitoMSM5205Rom + Offset + 0, i + 0, 2); if (nRet) return 1; nRet = BurnLoadRom(TaitoMSM5205Rom + Offset + 1, i + 1, 2); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i + 0); Offset += ri.nLen; BurnDrvGetRomInfo(&ri, i + 1); Offset += ri.nLen; i += 2; } } } if (TaitoCharPivotRomSize) { UINT8 *TempRom = (UINT8*)BurnMalloc(TaitoCharPivotRomSize); memset(TempRom, 0, TaitoCharPivotRomSize); Offset = 0; i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum; while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum) { BurnDrvGetRomInfo(&ri, i + 0); if ((ri.nType & 0xff) == TAITO_CHARS_PIVOT) { nRet = BurnLoadRom(TempRom + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } } GfxDecode(TaitoNumCharPivot, TaitoCharPivotNumPlanes, TaitoCharPivotWidth, TaitoCharPivotHeight, TaitoCharPivotPlaneOffsets, TaitoCharPivotXOffsets, TaitoCharPivotYOffsets, TaitoCharPivotModulo, TempRom, TaitoCharsPivot); BurnFree(TempRom); } if (TaitoMSM6295RomSize) { Offset = 0; i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum; while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum + TaitoMSM6295RomNum) { BurnDrvGetRomInfo(&ri, i + 0); if ((ri.nType & 0xff) == TAITO_MSM6295) { nRet = BurnLoadRom(TaitoMSM6295Rom + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } } } if (TaitoES5505RomSize) { Offset = 0; i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum + TaitoMSM6295RomNum; while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum + TaitoMSM6295RomNum + TaitoES5505RomNum) { BurnDrvGetRomInfo(&ri, i + 0); if ((ri.nType & 0xff) == TAITO_ES5505) { nRet = BurnLoadRom(TaitoES5505Rom + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } if ((ri.nType & 0xff) == TAITO_ES5505_BYTESWAP) { nRet = BurnLoadRom(TaitoES5505Rom + (Offset * 2), i, 2); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } } } if (TaitoDefaultEEPromSize) { Offset = 0; i = Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum + TaitoMSM6295RomNum + TaitoES5505RomNum; while (i < Taito68KRom1Num + Taito68KRom2Num + Taito68KRom3Num + TaitoZ80Rom1Num + TaitoZ80Rom2Num + TaitoCharRomNum + TaitoCharBRomNum + TaitoSpriteARomNum + TaitoSpriteBRomNum + TaitoRoadRomNum + TaitoSpriteMapRomNum + TaitoYM2610ARomNum + TaitoYM2610BRomNum + TaitoMSM5205RomNum + TaitoCharPivotRomNum + TaitoMSM6295RomNum + TaitoES5505RomNum + TaitoDefaultEEPromNum) { BurnDrvGetRomInfo(&ri, i + 0); if ((ri.nType & 0xff) == TAITO_DEFAULT_EEPROM) { nRet = BurnLoadRom(TaitoDefaultEEProm + Offset, i, 1); if (nRet) return 1; BurnDrvGetRomInfo(&ri, i); Offset += ri.nLen; i++; } } } } return 0; }
int write_datfile(int nDatType, int bIncMegadrive, FILE* fDat) { int nRet=0; unsigned int nOldSelect=0; unsigned int nGameSelect=0; unsigned int nParentSelect,nBoardROMSelect; nOldSelect=nBurnDrvSelect; // preserve the currently selected driver // Go over each of the games for (nGameSelect=0;nGameSelect<nBurnDrvCount;nGameSelect++) { char sgName[16]; char spName[16]; char sbName[16]; unsigned int i=0; int nPass=0; nBurnDrvSelect=nGameSelect; // Switch to driver nGameSelect if (BurnDrvGetFlags() & BDF_BOARDROM) { continue; } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_MEGADRIVE) && (bIncMegadrive == 0)) { continue; } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_SEGA_MEGADRIVE) && (bIncMegadrive == 2)) { continue; } strcpy(sgName, BurnDrvGetTextA(DRV_NAME)); strcpy(spName, ""); // make sure this string is empty before we start strcpy(sbName, ""); // make sure this string is empty before we start // Check to see if the game has a parent if (BurnDrvGetTextA(DRV_PARENT)) { nParentSelect=-1U; while (BurnDrvGetTextA(DRV_PARENT)) { strcpy(spName, BurnDrvGetTextA(DRV_PARENT)); for (i=0;i<nBurnDrvCount;i++) { nBurnDrvSelect=i; if (!strcmp(spName, BurnDrvGetTextA(DRV_NAME))) { nParentSelect=i; break; } } } nBurnDrvSelect=nGameSelect; // restore driver select } else nParentSelect=nGameSelect; // Check to see if the game has a BoardROM if (BurnDrvGetTextA(DRV_BOARDROM)) { nBoardROMSelect=-1U; strcpy(sbName, BurnDrvGetTextA(DRV_BOARDROM)); for (i=0;i<nBurnDrvCount;i++) { nBurnDrvSelect=i; if (!strcmp(sbName, BurnDrvGetTextA(DRV_NAME))) { nBoardROMSelect=i; break; } } nBurnDrvSelect=nGameSelect; // restore driver select } else nBoardROMSelect=nGameSelect; if (nDatType == 0) { // Report problems if (nParentSelect==-1U) fprintf(fDat, "# Missing parent %s. It needs to be added to " APP_TITLE "!\n\n", spName); if (nBoardROMSelect==-1U) fprintf(fDat, "# Missing boardROM %s. It needs to be added to " APP_TITLE "!\n\n", sbName); // Write the header fprintf(fDat, "game (\n"); fprintf(fDat, "\tname %s\n", sgName); if (nParentSelect!=nGameSelect && nParentSelect!=-1U) { fprintf(fDat, "\tcloneof %s\n", spName); fprintf(fDat, "\tromof %s\n", spName); } else { // Add "romof" (but not 'cloneof') line for games that have boardROMs if (nBoardROMSelect!=nGameSelect && nBoardROMSelect!=-1U) { fprintf(fDat, "\tromof %s\n", sbName); } } fprintf(fDat, "\tdescription \"%s\"\n", DecorateGameName(nBurnDrvSelect)); fprintf(fDat, "\tyear %s\n", BurnDrvGetTextA(DRV_DATE)); fprintf(fDat, "\tmanufacturer \"%s\"\n", BurnDrvGetTextA(DRV_MANUFACTURER)); } if (nDatType == 2) { // Report problems if (nParentSelect==-1U) fprintf(fDat, "# Missing parent %s. It needs to be added to " APP_TITLE "!\n\n", spName); if (nBoardROMSelect==-1U) fprintf(fDat, "# Missing boardROM %s. It needs to be added to " APP_TITLE "!\n\n", sbName); // Write the header if (nParentSelect!=nGameSelect && nParentSelect!=-1U) { fprintf(fDat, "\t<game name=\"%s\" cloneof=\"%s\" romof=\"%s\">\n", sgName, spName, sbName); } else { // Add "romof" (but not 'cloneof') line for games that have boardROMs if (nBoardROMSelect!=nGameSelect && nBoardROMSelect!=-1U) { fprintf(fDat, "\t<game name=\"%s\" romof=\"%s\">\n", sgName, sbName); } else { fprintf(fDat, "\t<game name=\"%s\">\n", sgName); } } char szGameName[255]; char szGameNameBuffer[255]; char szManufacturer[255]; char szManufacturerBuffer[255]; memset(szGameName, 0, 255); memset(szGameNameBuffer, 0, 255); memset(szManufacturer, 0, 255); memset(szManufacturerBuffer, 0, 255); strcpy(szGameName, DecorateGameName(nBurnDrvSelect)); ReplaceAmpersand(szGameNameBuffer, szGameName); strcpy(szManufacturer, BurnDrvGetTextA(DRV_MANUFACTURER)); ReplaceAmpersand(szManufacturerBuffer, szManufacturer); // fprintf(fDat, "\t\t<description>%s</description>\n", DecorateGameName(nBurnDrvSelect)); fprintf(fDat, "\t\t<description>%s</description>\n", szGameNameBuffer); fprintf(fDat, "\t\t<year>%s</year>\n", BurnDrvGetTextA(DRV_DATE)); // fprintf(fDat, "\t\t<manufacturer>%s</manufacturer>\n", BurnDrvGetTextA(DRV_MANUFACTURER)); fprintf(fDat, "\t\t<manufacturer>%s</manufacturer>\n", szManufacturerBuffer); } // Write the individual ROM info for (nPass=0; nPass<2; nPass++) { nBurnDrvSelect=nGameSelect; // Skip pass 0 if possible if (nPass==0 && (nBoardROMSelect==nGameSelect || nBoardROMSelect==-1U || nDatType == 1 || nDatType == 2)) continue; // Go over each of the files needed for this game (upto 0x0100) for (i=0, nRet=0; nRet==0 && i<0x100; i++) { int nRetTmp=0; struct BurnRomInfo ri; int nLen; unsigned int nCrc; char *szPossibleName=NULL; int j, nMerged=0; memset(&ri,0,sizeof(ri)); // Get info on this file nBurnDrvSelect=nGameSelect; nRet=BurnDrvGetRomInfo(&ri,i); nRet+=BurnDrvGetRomName(&szPossibleName,i,0); if (ri.nLen==0) continue; if (nRet==0) { struct BurnRomInfo riTmp; char *szPossibleNameTmp; nLen=ri.nLen; nCrc=ri.nCrc; // Check for files from boardROMs if (nBoardROMSelect!=nGameSelect && nBoardROMSelect!=-1U) { nBurnDrvSelect=nBoardROMSelect; nRetTmp=0; // Go over each of the files needed for this game (upto 0x0100) for (j=0; nRetTmp==0 && j<0x100; j++) { memset(&riTmp,0,sizeof(riTmp)); nRetTmp+=BurnDrvGetRomInfo(&riTmp,j); nRetTmp+=BurnDrvGetRomName(&szPossibleNameTmp,j,0); if (nRetTmp==0) { if (riTmp.nLen && riTmp.nCrc==nCrc && !strcmp(szPossibleName, szPossibleNameTmp)) { // This file is from a boardROM nMerged|=2; nRetTmp++; } } } } if (!nMerged && nParentSelect!=nGameSelect && nParentSelect!=-1U) { nBurnDrvSelect=nParentSelect; nRetTmp=0; // Go over each of the files needed for this game (upto 0x0100) for (j=0; nRetTmp==0 && j<0x100; j++) { memset(&riTmp,0,sizeof(riTmp)); nRetTmp+=BurnDrvGetRomInfo(&riTmp,j); nRetTmp+=BurnDrvGetRomName(&szPossibleNameTmp,j,0); if (nRetTmp==0) { if (riTmp.nLen && riTmp.nCrc==nCrc && !strcmp(szPossibleName, szPossibleNameTmp)) { // This file is from a parent set nMerged|=1; nRetTmp++; } } } } nBurnDrvSelect=nGameSelect; // Switch back to game } if (nDatType == 0) { // Selectable BIOS meta info if (nPass==0 && nMerged&2 && ri.nType&BRF_SELECT) fprintf(fDat, "\tbiosset ( name %d description \"%s\" %s)\n", i - 128, szPossibleName, ri.nType & BRF_OPT ? "" : "default yes "); // File info if (nPass==1 && !nMerged) { if (ri.nType & BRF_NODUMP) { fprintf(fDat, "\trom ( name %s size %d flags nodump )\n", szPossibleName, ri.nLen); } else { fprintf(fDat, "\trom ( name %s size %d crc %08x )\n", szPossibleName, ri.nLen, ri.nCrc); } } if (nPass==1 && nMerged) { // Selectable BIOS file info if (nMerged&2 && ri.nType&BRF_SELECT) fprintf(fDat, "\trom ( name %s merge %s bios %d size %d crc %08x )\n", szPossibleName, szPossibleName, i - 128, ri.nLen, ri.nCrc); // Files from parent/boardROMs else { if (ri.nType & BRF_NODUMP) { fprintf(fDat, "\trom ( name %s merge %s size %d flags nodump )\n", szPossibleName, szPossibleName, ri.nLen); } else { fprintf(fDat, "\trom ( name %s merge %s size %d crc %08x )\n", szPossibleName, szPossibleName, ri.nLen, ri.nCrc); } } } } if (nDatType == 1) { if (nPass == 0) continue; // No meta info needed if (nParentSelect!=nGameSelect && nParentSelect!=-1U) { nBurnDrvSelect=nParentSelect; // Switch to parent fprintf(fDat, "¬%s¬%s", spName, DecorateGameName(nBurnDrvSelect)); nBurnDrvSelect=nGameSelect; // Switch back to game } else fprintf(fDat, "¬%s¬%s", BurnDrvGetTextA(DRV_NAME), DecorateGameName(nBurnDrvSelect)); fprintf(fDat, "¬%s¬%s", BurnDrvGetTextA(DRV_NAME), DecorateGameName(nBurnDrvSelect)); fprintf(fDat, "¬%s¬%08x¬%d", szPossibleName, ri.nCrc, ri.nLen); if (nParentSelect!=nGameSelect && nParentSelect!=-1U) { // Files from parent fprintf(fDat, "¬%s", spName); } else { // Files from boardROM if (nBoardROMSelect!=nGameSelect && nBoardROMSelect!=-1U) fprintf(fDat, "¬%s", sbName); } if (!nMerged) fprintf(fDat, "¬¬¬\n"); else fprintf(fDat, "¬%s¬\n", szPossibleName); } if (nDatType == 2) { char szPossibleNameBuffer[255]; memset(szPossibleNameBuffer, 0, 255); ReplaceAmpersand(szPossibleNameBuffer, szPossibleName); // File info if (nPass==1 && !nMerged) { if (ri.nType & BRF_NODUMP) { fprintf(fDat, "\t\t<rom name=\"%s\" size=\"%d\" status=\"nodump\"/>\n", szPossibleNameBuffer, ri.nLen); } else { fprintf(fDat, "\t\t<rom name=\"%s\" size=\"%d\" crc=\"%08x\"/>\n", szPossibleNameBuffer, ri.nLen, ri.nCrc); } } if (nPass==1 && nMerged) { // Files from parent/boardROMs if (ri.nType & BRF_NODUMP) { fprintf(fDat, "\t\t<rom name=\"%s\" merge=\"%s\" size=\"%d\" status=\"nodump\"/>\n", szPossibleNameBuffer, szPossibleNameBuffer, ri.nLen); } else { fprintf(fDat, "\t\t<rom name=\"%s\" merge=\"%s\" size=\"%d\" crc=\"%08x\"/>\n", szPossibleNameBuffer, szPossibleNameBuffer, ri.nLen, ri.nCrc); } } } } } if (nDatType == 0) fprintf(fDat, ")\n\n"); if (nDatType == 2) fprintf(fDat, "\t</game>\n"); } if (nDatType == 1 && (bIncMegadrive != 2)) fprintf(fDat, "[RESOURCES]\n"); // Do another pass over each of the games to find boardROMs for (nBurnDrvSelect=0; nBurnDrvSelect<nBurnDrvCount; nBurnDrvSelect++) { int i, nPass; if (!(BurnDrvGetFlags() & BDF_BOARDROM)) { continue; } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_SEGA_MEGADRIVE) && (bIncMegadrive == 2)) { continue; } if (nDatType == 0) { fprintf(fDat, "resource (\n"); fprintf(fDat, "\tname %s\n", BurnDrvGetTextA(DRV_NAME)); fprintf(fDat, "\tdescription \"%s\"\n", DecorateGameName(nBurnDrvSelect)); fprintf(fDat, "\tyear %s\n", BurnDrvGetTextA(DRV_DATE)); fprintf(fDat, "\tmanufacturer \"%s\"\n", BurnDrvGetTextA(DRV_COMMENT)); } if (nDatType == 2) { fprintf(fDat, "\t<game isbios=\"yes\" name=\"%s\">\n", BurnDrvGetTextA(DRV_NAME)); fprintf(fDat, "\t\t<description>%s</description>\n", DecorateGameName(nBurnDrvSelect)); fprintf(fDat, "\t\t<year>%s</year>\n", BurnDrvGetTextA(DRV_DATE)); fprintf(fDat, "\t\t<manufacturer>%s</manufacturer>\n", BurnDrvGetTextA(DRV_MANUFACTURER)); } for (nPass=0; nPass<2; nPass++) { // No meta information needed if (nPass==0 && (nDatType == 1 || nDatType == 2)) continue; // Go over each of the individual files (upto 0x0100) for (i=0; i<0x100; i++) { struct BurnRomInfo ri; char *szPossibleName=NULL; memset(&ri,0,sizeof(ri)); nRet=BurnDrvGetRomInfo(&ri,i); nRet+=BurnDrvGetRomName(&szPossibleName,i,0); if (ri.nLen==0) continue; if (nRet==0) { if (nDatType == 0) { if (nPass==0) { if (ri.nType&BRF_SELECT) fprintf(fDat, "\tbiosset ( name %d description \"%s\" %s)\n", i, szPossibleName, ri.nType & 0x80 ? "" : "default yes "); } else { if (ri.nType&BRF_SELECT) fprintf(fDat, "\trom ( name %s bios %d size %d crc %08x )\n", szPossibleName, i, ri.nLen, ri.nCrc); else fprintf(fDat, "\trom ( name %s size %d crc %08x )\n", szPossibleName, ri.nLen, ri.nCrc); } } if (nDatType == 1) { fprintf(fDat, "¬%s¬%s", BurnDrvGetTextA(DRV_NAME), DecorateGameName(nBurnDrvSelect)); fprintf(fDat, "¬%s¬%s", BurnDrvGetTextA(DRV_NAME), DecorateGameName(nBurnDrvSelect)); fprintf(fDat, "¬%s¬%08x¬%d", szPossibleName, ri.nCrc, ri.nLen); fprintf(fDat, "¬¬¬\n"); } if (nDatType == 2) { char szPossibleNameBuffer[255]; memset(szPossibleNameBuffer, 0, 255); ReplaceAmpersand(szPossibleNameBuffer, szPossibleName); fprintf(fDat, "\t\t<rom name=\"%s\" size=\"%d\" crc=\"%08x\"/>\n", szPossibleNameBuffer, ri.nLen, ri.nCrc); } } } } if (nDatType == 0) fprintf(fDat, ")\n"); if (nDatType == 2) fprintf(fDat, "\t</game>\n"); } // Restore current driver nBurnDrvSelect=nOldSelect; if (nDatType == 2) fprintf(fDat, "</datafile>"); return 0; }
int BzipOpen(bool bootApp) { int nMemLen; // Zip name number nTotalSize = 0; nBzipError = 0; if (szBzipName == NULL) { return 1; } BzipClose(); // Make sure nothing is open // Count the number of roms needed for (nRomCount = 0; ; nRomCount++) { if (BurnDrvGetRomInfo(NULL, nRomCount)) { break; } } if (nRomCount <= 0) { return 2; } // Create an array for holding lookups for each rom -> zip entries nMemLen = nRomCount * sizeof(struct RomFind); RomFind = (struct RomFind*)malloc(nMemLen); if (RomFind == NULL) { return 3; } memset(RomFind, 0, nMemLen); for (int y = 0; y < BZIP_MAX; y++) { free(szBzipName[y]); szBzipName[y] = NULL; } // Locate each zip file for (int y = 0, z = 0; y < BZIP_MAX && z < BZIP_MAX; y++) { char* szName = NULL; bool bFound = false; if (BurnDrvGetZipName(&szName, y)) { break; } for (int d = 0; d < DIRS_MAX; d++) { if ( strlen(szAppRomPaths[d]) > 0 ){ TCHAR szFullName[MAX_PATH]; _stprintf(szFullName, _T("%s%hs"), szAppRomPaths[d], szName); if (ZipOpen(szFullName) == 0) { // Open the rom zip file ZipClose(); bFound = true; szBzipName[z] = (TCHAR*)malloc(MAX_PATH * sizeof(TCHAR)); _tcscpy(szBzipName[z], szFullName); if (!bootApp) { //FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_FOUND), szName, szBzipName[z]); } z++; // Look further in the last path specified, so you can put files with ROMs // used only by FB Alpha there without causing problems with dat files if (d < DIRS_MAX - 2) { d = DIRS_MAX - 2; } else { if (d >= DIRS_MAX - 1) { break; } } } } } if (!bootApp && !bFound) { //FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_NOTFOUND), szName); } } if (!bootApp) { //FBAPopupAddText(PUF_TEXT_DEFAULT, _T("\n")); } // Locate the ROM data in the zip files for (int z = 0; z < BZIP_MAX; z++) { if (szBzipName[z] == NULL) { continue; } if (ZipOpen(szBzipName[z]) == 0) { // Open the rom zip file nCurrentZip = z; ZipGetList(&List, &nListCount); // Get the list of entries for (int i = 0; i < nRomCount; i++) { struct BurnRomInfo ri; int nFind; if (RomFind[i].nState == 1) { // Already found this and it's okay continue; } memset(&ri, 0, sizeof(ri)); nFind = FindRom(i); if (nFind < 0) { // Couldn't find this rom at all continue; } RomFind[i].nZip = z; // Remember which zip file it is in RomFind[i].nPos = nFind; RomFind[i].nState = 1; // Set to found okay BurnDrvGetRomInfo(&ri, i); // Get info about the rom if ((ri.nType & BRF_OPT) == 0 && (ri.nType & BRF_NODUMP) == 0) { nTotalSize += ri.nLen; } if (List[nFind].nLen == ri.nLen) { if (ri.nCrc) { // If we know the CRC if (List[nFind].nCrc != ri.nCrc) { // Length okay, but CRC wrong RomFind[i].nState = 2; } } } else { if (List[nFind].nLen < ri.nLen) { RomFind[i].nState = 3; // Too small } else { RomFind[i].nState = 4; // Too big } } if (!bootApp) { if (RomFind[i].nState != 1) { RomDescribe(&ri); if (RomFind[i].nState == 2) { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_CRC), GetFilenameA(List[nFind].szName), List[nFind].nCrc, ri.nCrc); } if (RomFind[i].nState == 3) { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_SMALL), GetFilenameA(List[nFind].szName), List[nFind].nLen >> 10, ri.nLen >> 10); } if (RomFind[i].nState == 4) { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_LARGE), GetFilenameA(List[nFind].szName), List[nFind].nLen >> 10, ri.nLen >> 10); } } } } BzipListFree(); } ZipClose(); // Close the last zip file if open nCurrentZip = -1; } if (!bootApp) { // Check the roms to see if the code, graphics etc are complete CheckRoms(); if (nBzipError & 0x2000) { if (!(nBzipError & 0x0F0F)) { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_OK)); } else { // FBAPopupAddText(PUF_TEXT_DEFAULT, _T("\n")); // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_PROBLEM)); } if (nBzipError & 0x0101) { // FBAPopupAddText(PUF_TEXT_DEFAULT, _T("\n ") _T(SEPERATOR_1)); if (nBzipError & 0x0001) { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_ESS_MISS)); } else { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_ESS_BAD)); } } if (nBzipError & 0x0202) { // FBAPopupAddText(PUF_TEXT_DEFAULT, _T("\n ") _T(SEPERATOR_1)); // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_DET_PRG)); if (nBzipError & 0x0002) { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_DATA_MISS)); } else { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_DATA_BAD)); } } if (nBzipError & 0x0404) { // FBAPopupAddText(PUF_TEXT_DEFAULT, _T("\n ") _T(SEPERATOR_1)); // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_DET_GRA)); if (nBzipError & 0x0004) { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_DATA_MISS)); } else { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_DATA_BAD)); } } if (nBzipError & 0x0808) { // FBAPopupAddText(PUF_TEXT_DEFAULT, _T("\n ") _T(SEPERATOR_1)); // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_DET_SND)); if (nBzipError & 0x0008) { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_DATA_MISS)); } else { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_DATA_BAD)); } } // Catch non-categorised ROMs if ((nBzipError & 0x0F0F) == 0) { if (nBzipError & 0x0010) { // FBAPopupAddText(PUF_TEXT_DEFAULT, _T("\n ") _T(SEPERATOR_1)); if (nBzipError & 0x1000) { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_DATA_MISS)); } else { // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_DATA_BAD)); } } } } else { // FBAPopupAddText(PUF_TEXT_DEFAULT, _T("\n")); // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_NODATA)); } BurnExtLoadRom = BzipBurnLoadRom; // Okay to call our function to load each rom } else { return CheckRomsBoot(); } return 0; }