#include #include "stdio.h" #include "stdlib.h" #include "string.h" #include "conio.h" #include "CRB_Main.h" //#include "CRB_Log.h" #define __CRB_Includes_SNA__ #include "sna/snammg.h" #undef __CRB_Includes_SNA__ tdstBloc *g_p_stMemory0[C_CRB_NBMAXBLOC]; tdstBloc *g_p_stMemory1[C_CRB_NBMAXBLOC]; tdstBloc *g_p_stPtrMemory0[C_CRB_NBMAXBLOC]; tdstBloc *g_p_stPtrMemory1[C_CRB_NBMAXBLOC]; unsigned long g_ulNbBloc; unsigned long g_ulBlocPtrTable[1000000]; unsigned char g_ucBlocPtrDestTable[1000000]; unsigned long g_ulNbPtr,g_ulNbBadPtr; unsigned char g_ucAvoidAllEntries; // For debug purpose long g_ulBadBlocDiff[100]; unsigned long g_ulBadBlocDiffOccur[100]; unsigned long g_ulNbBadBlocDiff; // End for debug purpose char g_bGlideMode; void CRB_InitArray() { } char SNA_fn_bSaveThisModuleBlocInFix( tdstBloc *_p_stBlock ) { return(_p_stBlock->ucLocation == SNA_C_ucBlockOfFix); } char SNA_fn_bSaveThisModuleBlocInLevel( tdstBloc *_p_stBlock ) { return(_p_stBlock->ucLocation == SNA_C_ucBlockOfLevel); } unsigned long CRB_fn_ulNbOfFixBlockIn( tdstBloc **_p_a_stBlocks, unsigned long _ulArraySize ) { unsigned long i, ulNb = 0; for( i=0; i<_ulArraySize; i++ ) { if( SNA_fn_bSaveThisModuleBlocInFix( *_p_a_stBlocks ) ) ulNb++; _p_a_stBlocks++; } return ulNb; } unsigned long CRB_fn_ulNbOfLevelBlockIn( tdstBloc **_p_a_stBlocks, unsigned long _ulArraySize ) { unsigned long i, ulNb = 0; for( i=0; i<_ulArraySize; i++ ) { if( SNA_fn_bSaveThisModuleBlocInLevel( *_p_a_stBlocks ) ) ulNb++; _p_a_stBlocks++; } return ulNb; } unsigned char CRB_fn_bDestinationBloc( unsigned long _ulPtrValue ) { unsigned char i; for(i=0;i=g_p_stMemory0[i]->ulBeginBloc) && (_ulPtrValueulEndBloc) ) { return i; } } return -1; } // Add a bad bloc displacement to the array of bad bloc disp. void CRB_fn_bAddBadBlocDiff(long ucI) { unsigned char i; for(i=0;iulModuleNumber; WriteFile (hFile , &ucNb , 1 , &dwWrite , NULL); // N° Bloc ucNb=(unsigned char)g_p_stMemory0[ulBlocNb]->ulBlocNumber; WriteFile (hFile , &ucNb , 1 , &dwWrite , NULL); // Nb of Ptr WriteFile (hFile , &(g_ulNbPtr) , 4 , &dwWrite , NULL); /* for(i=0;iulModuleNumber; } else { ucNb=g_ucBlocPtrDestTable[i]; } WriteFile (hFile , &ucNb , 1 , &dwWrite , NULL); if(g_ucBlocPtrDestTable[i]<0xf0) { ucNb=(unsigned char)g_p_stMemory0[g_ucBlocPtrDestTable[i]]->ulBlocNumber; } else { ucNb=g_ucBlocPtrDestTable[i]; } WriteFile (hFile , &ucNb , 1 , &dwWrite , NULL); } */ p_stPointer = (tdstPtr*) malloc (sizeof(tdstPtr) * g_ulNbPtr); p_stPtr = p_stPointer; for(i=0;i p_vPtr = g_ulBlocPtrTable[i]; // if(g_ucBlocPtrDestTable[i]<0xf0) { p_stPtr -> ucTargetModule = (unsigned char)g_p_stMemory0[g_ucBlocPtrDestTable[i]]->ulModuleNumber; } else { p_stPtr -> ucTargetModule = g_ucBlocPtrDestTable[i]; } // if(g_ucBlocPtrDestTable[i]<0xf0) { p_stPtr -> ucTargetBlock = (unsigned char)g_p_stMemory0[g_ucBlocPtrDestTable[i]]->ulBlocNumber; } else { p_stPtr -> ucTargetBlock = g_ucBlocPtrDestTable[i]; } } WriteFile (hFile , p_stPointer , sizeof(tdstPtr) * g_ulNbPtr , &dwWrite , NULL); free (p_stPointer); } void CRB_fn_vBuildPointerTableForFix(unsigned long ulNbBloc,char *szFilename) { unsigned long i,j; unsigned long *p_b0,*p_b1,ulLastBadPtr; unsigned char ucDestBloc; //FILE *fFile; HANDLE hFile; hFile = CRB_fn_vOpenPtrTable (szFilename , CRB_fn_ulNbOfFixBlockIn (g_p_stMemory0 , ulNbBloc)); // For stats // fn_vBeginLogPointersInfos( "Fix" ); g_ulNbBadPtr=0; ulLastBadPtr=0; for(i=0;iulSize == 0 ) continue; p_b0=(unsigned long *)g_p_stMemory0[i]->cMemory; p_b1=(unsigned long *)g_p_stMemory1[i]->cMemory; for(j=0;j<((g_p_stMemory0[i]->ulSize)>>2);j++) { if(p_b0[j]!=p_b1[j]) { ucDestBloc=CRB_fn_bDestinationBloc(p_b0[j]); // fn_vLogAddPointer( i, ucDestBloc ); if(ucDestBloc!=(unsigned char)-1) { // Add store of the address of this ptr and the aim bloc. g_ulBlocPtrTable[g_ulNbPtr]=g_p_stMemory0[i]->ulBeginBloc+(j<<2); g_ucBlocPtrDestTable[g_ulNbPtr]=ucDestBloc; g_ulNbPtr++; /* if( g_p_stMemory0[ucDestBloc]->ulModuleNumber == C_ucIdOfModuleTmp ) { // Pointers to block TMP will be set to NULL. g_ucBlocPtrDestTable[g_ulNbPtr-1]=0xfe; } */ } else { /* Gus: Uncomment this to take care of pointers to unknown blocs. if(ulLastBadPtr==(j+1)) { printf("\nptr Possible"); } // for debug only // Pointers to unknow blocks will remain unchanged. g_ulBlocPtrTable[g_ulNbPtr]=g_p_stMemory0[i]->ulBeginBloc+(j<<2); g_ucBlocPtrDestTable[g_ulNbPtr]=0xff; g_ulNbPtr++; // end debug g_ulNbBadPtr++; ulLastBadPtr=j; // printf("\nWarning - A Pointer (Offset=%lx) in Module %ld Bloc %ld point out of Blocs !",j,g_p_stMemory0[i]->ulModuleNumber,g_p_stMemory0[i]->ulBlocNumber); */ } } } // fn_vLogPointersInfosForOneBlock( i ); CRB_fn_vSavePtrTable (i , hFile); } // fn_vEndLogPointersInfos(); CRB_fn_vClosePtrTable (hFile); } void CRB_fn_vBuildPointerTableForLevel(unsigned long ulNbBloc,char *szFilename) { unsigned long i,j; unsigned long *p_b0,*p_b1,ulLastBadPtr; unsigned char ucDestBloc; HANDLE hFile; hFile = CRB_fn_vOpenPtrTable (szFilename , CRB_fn_ulNbOfLevelBlockIn (g_p_stMemory0 , ulNbBloc)); // For stats // fn_vBeginLogPointersInfos( "Level" ); g_ulNbBadPtr=0; ulLastBadPtr=0; for(i=0;iulSize == 0 ) continue; p_b0=(unsigned long *)g_p_stMemory0[i]->cMemory; p_b1=(unsigned long *)g_p_stMemory1[i]->cMemory; for(j=0;j<((g_p_stMemory0[i]->ulSize)>>2);j++) { if(p_b0[j]!=p_b1[j]) { ucDestBloc=CRB_fn_bDestinationBloc(p_b0[j]); // fn_vLogAddPointer( i, ucDestBloc ); if(ucDestBloc==(unsigned char)-1) { /* Gus: Uncomment this to take care of pointers to unknown blocs. if(ulLastBadPtr==(j+1)) { printf("\nptr Possible"); } // for debug only g_ulBlocPtrTable[g_ulNbPtr]=g_p_stMemory0[i]->ulBeginBloc+(j<<2); g_ucBlocPtrDestTable[g_ulNbPtr]=0xff; g_ulNbPtr++; // end debug g_ulNbBadPtr++; ulLastBadPtr=j; // printf("\nWarning - A Pointer (Offset=%lx) in Module %ld Bloc %ld point out of Blocs !",j,g_p_stMemory0[i]->ulModuleNumber,g_p_stMemory0[i]->ulBlocNumber); */ } else { if( SNA_fn_bSaveThisModuleBlocInFix( g_p_stMemory0[i] ) ) { if( SNA_fn_bSaveThisModuleBlocInFix( g_p_stMemory0[ucDestBloc] ) ) { // Pointer from fix to fix: case is already handled by CRB_fn_vBuildPointerTableForFix j=j; } else if( SNA_fn_bSaveThisModuleBlocInLevel( g_p_stMemory0[ucDestBloc] ) ) { // Pointeur from fix to level g_ulBlocPtrTable[g_ulNbPtr]=g_p_stMemory0[i]->ulBeginBloc+(j<<2); g_ucBlocPtrDestTable[g_ulNbPtr]=ucDestBloc; g_ulNbPtr++; } } else // Pointeur from level to anywhere { // Add store of the address of this ptr and the aim bloc. g_ulBlocPtrTable[g_ulNbPtr]=g_p_stMemory0[i]->ulBeginBloc+(j<<2); g_ucBlocPtrDestTable[g_ulNbPtr]=ucDestBloc; g_ulNbPtr++; /* if( g_p_stMemory0[ucDestBloc]->ulModuleNumber == C_ucIdOfModuleTmp ) { // Pointers to block TMP will be set to NULL. g_ucBlocPtrDestTable[g_ulNbPtr-1]=0xfe; } */ } } } } if( SNA_fn_bSaveThisModuleBlocInFix( g_p_stMemory0[i] ) ) { } else { // fn_vLogPointersInfosForOneBlock( i ); CRB_fn_vSavePtrTable (i , hFile); } } // fn_vEndLogPointersInfos(); CRB_fn_vClosePtrTable (hFile); } void CRB_fn_vBuildPointerTableForPtr(unsigned long ulNbBloc,char *szFilename, char *szType ) { unsigned long i,j; unsigned long *p_b0,*p_b1; unsigned char ucDestBloc,br=0; HANDLE hFile; hFile = CRB_fn_vOpenPtrTable (szFilename , ulNbBloc); // For stats // fn_vBeginLogPointersInfosForGlobalPointers( szType ); g_ulNbBadPtr=0; for(i=0;iulSize == 0 ) continue; p_b0=(unsigned long *)g_p_stPtrMemory0[i]->cMemory; p_b1=(unsigned long *)g_p_stPtrMemory1[i]->cMemory; for(j=0;j<((g_p_stPtrMemory0[i]->ulSize)>>2);j++) { if(p_b0[j]!=p_b1[j]) { ucDestBloc=CRB_fn_bDestinationBloc(p_b0[j]); // fn_vLogAddPointer( i, ucDestBloc ); if(ucDestBloc!=(unsigned char)-1) { // Add store of the address of this ptr and the aim bloc. g_ulBlocPtrTable[g_ulNbPtr]=p_b0[j]; g_ucBlocPtrDestTable[g_ulNbPtr]=ucDestBloc; g_ulNbPtr++; } else { // for debug only // g_ulBlocPtrTable[g_ulNbPtr]=g_p_stMemory0[i]->ulBeginBloc+(j<<2); // g_ucBlocPtrDestTable[g_ulNbPtr]=0; // g_ulNbPtr++; // end debug g_ulNbBadPtr++; if(g_ucAvoidAllEntries==0) { if(br!=2) printf("\nWarning - A GlobalPointer (%8ld:%8lx/%8lx) point out of Blocs !",j,p_b0[j],p_b1[j]); if((j%24==0)&&(br==0)) { char c; printf("\nStop On Next Bad Pointer (Y/N/Skip all) :"); c=getch(); c=toupper(c); if(c=='N') br=1; if(c=='S') br=2; } } } } } // fn_vLogPointersInfosForOneBlock( i ); CRB_fn_vSavePtrTable (i , hFile); } // fn_vEndLogPointersInfos(); CRB_fn_vClosePtrTable (hFile); } // Build and save relocation table for sound pointers. // Sound datas require a special function because they contain // some data that are not pointers but change at each load. void CRB_fn_vBuildPointerTableForSndPtr(unsigned long ulNbBloc,char *szFilename, char *szType) { unsigned long i,j; char *p_b0,*p_b1; unsigned char ucDestBloc,ucNotPossible; HANDLE hFile; hFile = CRB_fn_vOpenPtrTable (szFilename , ulNbBloc); // For stats // fn_vBeginLogPointersInfosForGlobalPointers( szType ); ucNotPossible=1; g_ulNbBadPtr=0; for(i=0;iulSize == 0 ) continue; g_ulNbPtr=0; p_b0=(unsigned char *)g_p_stPtrMemory0[i]->cMemory; p_b1=(unsigned char *)g_p_stPtrMemory1[i]->cMemory; for(j=4;julSize;j=j+8) { //lDiff=(*(unsigned long *)(p_b1+j))-(*(unsigned long*)(p_b0+j)); ucDestBloc=CRB_fn_bDestinationBloc(*((unsigned long *)(p_b0+j))); // fn_vLogAddPointer( i, ucDestBloc ); if(ucDestBloc!=(unsigned char)-1) { // Add store of the address of this ptr and the aim bloc. g_ulBlocPtrTable[g_ulNbPtr]=*(unsigned long *)(p_b0+j); g_ucBlocPtrDestTable[g_ulNbPtr]=ucDestBloc; g_ulNbPtr++; } else { g_ulNbBadPtr++; printf("\nWarning - A SoundPointer (%ld) point out of Blocs !",(j-4)>>3); } } // fn_vLogPointersInfosForOneBlock( i ); CRB_fn_vSavePtrTable (i , hFile); } /// fn_vEndLogPointersInfos(); CRB_fn_vClosePtrTable (hFile); } // Build correspondance table for bloc number in the 2 SNA files. void CRB_fn_vTestBlocTable(unsigned long ulNbBloc) { unsigned long i,OK; OK=1; for(i=0;iulBeginBloc - g_p_stMemory0[i]->ulBeginBloc) == 0 ) { printf("\nFATAL ERROR - Module %d Bloc %d has not moved ! \n Relocation files may be incorrect",g_p_stMemory0[i]->ulModuleNumber,g_p_stMemory0[i]->ulBlocNumber); OK=0; } } if(OK==0) { getchar(); exit(3); } } int main(int argc, char *argv[]) { char szFilename0[255],szFilename1[255]; char *p_cl; unsigned char ucFix; unsigned long ulNbBloc; // getch(); g_ucAvoidAllEntries=0; g_bGlideMode=1; if(argv[2]) { strcpy(szFilename0,argv[2]); p_cl=strstr(szFilename0,"-"); if( toupper(*(p_cl+1))=='S' ) g_ucAvoidAllEntries=1; if (toupper(*(p_cl+1))=='D' ) g_bGlideMode=0; } if(argv[3]) { strcpy(szFilename0,argv[3]); p_cl=strstr(szFilename0,"-"); if( toupper(*(p_cl+1))=='S' ) g_ucAvoidAllEntries=1; if (toupper(*(p_cl+1))=='D' ) g_bGlideMode=0; } CRB_InitArray(); if( strcmp(_strupr(argv[1]),"FIX") == 0 ) { // Read blocks from the fix ulNbBloc=CRB_fn_bReadAllMemoryBlocks( "Fix0.sna", g_p_stMemory0, C_CRB_NEW ); g_ulNbBloc=CRB_fn_bReadAllMemoryBlocks( "Fix1.sna", g_p_stMemory1, C_CRB_NEW ); ucFix = 1; } else { // Read blocs of the level if we compute relocation for level. // Those block also contains reloc infos about blocks in the fix. strcpy(szFilename0,argv[1]); strcat(szFilename0,"0.sna"); ulNbBloc=CRB_fn_bReadAllMemoryBlocks(szFilename0,g_p_stMemory0,C_CRB_ADD); strcpy(szFilename1,argv[1]); strcat(szFilename1,"1.sna"); g_ulNbBloc=CRB_fn_bReadAllMemoryBlocks(szFilename1,g_p_stMemory1,C_CRB_ADD); ucFix = 0; } if(g_ulNbBloc!=ulNbBloc) { printf("\nERROR - Incompatible SNA Files, Number of Bloc is Different !"); getchar(); exit(4); } // Build correspondance table and write pointer table to disc. CRB_fn_vTestBlocTable(ulNbBloc); strcpy(szFilename0,argv[1]); strcat(szFilename0,".rtb"); if(ucFix==1) CRB_fn_vBuildPointerTableForFix(ulNbBloc,szFilename0); else CRB_fn_vBuildPointerTableForLevel(ulNbBloc,szFilename0); // Relocation table for global pointers strcpy(szFilename0,argv[1]); strcat(szFilename0,"0.gpt"); ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename0,g_p_stPtrMemory0, "Global"); strcpy(szFilename1,argv[1]); strcat(szFilename1,"1.gpt"); ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename1,g_p_stPtrMemory1, "Global"); strcpy(szFilename0,argv[1]); strcat(szFilename0,".rtp"); CRB_fn_vBuildPointerTableForPtr(ulNbBloc,szFilename0, "Global"); // Relocation table for Texture pointers strcpy(szFilename0,argv[1]); strcat(szFilename0,"0.ptx"); ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename0 ,g_p_stPtrMemory0, "Texture"); strcpy(szFilename0,argv[1]); strcat(szFilename0,"1.ptx"); ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename0 ,g_p_stPtrMemory1, "Texture"); strcpy(szFilename0,argv[1]); strcat(szFilename0,".rtt"); CRB_fn_vBuildPointerTableForPtr(ulNbBloc,szFilename0, "Texture"); // Relocation table for sound pointers strcpy(szFilename0,argv[1]); strcat(szFilename0,"0.snd"); ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename0,g_p_stPtrMemory0, "Sound" ); strcpy(szFilename1,argv[1]); strcat(szFilename1,"1.snd"); ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename1,g_p_stPtrMemory1, "Sound" ); strcpy(szFilename0,argv[1]); strcat(szFilename0,".rts"); CRB_fn_vBuildPointerTableForSndPtr(ulNbBloc,szFilename0, "Sound" ); // Relocation table for vignette pointers if( ucFix==0 ) { strcpy(szFilename0,argv[1]); strcat(szFilename0,"0.vgm"); ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename0,g_p_stPtrMemory0, "Vignette" ); strcpy(szFilename1,argv[1]); strcat(szFilename1,"1.vgm"); ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename1,g_p_stPtrMemory1, "Vignette" ); if( ulNbBloc > 0 ) { strcpy(szFilename0,argv[1]); strcat(szFilename0,".rtv"); CRB_fn_vBuildPointerTableForPtr(ulNbBloc,szFilename0, "Vignette" ); } } // MR0912 if(ucFix!=0) { strcpy(szFilename0,argv[1]); strcat(szFilename0,"0.lsy"); ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename0,g_p_stPtrMemory0, "LipsSync" ); strcpy(szFilename1,argv[1]); strcat(szFilename1,"1.lsy"); ulNbBloc=CRB_fn_bReadPtrBlocks(szFilename1,g_p_stPtrMemory1, "LipsSync" ); if( ulNbBloc > 0 ) { strcpy(szFilename0,argv[1]); strcat(szFilename0,".rtl"); CRB_fn_vBuildPointerTableForPtr(ulNbBloc,szFilename0, "LipsSync" ); } } printf("\n\nConversion Completed OK !!! \n"); // getch(); /* if(g_ucAvoidAllEntries==0) getch(); */ return 0; }