diff --git a/src/core/cheats.cpp b/src/core/cheats.cpp index bf63780bd..d2f2803f1 100644 --- a/src/core/cheats.cpp +++ b/src/core/cheats.cpp @@ -4035,6 +4035,15 @@ void Cheats::GamesharkCheatCode::Apply() const value += value_increment; } } + else if (write_type == InstructionCode::ExtConstantWrite32) + { + for (u32 i = 0; i < slide_count; i++) + { + DoMemoryWrite(address, value); + address += address_increment; + value += value_increment; + } + } else { ERROR_LOG("Invalid command in second slide parameter 0x{:02X}", static_cast(write_type)); @@ -4107,6 +4116,102 @@ void Cheats::GamesharkCheatCode::Apply() const value += value_change; } } + else if (write_type == InstructionCode::ExtConstantBitClear8) + { + for (u32 i = 0; i < slide_count; i++) + { + const u8 newValue = DoMemoryRead(address) & ~value; + DoMemoryWrite(address, newValue); + if (address_change_negative) + address -= address_change; + else + address += address_change; + if (value_change_negative) + value -= value_change; + else + value += value_change; + } + } + else if (write_type == InstructionCode::ExtConstantBitSet8) + { + for (u32 i = 0; i < slide_count; i++) + { + const u8 newValue = DoMemoryRead(address) | value; + DoMemoryWrite(address, newValue); + if (address_change_negative) + address -= address_change; + else + address += address_change; + if (value_change_negative) + value -= value_change; + else + value += value_change; + } + } + else if (write_type == InstructionCode::ExtConstantBitClear16) + { + for (u32 i = 0; i < slide_count; i++) + { + const u16 newValue = DoMemoryRead(address) & ~value; + DoMemoryWrite(address, newValue); + if (address_change_negative) + address -= address_change; + else + address += address_change; + if (value_change_negative) + value -= value_change; + else + value += value_change; + } + } + else if (write_type == InstructionCode::ExtConstantBitSet16) + { + for (u32 i = 0; i < slide_count; i++) + { + const u16 newValue = DoMemoryRead(address) | value; + DoMemoryWrite(address, newValue); + if (address_change_negative) + address -= address_change; + else + address += address_change; + if (value_change_negative) + value -= value_change; + else + value += value_change; + } + } + else if (write_type == InstructionCode::ExtConstantBitClear32) + { + for (u32 i = 0; i < slide_count; i++) + { + const u32 newValue = DoMemoryRead(address) & ~value; + DoMemoryWrite(address, newValue); + if (address_change_negative) + address -= address_change; + else + address += address_change; + if (value_change_negative) + value -= value_change; + else + value += value_change; + } + } + else if (write_type == InstructionCode::ExtConstantBitSet32) + { + for (u32 i = 0; i < slide_count; i++) + { + const u32 newValue = DoMemoryRead(address) | value; + DoMemoryWrite(address, newValue); + if (address_change_negative) + address -= address_change; + else + address += address_change; + if (value_change_negative) + value -= value_change; + else + value += value_change; + } + } else { ERROR_LOG("Invalid command in second slide parameter 0x{:02X}", static_cast(write_type));