Add objdiff setup

This is intended more as a proof of concept as we figure things out
than the start of an actual decompilation in this repository.  Target
object files are currently "bring your own."
This commit is contained in:
KeybadeBlox 2025-12-14 19:27:11 -05:00
parent 10b3c8c273
commit 7e1785e466
12 changed files with 151 additions and 27 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
*.obj

10
objdiff/Makefile Normal file
View file

@ -0,0 +1,10 @@
all: src/Jet2.obj
# Simple inference rule for producing object files
.SUFFIXES: .cpp .obj
.cpp.obj:
CL.EXE /nologo /Wall /TP /W3 /O2 /G6 /MT /GX /Fo$@ /c $<
# Header files used for each object
src/Jet2.obj: src/Core.hpp src/D3D.hpp src/MMatrix.hpp src/Std.hpp\
src/Win32.hpp

22
objdiff/objdiff.json Normal file
View file

@ -0,0 +1,22 @@
{
"custom_make": "NMAKE.EXE",
"watch_patterns": [
"*.cpp",
"*.hpp"
],
"units": [
{
"name": "Jet2",
"target_path": "target/Jet2.obj",
"base_path": "src/Jet2.obj",
"complete": true,
"metadata": {
"source_path": "src/Jet2.cpp"
},
"symbol_mappings": {
"FUN_00187710": "$L514",
"FUN_0018771b": "$L522"
}
}
]
}

View file

