Fix small buf and add cheat error messages

Some minor formating too
This commit is contained in:
David Guillen Fandos 2021-05-05 18:07:55 +02:00 committed by David G. F
parent 4fd456e158
commit 883f07f487
5 changed files with 52 additions and 11 deletions

View File

@ -31,8 +31,8 @@ u32 prepare_store_reg(u32 scratch_reg, u32 reg_index);
void generate_load_reg(u32 ireg, u32 reg_index);
void complete_store_reg(u32 scratch_reg, u32 reg_index);
void complete_store_reg_pc_no_flags(u32 scratch_reg, u32 reg_index);
void thumb_cheat_hook();
void arm_cheat_hook();
void thumb_cheat_hook(void);
void arm_cheat_hook(void);
u32 arm_update_gba_arm(u32 pc);
u32 arm_update_gba_thumb(u32 pc);

View File

@ -33,6 +33,19 @@ cheat_type cheats[MAX_CHEATS];
u32 max_cheat = 0;
u32 cheat_master_hook = 0xffffffff;
static bool has_encrypted_codebreaker(cheat_type *cheat)
{
int i;
for(i = 0; i < cheat->cheat_count; i++)
{
u32 code = cheat->codes[i].address;
u32 opcode = code >> 28;
if (opcode == 9)
return true;
}
return false;
}
static void update_hook_codebreaker(cheat_type *cheat)
{
int i;
@ -103,7 +116,7 @@ static void process_cheat_codebreaker(cheat_type *cheat, u16 pad)
bvalue = cheat->codes[i].address >> (24 - off*8);
break;
case 4 ... 5:
bvalue = cheat->codes[i].address >> (40 - off*8);
bvalue = cheat->codes[i].value >> (40 - off*8);
break;
};
write_memory8(address, bvalue);
@ -192,7 +205,7 @@ void cheat_clear()
cheat_master_hook = 0xffffffff;
}
void cheat_parse(unsigned index, const char *code)
cheat_error cheat_parse(unsigned index, const char *code)
{
int pos = 0;
int codelen = strlen(code);
@ -200,9 +213,9 @@ void cheat_parse(unsigned index, const char *code)
char buf[1024];
if (index >= MAX_CHEATS)
return;
return CheatErrorTooMany;
if (codelen >= sizeof(buf))
return;
return CheatErrorTooBig;
memcpy(buf, code, codelen+1);
@ -236,13 +249,17 @@ void cheat_parse(unsigned index, const char *code)
if (pos >= codelen)
{
/* Check whether these cheats are readable */
if (has_encrypted_codebreaker(ch))
return CheatErrorEncrypted;
/* All codes were parsed! Process hook here */
ch->cheat_active = true;
update_hook_codebreaker(ch);
return;
return CheatNoError;
}
/* TODO parse other types here */
return CheatErrorNotSupported;
}

View File

@ -23,9 +23,17 @@
#define MAX_CHEATS 20
#define MAX_CHEAT_CODES 64
typedef enum {
CheatNoError = 0,
CheatErrorTooMany,
CheatErrorTooBig,
CheatErrorEncrypted,
CheatErrorNotSupported
} cheat_error;
void process_cheats(void);
void cheat_parse(unsigned index, const char *code);
void cheat_clear();
cheat_error cheat_parse(unsigned index, const char *code);
void cheat_clear(void);
extern u32 cheat_master_hook;

View File

@ -647,7 +647,23 @@ void retro_cheat_set(unsigned index, bool enabled, const char* code)
if (!enabled)
return;
cheat_parse(index, code);
switch (cheat_parse(index, code))
{
case CheatErrorTooMany:
show_warning_message("Too many active cheats!", 2500);
break;
case CheatErrorTooBig:
show_warning_message("Cheats are too big!", 2500);
break;
case CheatErrorEncrypted:
show_warning_message("Encrypted cheats are not supported!", 2500);
break;
case CheatErrorNotSupported:
show_warning_message("Cheat type is not supported!", 2500);
break;
case CheatNoError:
break;
};
}
static void extract_directory(char* buf, const char* path, size_t size)

View File

@ -44,7 +44,7 @@ void mips_indirect_branch_dual(u32 address);
u32 execute_read_cpsr();
u32 execute_read_spsr();
void execute_swi(u32 pc);
void mips_cheat_hook();
void mips_cheat_hook(void);
u32 execute_spsr_restore(u32 address);
void execute_store_cpsr(u32 new_cpsr, u32 store_mask);