Files
project-solana/games/rac1/host/include/rac1_common.h
T
2026-10-13 20:04:31 -04:00

44 lines
1.7 KiB
C

/* rac1_common.h: replaces OpenRAC's include/common.h when the game's C is
* built for a PC (gen_host.py copies it to gen/include/common.h).
*
* The host is a 32-bit x86 program with PS2 RAM mapped at its real addresses,
* so pointers are 4 bytes and structs keep their PS2 layout. `long` is
* rewritten to `long long` by gen_host.py (the EE's long is 64-bit); build
* with -malign-double so 64-bit fields keep 8-byte alignment. */
#ifndef COMMON_H
#define COMMON_H
#include "uya_host.h"
#include "names.h"
/* Matching-only placement attributes: no meaning on the host. */
#define NOT_SDA
#define MACRO_ADDR
/* SDATA(D_x) names a scalar by another C name: an asm label to the address symbol
* (expanded first: a level program's names carry its suffix, gen/lNN/lNN_names.h) */
#define UYA_SYMSTR_(x) #x
#define UYA_SYMSTR(x) UYA_SYMSTR_(x)
#ifdef _WIN32
#define SDATA(sym) __asm__("_" UYA_SYMSTR(sym))
#else
#define SDATA(sym) __asm__(UYA_SYMSTR(sym))
#endif
/* The decomp's quadword copy and clear (lq/sq inline asm on the EE). */
static __inline__ void qcopy(void *dst, void *src) { __builtin_memcpy(dst, src, 16); }
static __inline__ void qcopy_nc(void *dst, void *src) { __builtin_memcpy(dst, src, 16); }
static __inline__ void qzero(void *p) { __builtin_memset(p, 0, 16); }
/* EE FPU division for C patched with it (tools/source_patches.py): a division
* by zero gives +-MAX (the sign of a XOR b), never inf or NaN. */
static __inline__ float ee_fdiv(float a, float b)
{
if (b == 0.0f) {
unsigned ua, ub; __builtin_memcpy(&ua, &a, 4); __builtin_memcpy(&ub, &b, 4);
unsigned r = ((ua ^ ub) & 0x80000000u) | 0x7F7FFFFFu; float f; __builtin_memcpy(&f, &r, 4); return f;
}
return a / b;
}
#endif /* COMMON_H */