@ -1,20 +1,27 @@
/* JSRF Decompilation: Core.hpp
Game and GameObj classes that form the foundation of the JSRF game code.
*/
#ifndef CORE_HPP #ifndef CORE_HPP
#define CORE_HPP
#include "D3D.hpp"
#include "MMatrix.hpp"
#include "Std.hpp"
#include "Win32.hpp"
typedef bool32 unsigned; // Need to find a clean way of representing this // TODO; move to header for Graphics COM object in Smilebit libraries
struct GraphicsPerformanceCounters {
typedef Mat4 D3DVECTOR4[4]; // Should probably be defined somewhere else
struct GraphicsPerformanceCounters { // Would come from header with Graphics COM object
unsigned fps; unsigned fps;
unsigned trianglesPerSecond; unsigned trianglesPerSecond;
unsigned frameTriangleCnt; unsigned frameTriangleCnt;
unsigned unknown0xC; unsigned unknown0xC;
unsigned unknown0x10; unsigned unknown0x10;
unsigned unknown0x14; unsigned unknown0x14;
} };
// Base class of most objects // Base class of most objects (and everything in g_game->objects)
class GameObj { class GameObj {
enum GameObjFlags { enum GameObjFlags {
GOF_SOMETHINGLINKED_ALTLIST = 1 << 0, GOF_SOMETHINGLINKED_ALTLIST = 1 << 0,
@ -93,38 +100,38 @@ extern class Game {
unsigned * unknown0xC; unsigned * unknown0xC;
int initState; int initState;
unsigned unknown0x14; unsigned unknown0x14;
bool32 drawProfilingInfo; BOOL drawProfilingInfo;
int unknown0x1C; int unknown0x1C;
bool32 logosStarted; BOOL logosStarted;
bool32 fatalErr; BOOL fatalErr;
D3DCOLOR colour; D3DCOLOR colour;
D3DCOLOR ambientColour; D3DCOLOR ambientColour;
D3DCOLOR shadowColour; D3DCOLOR shadowColour;
D3DCOLOR bgColour; D3DCOLOR bgColour;
D3DCOLOR bgColourFallback; D3DCOLOR bgColourFallback;
bool32 useFallbackBgColour; BOOL useFallbackBgColour;
// Game state used to select GameObj methods to call in main loop // Game state used to select GameObj methods to call in main loop
// If multiple states are acivated, the precedence is // If multiple states are acivated, the precedence is
// coveredPause > Event > FreezeCam > UncoveredPause > Default // coveredPause > Event > FreezeCam > UncoveredPause > Default
bool32 coveredPause; // Game paused with world not visible BOOL coveredPause; // Game paused with world not visible
bool32 event; // Events (cutscenes) BOOL event; // Events (cutscenes)
bool32 freezeCam; // Time-frozen camera shots BOOL freezeCam; // Time-frozen camera shots
bool32 uncoveredPause; // Game paused with world visible, or BOOL uncoveredPause; // Game paused with world visible, or
// automatic pause at start of mission // automatic pause at start of mission
bool32 setCoveredPauseNextFrame; BOOL setCoveredPauseNextFrame;
bool32 unsetCoveredPauseNextFrame; BOOL unsetCoveredPauseNextFrame;
bool32 setEventNextFrame; BOOL setEventNextFrame;
bool32 unsetEventNextFrame; BOOL unsetEventNextFrame;
bool32 setFreezeCamNextFrame; BOOL setFreezeCamNextFrame;
bool32 unsetFreezeCamNextFrame; BOOL unsetFreezeCamNextFrame;
bool32 setUncoveredPauseNextFrame; BOOL setUncoveredPauseNextFrame;
bool32 unsetUncoveredPauseNextFrame; BOOL unsetUncoveredPauseNextFrame;
unsigned unknown0x70; unsigned unknown0x70;
bool32 skipDraw; BOOL skipDraw;
int zeroedByExec; int zeroedByExec;
GraphicsPerformanceCounters perfCounters; GraphicsPerformanceCounters perfCounters;
@ -150,8 +157,6 @@ extern class Game {
GameObj * linkedListsByKeyHeads [256]; GameObj * linkedListsByKeyHeads [256];
GameObj * * linkedListByKeyEndNexts[256]; GameObj * * linkedListByKeyEndNexts[256];
unsigned unknown0x87B4;
LARGE_INTEGER execPerfCount; LARGE_INTEGER execPerfCount;
LARGE_INTEGER drawPerfCount; LARGE_INTEGER drawPerfCount;
@ -175,7 +180,9 @@ public:
Game(unsigned *, unsigned); Game(unsigned *, unsigned);
virtual ~Game(); virtual ~Game();
// TODO: methods void initExecRootObj();
void mainLoop();
// TODO: other methods
} * g_game; } * g_game;

16
objdiff/src/D3D.hpp Normal file
View file

@ -0,0 +1,16 @@
/* JSRF Decompilation: D3D.hpp
Direct3D8 declarations.
*/
#ifndef D3D_HPP
#define D3D_HPP
#include "Win32.hpp"
typedef DWORD D3DCOLOR;
struct D3DVECTOR { float x, y, z ; };
struct D3DVECTOR4 { float x, y, z, w; };
#endif

View file

@ -1,3 +1,5 @@
#pragma bss_seg(".data")
#include "Core.hpp" #include "Core.hpp"

14
objdiff/src/MMatrix.hpp Normal file
View file

@ -0,0 +1,14 @@
/* JSRF Decompilation: MMatrix.hpp
Smilebit's stack-based matrix math library.
*/
#ifndef MMATRIX_HPP
#define MMATRIX_HPP
#include "D3D.hpp"
// 4x4 matrix type
typedef D3DVECTOR4 Mat4[4];
#endif

12
objdiff/src/Std.hpp Normal file
View file

@ -0,0 +1,12 @@
/* JSRF Decompilation: Std.hpp
C(++) standard library definitions. Implemented in the repository instead of
linking to an outside stdlib to ensure consistency (this may not actually be
possible to accomplish, but we'll go for it for now).
*/
#ifndef STD_HPP
#define STD_HPP
#define NULL 0
#endif

40
objdiff/src/Win32.hpp Normal file
View file

@ -0,0 +1,40 @@
/* JSRF Decompilation: Win32.hpp
Definitions normally provided by Windows headers.
*/
#ifndef WIN32_HPP
#define WIN32_HPP
// The famous Win32 typedefs
typedef unsigned char UCHAR;
typedef char CHAR;
typedef unsigned short USHORT;
typedef short SHORT;
typedef unsigned int UINT;
typedef int INT;
typedef unsigned long ULONG;
typedef long LONG;
typedef unsigned __int64 ULONGLONG;
typedef __int64 LONGLONG;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef int BOOL;
typedef float FLOAT;
// 64-bit integer compatibility type
union LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};
struct {
DWORD LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart;
};
#endif

0
objdiff/target/.gitkeep Normal file
View file