On Friday 03 August 2007 09:06:44 am Fabian Greffrath wrote:
> Dear ROTTers,
>
> last weekend I finally found the time to implement what Darren Salt (and
> several 64bit-porting documentations the web) suggested and replaced all
> unsinged and signed long variables in the ROTT source code with the
> corresponfing (u)int32_t variables. Please find the dpatch at:
>
> http://www.geocities.com/fab666_2000/10-32bitisms.dpatch.zip
>
> You need to copy it into the rott-1.0/debian/patches directory and
> append '10-32bitisms' to the debian/patches/00list file.
>
> Please rebuild rott on AMD64 and try if it works for you. Please check
> especially if sound and writing/loading of savegames work.
> If it happens to be still buggy I highly appreciate further help!!!
I tried that, it gave the following error:
=====================================
[EMAIL PROTECTED]:~/rott-1.0/rott$ ./rott
Rise of the Triad Startup Version 1.4
Shareware Version
Z_INIT: 8950000 bytes
IN_Startup: Mouse Present
Adding /usr/share/games/rott/HUNTBGIN.WAD.
Adding /usr/share/games/rott/REMOTE1.RTS.
W_Wad: Wad Manager Started NUMLUMPS=2103
RT_DRAW: Tables Initialized
MU_Startup: No SoundBlaster cards available.
SD_SetupFXCard: No SoundBlaster cards available.
SD_Startup: No SoundBlaster cards available.
RT_MAIN: Fonts Initialized
RT_MSG: Message System Started
W_ReadLump: only read -1 of 8192 on lump 545 Episode = 0
Area = 1
=====================================
After some pleasant tinkering with GDB (didn't use that for ages) and fixing
various things I managed to make it start a game; the graphics and gameplay
at the beginning seem normal. Sound works, but music is just a loud humming.
Loading a game produces segfault.
I've got other things to do for the time being, so I don't plan to see into
these issues any time soon. Hope somebody else will do that :)
By the way, GCC just screams about these issues in it's warnings, like
===============================================
rt_actor.c: In function ‘FindAddresses’:
rt_actor.c:1004: warning: cast from pointer to integer of different size
rt_actor.c:1012: warning: cast from pointer to integer of different size
===============================================
Probably fixing all these warnings in the first place will solve the issues.
The patch is attached. I wonder what is the scheme of working on packages in
Debian is --- surely it's something more advanced than cp/diff I used?
> Thanks for testing!
No problem, thank you for your support.
Regards,
--
-- Dmitry Rutsky
diff -u rott-1.0/rott/modexlib.c rott/modexlib.c
--- rott-1.0/rott/modexlib.c 2007-08-03 14:55:20.000000000 +0400
+++ rott/modexlib.c 2007-08-03 16:37:01.000000000 +0400
@@ -46,12 +46,12 @@
int linewidth;
int ylookup[MAXSCREENHEIGHT];
-int page1start;
-int page2start;
-int page3start;
+intptr_t page1start;
+intptr_t page2start;
+intptr_t page3start;
int screensize;
-unsigned bufferofs;
-unsigned displayofs;
+intptr_t bufferofs;
+intptr_t displayofs;
boolean graphicsmode=false;
#ifdef DOS
@@ -517,13 +517,13 @@
screensize=MAXSCREENHEIGHT*MAXSCREENWIDTH;
#ifdef FULLSCREENHACK // [!New!
- page1start=(int)backbuf;
- page2start=(int)backbuf;
- page3start=(int)backbuf;
+ page1start=(intptr_t)backbuf;
+ page2start=(intptr_t)backbuf;
+ page3start=(intptr_t)backbuf;
#else // !New!]
- page1start=(int)sdl_surface->pixels;
- page2start=(int)sdl_surface->pixels;
- page3start=(int)sdl_surface->pixels;
+ page1start=sdl_surface->pixels;
+ page2start=sdl_surface->pixels;
+ page3start=sdl_surface->pixels;
#endif // !New!
displayofs = page1start;
bufferofs = page2start;
@@ -627,7 +627,7 @@
=================
*/
-void VL_ClearBuffer (unsigned buf, byte color)
+void VL_ClearBuffer (intptr_t buf, byte color)
{
#ifdef DOS
VGAMAPMASK(15);
diff -u rott-1.0/rott/modexlib.h rott/modexlib.h
--- rott-1.0/rott/modexlib.h 2003-01-01 12:23:50.000000000 +0300
+++ rott/modexlib.h 2007-08-03 16:37:14.000000000 +0400
@@ -104,19 +104,19 @@
extern int ylookup[MAXSCREENHEIGHT]; // Table of row offsets
extern int linewidth;
-extern int page1start;
-extern int page2start;
-extern int page3start;
+extern intptr_t page1start;
+extern intptr_t page2start;
+extern intptr_t page3start;
extern int screensize;
-extern unsigned bufferofs;
-extern unsigned displayofs;
+extern intptr_t bufferofs;
+extern intptr_t displayofs;
extern boolean graphicsmode;
void GraphicsMode ( void );
void SetTextMode ( void );
void VL_SetVGAPlaneMode ( void );
-void VL_ClearBuffer (unsigned buf, byte color);
+void VL_ClearBuffer (intptr_t buf, byte color);
void VL_ClearVideo (byte color);
void VL_DePlaneVGA (void);
void VL_CopyDisplayToHidden ( void );
Binary files rott-1.0/rott/rott and rott/rott differ
diff -u rott-1.0/rott/rt_game.c rott/rt_game.c
--- rott-1.0/rott/rt_game.c 2007-08-03 14:55:20.000000000 +0400
+++ rott/rt_game.c 2007-08-03 17:28:26.000000000 +0400
@@ -998,7 +998,10 @@
void DrawGameString (int x, int y, char * str, boolean bufferofsonly)
{
- unsigned tempbuf;
+ intptr_t tempbuf;
+
+ if (str == NULL)
+ return;
px=x;
py=y;
@@ -2254,7 +2257,7 @@
void DrawPause (void)
{
pic_t *p;
- int bufftemp = bufferofs;
+ intptr_t bufftemp = bufferofs;
bufferofs -= screenofs;
diff -u rott-1.0/rott/rt_main.c rott/rt_main.c
--- rott-1.0/rott/rt_main.c 2007-08-03 14:55:20.000000000 +0400
+++ rott/rt_main.c 2007-08-03 16:31:39.000000000 +0400
@@ -979,7 +979,7 @@
while ((!LastScan) && (!IN_GetMouseButtons()))
{
int i;
- unsigned tempbuf;
+ intptr_t tempbuf;
MenuFadeOut();
ClearGraphicsScreen();
SetPalette(&dimpal[0]);
diff -u rott-1.0/rott/rt_ted.c rott/rt_ted.c
--- rott-1.0/rott/rt_ted.c 2007-08-03 14:55:20.000000000 +0400
+++ rott/rt_ted.c 2007-08-03 17:06:00.000000000 +0400
@@ -1143,7 +1143,7 @@
int lastmem=0;
int lastcache=0;
int ticdelay;
- unsigned tempbuf;
+ intptr_t tempbuf;
if (CachingStarted==false)
{
diff -u rott-1.0/rott/rt_vid.c rott/rt_vid.c
--- rott-1.0/rott/rt_vid.c 2002-12-24 10:29:52.000000000 +0300
+++ rott/rt_vid.c 2007-08-03 16:54:53.000000000 +0400
@@ -968,7 +968,7 @@
void SwitchPalette (byte * newpal, int steps)
{
- int temp;
+ intptr_t temp;
VL_FadeOut(0,255,0,0,0,steps>>1);
Only in rott: rt_vid.c.v2
diff -u rott-1.0/rott/rt_view.c rott/rt_view.c
--- rott-1.0/rott/rt_view.c 2007-08-03 14:55:20.000000000 +0400
+++ rott/rt_view.c 2007-08-03 16:04:24.000000000 +0400
@@ -447,7 +447,7 @@
lump = W_GetNumForName("colormap");
length = W_LumpLength (lump) + 255;
colormap = SafeMalloc (length);
- colormap = (byte *)( ((int)colormap + 255)&~0xff);
+ colormap = (byte *)( ((uintptr_t)colormap + 255)&~0xff);
W_ReadLump (lump,colormap);
// Fix fire colors in colormap
@@ -461,7 +461,7 @@
lump = W_GetNumForName("specmaps");
length = W_LumpLength (lump+1) + 255;
redmap = SafeMalloc (length);
- redmap = (byte *)( ((int)redmap + 255)&~0xff);
+ redmap = (byte *)( ((uintptr_t)redmap + 255)&~0xff);
W_ReadLump (lump+1,redmap);
greenmap = redmap+(16*256);
@@ -474,7 +474,7 @@
{
length = W_LumpLength (lump+i) + 255;
playermaps[i] = SafeMalloc (length);
- playermaps[i] = (byte *)( ((int)playermaps[i] + 255)&~0xff);
+ playermaps[i] = (byte *)( ((uintptr_t)playermaps[i] + 255)&~0xff);
W_ReadLump (lump+i,playermaps[i]);
}
}
diff -u rott-1.0/rott/w_wad.c rott/w_wad.c
--- rott-1.0/rott/w_wad.c 2007-08-03 14:55:20.000000000 +0400
+++ rott/w_wad.c 2007-08-03 16:01:22.000000000 +0400
@@ -304,8 +304,8 @@
name8[8] = 0; // in case the name was a fill 8 chars
strupr (name8); // case insensitive
- v1 = *(int *)name8;
- v2 = *(int *)&name8[4];
+ v1 = *(int32_t *)name8;
+ v2 = *(int32_t *)&name8[4];
// scan backwards so patch lump files take precedence
@@ -315,7 +315,7 @@
while (lump_p != endlump)
{
- if ( *(int *)lump_p->name == v1 && *(int *)&lump_p->name[4] == v2)
+ if ( *(int32_t *)lump_p->name == v1 && *(int *)&lump_p->name[4] == v2)
return lump_p - lumpinfo;
lump_p++;
}
diff -u rott-1.0/rott/_w_wad.h rott/_w_wad.h
--- rott-1.0/rott/_w_wad.h 2002-12-24 08:16:23.000000000 +0300
+++ rott/_w_wad.h 2007-08-03 15:45:45.000000000 +0400
@@ -53,23 +53,23 @@
typedef struct
{
char name[8];
- int handle,position,size;
- int byteswapped;
+ int32_t handle,position,size;
+ int32_t byteswapped;
} lumpinfo_t;
typedef struct
{
char identification[4]; // should be IWAD
- int numlumps;
- int infotableofs;
+ int32_t numlumps;
+ int32_t infotableofs;
} wadinfo_t;
typedef struct
{
- int filepos;
- int size;
+ int32_t filepos;
+ int32_t size;
char name[8];
} filelump_t;