// Catch calls to BurnLoadRom() once the emulation has started; // Intialise the zip module before forwarding the call, and exit cleanly. static int DrvLoadRom(unsigned char* Dest, int* pnWrote, int i) { int nRet; BzipOpen(false); if ((nRet = BurnExtLoadRom(Dest, pnWrote, i)) != 0) { char szText[256] = ""; char* pszFilename; BurnDrvGetRomName(&pszFilename, i, 0); sprintf(szText, "Error loading %s, requested by %s.\n" "The emulation will likely suffer problems.", pszFilename, BurnDrvGetTextA(0)); } BzipClose(); BurnExtLoadRom = DrvLoadRom; //ScrnTitle(); return nRet; }
// 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 }
// 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; }
// Catch calls to BurnLoadRom() once the emulation has started; // Intialise the zip module before forwarding the call, and exit cleanly. static int __cdecl DrvLoadRom(unsigned char* Dest, int* pnWrote, int i) { int nRet; BzipOpen(false); if ((nRet = BurnExtLoadRom(Dest, pnWrote, i)) != 0) { char* pszFilename; BurnDrvGetRomName(&pszFilename, i, 0); } BzipClose(); return nRet; }
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; }
// Catch calls to BurnLoadRom() once the emulation has started; // Intialise the zip module before forwarding the call, and exit cleanly. static int __cdecl DrvLoadRom(unsigned char* Dest, int* pnWrote, int i) { int nRet; BzipOpen(false); if ((nRet = BurnExtLoadRom(Dest, pnWrote, i)) != 0) { char* pszFilename; BurnDrvGetRomName(&pszFilename, i, 0); FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_REQUEST), pszFilename, BurnDrvGetText(DRV_NAME)); FBAPopupDisplay(PUF_TYPE_ERROR); } BzipClose(); BurnExtLoadRom = DrvLoadRom; ScrnTitle(); return nRet; }
// 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; }
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; }
// 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; } char* RomName = ""; //add by emufan BurnDrvGetRomName(&RomName, i, 0); 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 *)0x00200000;//malloc(nLen); if (Load==NULL) { return 1; } memset(Load,0,nLen); // Load in the file //static int __cdecl SaturnLoadRom(unsigned char* Dest, int* pnWrote, int i, int nGap,int bXor) nRet=BurnExtLoadRom(Load,&nLoadLen,i,nGap,bXor); //if (bDoPatch) ApplyPatches(Load, RomName); if (nRet!=0) { // 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); } pd=pl=LoadEnd=NULL; // free(Load); Load = NULL; } else { // If no XOR, and gap of 1, just copy straight in nRet=BurnExtLoadRom(Dest,NULL,i,nGap,bXor); // if (bDoPatch) ApplyPatches(Dest, RomName); if (nRet!=0) return 1; } 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; }
// 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 int 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"; } _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 (RomFind[i].nState == 0) { // Rom not found in zip at all 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])) { 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 // FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(nRet == 2 ? IDS_ERR_LOAD_DISK_CRC : IDS_ERR_LOAD_DISK), pszRomName, GetFilenameW(szBzipName[nCurrentZip])); // FBAPopupDisplay(PUF_TYPE_WARNING); return 1; } 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; }
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) { 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 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); #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; }
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; }
int write_datfile(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[32]; char spName[32]; char sbName[32]; char ssName[32]; 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; } #if defined (ROM_VERIFY) if ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_CAPCOM_CPS3) { continue; } #endif 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++) { 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 (BurnDrvGetTextA(DRV_SAMPLENAME)) { strcpy(ssName, BurnDrvGetTextA(DRV_SAMPLENAME)); } if ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_MEGADRIVE) { // remove the md_ char Temp[35]; int Length; if (sgName[0]) { Length = strlen(sgName); memset(Temp, 0, 35); strcpy(Temp, sgName); memset(sgName, 0, 32); for (int 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 (int pos = 0; pos < Length; pos++) { spName[pos] = Temp[pos + 3]; } } } // 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(nBurnDrvSelect)); ReplaceAmpersand(szGameNameBuffer, szGameName); strcpy(szManufacturer, BurnDrvGetTextA(DRV_MANUFACTURER)); ReplaceAmpersand(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++) { nBurnDrvSelect=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++) { 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 } 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); } } } // 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 nBurnDrvSelect=nGameSelect; nRet=BurnDrvGetSampleInfo(&si,i); nRet+=BurnDrvGetSampleName(&szPossibleName,i,0); if (si.nFlags==0) continue; if (nPass == 1) { char szPossibleNameBuffer[255]; memset(szPossibleNameBuffer, 0, 255); ReplaceAmpersand(szPossibleNameBuffer, szPossibleName); 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 (nBurnDrvSelect=0; nBurnDrvSelect<nBurnDrvCount; nBurnDrvSelect++) { int i, nPass; if (!(BurnDrvGetFlags() & BDF_BOARDROM)) { continue; } if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) != HARDWARE_SEGA_MEGADRIVE) && (bIncMegadrive == 2)) { continue; } 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 (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]; memset(szPossibleNameBuffer, 0, 255); ReplaceAmpersand(szPossibleNameBuffer, szPossibleName); 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 nBurnDrvSelect=nOldSelect; fprintf(fDat, "</datafile>"); return 0; }
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; }