diff --git a/Core/cheats.c b/Core/cheats.c index aee5ba2..9bece72 100644 --- a/Core/cheats.c +++ b/Core/cheats.c @@ -59,7 +59,7 @@ void GB_set_cheats_enabled(GB_gameboy_t *gb, bool enabled) gb->cheat_enabled = enabled; } -void GB_add_cheat(GB_gameboy_t *gb, const char *description, uint16_t address, uint16_t bank, uint8_t value, uint8_t old_value, bool use_old_value, bool enabled) +const GB_cheat_t *GB_add_cheat(GB_gameboy_t *gb, const char *description, uint16_t address, uint16_t bank, uint8_t value, uint8_t old_value, bool use_old_value, bool enabled) { GB_ASSERT_NOT_RUNNING_OTHER_THREAD(gb) @@ -86,11 +86,15 @@ void GB_add_cheat(GB_gameboy_t *gb, const char *description, uint16_t address, u *hash = realloc(*hash, sizeof(GB_cheat_hash_t) + sizeof(cheat) * (*hash)->size); (*hash)->cheats[(*hash)->size - 1] = cheat; } + + return cheat; } const GB_cheat_t *const *GB_get_cheats(GB_gameboy_t *gb, size_t *size) { - *size = gb->cheat_count; + if (size) { + *size = gb->cheat_count; + } return (void *)gb->cheats; } @@ -130,7 +134,7 @@ void GB_remove_cheat(GB_gameboy_t *gb, const GB_cheat_t *cheat) free((void *)cheat); } -bool GB_import_cheat(GB_gameboy_t *gb, const char *cheat, const char *description, bool enabled) +const GB_cheat_t *GB_import_cheat(GB_gameboy_t *gb, const char *cheat, const char *description, bool enabled) { GB_ASSERT_NOT_RUNNING_OTHER_THREAD(gb) @@ -144,8 +148,8 @@ bool GB_import_cheat(GB_gameboy_t *gb, const char *cheat, const char *descriptio if (bank >= 0x80) { bank &= 0xF; } - GB_add_cheat(gb, description, address, bank, value, 0, false, enabled); - return true; + address = __builtin_bswap16(address); + return GB_add_cheat(gb, description, address, bank, value, 0, false, enabled); } } @@ -174,8 +178,7 @@ bool GB_import_cheat(GB_gameboy_t *gb, const char *cheat, const char *descriptio } old_value = (uint8_t)(old_value >> 2) | (uint8_t)(old_value << 6); old_value ^= 0xBA; - GB_add_cheat(gb, description, address, GB_CHEAT_ANY_BANK, value, old_value, true, enabled); - return true; + return GB_add_cheat(gb, description, address, GB_CHEAT_ANY_BANK, value, old_value, true, enabled); } if (sscanf(stripped_cheat, "%02hhx%04hx%c", &value, &address, &dummy) == 2) { @@ -184,11 +187,10 @@ bool GB_import_cheat(GB_gameboy_t *gb, const char *cheat, const char *descriptio if (address > 0x7FFF) { return false; } - GB_add_cheat(gb, description, address, GB_CHEAT_ANY_BANK, value, false, true, enabled); - return true; + return GB_add_cheat(gb, description, address, GB_CHEAT_ANY_BANK, value, false, true, enabled); } } - return false; + return NULL; } void GB_update_cheat(GB_gameboy_t *gb, const GB_cheat_t *_cheat, const char *description, uint16_t address, uint16_t bank, uint8_t value, uint8_t old_value, bool use_old_value, bool enabled) diff --git a/Core/cheats.h b/Core/cheats.h index f9c076c..6577be3 100644 --- a/Core/cheats.h +++ b/Core/cheats.h @@ -6,9 +6,9 @@ typedef struct GB_cheat_s GB_cheat_t; -void GB_add_cheat(GB_gameboy_t *gb, const char *description, uint16_t address, uint16_t bank, uint8_t value, uint8_t old_value, bool use_old_value, bool enabled); +const GB_cheat_t *GB_add_cheat(GB_gameboy_t *gb, const char *description, uint16_t address, uint16_t bank, uint8_t value, uint8_t old_value, bool use_old_value, bool enabled); void GB_update_cheat(GB_gameboy_t *gb, const GB_cheat_t *cheat, const char *description, uint16_t address, uint16_t bank, uint8_t value, uint8_t old_value, bool use_old_value, bool enabled); -bool GB_import_cheat(GB_gameboy_t *gb, const char *cheat, const char *description, bool enabled); +const GB_cheat_t *GB_import_cheat(GB_gameboy_t *gb, const char *cheat, const char *description, bool enabled); const GB_cheat_t *const *GB_get_cheats(GB_gameboy_t *gb, size_t *size); void GB_remove_cheat(GB_gameboy_t *gb, const GB_cheat_t *cheat); bool GB_cheats_enabled(GB_gameboy_t *gb);