mirror of
https://github.com/RetroPortingToolKit/psxrecomp
synced 2026-10-28 19:07:47 -04:00
9f8a6f9ec2
(cherry picked from commit 2a0754436a4942cd91d389f9cac74e5a662ec0ea)
71 lines
3.2 KiB
C
71 lines
3.2 KiB
C
#include "cpu_state.h"
|
|
#include "mod_plugins.h"
|
|
#undef NDEBUG
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
static int enabled, calls;
|
|
static int replace(CPUState *cpu, uint32_t address) {
|
|
assert(psx_mod_function_replacement_depth() == 1);
|
|
++calls;
|
|
if (!enabled)
|
|
return 0;
|
|
cpu->gpr[2] = address;
|
|
return 1;
|
|
}
|
|
static int replace_with_ra_clobber(CPUState *cpu, uint32_t address) {
|
|
cpu->gpr[31] = address;
|
|
return 1;
|
|
}
|
|
int main(void) {
|
|
CPUState cpu = {0}, before;
|
|
cpu.gpr[31] = 0x80001234;
|
|
cpu.pc = 0;
|
|
before = cpu;
|
|
assert(!psx_mod_try_function_replacement(&cpu, 0x80001000));
|
|
assert(!memcmp(&before, &cpu, sizeof cpu));
|
|
assert(!psx_mod_set_function_replacement(0, replace));
|
|
assert(!psx_mod_set_function_replacement(0x80001001, replace));
|
|
assert(psx_mod_set_function_replacement(0x80001000, replace));
|
|
assert(!psx_mod_try_function_replacement(&cpu, 0x80001000));
|
|
assert(calls == 1 && !memcmp(&before, &cpu, sizeof cpu));
|
|
enabled = 1;
|
|
assert(!psx_mod_try_function_replacement(&cpu, 0x80001004));
|
|
assert(psx_mod_try_function_replacement(&cpu, 0x80001000));
|
|
assert(cpu.pc == 0x80001234 && cpu.gpr[2] == 0x80001000 && cpu.gpr[31] == before.gpr[31]);
|
|
assert(psx_mod_try_function_replacement(&cpu, 0xA0001000));
|
|
assert(cpu.gpr[2] == 0xA0001000);
|
|
assert(psx_mod_try_function_replacement(&cpu, 0x00001000));
|
|
assert(!psx_mod_try_function_replacement(&cpu, 0x80201000));
|
|
assert(psx_mod_set_function_replacement(0x80001000, 0));
|
|
assert(!psx_mod_try_function_replacement(&cpu, 0x80001000));
|
|
assert(psx_mod_set_function_replacement(0x80001000, 0));
|
|
assert(psx_mod_set_function_replacement(0x80001000, replace_with_ra_clobber));
|
|
assert(!psx_mod_try_function_replacement(0, 0x80001000));
|
|
cpu.gpr[31] = 0x80001234;
|
|
assert(psx_mod_try_function_replacement(&cpu, 0x80001000));
|
|
assert(cpu.pc == 0x80001234 && cpu.gpr[31] == 0x80001000);
|
|
assert(psx_mod_set_function_replacement(0x80001000, 0));
|
|
for (unsigned i = 0; i < 64; ++i)
|
|
assert(psx_mod_set_function_replacement(0x80002000 + 4 * i, replace));
|
|
assert(!psx_mod_set_function_replacement(0x80004000, replace));
|
|
assert(psx_mod_set_function_replacement(0x80002000, 0));
|
|
assert(psx_mod_set_function_replacement(0x80004000, replace));
|
|
assert(psx_mod_try_function_replacement(&cpu, 0x800020FC));
|
|
assert(psx_mod_try_function_replacement(&cpu, 0x80004000));
|
|
for (unsigned i = 1; i < 64; ++i)
|
|
assert(psx_mod_set_function_replacement(0x80002000 + 4 * i, 0));
|
|
assert(psx_mod_set_function_replacement(0x80004000, 0));
|
|
before = cpu;
|
|
assert(!psx_mod_try_function_replacement(&cpu, 0x80004000));
|
|
assert(!memcmp(&before, &cpu, sizeof cpu));
|
|
assert(psx_mod_set_function_replacement(0x80004000, replace));
|
|
psx_mod_clear_function_replacements();
|
|
assert(!psx_mod_try_function_replacement(&cpu, 0x80004000));
|
|
assert(psx_mod_function_replacement_depth() == 0);
|
|
psx_mod_function_replacement_restore_depth(3);
|
|
assert(psx_mod_function_replacement_depth() == 3);
|
|
psx_mod_function_replacement_restore_depth(0);
|
|
puts("PASS native replacement opt-in, fallback, return ABI, unregister and capacity");
|
|
}
|