sotn-decomp/include/common.h

69 lines
1.8 KiB
C
Raw Normal View History

2022-01-01 17:45:41 +00:00
#ifndef COMMON_H
#define COMMON_H
2023-05-04 22:32:35 +00:00
#if defined(_internal_version_us)
#define VERSION_US
#define VERSION "us"
2023-05-04 22:32:35 +00:00
#elif defined(_internal_version_hd)
#define VERSION_HD
#define VERSION "hd"
Add TT_000 overlay from PSP (#1113) TT_000 is the first overlay from PlayStation 1 that we are now able to compile from the source and produce a 1:1 binary. This lead me to start exploring the same overlay from the game Castlevania: Dracula X Chronicles, which contains a PSP re-build of Symphony of the Night. This PR adds all the infrastructure to add the same flow for a PSP matching decomp. Use `export VERSION=pspeu` and then the usual `sotn` command to splat the overlay, build it and check if it matches. Running `make extract_disk` should not be necessary as the same ISO used from `VERSION=hd` is also used for `pspeu`, so you will probably have it extracted already. Some important notes about the PSP build: * The whole PSP build seems to be compiled with `-O0`, which makes it much easier to decompile * Having ŧhe PSX, PSP and Saturn builds will allow to easily cross-reference the code and reduce fake matches * `disks/pspeu/PSP_GAME/USRDIR/res/ps/hdbin/tt_000.bin` is the HD PSX build * `disks/pspeu/PSP_GAME/USRDIR/res/ps/PSPBIN/tt_000.bin` has the same code from the HD build, but for PSP * `disks/pspeu/PSP_GAME/USRDIR/res/ps/PACK_E/TP00.BIN` is the same as above, but it packs both overlay and graphics. This is the file the PSP game seems to actually use * The PSP build uses the Metrowerk CodeWarrior's C compiler, which is very different from the GCC one used on PSX. * Thanks to @mkst lead, we found a way to still use the GNU assembler and linker * MWCC uses [wibo](https://github.com/decompals/WiBo/), a think compatibility layer to run Windows CLI tools on Linux. It is much more lightweight than Wine. * MWCC does not support the `INCLUDE_ASM` dialect, so the custom pre-processor `tools/mwcpp` had to be created * The exact MWCC compiler version is unknown, but I suspect it is `build 147` * I am not yet sure of any implications for using GNU AS and GNU LD instead of the MW correspondent tools * Not all the functions can be correctly disassembled, spimdisasm will just produce a bunch of `.word 0x________` due to the in-progress effort of adding the Allegrex-specific opcodes support --- TO-DO list before marking the PR as ready: - [X] Add PSP build to the CI - [x] Add progress reporting to the PSP build - [x] Integrate source file from `src/servant/tt_000_psp` to `src/servant/tt_000` to promote the psp build as first-citizen --- TO-DO in a follow-up PR: * Figure out what `header` is: can we extract it as assembly code? or maybe as custom re-compilable asset via splat? Is it a MW stuff or a Castlevania-specific file? * Get rid of the last line in `Makefile.psp.mk`
2024-04-21 01:18:10 +00:00
#elif defined(_internal_version_pspeu)
#define VERSION_PSP
#define VERSION "psp"
#elif defined(_internal_version_beta)
#define VERSION_BETA
#define VERSION "beta"
2023-05-04 22:32:35 +00:00
#else
#warning "Version not specified. Falling back to the US version."
#define VERSION_US
#define VERSION "us"
2023-05-04 22:32:35 +00:00
#endif
#include "include_asm.h"
#include "settings.h"
#include "types.h"
2023-03-24 12:42:41 +00:00
#define LEN(x) ((s32)(sizeof(x) / sizeof(*(x))))
#define OFF(type, field) ((size_t)(&((type*)0)->field))
2023-03-28 12:14:13 +00:00
#define STRCPY(dst, src) __builtin_memcpy(dst, src, sizeof(src))
#define SQ(x) ((x) * (x))
#define MIN(a, b) ((a) > (b) ? (b) : (a))
#define MAX(a, b) ((a) > (b) ? (b) : (a))
#ifdef _MSC_VER
#define __builtin_memcpy memcpy
#endif
2023-03-04 01:26:05 +00:00
#define LOH(x) (*(s16*)&(x))
#define HIH(x) (((s16*)&(x))[1])
2023-07-06 11:20:53 +00:00
#define LOHU(x) (*(u16*)&(x))
2023-05-27 10:13:49 +00:00
#define LOW(x) (*(s32*)&(x))
2023-07-06 11:20:53 +00:00
#define LOWU(x) (*(u32*)&(x))
2023-05-27 10:13:49 +00:00
2023-03-13 01:43:07 +00:00
#if defined(HACKS) && !defined(PERMUTER)
2023-03-12 00:13:28 +00:00
#define ALIGNED4 __attribute__((aligned(4)))
2023-03-12 00:11:04 +00:00
#else
#define ALIGNED4
#endif
2023-03-04 01:26:05 +00:00
#ifndef __clang__
int sprintf(char* dst, const char* fmt, ...);
#endif
#define FIX(x) ((s32)((x)*65536.0))
#define FIX_TO_I(x) ((s32)((x) >> 16))
// The second argument to CreateEntFactoryFromEntity has weird bit packing,
// this takes the 2 relevant inputs and packs them up.
// A0 should be a value like 0x##00 where ## is two hexadecimal digits.
// BLUEPRINTNUM is which blueprint gets loaded from g_FactoryBlueprints.
#define FACTORY(A0, BLUEPRINTNUM) (A0 << 8 | BLUEPRINTNUM)
// Tests multiple bits of x being set, based on the bitmask defined in y.
#define TEST_BITS(x, y) ((x & y) == y)
// PSX SDK libraries do not use float. Instead they use a fix-point number
// where 4096 is equal to 1.0.
#define FLT(x) ((s32)((x)*4096.0))
2022-01-01 17:45:41 +00:00
#endif