RE: dosbox breaks with MIPSpro, works with gcc
I got the same 'mount' command behaviour with my MIPSPro built binaries and the fact that dosbox runs fine from a gcc build and not a MIPSPro build led me to believe that there is a gcc-ism not taken into account when compiling with non-gcc compilers.
The gcc-ism __attribute__((packed)) appears to be a prime candidate which i have encountered before and can be substituted with #pragma pack(1) in the MIPSPro preprocessor.
So i've cobbled up a patch file like this:
Code: --- ./include/ipx.h.save Sat Mar 16 22:31:25 2019
+++ ./include/ipx.h Sat Mar 16 22:32:18 2019
@@ -66,7 +66,7 @@
#define COMP_UNDELIVERABLE 0xfe
#define COMP_HARDWAREERROR 0xff
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack(1)
#endif
@@ -154,7 +154,7 @@
void UnpackIP(PackedIP ipPack, IPaddress * ipAddr);
void PackIP(IPaddress ipAddr, PackedIP *ipPack);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack()
#endif
--- ./include/paging.h.save Sat Mar 16 22:28:01 2019
+++ ./include/paging.h Sat Mar 16 22:28:50 2019
@@ -100,7 +100,7 @@
void MEM_ResetPageHandler(Bitu phys_page, Bitu pages);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__SGI)
#pragma pack (1)
#endif
struct X86_PageEntryBlock{
@@ -130,7 +130,7 @@
Bit32u base:20;
#endif
} GCC_ATTRIBUTE(packed);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__SGI)
#pragma pack ()
#endif
--- ./include/dos_inc.h.save Sat Mar 16 22:21:57 2019
+++ ./include/dos_inc.h Sat Mar 16 22:26:02 2019
@@ -30,7 +30,7 @@
#include <stddef.h> //for offsetof
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
struct CommandTail{
@@ -37,7 +37,7 @@
Bit8u count; /* number of bytes returned */
char buffer[127]; /* the buffer itself */
} GCC_ATTRIBUTE(packed);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack ()
#endif
@@ -52,7 +52,7 @@
};
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
union bootSector {
@@ -66,7 +66,7 @@
} bootdata;
Bit8u rawdata[512];
} GCC_ATTRIBUTE(packed);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack ()
#endif
@@ -308,7 +308,7 @@
Bit16u FindEntryByHandle (Bit8u handle);
private:
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack(1)
#endif
struct sPSP {
@@ -339,7 +339,7 @@
Bit8u fill_4[4]; /* unused */
CommandTail cmdtail;
} GCC_ATTRIBUTE(packed);
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack()
#endif
Bit16u seg;
@@ -353,7 +353,7 @@
void Clear(void);
void LoadData(void);
void SaveData(void); /* Save it as an exec block */
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
struct sOverlay {
@@ -368,7 +368,7 @@
RealPt initsssp;
RealPt initcsip;
}GCC_ATTRIBUTE(packed);
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack()
#endif
sExec exec;
@@ -392,7 +392,7 @@
RealPt GetPointer(void);
Bit32u GetDeviceChain(void);
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack(1)
#endif
struct sDIB {
@@ -445,7 +445,7 @@
Bit16u startOfUMBChain; // 0x66 segment of first UMB-MCB
Bit16u memAllocScanStart; // 0x68 start paragraph for memory allocation
} GCC_ATTRIBUTE(packed);
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack ()
#endif
Bit16u seg;
@@ -467,7 +467,7 @@
Bit16u GetDirID(void) { return (Bit16u)sGet(sDTA,dirID); };
Bit16u GetDirIDCluster(void) { return (Bit16u)sGet(sDTA,dirCluster); };
private:
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack(1)
#endif
struct sDTA {
@@ -484,7 +484,7 @@
Bit32u size;
char name[DOS_NAMELENGTH_ASCII];
} GCC_ATTRIBUTE(packed);
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack()
#endif
};
@@ -512,7 +512,7 @@
private:
bool extended;
PhysPt real_pt;
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
struct sFCB {
@@ -534,7 +534,7 @@
Bit8u cur_rec; /* Current record in current block */
Bit32u rndm; /* Current relative record number */
} GCC_ATTRIBUTE(packed);
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack ()
#endif
};
@@ -551,7 +551,7 @@
Bit16u GetSize(void) { return (Bit16u)sGet(sMCB,size);}
Bit16u GetPSPSeg(void) { return (Bit16u)sGet(sMCB,psp_segment);}
private:
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
struct sMCB {
@@ -561,7 +561,7 @@
Bit8u unused[3];
Bit8u filename[8];
} GCC_ATTRIBUTE(packed);
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack ()
#endif
};
@@ -579,7 +579,7 @@
private:
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
struct sSDA {
@@ -599,7 +599,7 @@
Bit8u extended_break_flag; /* 0x17 extended break flag */
Bit8u fill[2]; /* 0x18 flag: code page switching || flag: copy of previous byte in case of INT 24 Abort*/
} GCC_ATTRIBUTE(packed);
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack()
#endif
};
--- ./include/cpu.h.save Sat Mar 16 22:29:22 2019
+++ ./include/cpu.h Sat Mar 16 22:30:57 2019
@@ -223,7 +223,7 @@
#define DESC_CODE_R_C_A 0x1e
#define DESC_CODE_R_C_NA 0x1f
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
@@ -320,7 +320,7 @@
Bit32u ldt; /* The local descriptor table */
} GCC_ATTRIBUTE(packed);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack()
#endif
class Descriptor
--- ./src/dos/wnaspi32.h.save Sat Mar 16 22:51:15 2019
+++ ./src/dos/wnaspi32.h Sat Mar 16 22:53:02 2019
@@ -25,7 +25,7 @@
#pragma option -a1
#endif //__BORLANDC__
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack(1)
#endif //__MSC_VER
@@ -343,7 +343,7 @@
#pragma option -a.
#endif //__BORLANDC__
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack()
#endif //_MSC_VER
--- ./src/dos/dos_mscdex.cpp.save Sat Mar 16 22:58:13 2019
+++ ./src/dos/dos_mscdex.cpp Sat Mar 16 22:59:26 2019
@@ -70,7 +70,7 @@
void SetStrategy (Bit16u ofs) { sSave(sDeviceHeader,strategy,ofs); };
public:
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack(1)
#endif
struct sDeviceHeader{
@@ -83,7 +83,7 @@
Bit8u driveLetter;
Bit8u numSubUnits;
} GCC_ATTRIBUTE(packed) TDeviceHeader;
- #ifdef _MSC_VER
+ #if defined(_MSC_VER) || defined(__sgi)
#pragma pack()
#endif
};
--- ./src/dos/drives.h.save Sat Mar 16 22:53:20 2019
+++ ./src/dos/drives.h Sat Mar 16 22:55:03 2019
@@ -87,7 +87,7 @@
} allocation;
};
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
struct bootstrap {
@@ -140,7 +140,7 @@
Bit8u magic2; /* 0xaa */
} GCC_ATTRIBUTE(packed);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack ()
#endif
@@ -232,7 +232,7 @@
char driveLetter;
};
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
struct isoPVD {
@@ -285,7 +285,7 @@
Bit8u ident[222];
} GCC_ATTRIBUTE(packed);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack ()
#endif
--- ./src/dos/dos_execute.cpp.save Sat Mar 16 22:55:27 2019
+++ ./src/dos/dos_execute.cpp Sat Mar 16 22:56:38 2019
@@ -30,7 +30,7 @@
const char * RunningProgram="DOSBOX";
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack(1)
#endif
struct EXE_Header {
@@ -49,7 +49,7 @@
Bit16u reloctable;
Bit16u overlay;
} GCC_ATTRIBUTE(packed);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack()
#endif
--- ./src/dos/dos_tables.cpp.save Sat Mar 16 22:59:38 2019
+++ ./src/dos/dos_tables.cpp Sat Mar 16 23:00:27 2019
@@ -23,7 +23,7 @@
#include "dos_inc.h"
#include "callback.h"
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack(1)
#endif
struct DOS_TableCase {
@@ -31,7 +31,7 @@
Bit8u chars[256];
}
GCC_ATTRIBUTE (packed);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack ()
#endif
--- ./src/dos/dos_files.cpp.save Sat Mar 16 22:56:59 2019
+++ ./src/dos/dos_files.cpp Sat Mar 16 22:57:53 2019
@@ -785,7 +785,7 @@
Bitu index=0;
Bit8u fill=' ';
/* First get the old data from the fcb */
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
union {
@@ -796,7 +796,7 @@
} GCC_ATTRIBUTE (packed) part;
char full[DOS_FCBNAME];
} fcb_name;
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack()
#endif
/* Get the old information from the previous fcb */
--- ./src/hardware/adlib.cpp.save Sat Mar 16 23:01:24 2019
+++ ./src/hardware/adlib.cpp Sat Mar 16 23:02:09 2019
@@ -99,7 +99,7 @@
/* Raw DRO capture stuff */
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
@@ -120,7 +120,7 @@
Bit8u delayShift8; /* 0x18, Bit8u (delay + 1)*256 */
Bit8u conversionTableSize; /* 0x191, Bit8u Raw Conversion Table size */
} GCC_ATTRIBUTE(packed);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack()
#endif
/*
--- ./src/ints/xms.cpp.save Sat Mar 16 23:06:22 2019
+++ ./src/ints/xms.cpp Sat Mar 16 23:07:00 2019
@@ -81,7 +81,7 @@
bool free;
};
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
struct XMS_MemMove{
@@ -98,7 +98,7 @@
} dest;
} GCC_ATTRIBUTE(packed);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack ()
#endif
--- ./src/ints/int10_vesa.cpp.save Sat Mar 16 23:04:49 2019
+++ ./src/ints/int10_vesa.cpp Sat Mar 16 23:05:37 2019
@@ -41,7 +41,7 @@
static char string_productname[]="DOSBox - The DOS Emulator";
static char string_productrev[]="DOSBox " VERSION;
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack (1)
#endif
struct MODE_INFO{
@@ -79,7 +79,7 @@
Bit16u OffScreenMemSize;
Bit8u Reserved[206];
} GCC_ATTRIBUTE(packed);
-#ifdef _MSC_VER
+#if defined(_MSC_VER) || defined(__sgi)
#pragma pack()
#endif
This seems to work, although i have used it in combination with -signed in the CFLAGS/CXXFLAGS so i'm not completely sure which one did it. More testing needed tomorrow. It could be kind of ironic though that a preprocessor command meant for the Windows environment can help out our IRIX build :-)
But with this effort i have a working mount command in dosbox and successfully installed Wolfenstein3D. My challengeS didn't like the sound calls to ALmedia libraries, so i had to disable that in dosbox.conf. The game runs at a glacial speed from my R4400@175MHz over the network, so i'm sure it can do better on other machines.
The SDL i use is 1.2.15 with a modified configure script to enable the SDL_CDROM_DUMMY driver and disable SDL_CDROM_DISABLE which causes the dosbox exit with the CDROM init failure message. I'll post that later.
(This post was last modified: 03-17-2019, 01:19 AM by dexter1.)
|
|
dexter1
Administrator
Trade Count:
(1)
Posts: 297
Threads: 17
Joined: May 2018
Location: The Netherlands
|