From 5162c3ff5086640220dcfa12e8598e4d4e89c5c6 Mon Sep 17 00:00:00 2001 From: notaz Date: Wed, 13 Dec 2023 00:24:23 +0200 Subject: [PATCH] cheats: handle 1F and D4 libretro/pcsx_rearmed#808 --- libpcsxcore/cheat.c | 27 ++++++++++++++++++++++++--- libpcsxcore/cheat.h | 36 ++++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/libpcsxcore/cheat.c b/libpcsxcore/cheat.c index e0cf411e..2727fd23 100644 --- a/libpcsxcore/cheat.c +++ b/libpcsxcore/cheat.c @@ -20,6 +20,7 @@ #include "r3000a.h" #include "psxmem.h" #include "misc.h" +#include "../frontend/plugin_lib.h" // in_keystate for D4 #include "cheat.h" @@ -228,6 +229,10 @@ void ApplyCheats() { psxMu16ref(addr) = SWAPu16(val); break; + case CHEAT_SCRATCHPAD16: // 1F + psxHs16ref(addr) = SWAPu16(val); + break; + case CHEAT_INC16: psxMu16ref(addr) = SWAPu16(psxMu16(addr) + val); break; @@ -319,6 +324,20 @@ void ApplyCheats() { if (PSXMu16(addr) <= val) j++; // skip the next code break; + + case CHEAT_BUTTONS1_16: { // D4 + u16 keys = in_keystate[0]; + keys = (keys << 8) | (keys >> 8); + if (keys != val) + j++; // skip the next code + break; + } + + default: + SysPrintf("unhandled cheat %d,%d code %08X\n", + i, j, CheatCodes[j].Addr); + Cheats[i].WasEnabled = Cheats[i].Enabled = 0; + break; } } } @@ -350,7 +369,7 @@ int AddCheat(const char *descr, char *code) { p2 = code; while (c) { - unsigned int t1, t2; + unsigned int t1, t2, r; while (*p2 != '\n' && *p2 != '\0') p2++; @@ -363,9 +382,11 @@ int AddCheat(const char *descr, char *code) { t1 = 0; t2 = 0; - sscanf(p1, "%x %x", &t1, &t2); + r = sscanf(p1, "%x %x", &t1, &t2); - if (t1 > 0x10000000) { + if (r != 2) + SysPrintf("cheat %d: couldn't parse '%s'\n", NumCodes, p1); + else if (t1 >= 0x10000000) { if (NumCodes >= NumCodesAllocated) { NumCodesAllocated += ALLOC_INCREMENT; diff --git a/libpcsxcore/cheat.h b/libpcsxcore/cheat.h index b3d8bc4a..d8c2c66f 100644 --- a/libpcsxcore/cheat.h +++ b/libpcsxcore/cheat.h @@ -98,23 +98,27 @@ extern int NumCodesAllocated; #define PrevMu32(mem) (SWAP32(*(u32 *)PREVM(mem))) // cheat types -#define CHEAT_CONST8 0x30 /* 8-bit Constant Write */ -#define CHEAT_CONST16 0x80 /* 16-bit Constant Write */ -#define CHEAT_INC16 0x10 /* 16-bit Increment */ -#define CHEAT_DEC16 0x11 /* 16-bit Decrement */ -#define CHEAT_INC8 0x20 /* 8-bit Increment */ -#define CHEAT_DEC8 0x21 /* 8-bit Decrement */ -#define CHEAT_SLIDE 0x50 /* Slide Codes */ -#define CHEAT_MEMCPY 0xC2 /* Memory Copy */ - -#define CHEAT_EQU8 0xE0 /* 8-bit Equal To */ -#define CHEAT_NOTEQU8 0xE1 /* 8-bit Not Equal To */ -#define CHEAT_LESSTHAN8 0xE2 /* 8-bit Less Than */ -#define CHEAT_GREATERTHAN8 0xE3 /* 8-bit Greater Than */ -#define CHEAT_EQU16 0xD0 /* 16-bit Equal To */ -#define CHEAT_NOTEQU16 0xD1 /* 16-bit Not Equal To */ -#define CHEAT_LESSTHAN16 0xD2 /* 16-bit Less Than */ +#define CHEAT_CONST8 0x30 /* 8-bit Constant Write */ +#define CHEAT_CONST16 0x80 /* 16-bit Constant Write */ + +#define CHEAT_INC16 0x10 /* 16-bit Increment */ +#define CHEAT_DEC16 0x11 /* 16-bit Decrement */ +#define CHEAT_SCRATCHPAD16 0x1F /* 16-bit Scratchpad Write */ +#define CHEAT_INC8 0x20 /* 8-bit Increment */ +#define CHEAT_DEC8 0x21 /* 8-bit Decrement */ +#define CHEAT_SLIDE 0x50 /* Slide Codes */ +#define CHEAT_MEMCPY 0xC2 /* Memory Copy */ + +// conditionals +#define CHEAT_EQU16 0xD0 /* 16-bit Equal To */ +#define CHEAT_NOTEQU16 0xD1 /* 16-bit Not Equal To */ +#define CHEAT_LESSTHAN16 0xD2 /* 16-bit Less Than */ #define CHEAT_GREATERTHAN16 0xD3 /* 16-bit Greater Than */ +#define CHEAT_BUTTONS1_16 0xD4 /* button presses equate to YYYY */ +#define CHEAT_EQU8 0xE0 /* 8-bit Equal To */ +#define CHEAT_NOTEQU8 0xE1 /* 8-bit Not Equal To */ +#define CHEAT_LESSTHAN8 0xE2 /* 8-bit Less Than */ +#define CHEAT_GREATERTHAN8 0xE3 /* 8-bit Greater Than */ #ifdef __cplusplus } -- 2.39.5