From 600a3365ea3337bc6f8f0be25b82c6573e1781b1 Mon Sep 17 00:00:00 2001 From: Jamiras <32680403+Jamiras@users.noreply.github.com> Date: Sun, 13 Feb 2022 13:40:16 -0700 Subject: [PATCH] update to rcheevos 10.3.2 (#13621) --- deps/rcheevos/src/rapi/rc_api_runtime.c | 2 +- deps/rcheevos/src/rcheevos/consoleinfo.c | 18 ++++++++++++ deps/rcheevos/src/rcheevos/memref.c | 33 ++++++++++----------- deps/rcheevos/src/rcheevos/rc_libretro.c | 6 ++++ deps/rcheevos/src/rhash/hash.c | 37 +++++++++++++++++------- 5 files changed, 66 insertions(+), 30 deletions(-) diff --git a/deps/rcheevos/src/rapi/rc_api_runtime.c b/deps/rcheevos/src/rapi/rc_api_runtime.c index 99289afc0c..e42db3cf16 100644 --- a/deps/rcheevos/src/rapi/rc_api_runtime.c +++ b/deps/rcheevos/src/rapi/rc_api_runtime.c @@ -477,7 +477,7 @@ int rc_api_process_submit_lboard_entry_response(rc_api_submit_lboard_entry_respo rc_buf_init(&response->response.buffer); result = rc_json_parse_response(&response->response, server_response, fields, sizeof(fields) / sizeof(fields[0])); - if (result != RC_OK) + if (result != RC_OK || !response->response.succeeded) return result; if (!rc_json_get_required_object(response_fields, sizeof(response_fields) / sizeof(response_fields[0]), &response->response, &fields[2], "Response")) diff --git a/deps/rcheevos/src/rcheevos/consoleinfo.c b/deps/rcheevos/src/rcheevos/consoleinfo.c index 2de4047162..44a040a01c 100644 --- a/deps/rcheevos/src/rcheevos/consoleinfo.c +++ b/deps/rcheevos/src/rcheevos/consoleinfo.c @@ -239,6 +239,20 @@ static const rc_memory_region_t _rc_memory_regions_3do[] = { }; static const rc_memory_regions_t rc_memory_regions_3do = { _rc_memory_regions_3do, 1 }; +/* ===== Amstrad CPC ===== */ +/* http://www.cpcalive.com/docs/amstrad_cpc_6128_memory_map.html */ +/* https://www.cpcwiki.eu/index.php/File:AWMG_page151.jpg */ +/* The original CPC only had 64KB of memory, but the newer model has 128KB (expandable to 576KB) */ +/* https://www.grimware.org/doku.php/documentations/devices/gatearraydo=export_xhtml#mmr */ +static const rc_memory_region_t _rc_memory_regions_amstrad_pc[] = { + { 0x000000U, 0x00003FU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Firmware" }, + { 0x000040U, 0x00B0FFU, 0x000040U, RC_MEMORY_TYPE_SYSTEM_RAM, "System RAM" }, + { 0x00B100U, 0x00BFFFU, 0x00B100U, RC_MEMORY_TYPE_SYSTEM_RAM, "Stack and Firmware Data" }, + { 0x00C000U, 0x00FFFFU, 0x00C000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Screen Memory" }, + { 0x010000U, 0x08FFFFU, 0x010000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Extended RAM" }, +}; +static const rc_memory_regions_t rc_memory_regions_amstrad_pc = { _rc_memory_regions_amstrad_pc, 5 }; + /* ===== Apple II ===== */ static const rc_memory_region_t _rc_memory_regions_appleii[] = { { 0x000000U, 0x00FFFFU, 0x000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Main RAM" }, @@ -665,6 +679,9 @@ const rc_memory_regions_t* rc_console_memory_regions(int console_id) case RC_CONSOLE_3DO: return &rc_memory_regions_3do; + case RC_CONSOLE_AMSTRAD_PC: + return &rc_memory_regions_amstrad_pc; + case RC_CONSOLE_APPLE_II: return &rc_memory_regions_appleii; @@ -686,6 +703,7 @@ const rc_memory_regions_t* rc_console_memory_regions(int console_id) case RC_CONSOLE_DREAMCAST: return &rc_memory_regions_dreamcast; + case RC_CONSOLE_MEGADUCK: case RC_CONSOLE_GAMEBOY: return &rc_memory_regions_gameboy; diff --git a/deps/rcheevos/src/rcheevos/memref.c b/deps/rcheevos/src/rcheevos/memref.c index 91449dd9d5..0771c3c6ed 100644 --- a/deps/rcheevos/src/rcheevos/memref.c +++ b/deps/rcheevos/src/rcheevos/memref.c @@ -361,37 +361,34 @@ char rc_memref_shared_size(char size) { } static unsigned rc_peek_value(unsigned address, char size, rc_peek_t peek, void* ud) { - rc_typed_value_t value; - char shared_size; - if (!peek) return 0; - shared_size = rc_memref_shared_size(size); - switch (shared_size) + switch (size) { case RC_MEMSIZE_8_BITS: - value.value.u32 = peek(address, 1, ud); - break; + return peek(address, 1, ud); case RC_MEMSIZE_16_BITS: - value.value.u32 = peek(address, 2, ud); - break; + return peek(address, 2, ud); case RC_MEMSIZE_32_BITS: - value.value.u32 = peek(address, 4, ud); - break; + return peek(address, 4, ud); default: - return 0; - } + { + unsigned value; + const size_t index = (size_t)size; + if (index >= sizeof(rc_memref_shared_sizes) / sizeof(rc_memref_shared_sizes[0])) + return 0; - if (shared_size != size) { - value.type = RC_VALUE_TYPE_UNSIGNED; - rc_transform_memref_value(&value, size); + /* fetch the larger value and mask off the bits associated to the specified size + * for correct deduction of prior value. non-prior memrefs should already be using + * shared size memrefs to minimize the total number of memory reads required. */ + value = rc_peek_value(address, rc_memref_shared_sizes[index], peek, ud); + return value & rc_memref_masks[index]; + } } - - return value.value.u32; } void rc_update_memref_value(rc_memref_value_t* memref, unsigned new_value) { diff --git a/deps/rcheevos/src/rcheevos/rc_libretro.c b/deps/rcheevos/src/rcheevos/rc_libretro.c index 77fb0b9e08..c08bd6a065 100644 --- a/deps/rcheevos/src/rcheevos/rc_libretro.c +++ b/deps/rcheevos/src/rcheevos/rc_libretro.c @@ -31,6 +31,11 @@ static const rc_disallowed_setting_t _rc_disallowed_bsnes_settings[] = { { NULL, NULL } }; +static const rc_disallowed_setting_t _rc_disallowed_cap32_settings[] = { + { "cap32_autorun", "disabled" }, + { NULL, NULL } +}; + static const rc_disallowed_setting_t _rc_disallowed_dolphin_settings[] = { { "dolphin_cheats_enabled", "enabled" }, { NULL, NULL } @@ -116,6 +121,7 @@ static const rc_disallowed_setting_t _rc_disallowed_virtual_jaguar_settings[] = static const rc_disallowed_core_settings_t rc_disallowed_core_settings[] = { { "bsnes-mercury", _rc_disallowed_bsnes_settings }, + { "cap32", _rc_disallowed_cap32_settings }, { "dolphin-emu", _rc_disallowed_dolphin_settings }, { "DuckStation", _rc_disallowed_duckstation_settings }, { "ecwolf", _rc_disallowed_ecwolf_settings }, diff --git a/deps/rcheevos/src/rhash/hash.c b/deps/rcheevos/src/rhash/hash.c index 4e0765dfcd..41740b1d45 100644 --- a/deps/rcheevos/src/rhash/hash.c +++ b/deps/rcheevos/src/rhash/hash.c @@ -83,6 +83,12 @@ static void filereader_close(void* file_handle) fclose((FILE*)file_handle); } +/* for unit tests - normally would call rc_hash_init_custom_filereader(NULL) */ +void rc_hash_reset_filereader() +{ + filereader = NULL; +} + void rc_hash_init_custom_filereader(struct rc_hash_filereader* reader) { /* initialize with defaults first */ @@ -1535,23 +1541,24 @@ void rc_file_close_buffered_file(void* file_handle) static int rc_hash_file_from_buffer(char hash[33], int console_id, const uint8_t* buffer, size_t buffer_size) { - struct rc_hash_filereader filereader_funcs_old; + struct rc_hash_filereader buffered_filereader_funcs; + struct rc_hash_filereader* old_filereader = filereader; int result; - memcpy(&filereader_funcs_old, &filereader_funcs, sizeof(filereader_funcs)); - - filereader_funcs.open = rc_file_open_buffered_file; - filereader_funcs.close = rc_file_close_buffered_file; - filereader_funcs.read = rc_file_read_buffered_file; - filereader_funcs.seek = rc_file_seek_buffered_file; - filereader_funcs.tell = rc_file_tell_buffered_file; + memset(&buffered_filereader_funcs, 0, sizeof(buffered_filereader_funcs)); + buffered_filereader_funcs.open = rc_file_open_buffered_file; + buffered_filereader_funcs.close = rc_file_close_buffered_file; + buffered_filereader_funcs.read = rc_file_read_buffered_file; + buffered_filereader_funcs.seek = rc_file_seek_buffered_file; + buffered_filereader_funcs.tell = rc_file_tell_buffered_file; + filereader = &buffered_filereader_funcs; rc_buffered_file.data = rc_buffered_file.read_ptr = buffer; rc_buffered_file.data_size = buffer_size; result = rc_hash_generate_from_file(hash, console_id, "[buffered file]"); - memcpy(&filereader_funcs, &filereader_funcs_old, sizeof(filereader_funcs)); + filereader = old_filereader; return result; } @@ -1566,6 +1573,7 @@ int rc_hash_generate_from_buffer(char hash[33], int console_id, const uint8_t* b return rc_hash_error(message); } + case RC_CONSOLE_AMSTRAD_PC: case RC_CONSOLE_APPLE_II: case RC_CONSOLE_ATARI_2600: case RC_CONSOLE_ATARI_JAGUAR: @@ -1578,6 +1586,7 @@ int rc_hash_generate_from_buffer(char hash[33], int console_id, const uint8_t* b case RC_CONSOLE_MAGNAVOX_ODYSSEY2: case RC_CONSOLE_MASTER_SYSTEM: case RC_CONSOLE_MEGA_DRIVE: + case RC_CONSOLE_MEGADUCK: case RC_CONSOLE_MSX: case RC_CONSOLE_NEOGEO_POCKET: case RC_CONSOLE_ORIC: @@ -1851,7 +1860,6 @@ int rc_hash_generate_from_file(char hash[33], int console_id, const char* path) return rc_hash_error(buffer); } - case RC_CONSOLE_APPLE_II: case RC_CONSOLE_ATARI_2600: case RC_CONSOLE_ATARI_JAGUAR: case RC_CONSOLE_COLECOVISION: @@ -1863,6 +1871,7 @@ int rc_hash_generate_from_file(char hash[33], int console_id, const char* path) case RC_CONSOLE_MAGNAVOX_ODYSSEY2: case RC_CONSOLE_MASTER_SYSTEM: case RC_CONSOLE_MEGA_DRIVE: + case RC_CONSOLE_MEGADUCK: case RC_CONSOLE_NEOGEO_POCKET: case RC_CONSOLE_ORIC: case RC_CONSOLE_POKEMON_MINI: @@ -1876,6 +1885,8 @@ int rc_hash_generate_from_file(char hash[33], int console_id, const char* path) /* generic whole-file hash - don't buffer */ return rc_hash_whole_file(hash, path); + case RC_CONSOLE_AMSTRAD_PC: + case RC_CONSOLE_APPLE_II: case RC_CONSOLE_MSX: case RC_CONSOLE_PC8800: /* generic whole-file hash with m3u support - don't buffer */ @@ -1995,6 +2006,9 @@ static void rc_hash_initialize_dsk_iterator(struct rc_hash_iterator* iterator, c { /* FAT-12 5.25" DD (512 byte sectors, 9 sectors per track, 40 tracks per side */ iterator->consoles[0] = RC_CONSOLE_MSX; + + /* AMSDOS 3" - 40 tracks */ + iterator->consoles[1] = RC_CONSOLE_AMSTRAD_PC; } else if (size == 256 * 16 * 35) /* 140KB */ { @@ -2011,6 +2025,7 @@ static void rc_hash_initialize_dsk_iterator(struct rc_hash_iterator* iterator, c /* check MSX first, as Apple II isn't supported by RetroArch, and RAppleWin won't use the iterator */ rc_hash_iterator_append_console(iterator, RC_CONSOLE_MSX); + rc_hash_iterator_append_console(iterator, RC_CONSOLE_AMSTRAD_PC); rc_hash_iterator_append_console(iterator, RC_CONSOLE_APPLE_II); } @@ -2081,7 +2096,7 @@ void rc_hash_initialize_iterator(struct rc_hash_iterator* iterator, const char* } } - /* bin is associated with MegaDrive, Sega32X, Atari 2600, and Watara Supervision. + /* bin is associated with MegaDrive, Sega32X, Atari 2600, Watara Supervision, and MegaDuck. * Since they all use the same hashing algorithm, only specify one of them */ iterator->consoles[0] = RC_CONSOLE_MEGA_DRIVE; }