362 lines
12 KiB
C
362 lines
12 KiB
C
#include "SaiCPA.h"
|
|
#include "MmgSai.h"
|
|
#include "ErmSai.h"
|
|
#include "Sai_Enum.h"
|
|
#include "Sai_Pub.h"
|
|
#include "Sai_str.h"
|
|
#include "Sai_Priv.h"
|
|
|
|
/**************************************************************************/
|
|
SAI_tdxHandleToListEntry SAI_fn_hCreateAListEntry(void)
|
|
{
|
|
SAI_tdxHandleToListEntry hListEntry;
|
|
|
|
MMG_fn_vAddMemoryInfo( MMG_C_lTypeSAI , MMG_C_lSubTypeSAI , 0 );
|
|
M_SAIAlloc(hListEntry,SAI_tdxHandleToListEntry,sizeof(struct SAI_tdstListEntry_));
|
|
if (hListEntry==NULL)
|
|
M_SAIFatalError(E_uwSAI_CreateAListEntry);
|
|
memset(hListEntry,0,sizeof(struct SAI_tdstListEntry_));
|
|
|
|
hListEntry->ucMemoryLevel = SAI_g_ucMemoryBlockUsed;
|
|
|
|
return(hListEntry);
|
|
}
|
|
/**************************************************************************/
|
|
void SAI_fn_vIsolateAllListEntryByMemoryLevel(struct SAI_tdstInternalStructure_ *p_stInternalStructure,unsigned char ucMemoryLevel)
|
|
{
|
|
SAI_tdstListEntry * p_stPreviousListEntry = NULL;
|
|
SAI_tdstListEntry * p_stListEntry = p_stInternalStructure -> p_stFirstEntry;
|
|
|
|
while (p_stListEntry)
|
|
{
|
|
if (p_stListEntry -> ucMemoryLevel == ucMemoryLevel)
|
|
{
|
|
/* Remove the entry*/
|
|
if (p_stPreviousListEntry) p_stPreviousListEntry -> p_stNextEntry = p_stListEntry -> p_stNextEntry;
|
|
else p_stInternalStructure -> p_stFirstEntry = p_stListEntry -> p_stNextEntry;
|
|
|
|
if( p_stListEntry -> p_stNextEntry == NULL )
|
|
p_stInternalStructure->p_stLastEntry = p_stPreviousListEntry;
|
|
|
|
#ifdef _DEBUG
|
|
/* GuS*/
|
|
p_stInternalStructure->ulNumberOfEntries--;
|
|
#endif
|
|
|
|
}
|
|
else p_stPreviousListEntry = p_stListEntry;
|
|
|
|
|
|
p_stListEntry = p_stListEntry -> p_stNextEntry;
|
|
}
|
|
|
|
Mmg_M_FreeBlock( SAI, ucMemoryLevel );
|
|
}
|
|
/**************************************************************************/
|
|
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
|
void SAI_fn_vDeleteAListEntry(SAI_tdxHandleToListEntry hListEntry)
|
|
{
|
|
/*M_SAIFree(hListEntry);*/
|
|
}
|
|
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
|
|
|
/**************************************************************************/
|
|
SAI_tdeFlags SAI_fn_eVerifyFlags(SAI_tdeFlags eFlags)
|
|
{
|
|
/**** Empty the type flags ****/
|
|
eFlags&=C_UserFlags;
|
|
|
|
if ( (eFlags&SAI_ePlayerSaveTableValue&&eFlags&SAI_ePlayerSaveCurrentValue)
|
|
||(eFlags&SAI_eLevelSaveTableValue&&eFlags&SAI_eLevelSaveCurrentValue)
|
|
)
|
|
{
|
|
M_SAIFatalError(E_uwSAI_SaveTableAndCurrentValue);
|
|
}
|
|
|
|
if (eFlags&SAI_ePlayerSaveTableValue||eFlags&SAI_ePlayerSaveCurrentValue)
|
|
/**** DFM ****/
|
|
eFlags|=SAI_eInitWhenPlayerGameSavedLoaded;
|
|
|
|
if (eFlags&SAI_eLevelSaveTableValue||eFlags&SAI_eLevelSaveCurrentValue)
|
|
/**** DFM ****/
|
|
eFlags|=SAI_eInitWhenLevelGameSavedLoaded;
|
|
|
|
if (eFlags&SAI_ePlayerSaveCurrentValue||eFlags&SAI_eLevelSaveCurrentValue)
|
|
{
|
|
if (eFlags&(SAI_eInitWhenMapLoaded|SAI_eInitWhenReinitTheMap|SAI_eInitWhenPlayerDead))
|
|
M_SAIWarningError(E_uwSAI_SaveCurrentAndInitOther);
|
|
}
|
|
|
|
return(eFlags);
|
|
}
|
|
/**************************************************************************/
|
|
SAI_tdxHandleToListEntry fn_hSearchAnElementInList(struct SAI_tdstInternalStructure_ *p_stInternalStructure,void *p_vData,SAI_tdeFlags eUserFlags)
|
|
{
|
|
SAI_tdxHandleToListEntry hListEntry = p_stInternalStructure -> p_stFirstEntry;;
|
|
|
|
while (hListEntry)
|
|
{
|
|
if (hListEntry->p_vDataPointer==p_vData&&(hListEntry->eFlags&C_UserFlags)==eUserFlags)
|
|
return(hListEntry);
|
|
|
|
hListEntry = hListEntry -> p_stNextEntry;
|
|
}
|
|
|
|
return(NULL);
|
|
}
|
|
/**************************************************************************/
|
|
unsigned char SAI_fn_bFreeAnElementFromList(struct SAI_tdstInternalStructure_ *p_stInternalStructure,void *p_stData,SAI_tdeFlags eUserFlags)
|
|
{
|
|
SAI_tdstListEntry * p_stPreviousListEntry = NULL;
|
|
SAI_tdstListEntry * p_stListEntry = p_stInternalStructure -> p_stFirstEntry;
|
|
unsigned char bFound = FALSE;
|
|
|
|
eUserFlags = SAI_fn_eVerifyFlags(eUserFlags);
|
|
|
|
while (p_stListEntry)
|
|
{
|
|
if (p_stListEntry -> p_vDataPointer == p_stData && (p_stListEntry -> eFlags & C_UserFlags) == eUserFlags)
|
|
{
|
|
bFound = TRUE;
|
|
break;
|
|
}
|
|
|
|
p_stPreviousListEntry = p_stListEntry;
|
|
p_stListEntry = p_stListEntry -> p_stNextEntry;
|
|
}
|
|
|
|
if (bFound)
|
|
{
|
|
/* If there is a data, free the data*/
|
|
/* not used since block without free
|
|
if ((p_stListEntry -> eFlags & C_TypesFlags) == SAI_eTypeXX)
|
|
{
|
|
M_SAIFree (p_stListEntry -> uData . stArrayData . p_ucPointer);
|
|
}
|
|
*/
|
|
/* Remove the entry from the list*/
|
|
if (p_stPreviousListEntry) p_stPreviousListEntry -> p_stNextEntry = p_stListEntry -> p_stNextEntry;
|
|
else p_stInternalStructure -> p_stFirstEntry = p_stListEntry -> p_stNextEntry;
|
|
|
|
|
|
if( p_stListEntry -> p_stNextEntry == NULL )
|
|
p_stInternalStructure->p_stLastEntry = p_stPreviousListEntry;
|
|
|
|
#ifdef _DEBUG
|
|
/* GuS*/
|
|
p_stInternalStructure->ulNumberOfEntries--;
|
|
#endif
|
|
|
|
/* Free the entry*/
|
|
/*SAI_fn_vDeleteAListEntry (p_stListEntry);*/
|
|
}
|
|
|
|
return bFound;
|
|
}
|
|
/**************************************************************************/
|
|
unsigned char SAI_fn_bInsertAnElementInList(struct SAI_tdstInternalStructure_ *p_stInternalStructure,void *p_stData,unsigned long ulSizeOfData,SAI_tdeFlags eTypeOfData,SAI_tdeFlags eUserFlags)
|
|
{
|
|
unsigned char bReturn = SAI_TRUE;
|
|
SAI_tdxHandleToListEntry hListEntry;
|
|
unsigned short uwBlocId;
|
|
void *p_vBeginBloc;
|
|
|
|
eUserFlags=SAI_fn_eVerifyFlags(eUserFlags);
|
|
if ((hListEntry=fn_hSearchAnElementInList(p_stInternalStructure,p_stData,eUserFlags))==NULL)
|
|
{
|
|
hListEntry = SAI_fn_hCreateAListEntry();
|
|
|
|
/* GuS 17/10/98 : Bool entries are created at the end of the list.*/
|
|
/* With this method, all bool entries will be grouped at the end of the list */
|
|
/* (=> game save is easier)*/
|
|
|
|
#ifndef U64 /* Oliv' - 07/07/1999 */
|
|
if( eTypeOfData == SAI_eType1 )
|
|
{
|
|
hListEntry -> p_stNextEntry = NULL;
|
|
if( p_stInternalStructure->p_stLastEntry )
|
|
p_stInternalStructure->p_stLastEntry->p_stNextEntry = hListEntry;
|
|
else
|
|
p_stInternalStructure -> p_stFirstEntry = hListEntry;
|
|
p_stInternalStructure->p_stLastEntry = hListEntry;
|
|
}
|
|
else
|
|
#endif /* U64 */
|
|
{
|
|
/* Insert the element at the head of the list*/
|
|
hListEntry -> p_stNextEntry = p_stInternalStructure -> p_stFirstEntry;
|
|
p_stInternalStructure -> p_stFirstEntry = hListEntry;
|
|
if( ! p_stInternalStructure -> p_stLastEntry )
|
|
p_stInternalStructure -> p_stLastEntry = hListEntry;
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
p_stInternalStructure->ulNumberOfEntries++;
|
|
#endif
|
|
|
|
}
|
|
|
|
hListEntry->p_vDataPointer = p_stData;
|
|
|
|
switch(eTypeOfData)
|
|
{
|
|
/* Oliv', then GuS*/
|
|
#ifndef U64 /* Oliv' - 07/07/1999 */
|
|
case SAI_eType1:
|
|
hListEntry->eFlags = (SAI_tdeFlags) (eUserFlags|SAI_eType1);
|
|
hListEntry->uData.stBooleanData.ucBitPosition = SAI_fn_ucComputeBitPosition( (unsigned char)ulSizeOfData );
|
|
/* Save masked value*/
|
|
hListEntry->uData.stBooleanData.ucCharData = (unsigned char)(*(unsigned char*)p_stData & (unsigned char)ulSizeOfData);
|
|
break;
|
|
#endif /* U64 */
|
|
/* EndOfOliv', then GuS*/
|
|
case SAI_eType8:
|
|
hListEntry->eFlags = (SAI_tdeFlags) (eUserFlags|SAI_eType8);
|
|
hListEntry->uData.ucCharData = *(unsigned char*)p_stData;
|
|
break;
|
|
case SAI_eType16:
|
|
hListEntry->eFlags = (SAI_tdeFlags) (eUserFlags|SAI_eType16);
|
|
hListEntry->uData.uwShortData = *(unsigned short*)p_stData;
|
|
break;
|
|
case SAI_eType32:
|
|
hListEntry->eFlags = (SAI_tdeFlags) (eUserFlags|SAI_eType32);
|
|
hListEntry->uData.ulLongData = *(unsigned long*)p_stData;
|
|
break;
|
|
case SAI_eType64:
|
|
hListEntry->eFlags = (SAI_tdeFlags) (eUserFlags|SAI_eType64);
|
|
hListEntry->uData.i64Long64Data = *(tdLong64*)p_stData;
|
|
break;
|
|
case SAI_eTypePointer:
|
|
hListEntry->eFlags = (SAI_tdeFlags) (eUserFlags|SAI_eTypePointer);
|
|
if (*(void**)p_stData!=NULL)
|
|
{
|
|
Mmg_fn_vWhereIs (*(void**)p_stData,&uwBlocId,&p_vBeginBloc);
|
|
hListEntry->uData.stPointerData.uwBlocAndModuleID = uwBlocId;
|
|
if (uwBlocId==0xffff)
|
|
hListEntry->uData.stPointerData.p_vPointer = (void*)*(long *)p_stData;
|
|
else
|
|
hListEntry->uData.stPointerData.p_vPointer = (void*)((*(long*)p_stData)-(long)p_vBeginBloc);
|
|
}
|
|
else
|
|
{
|
|
hListEntry->uData.stPointerData.uwBlocAndModuleID = 0xffff;
|
|
hListEntry->uData.stPointerData.p_vPointer = NULL;
|
|
}
|
|
break;
|
|
case SAI_eTypeXX:
|
|
hListEntry->eFlags = (SAI_tdeFlags) (eUserFlags|SAI_eTypeXX);
|
|
if (hListEntry->uData.stArrayData.p_ucPointer==NULL)
|
|
{
|
|
MMG_fn_vAddMemoryInfo( MMG_C_lTypeSAI , MMG_C_lSubTypeSAI , 0 );
|
|
M_SAIAlloc(hListEntry->uData.stArrayData.p_ucPointer,unsigned char*,ulSizeOfData);
|
|
if (hListEntry->uData.stArrayData.p_ucPointer==NULL)
|
|
{
|
|
M_SAIFatalError(E_uwSAI_CreateAListEntry);
|
|
}
|
|
hListEntry->uData.stArrayData.ulArraySize = ulSizeOfData;
|
|
}
|
|
if (hListEntry->uData.stArrayData.ulArraySize==ulSizeOfData)
|
|
memcpy(hListEntry->uData.stArrayData.p_ucPointer,(char *)p_stData,ulSizeOfData);
|
|
else
|
|
M_SAIFatalError(E_uwSAI_ArrayCantChangeSize);
|
|
break;
|
|
default:
|
|
/* ANNECY AV {*/
|
|
/*LST2_M_StaticIsolate(hListEntry);*/
|
|
/*SAI_fn_vDeleteAListEntry(hListEntry);*/
|
|
/* END ANNECY AV }*/
|
|
bReturn = SAI_FALSE;
|
|
break;
|
|
}
|
|
|
|
return(bReturn);
|
|
}
|
|
/**************************************************************************/
|
|
unsigned char SAI_fn_bRestoreAnElementFromList(SAI_tdxHandleToListEntry hListEntry)
|
|
{
|
|
unsigned char bReturn = SAI_TRUE;
|
|
void *p_vBeginBloc;
|
|
|
|
switch(hListEntry->eFlags&C_TypesFlags)
|
|
{
|
|
#ifndef U64 /* Oliv' - 07/07/1999 */
|
|
case SAI_eType1:
|
|
*(char*)hListEntry->p_vDataPointer &= ~(hListEntry->uData.stBooleanData.ucCharData);
|
|
*(char*)hListEntry->p_vDataPointer |= hListEntry->uData.stBooleanData.ucCharData;
|
|
break;
|
|
#endif /* U64 */
|
|
case SAI_eType8:
|
|
*(char*)hListEntry->p_vDataPointer = hListEntry->uData.ucCharData;
|
|
//osSyncPrintf( "Restoring %02x from 0x%x to 0x%x\n", hListEntry->uData.ucCharData, &hListEntry->uData.ucCharData, hListEntry->p_vDataPointer );
|
|
break;
|
|
case SAI_eType16:
|
|
*(short*)hListEntry->p_vDataPointer = hListEntry->uData.uwShortData;
|
|
break;
|
|
case SAI_eType32:
|
|
*(long*)hListEntry->p_vDataPointer = hListEntry->uData.ulLongData;
|
|
break;
|
|
case SAI_eType64:
|
|
*(tdLong64*)hListEntry->p_vDataPointer = hListEntry->uData.i64Long64Data;
|
|
break;
|
|
case SAI_eTypePointer:
|
|
if (hListEntry->uData.stPointerData.uwBlocAndModuleID==0xffff)
|
|
*(void**)hListEntry->p_vDataPointer = hListEntry->uData.stPointerData.p_vPointer;
|
|
else
|
|
{
|
|
p_vBeginBloc = Mmg_fn_p_vGiveTheBeginingAddress(hListEntry->uData.stPointerData.uwBlocAndModuleID);
|
|
*(void**)hListEntry->p_vDataPointer = (void *)((long)p_vBeginBloc+(long)hListEntry->uData.stPointerData.p_vPointer);
|
|
}
|
|
break;
|
|
case SAI_eTypeXX:
|
|
memcpy((char *)hListEntry->p_vDataPointer,hListEntry->uData.stArrayData.p_ucPointer,hListEntry->uData.stArrayData.ulArraySize);
|
|
break;
|
|
default:
|
|
bReturn = SAI_FALSE;
|
|
break;
|
|
}
|
|
|
|
return(bReturn);
|
|
}
|
|
/**************************************************************************/
|
|
unsigned char SAI_fn_bInitAllTableWhen(struct SAI_tdstInternalStructure_ *p_stInternalStructure,SAI_tdeFlags eUserFlags)
|
|
{
|
|
SAI_tdxHandleToListEntry hListEntry = p_stInternalStructure -> p_stFirstEntry;
|
|
|
|
while (hListEntry)
|
|
{
|
|
if ((hListEntry->eFlags&eUserFlags)==eUserFlags)
|
|
SAI_fn_bRestoreAnElementFromList(hListEntry);
|
|
hListEntry = hListEntry -> p_stNextEntry;
|
|
}
|
|
|
|
return SAI_TRUE;
|
|
}
|
|
/**************************************************************************/
|
|
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
|
|
unsigned char SAI_fn_bInitOneTableElementWhen(struct SAI_tdstInternalStructure_ *p_stInternalStructure,void *_p_vValue,SAI_tdeFlags eUserFlags)
|
|
{
|
|
unsigned char bReturn = SAI_FALSE;
|
|
SAI_tdxHandleToListEntry hListEntry = NULL;
|
|
|
|
if ((hListEntry=fn_hSearchAnElementInList(p_stInternalStructure,_p_vValue,eUserFlags))!=NULL)
|
|
{
|
|
bReturn = SAI_TRUE;
|
|
SAI_fn_bRestoreAnElementFromList(hListEntry);
|
|
}
|
|
|
|
return(bReturn);
|
|
}
|
|
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
|
|
/* GuS : return the position of the first bit set to 1 in _ucMask (the lowest bit set).*/
|
|
/* The return value is between 0 and 7 if a bit is set, or > 7 if no bit is set in _ucMask*/
|
|
unsigned char SAI_fn_ucComputeBitPosition( unsigned char _ucMask )
|
|
{
|
|
unsigned char i;
|
|
for( i = 0; i < 8; i++ )
|
|
{
|
|
if( _ucMask & 0x01 ) return i;
|
|
_ucMask >>= 1;
|
|
}
|
|
return 10;
|
|
}
|