reman3/Rayman_X/cpa/tempgrp/GAM/PlayAnim/Interpol/a3x_mem.c

465 lines
18 KiB
C

/* ***********************************************************************************/
/* * "a3x_mem.c" **/
/* * Written by : Sébastien Rubens **/
/* * Tabulations : 4 char **/
/* ***********************************************************************************/
#define A3X_MEM_C
/* ***********************************************************************************/
/* Included files*/
#include <stdlib.h>
#include "PlayAnim/Interpol/specif/a3x_pref.h"
/*#define LST2_StaticIsOptimised*/
#include "TOOLSCPA.h"
#include "cpa_std.h"
#include "STRUCTUR/Anim_s.h"
#include "STRUCTUR/ErrGame.h"
#include "PlayAnim/Interpol/a3x_glob.h"
#include "PlayAnim/Interpol/a3x_cach.h"
#include "PlayAnim/Interpol/a3x_int.h"
#include "PlayAnim/Interpol/a3x_mem.h"
#include "zemem.h"
#ifndef U64
#include "SNA\snaglob.h"
#endif
#ifndef RETAIL
#include "STRUCTUR/GameScpt.h"
#endif
/* ***********************************************************************************/
/* Defines*/
/*#ifndef A3X_CacheIsUsed*/
/*#ifndef U64
#define MaxInTabA3dGENERAL 1500
#define MaxInTabVertexes 60000
#define MaxInTabQuaternions 60000
#define MaxInTabHierarchies 5000
#define MaxInTabNTTO 10000
#define MaxInTabOnlyFrames 30000
#define MaxInTabChannels 30000
#define MaxInTabFrames 40000
#define MaxInTabFramesKF 140000
#define MaxInTabKeyFrames 65500
#define MaxInTabEvents 5000
#define MaxInTabMorphData 30000
#define MaxInTabCuttedAnim 3000
#define MaxInTabHandleElement3d 1000
#else*/
#ifdef U64
#define MaxInTabA3dGENERAL 1500
#define MaxInTabVertexes 30000
#define MaxInTabQuaternions 20000
#define MaxInTabHierarchies 5000
#define MaxInTabNTTO 10000
#define MaxInTabOnlyFrames 15000
#define MaxInTabChannels 10000
#define MaxInTabFrames 33000
#define MaxInTabFramesKF 80000
#define MaxInTabKeyFrames 30000
#define MaxInTabEvents 5000
#define MaxInTabMorphData 5000
#define MaxInTabCuttedAnim 3000
#define MaxInTabHandleElement3d 1000
#endif /*U64*/
/*#else
#define MaxInTabA3dGENERAL 1
#define MaxInTabVertexes 1
#define MaxInTabQuaternions 1
#define MaxInTabHierarchies 1
#define MaxInTabNTTO 1
#define MaxInTabOnlyFrames 1
#define MaxInTabChannels 1
#define MaxInTabFrames 1
#define MaxInTabFramesKF 1
#define MaxInTabKeyFrames 1
#define MaxInTabEvents 1
#define MaxInTabMorphData 1
#define MaxInTabCuttedAnim 1
#define MaxInTabHandleElement3d 1
// Output cache
#define uwMaxInTabFrame3d 100
#define uwMaxInTabElement3d 1000
#endif */
/* ***********************************************************************************/
/* Globals datas*/
tdstStackInfos tdstStacks[eStackNbMax]=
{
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 }
};
#ifdef A3X_StaticTables
tdstA3dGENERAL ax_stA3dGENERAL [MaxInTabA3dGENERAL];
tdxVector3 axa3_xVectors [MaxInTabVertexes];
tdxSShortQuater4 axa4_xQuaternions [MaxInTabQuaternions];
tdstHierarchy ax_stHierarchies [MaxInTabHierarchies];
tdstNTTO ax_stNTTO [MaxInTabNTTO];
tdstOnlyFrame ax_stOnlyFrames [MaxInTabOnlyFrames];
tdstChannel ax_stChannels [MaxInTabChannels];
tdstFrame ax_stFrames [MaxInTabFrames];
tdstFrameKF ax_stFramesKF [MaxInTabFramesKF];
tdstKeyFrame ax_stKeyFrames [MaxInTabKeyFrames];
tdstEvent ax_stEvents [MaxInTabEvents];
tdstMorphData ax_stMorphData [MaxInTabMorphData];
tdstCuttedAnim ax_stCuttedAnim [MaxInTabCuttedAnim];
#endif
tdstA3dGENERAL *p_stA3dGENERAL;
tdxVector3 *p_a3_xVectors;
tdxSShortQuater4 *p_a4_xQuaternions;
tdstHierarchy *p_stHierarchies;
tdstNTTO *p_stNTTO;
tdstOnlyFrame *p_stOnlyFrames;
tdstChannel *p_stChannels;
tdstFrame *p_stFrames;
tdstFrameKF *p_stFramesKF;
tdstKeyFrame *p_stKeyFrames;
tdstEvent *p_stEvents;
tdstMorphData *p_stMorphData; /*AR9803*/
tdstCuttedAnim *p_stCuttedAnim;
/* ***********************************************************************************/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 07/06/99 */
unsigned long fn_ul_GetStackAlloc( unsigned short _uwNumStack )
{
return (tdstStacks[_uwNumStack].ulPosAlloc);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 07/06/99 */
/* ***********************************************************************************/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
unsigned long fn_ul_GetStackPos( unsigned short _uwNumStack )
{
return (tdstStacks[_uwNumStack].ulStackPos);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/* ***********************************************************************************/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_v_AllocateOnStack( unsigned short _uwNumStack,
unsigned short _uwWantedSize )
{
#ifndef A3X_CacheIsUsed /*AR9807*/
if ((tdstStacks[_uwNumStack].ulStackPos+_uwWantedSize)>tdstStacks[_uwNumStack].ulMaxPos) {
char szMessage[50];
sprintf(szMessage,"Stack %d exceed maximum elements(%d), change it in Game.dsc",_uwNumStack,tdstStacks[_uwNumStack].ulMaxPos);
Erm_M_UpdateLastError( Game, C_ucErmDefaultChannel, E_uwGameErrorWhileLoadingAnimation,
C_lErmNoDebugData,C_ucErmOpenInfoWindow, C_ucAllowStopForDebug,szMessage);
}
#endif
tdstStacks[_uwNumStack].ulStackPos+= _uwWantedSize;
tdstStacks[_uwNumStack].ulPosAlloc= tdstStacks[_uwNumStack].ulStackPos - _uwWantedSize;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/* ***********************************************************************************/
unsigned long fn_ul_AllocateOnStack( unsigned short _uwNumStack,
unsigned short _uwWantedSize )
{
#ifndef A3X_CacheIsUsed /*AR9807*/
#ifndef U64
if ((tdstStacks[_uwNumStack].ulStackPos+_uwWantedSize)>tdstStacks[_uwNumStack].ulMaxPos) {
char szMessage[50];
sprintf(szMessage,"Stack %d exceed maximum elements(%d), change it in Game.dsc",_uwNumStack,tdstStacks[_uwNumStack].ulMaxPos);
Erm_M_UpdateLastError( Game, C_ucErmDefaultChannel, E_uwGameErrorWhileLoadingAnimation,
C_lErmNoDebugData,C_ucErmOpenInfoWindow, C_ucAllowStopForDebug,szMessage);
}
#else
if((tdstStacks[_uwNumStack].ulStackPos+_uwWantedSize)>=tdstStacks[_uwNumStack].ulMaxPos)
osSyncPrintf("No enough place in stack %d (%d)\n",_uwNumStack,_uwWantedSize);
#endif
#endif
tdstStacks[_uwNumStack].ulStackPos+= _uwWantedSize;
tdstStacks[_uwNumStack].ulPosAlloc= tdstStacks[_uwNumStack].ulStackPos - _uwWantedSize;
return tdstStacks[_uwNumStack].ulPosAlloc;
}
/* ***********************************************************************************/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_v_DeAllocateOnStack( unsigned short _uwNumStack,
unsigned short _uwSize )
{
tdstStacks[_uwNumStack].ulStackPos-= _uwSize;
assert(tdstStacks[_uwNumStack].ulStackPos >= 0);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/* ************************************************** fn_v_UnclearPreviousLoadedAnims*/
/* Allow to keep the N First Anims when clear*/
/* Must be call after loading the N anims*/
/* 03/07/98 Carlos Torres*/
/* ***********************************************************************************/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_v_UnclearPreviousLoadedAnims( void ) {
unsigned short uwCnt;
for ( uwCnt=0 ; uwCnt<eStackNbMax ; uwCnt++ )
tdstStacks[uwCnt].ulResetPos=tdstStacks[uwCnt].ulStackPos;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/* ************************************************************ fn_v_ClearLoadedAnims*/
/* Clear Loaded Anims depending on parameter ucClearAll*/
/* False : Until the position set by fn_v_UnclearPreviousLoadedAnims*/
/* True : ALL anims*/
/* 03/07/98 Carlos Torres*/
/* ***********************************************************************************/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_v_ClearLoadedAnims(unsigned char ucClearAll) {
unsigned short uwCnt;
for ( uwCnt=0 ; uwCnt<eStackNbMax ; uwCnt++ ) {
if (ucClearAll)
tdstStacks[uwCnt].ulResetPos=0;
M_v_ResetOneStack(uwCnt);
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/* **************************************************************** fn_v_InitInterpol*/
/* Make allocation and init structure for anim management*/
/* Must be called only once*/
/**/
/* 03/07/98 Carlos Torres*/
/* 17/07/98 : Erase table of Frame and table of Element3d*/
/* ***********************************************************************************/
void fn_v_InitInterpol( void )
{
#ifdef U64
#ifndef FORCE_REAL_TIME_LOAD
fn_vInitROMLoad(); /* To initialise the animation loading system*/
#endif
#endif /*U64*/
#ifndef FORCE_REAL_TIME_LOAD
if(!g_bRealTimeAnimationLoad)
{
#ifdef A3X_StaticTables
p_stA3dGENERAL= ax_stA3dGENERAL;
p_a3_xVectors= axa3_xVectors;
p_a4_xQuaternions= axa4_xQuaternions;
p_stHierarchies= ax_stHierarchies;
p_stNTTO= ax_stNTTO;
p_stOnlyFrames= ax_stOnlyFrames;
p_stChannels= ax_stChannels;
p_stFrames= ax_stFrames;
p_stFramesKF= ax_stFramesKF;
p_stKeyFrames= ax_stKeyFrames;
p_stEvents= ax_stEvents;
p_stMorphData= ax_stMorphData;
p_stCuttedAnim= ax_stCuttedAnim;
#else
#ifndef A3X_N64
if (SNA_fn_ucGetLoadType()!=SNA_LOAD_SNAPSHOT)
#endif
{
unsigned char ucOldACPModeMalloc;
ucOldACPModeMalloc = GEO_M_ucGetMemMallocMode();
GEO_xSelectMemoryChannel(ACP_FixMemoryChannel);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeA3dGENERAL , 0 );
#ifndef U64
/* check if all stack size is set*/
{
unsigned short uwCnt;
for ( uwCnt=0 ; uwCnt<eStackNbMax ; uwCnt++ ) {
if (!tdstStacks[uwCnt].ulMaxPos) {
char szMessage[50];
sprintf(szMessage,"To Load Animation All stacks must be sized, correct Game.dsc for stack %d",uwCnt);
Erm_M_UpdateLastError( Game, C_ucErmDefaultChannel, E_uwGameErrorWhileLoadingAnimation,
C_lErmNoDebugData,C_ucErmOpenInfoWindow, C_ucAllowStopForDebug,szMessage);
}
}
}
GEO_M_CPAMalloc(p_stA3dGENERAL, tdstA3dGENERAL * , tdstStacks[eStackA3dGENERAL].ulMaxPos * sizeof(tdstA3dGENERAL) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeVectors , 0 );
GEO_M_CPAMalloc(p_a3_xVectors, tdxVector3 * , tdstStacks[eStackVertexes].ulMaxPos * sizeof(tdxVector3) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeQuaternions , 0 );
GEO_M_CPAMalloc(p_a4_xQuaternions, tdxSShortQuater4 * , tdstStacks[eStackQuaternions].ulMaxPos * sizeof(tdxSShortQuater4) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeHierarchies , 0 );
GEO_M_CPAMalloc(p_stHierarchies, tdstHierarchy * , tdstStacks[eStackHierarchies].ulMaxPos * sizeof(tdstHierarchy) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeNTTO , 0 );
GEO_M_CPAMalloc(p_stNTTO, tdstNTTO * , tdstStacks[eStackNTTO].ulMaxPos * sizeof(tdstNTTO) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeOnlyFrames , 0 );
GEO_M_CPAMalloc(p_stOnlyFrames, tdstOnlyFrame * , tdstStacks[eStackOnlyFrames].ulMaxPos * sizeof(tdstOnlyFrame) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeChannels , 0 );
GEO_M_CPAMalloc(p_stChannels, tdstChannel * , tdstStacks[eStackChannels].ulMaxPos * sizeof(tdstChannel) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeFrames , 0 );
GEO_M_CPAMalloc(p_stFrames, tdstFrame * , tdstStacks[eStackFrames].ulMaxPos * sizeof(tdstFrame) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeFramesKF , 0 );
GEO_M_CPAMalloc(p_stFramesKF, tdstFrameKF * , tdstStacks[eStackFramesKF].ulMaxPos * sizeof(tdstFrameKF) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeKeyFrames , 0 );
GEO_M_CPAMalloc(p_stKeyFrames, tdstKeyFrame * , tdstStacks[eStackKeyFrames].ulMaxPos * sizeof(tdstKeyFrame) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeEvents , 0 );
GEO_M_CPAMalloc(p_stEvents, tdstEvent * , tdstStacks[eStackEvents].ulMaxPos * sizeof(tdstEvent) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeMorphData , 0 );
GEO_M_CPAMalloc(p_stMorphData, tdstMorphData * , tdstStacks[eStackMorphData].ulMaxPos * sizeof(tdstMorphData) , E_uwGEONotEnoughtMemory);
#else /* U64 */
GEO_M_CPAMalloc(p_stA3dGENERAL, tdstA3dGENERAL * , MaxInTabA3dGENERAL * sizeof(tdstA3dGENERAL) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeVectors , 0 );
GEO_M_CPAMalloc(p_a3_xVectors, tdxVector3 * , MaxInTabVertexes * sizeof(tdxVector3) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeQuaternions , 0 );
GEO_M_CPAMalloc(p_a4_xQuaternions, tdxSShortQuater4 * , MaxInTabQuaternions * sizeof(tdxSShortQuater4) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeHierarchies , 0 );
GEO_M_CPAMalloc(p_stHierarchies, tdstHierarchy * , MaxInTabHierarchies * sizeof(tdstHierarchy) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeNTTO , 0 );
GEO_M_CPAMalloc(p_stNTTO, tdstNTTO * , MaxInTabNTTO * sizeof(tdstNTTO) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeOnlyFrames , 0 );
GEO_M_CPAMalloc(p_stOnlyFrames, tdstOnlyFrame * , MaxInTabOnlyFrames * sizeof(tdstOnlyFrame) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeChannels , 0 );
GEO_M_CPAMalloc(p_stChannels, tdstChannel * , MaxInTabChannels * sizeof(tdstChannel) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeFrames , 0 );
GEO_M_CPAMalloc(p_stFrames, tdstFrame * , MaxInTabFrames * sizeof(tdstFrame) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeFramesKF , 0 );
GEO_M_CPAMalloc(p_stFramesKF, tdstFrameKF * , MaxInTabFramesKF * sizeof(tdstFrameKF) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeKeyFrames , 0 );
GEO_M_CPAMalloc(p_stKeyFrames, tdstKeyFrame * , MaxInTabKeyFrames * sizeof(tdstKeyFrame) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeEvents , 0 );
GEO_M_CPAMalloc(p_stEvents, tdstEvent * , MaxInTabEvents * sizeof(tdstEvent) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeMorphData , 0 );
GEO_M_CPAMalloc(p_stMorphData, tdstMorphData * , MaxInTabMorphData * sizeof(tdstMorphData) , E_uwGEONotEnoughtMemory);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeInterpol , MMG_C_lSubTypeSpeedCuttedAnim, 0 );
GEO_M_CPAMalloc(p_stCuttedAnim, tdstCuttedAnim * , MaxInTabCuttedAnim * sizeof(tdstCuttedAnim) , E_uwGEONotEnoughtMemory);
#endif /* U64 */
GEO_xSelectMemoryChannel(ucOldACPModeMalloc);
}
#endif /*A3X_StaticTables*/
}
#endif
#ifdef U64
#ifndef FORCE_REAL_TIME_LOAD
else
#endif
fn_v_InitCache();
#endif
fn_v_InitSinTab();
}
/* ***************************************************************** fn_vSetStackSize*/
/* Set the stack size */
/* Must be called only once for all stack to configure it*/
/**/
/* 27/10/98 Carlos Torres*/
/* ***********************************************************************************/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vSetStackSize(unsigned short uwNumStack,unsigned long ulSize) {
/* change only if is not previously set*/
if (!tdstStacks[uwNumStack].ulMaxPos)
tdstStacks[uwNumStack].ulMaxPos = ulSize;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
#if !defined(RETAIL) && !defined(U64)
/* ***************************************************************** fn_vAnimStackLog*/
/* Make a log of Memory used for each stack in an open file*/
/**/
/* 11/12/98 Carlos Torres*/
/* ***********************************************************************************/
void fn_vAnimStackLog(FILE * fLogFile) {
unsigned short uwCnt;
unsigned long ulMemFix=0,ulMemGlob=0;
struct {
char szName[16];
unsigned long ulSize;
} stStackData[eStackNbMax] = {
C_Entry_A3dGeneral,sizeof(tdstA3dGENERAL),
C_Entry_Vertexes,sizeof(tdxVector3),
C_Entry_Quaternions,sizeof(tdxSShortQuater4),
C_Entry_Hierarchies,sizeof(tdstHierarchy),
C_Entry_NTTO,sizeof(tdstNTTO),
C_Entry_OnlyFrames,sizeof(tdstOnlyFrame),
C_Entry_Channels,sizeof(tdstChannel),
C_Entry_Frames,sizeof(tdstFrame),
C_Entry_FramesKF,sizeof(tdstFrameKF),
C_Entry_KeyFrames,sizeof(tdstKeyFrame),
C_Entry_Events,sizeof(tdstEvent),
C_Entry_MorphData,sizeof(tdstMorphData)
};
if (!fLogFile)
return;
fprintf (fLogFile,"\tStack Name\tFix Nb: FixMem \tLvl Nb: Lvl Mem \tTot Nb( Max. ): Tot Mem \n");
/* log for each stack*/
for (uwCnt=0 ; uwCnt<eStackNbMax ; uwCnt++) {
fprintf (fLogFile,"\t%10s\t%6d:%8do\t%6d:%8do\t%6d(%6d):%8do\n",
stStackData[uwCnt].szName,
tdstStacks[uwCnt].ulResetPos,tdstStacks[uwCnt].ulResetPos*stStackData[uwCnt].ulSize,
tdstStacks[uwCnt].ulStackPos-tdstStacks[uwCnt].ulResetPos,
(tdstStacks[uwCnt].ulStackPos-tdstStacks[uwCnt].ulResetPos)*stStackData[uwCnt].ulSize,
tdstStacks[uwCnt].ulStackPos,
tdstStacks[uwCnt].ulMaxPos,
tdstStacks[uwCnt].ulStackPos*stStackData[uwCnt].ulSize);
ulMemFix += tdstStacks[uwCnt].ulResetPos*stStackData[uwCnt].ulSize;
ulMemGlob += tdstStacks[uwCnt].ulStackPos*stStackData[uwCnt].ulSize;
}
/* Total*/
fprintf(fLogFile,"\t---------------------------------------------------------------------------------\n");
fprintf (fLogFile,"\tTotal \t %8do\t %8do\t %8do\n\n",
ulMemFix,ulMemGlob-ulMemFix,ulMemGlob);
}
#endif /* RETAIL */
/* ***********************************************************************************/
#undef A3X_MEM_C