[Scummvm-cvs-logs] CVS: scummvm/bs2 interpreter.cpp,1.6,1.7 interpreter.h,1.5,1.6 logic.cpp,1.5,1.6 protocol.cpp,1.5,1.6
Max Horn
fingolfin at users.sourceforge.net
Sat Sep 6 20:20:03 CEST 2003
Update of /cvsroot/scummvm/scummvm/bs2
In directory sc8-pr-cvs1:/tmp/cvs-serv14143
Modified Files:
interpreter.cpp interpreter.h logic.cpp protocol.cpp
Log Message:
more endian fixes
Index: interpreter.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/interpreter.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- interpreter.cpp 7 Sep 2003 01:51:15 -0000 1.6
+++ interpreter.cpp 7 Sep 2003 03:18:26 -0000 1.7
@@ -330,10 +330,10 @@
// FIXME: 'scriptData' and 'variables' used to be const. However,
// this code writes into 'variables' so it can not be const.
char *variables = scriptData + sizeof(int);
- const char *code = scriptData + (int)READ_LE_UINT32(scriptData) + sizeof(int);
- uint32 noScripts = (int)READ_LE_UINT32(code);
+ const char *code = scriptData + (int32)READ_LE_UINT32(scriptData) + sizeof(int);
+ uint32 noScripts = (int32)READ_LE_UINT32(code);
if ( (*offset) < noScripts)
- { ip = (int)READ_LE_UINT32((const int *)code + (*offset) + 1);
+ { ip = (int32)READ_LE_UINT32((const int *)code + (*offset) + 1);
DEBUG2("Start script %d with offset %d",*offset,ip);
}
else
@@ -354,7 +354,7 @@
const int *checksumBlock = (const int *)code;
code += sizeof(int) * 3;
- if ((int)READ_LE_UINT32(checksumBlock) != 12345678)
+ if ((int32)READ_LE_UINT32(checksumBlock) != 12345678)
{
#ifdef INSIDE_LINC
AfxMessageBox(CVString("Invalid script in object %s",header->name));
@@ -363,11 +363,11 @@
#endif
return(0);
}
- int codeLen = (int)READ_LE_UINT32(checksumBlock + 1);
+ int codeLen = (int32)READ_LE_UINT32(checksumBlock + 1);
int checksum = 0;
for (int count = 0 ; count < codeLen ; count++)
checksum += (unsigned char)code[count];
- if ( checksum != (int)READ_LE_UINT32(checksumBlock + 2) )
+ if ( checksum != (int32)READ_LE_UINT32(checksumBlock + 2) )
{
#ifdef INSIDE_LINC
AfxMessageBox(CVString("Checksum error in script %s",header->name));
@@ -396,8 +396,8 @@
case CP_PUSH_LOCAL_VAR32: // 1 Push the contents of a local variable
Read16ip(parameter)
- DEBUG2("Push local var %d (%d)",parameter,*((int *)(variables+parameter)));
- PUSHONSTACK ( *((int *)(variables+parameter)) );
+ DEBUG2("Push local var %d (%d)",parameter,(int32)READ_LE_UINT32(variables+parameter));
+ PUSHONSTACK ( (int32)READ_LE_UINT32(variables+parameter) );
break;
@@ -417,7 +417,7 @@
Read16ip(parameter)
POPOFFSTACK ( value );
DEBUG2("Pop %d into var %d",value,parameter);
- *((int *)(variables+parameter)) = value;
+ *((int *)(variables+parameter)) = TO_LE_32(value);
break;
case CP_CALL_MCODE: // 4 Call an mcode routine
@@ -499,10 +499,10 @@
int foundCase = 0;
for (int count = 0 ; (count < caseCount) && (!foundCase) ; count++)
{
- if (value == *((const int32 *)(code+ip)))
+ if (value == (int32)READ_LE_UINT32(code+ip))
{ // We have found the case, so lets jump to it
foundCase = 1;
- ip += *((const int32 *)(code+ip+sizeof(int32)));
+ ip += (int32)READ_LE_UINT32(code+ip+sizeof(int32));
}
else
ip += sizeof(int32) * 2;
@@ -510,7 +510,7 @@
// If we found no matching case then use the default
if (!foundCase)
{
- ip += *((const int32 *)(code+ip));
+ ip += (int32)READ_LE_UINT32(code+ip);
}
}
break;
@@ -518,15 +518,15 @@
case CP_ADDNPOP_LOCAL_VAR32: // 10
Read16ip(parameter)
POPOFFSTACK ( value );
- *((int *)(variables+parameter)) += value;
- DEBUG3("+= %d into var %d->%d",value,parameter,*((int *)(variables+parameter)));
+ *((int *)(variables+parameter)) = TO_LE_32((int32)READ_LE_UINT32(variables+parameter) + value);
+ DEBUG3("+= %d into var %d->%d",value,parameter,(int32)READ_LE_UINT32(variables+parameter));
break;
case CP_SUBNPOP_LOCAL_VAR32: // 11
Read16ip(parameter)
POPOFFSTACK ( value );
- *((int *)(variables+parameter)) -= value;
- DEBUG3("-= %d into var %d->%d",value,parameter,*((int *)(variables+parameter)));
+ *((int *)(variables+parameter)) = TO_LE_32((int32)READ_LE_UINT32(variables+parameter) - value);
+ DEBUG3("-= %d into var %d->%d",value,parameter,(int32)READ_LE_UINT32(variables+parameter));
break;
case CP_SKIPONTRUE: // 12 Skip if the value on the stack is TRUE
@@ -574,7 +574,7 @@
VS_COL_GREY);
#else
globalInterpreterVariables2[parameter] += value;
- DEBUG3("+= %d into global var %d->%d",value,parameter,*((int *)(variables+parameter)));
+ DEBUG3("+= %d into global var %d->%d",value,parameter,(int32)READ_LE_UINT32(variables+parameter));
#endif
break;
}
@@ -593,7 +593,7 @@
VS_COL_GREY);
#else
globalInterpreterVariables2[parameter] -= value;
- DEBUG3("-= %d into global var %d->%d",value,parameter,*((int *)(variables+parameter)));
+ DEBUG3("-= %d into global var %d->%d",value,parameter,(int32)READ_LE_UINT32(variables+parameter));
#endif
break;
}
@@ -696,10 +696,10 @@
#ifdef INSIDE_LINC
TRACE("ip %d: Parameter %d skip %d\r\n", ip,
parameterReturnedFromMcodeFunction,
- ((const int32 *)(code+ip))[parameterReturnedFromMcodeFunction] );
+ (int32)READ_LE_UINT32(code + ip + parameterReturnedFromMcodeFunction * 4) );
#endif
- ip += ((const int32 *)(code+ip))[parameterReturnedFromMcodeFunction];
+ ip += (int32)READ_LE_UINT32(code + ip + parameterReturnedFromMcodeFunction * 4);
}
break;
@@ -723,7 +723,7 @@
case CP_RESTART_SCRIPT: // 32
{ // Start the script again
// Do a ip search to find the script we are running
- const char *tempScrPtr = scriptData + *((int *)scriptData) + sizeof(int);
+ const char *tempScrPtr = scriptData + (int32)READ_LE_UINT32(scriptData) + sizeof(int);
int scriptNumber = 0;
int foundScript = 0;
uint32 count = 0;
Index: interpreter.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/interpreter.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- interpreter.h 30 Jul 2003 19:25:28 -0000 1.5
+++ interpreter.h 7 Sep 2003 03:18:26 -0000 1.6
@@ -61,9 +61,9 @@
// Get parameter fix so that the playstation version can handle words not on word boundaries
-#define Read16ip(var) {var = *((const int16 *)(code+ip));ip+=sizeof(int16);}
-#define Read32ip(var) {var = *((const int32 *)(code+ip));ip+=sizeof(int32);}
-#define Read32ipLeaveip(var) {var = *((const int32 *)(code+ip));}
+#define Read16ip(var) {var = (int16)READ_LE_UINT16(code+ip);ip+=sizeof(int16);}
+#define Read32ip(var) {var = (int32)READ_LE_UINT32(code+ip);ip+=sizeof(int32);}
+#define Read32ipLeaveip(var) {var = (int32)READ_LE_UINT32(code+ip);}
void SetGlobalInterpreterVariables(int32 *vars);
Index: logic.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/logic.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- logic.cpp 19 Aug 2003 14:57:26 -0000 1.5
+++ logic.cpp 7 Sep 2003 03:18:26 -0000 1.6
@@ -81,7 +81,7 @@
Con_fatal_error("Logic_engine %d not a run_list", run_list);
game_object_list = (uint32 *) (head+1);
- ID = game_object_list[pc++]; //read the next id
+ ID = FROM_LE_32(game_object_list[pc++]); //read the next id
id=ID;
res_man.Res_close(run_list); //release the list again so it can float in memory - at this point not one thing should be locked
Index: protocol.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/protocol.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- protocol.cpp 7 Sep 2003 01:51:15 -0000 1.5
+++ protocol.cpp 7 Sep 2003 03:18:26 -0000 1.6
@@ -40,7 +40,7 @@
_multiScreenHeader *mscreenHeader = (_multiScreenHeader *) (screenFile + sizeof(_standardHeader));
- palette = (uint8 *)mscreenHeader + mscreenHeader->palette;
+ palette = (uint8 *)mscreenHeader + FROM_LE_32(mscreenHeader->palette);
palette[0] = 0; // always set colour 0 to black
palette[1] = 0; // because most background screen palettes have a bright colour 0
@@ -57,7 +57,7 @@
{
_multiScreenHeader *mscreenHeader = (_multiScreenHeader *) (screenFile + sizeof(_standardHeader));
- return (uint8 *) mscreenHeader + mscreenHeader->paletteTable;
+ return (uint8 *) mscreenHeader + FROM_LE_32(mscreenHeader->paletteTable);
}
//-----------------------------------------------------------------------------------------------------------------------
@@ -67,9 +67,15 @@
{
// Get the table
_multiScreenHeader *mscreenHeader = (_multiScreenHeader *) (screenFile + sizeof(_standardHeader));
+ _screenHeader *screenHeader = (_screenHeader*) ((uint8 *) mscreenHeader + FROM_LE_32(mscreenHeader->screen));
- return (_screenHeader*) ((uint8 *) mscreenHeader + mscreenHeader->screen);
+#if defined(SCUMM_BIG_ENDIAN)
+ screenHeader->width = SWAP_BYTES_16(screenHeader->width);
+ screenHeader->height = SWAP_BYTES_16(screenHeader->height);
+ screenHeader->noLayers = SWAP_BYTES_16(screenHeader->noLayers);
+#endif
+ return screenHeader;
}
//-----------------------------------------------------------------------------------------------------------------------
// returns a pointer to the requested layer header, given the pointer to the start of the screen file
@@ -77,19 +83,27 @@
// assumes it has been passed a pointer to a valid screen file
_layerHeader *FetchLayerHeader(uint8 *screenFile, uint16 layerNo) //Chris 04Oct96
{
- _screenHeader *screenHead;
-
-
- screenHead = FetchScreenHeader(screenFile);
-
#ifdef _SWORD2_DEBUG
+ _screenHeader *screenHead = FetchScreenHeader(screenFile);
+
if (layerNo > (screenHead->noLayers-1)) // layer number too large!
Con_fatal_error("FetchLayerHeader(%d) invalid layer number! (%s line %u)",layerNo,__FILE__,__LINE__);
#endif
_multiScreenHeader *mscreenHeader = (_multiScreenHeader *) (screenFile + sizeof(_standardHeader));
- return (_layerHeader *) ((uint8 *) mscreenHeader + mscreenHeader->layers + (layerNo * sizeof(_layerHeader)));
+ _layerHeader *layerHeader = (_layerHeader *) ((uint8 *) mscreenHeader + FROM_LE_32(mscreenHeader->layers) + (layerNo * sizeof(_layerHeader)));
+
+#if defined(SCUMM_BIG_ENDIAN)
+ layerHeader->x = SWAP_BYTES_16(layerHeader->x);
+ layerHeader->y = SWAP_BYTES_16(layerHeader->y);
+ layerHeader->width = SWAP_BYTES_16(layerHeader->width);
+ layerHeader->height = SWAP_BYTES_16(layerHeader->height);
+ layerHeader->maskSize = SWAP_BYTES_32(layerHeader->maskSize);
+ layerHeader->offset = SWAP_BYTES_32(layerHeader->offset);
+#endif
+
+ return layerHeader;
}
//---------------------------------------------------------------
@@ -100,7 +114,7 @@
{
_multiScreenHeader *mscreenHeader = (_multiScreenHeader *) (screenFile + sizeof(_standardHeader));
- return (uint8 *) mscreenHeader + mscreenHeader->maskOffset;
+ return (uint8 *) mscreenHeader + FROM_LE_32(mscreenHeader->maskOffset);
}
//-----------------------------------------------------------------------------------------------------------------------
@@ -109,7 +123,19 @@
_animHeader *FetchAnimHeader(uint8 *animFile) // (25sep96JEL)
{
- return (_animHeader *) (animFile + sizeof(_standardHeader));
+ _animHeader *animHead;
+ animHead = (_animHeader *) (animFile + sizeof(_standardHeader));
+
+#if defined(SCUMM_BIG_ENDIAN)
+ animHead->noAnimFrames = SWAP_BYTES_16(animHead->noAnimFrames);
+ animHead->feetStartX = SWAP_BYTES_16(animHead->feetStartX);
+ animHead->feetStartY = SWAP_BYTES_16(animHead->feetStartY);
+ animHead->feetEndX = SWAP_BYTES_16(animHead->feetEndX);
+ animHead->feetEndY = SWAP_BYTES_16(animHead->feetEndY);
+ animHead->blend = SWAP_BYTES_16(animHead->blend);
+#endif
+
+ return animHead;
}
//---------------------------------------------------------------
@@ -128,8 +154,18 @@
Con_fatal_error("FetchCdtEntry(animFile,%d) - anim only %d frames (%s line %u)",frameNo,animHead->noAnimFrames,__FILE__,__LINE__);
#endif
- return (_cdtEntry *) ( (uint8 *)animHead + sizeof(_animHeader) + frameNo * sizeof(_cdtEntry) );
+ _cdtEntry *cdtEntry;
+ cdtEntry = (_cdtEntry *) ( (uint8 *)animHead + sizeof(_animHeader) + frameNo * sizeof(_cdtEntry) );
+
+#if defined(SCUMM_BIG_ENDIAN)
+ cdtEntry->x = (int16)SWAP_BYTES_16(cdtEntry->x);
+ cdtEntry->y = (int16)SWAP_BYTES_16(cdtEntry->y);
+ cdtEntry->frameOffset = SWAP_BYTES_32(cdtEntry->frameOffset);
+#endif
+
+ return cdtEntry;
}
+
//---------------------------------------------------------------
// returns a pointer to the requested frame number's header, given the pointer to the start of the anim file
// drops out if the requested frame number exceeds the number of frames in this anim
@@ -138,7 +174,15 @@
_frameHeader *FetchFrameHeader(uint8 *animFile, uint16 frameNo) // James 31oct96
{
// required address = (address of the start of the anim header) + frameOffset
- return (_frameHeader *) (animFile + sizeof(_standardHeader) + (FetchCdtEntry(animFile,frameNo)->frameOffset) );
+ _frameHeader *frameHeader = (_frameHeader *) (animFile + sizeof(_standardHeader) + (FetchCdtEntry(animFile,frameNo)->frameOffset) );
+
+#if defined(SCUMM_BIG_ENDIAN)
+ frameHeader->compSize = SWAP_BYTES_32(frameHeader->compSize);
+ frameHeader->width = SWAP_BYTES_16(frameHeader->width);
+ frameHeader->height = SWAP_BYTES_16(frameHeader->height);
+#endif
+
+ return frameHeader;
}
//---------------------------------------------------------------
// Returns a pointer to the requested parallax layer data.
@@ -148,11 +192,18 @@
_multiScreenHeader *mscreenHeader = (_multiScreenHeader *) (screenFile + sizeof(_standardHeader));
#ifdef _SWORD2_DEBUG
- if (mscreenHeader->bg_parallax[layer] == 0)
+ if (FROM_LE_32(mscreenHeader->bg_parallax[layer]) == 0)
Con_fatal_error("FetchBackgroundParallaxLayer(%d) - No parallax layer exists (%s line %u)",layer,__FILE__,__LINE__);
#endif
- return (_parallax *) ((uint8 *) mscreenHeader + mscreenHeader->bg_parallax[layer]);
+ _parallax *parallax = (_parallax *) ((uint8 *) mscreenHeader + FROM_LE_32(mscreenHeader->bg_parallax[layer]));
+
+#if defined(SCUMM_BIG_ENDIAN)
+ parallax->w = SWAP_BYTES_16(parallax->w);
+ parallax->h = SWAP_BYTES_16(parallax->h);
+#endif
+
+ return parallax;
}
//---------------------------------------------------------------
_parallax *FetchBackgroundLayer(uint8 *screenFile) // Chris 04Oct96
@@ -160,11 +211,18 @@
_multiScreenHeader *mscreenHeader = (_multiScreenHeader *) (screenFile + sizeof(_standardHeader));
#ifdef _SWORD2_DEBUG
- if (mscreenHeader->screen == 0)
+ if (FROM_LE_32(mscreenHeader->screen) == 0)
Con_fatal_error("FetchBackgroundLayer (%d) - No background layer exists (%s line %u)",__FILE__,__LINE__);
#endif
- return (_parallax *) ((uint8 *) mscreenHeader + mscreenHeader->screen + sizeof(_screenHeader));
+ _parallax *parallax = (_parallax *) ((uint8 *) mscreenHeader + FROM_LE_32(mscreenHeader->screen) + sizeof(_screenHeader));
+
+#if defined(SCUMM_BIG_ENDIAN)
+ parallax->w = SWAP_BYTES_16(parallax->w);
+ parallax->h = SWAP_BYTES_16(parallax->h);
+#endif
+
+ return parallax;
}
//---------------------------------------------------------------
_parallax *FetchForegroundParallaxLayer(uint8 *screenFile, int layer) // Chris 04Oct96
@@ -172,11 +230,18 @@
_multiScreenHeader *mscreenHeader = (_multiScreenHeader *) (screenFile + sizeof(_standardHeader));
#ifdef _SWORD2_DEBUG
- if (mscreenHeader->fg_parallax[layer] == 0)
+ if (FROM_LE_32(mscreenHeader->fg_parallax[layer]) == 0)
Con_fatal_error("FetchForegroundParallaxLayer(%d) - No parallax layer exists (%s line %u)",layer,__FILE__,__LINE__);
#endif
- return (_parallax *) ((uint8 *) mscreenHeader + mscreenHeader->fg_parallax[layer]);
+ _parallax *parallax = (_parallax *) ((uint8 *) mscreenHeader + FROM_LE_32(mscreenHeader->fg_parallax[layer]));
+
+#if defined(SCUMM_BIG_ENDIAN)
+ parallax->w = SWAP_BYTES_16(parallax->w);
+ parallax->h = SWAP_BYTES_16(parallax->h);
+#endif
+
+ return parallax;
}
//---------------------------------------------------------------
uint8 errorLine[128];
@@ -191,16 +256,16 @@
_textHeader *text_header = (_textHeader *) (file + sizeof(_standardHeader));
- if (text_line>=text_header->noOfLines) // (James08aug97)
+ if (text_line>=FROM_LE_32(text_header->noOfLines)) // (James08aug97)
{
fileHeader = (_standardHeader*)file;
- sprintf ((char*)errorLine, "xxMissing line %d of %s (only 0..%d)", text_line, fileHeader->name, text_header->noOfLines-1);
+ sprintf ((char*)errorLine, "xxMissing line %d of %s (only 0..%d)", text_line, fileHeader->name, FROM_LE_32(text_header->noOfLines)-1);
errorLine[0]=0; // first 2 chars are NULL so that actor-number comes out as '0'
errorLine[1]=0;
return(errorLine);
// GOT RID OF CON_FATAL_ERROR HERE BECAUSE WE DON'T WANT IT TO CRASH OUT ANY MORE!
-// Con_fatal_error("FetchTextLine cannot get %d, only 0..%d avail (%s line %u)", text_line, text_header->noOfLines-1,__FILE__,__LINE__);
+// Con_fatal_error("FetchTextLine cannot get %d, only 0..%d avail (%s line %u)", text_line, FROM_LE_32(text_header->noOfLines)-1,__FILE__,__LINE__);
}
@@ -214,7 +279,7 @@
{
_textHeader *text_header = (_textHeader *) (file + sizeof(_standardHeader));
- if (text_line>=text_header->noOfLines)
+ if (text_line>=FROM_LE_32(text_header->noOfLines))
return(0); // out of range => invalid
else
return(1); // valid
More information about the Scummvm-git-logs
mailing list