Fix small buf and add cheat error messages
Some minor formating too
This commit is contained in:
		
							parent
							
								
									4fd456e158
								
							
						
					
					
						commit
						883f07f487
					
				
					 5 changed files with 52 additions and 11 deletions
				
			
		|  | @ -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); | ||||
|  |  | |||
							
								
								
									
										27
									
								
								cheats.c
									
										
									
									
									
								
							
							
						
						
									
										27
									
								
								cheats.c
									
										
									
									
									
								
							|  | @ -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; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										12
									
								
								cheats.h
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								cheats.h
									
										
									
									
									
								
							|  | @ -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; | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										18
									
								
								libretro.c
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								libretro.c
									
										
									
									
									
								
							|  | @ -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) | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue