// 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; }
// 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; }
// 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; }
// 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; }
// 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; }