diff --git a/managers/cheat_manager.c b/managers/cheat_manager.c index fb4d0de824..a2a5ad85fa 100644 --- a/managers/cheat_manager.c +++ b/managers/cheat_manager.c @@ -455,14 +455,19 @@ void cheat_manager_free(void) if ( cheat_manager_state.prev_memory_buf ) free(cheat_manager_state.prev_memory_buf) ; + if ( cheat_manager_state.matches ) + free(cheat_manager_state.matches) ; + cheat_manager_state.cheats = NULL ; cheat_manager_state.size = 0 ; cheat_manager_state.buf_size = 0 ; cheat_manager_state.prev_memory_buf = NULL ; cheat_manager_state.curr_memory_buf = NULL ; + cheat_manager_state.matches = NULL ; cheat_manager_state.total_memory_size = 0 ; cheat_manager_state.actual_memory_size = 0 ; cheat_manager_state.memory_initialized = false ; + cheat_manager_state.memory_search_initialized = false ; } @@ -568,15 +573,15 @@ bool cheat_manager_get_game_specific_filename(char * cheat_filename, size_t max_ return false ; cheat_filename[0] = '\0'; - strncat(cheat_filename, settings->paths.path_cheat_database, max_length) ; + strlcat(cheat_filename, settings->paths.path_cheat_database, max_length-1) ; fill_pathname_slash(cheat_filename, max_length) ; - strncat(cheat_filename, core_name, max_length-strlen(cheat_filename)) ; + strlcat(cheat_filename, core_name, max_length-strlen(cheat_filename)-1) ; fill_pathname_slash(cheat_filename, max_length) ; if (!filestream_exists(cheat_filename)) path_mkdir(cheat_filename); - strncat(cheat_filename, game_name, max_length-strlen(cheat_filename)) ; + strlcat(cheat_filename, game_name, max_length-strlen(cheat_filename)-1) ; return true ; @@ -614,10 +619,11 @@ bool cheat_manager_alloc_if_empty(void) return true; } -int cheat_manager_initialize_search(void *data, bool wraparound) +int cheat_manager_initialize_memory(void *data, bool wraparound) { retro_ctx_memory_info_t meminfo ; bool refresh = false; + bool is_search_initialization = (data != NULL) ; meminfo.id = RETRO_MEMORY_SYSTEM_RAM ; if (! core_get_memory(&meminfo) ) @@ -629,32 +635,36 @@ int cheat_manager_initialize_search(void *data, bool wraparound) cheat_manager_state.actual_memory_size = meminfo.size ; cheat_manager_state.curr_memory_buf = meminfo.data ; cheat_manager_state.total_memory_size = meminfo.size ; - cheat_manager_state.num_matches = 0 ; + cheat_manager_state.num_matches = (cheat_manager_state.total_memory_size*8)/((int)pow(2,cheat_manager_state.search_bit_size)) ; //ensure we're aligned on 4-byte boundary //if ( meminfo.size % 4 > 0 ) { //cheat_manager_state.total_memory_size = cheat_manager_state.total_memory_size + (4 - (meminfo.size%4)) ; //} - cheat_manager_state.prev_memory_buf = (uint8_t*) calloc(cheat_manager_state.total_memory_size, sizeof(uint8_t)); - if (!cheat_manager_state.prev_memory_buf ) + if ( is_search_initialization ) { - runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_INIT_FAIL), 1, 180, true); - return 0 ; - } - cheat_manager_state.matches = (uint8_t*) calloc(cheat_manager_state.total_memory_size, sizeof(uint8_t)); - if (!cheat_manager_state.matches ) - { - free(cheat_manager_state.prev_memory_buf) ; - cheat_manager_state.prev_memory_buf = NULL ; - runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_INIT_FAIL), 1, 180, true); - return 0 ; - } + cheat_manager_state.prev_memory_buf = (uint8_t*) calloc(cheat_manager_state.total_memory_size, sizeof(uint8_t)); + if (!cheat_manager_state.prev_memory_buf ) + { + runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_INIT_FAIL), 1, 180, true); + return 0 ; + } + cheat_manager_state.matches = (uint8_t*) calloc(cheat_manager_state.total_memory_size, sizeof(uint8_t)); + if (!cheat_manager_state.matches ) + { + free(cheat_manager_state.prev_memory_buf) ; + cheat_manager_state.prev_memory_buf = NULL ; + runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_INIT_FAIL), 1, 180, true); + return 0 ; + } - memset(cheat_manager_state.matches, 0xFF, cheat_manager_state.total_memory_size) ; - memcpy(cheat_manager_state.prev_memory_buf, cheat_manager_state.curr_memory_buf, cheat_manager_state.actual_memory_size); - cheat_manager_state.num_matches = (cheat_manager_state.total_memory_size*8)/((int)pow(2,cheat_manager_state.search_bit_size)) ; + memset(cheat_manager_state.matches, 0xFF, cheat_manager_state.total_memory_size) ; + memcpy(cheat_manager_state.prev_memory_buf, cheat_manager_state.curr_memory_buf, cheat_manager_state.actual_memory_size); + cheat_manager_state.memory_search_initialized = true ; + } cheat_manager_state.memory_initialized = true ; + runloop_msg_queue_push(msg_hash_to_str(MSG_CHEAT_INIT_SUCCESS), 1, 180, true); if ( !wraparound ) { @@ -1135,7 +1145,7 @@ void cheat_manager_apply_retro_cheats(void) if (cheat_manager_state.cheats[i].handler != CHEAT_HANDLER_TYPE_RETRO || !cheat_manager_state.cheats[i].state) continue ; if ( !cheat_manager_state.memory_initialized ) - cheat_manager_initialize_search(NULL, false) ; + cheat_manager_initialize_memory(NULL, false) ; /* If we're still not initialized, something must have gone wrong - just bail */ if ( !cheat_manager_state.memory_initialized ) diff --git a/managers/cheat_manager.h b/managers/cheat_manager.h index 2b84df40d2..163002ae8c 100644 --- a/managers/cheat_manager.h +++ b/managers/cheat_manager.h @@ -150,6 +150,7 @@ struct cheat_manager unsigned num_matches ; bool big_endian ; bool memory_initialized ; + bool memory_search_initialized ; unsigned int delete_state ; }; @@ -209,7 +210,7 @@ void cheat_manager_load_game_specific_cheats(); void cheat_manager_save_game_specific_cheats(); -int cheat_manager_initialize_search(void *data, bool wraparound); +int cheat_manager_initialize_memory(void *data, bool wraparound); int cheat_manager_search_exact(void *data, bool wraparound); int cheat_manager_search_lt(void *data, bool wraparound); int cheat_manager_search_gt(void *data, bool wraparound); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index cd1d106d79..d8d9f9192d 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -5167,12 +5167,16 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); if ( !cheat_manager_state.memory_initialized) - cheat_manager_initialize_search(NULL,true) ; + cheat_manager_initialize_memory(NULL,true) ; setting = menu_setting_find(msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_ADDRESS)); if ( setting ) setting->max = cheat_manager_state.total_memory_size==0?0:cheat_manager_state.total_memory_size-1; + setting = menu_setting_find(msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_ADDRESS_BIT_POSITION)); + if ( setting ) + setting->max = cheat_manager_state.working_cheat.memory_search_size<3 ? 255 : 0 ; + menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEAT_IDX, PARSE_ONLY_UINT, false); diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 20730ce7ba..2e534c21de 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -3449,7 +3449,7 @@ static bool setting_append_list( setting_uint_action_left_with_refresh,setting_uint_action_right_with_refresh, MENU_ENUM_LABEL_CHEAT_MEMORY_SIZE_1,&setting_get_string_representation_uint_as_enum, 0,5,1) ; - (*list)[list_info->index - 1].action_ok = &cheat_manager_initialize_search; + (*list)[list_info->index - 1].action_ok = &cheat_manager_initialize_memory; CONFIG_BOOL( list, list_info,