| 1223 | template <typename Memory> |
| 1224 | requires std::is_base_of_v<MemoryInterface, Memory> |
| 1225 | void Patch::handle_extended_t(const PatchCommand* p, Memory& memory, ExtendedState& state) |
| 1226 | { |
| 1227 | if (state.skip_count > 0) |
| 1228 | { |
| 1229 | state.skip_count--; |
| 1230 | } |
| 1231 | else |
| 1232 | switch (state.prev_cheat_type) |
| 1233 | { |
| 1234 | case 0x3040: // vvvvvvvv 00000000 Inc |
| 1235 | { |
| 1236 | u32 mem = memory.Read32(state.prev_cheat_addr); |
| 1237 | memory.Write32(state.prev_cheat_addr, mem + (p->addr)); |
| 1238 | state.prev_cheat_type = 0; |
| 1239 | break; |
| 1240 | } |
| 1241 | |
| 1242 | case 0x3050: // vvvvvvvv 00000000 Dec |
| 1243 | { |
| 1244 | u32 mem = memory.Read32(state.prev_cheat_addr); |
| 1245 | memory.Write32(state.prev_cheat_addr, mem - (p->addr)); |
| 1246 | state.prev_cheat_type = 0; |
| 1247 | break; |
| 1248 | } |
| 1249 | |
| 1250 | case 0x4000: // vvvvvvvv iiiiiiii |
| 1251 | for (u32 i = 0; i < state.iteration_count; i++) |
| 1252 | { |
| 1253 | memory.IdempotentWrite32((u32)(state.prev_cheat_addr + (i * state.iteration_increment)), (u32)(p->addr + ((u32)p->data * i))); |
| 1254 | } |
| 1255 | state.prev_cheat_type = 0; |
| 1256 | break; |
| 1257 | |
| 1258 | case 0x5000: // bbbbbbbb 00000000 |
| 1259 | for (u32 i = 0; i < state.iteration_count; i++) |
| 1260 | { |
| 1261 | u8 mem = memory.Read8(state.prev_cheat_addr + i); |
| 1262 | memory.IdempotentWrite8((p->addr + i) & 0x0FFFFFFF, mem); |
| 1263 | } |
| 1264 | state.prev_cheat_type = 0; |
| 1265 | break; |
| 1266 | |
| 1267 | case 0x6000: // 000Xnnnn iiiiiiii |
| 1268 | { |
| 1269 | state.null_pointer_encountered = false; |
| 1270 | |
| 1271 | // Get Number of pointers |
| 1272 | if (((u32)p->addr & 0x0000FFFF) == 0) |
| 1273 | state.iteration_count = 1; |
| 1274 | else |
| 1275 | state.iteration_count = (u32)p->addr & 0x0000FFFF; |
| 1276 | |
| 1277 | // Read first pointer |
| 1278 | state.last_type = ((u32)p->addr & 0x000F0000) >> 16; |
| 1279 | u32 mem = memory.Read32(state.prev_cheat_addr); |
| 1280 | if (((mem & 0x0FFFFFFF) & 0x3FFFFFFC) == 0) |
| 1281 | state.null_pointer_encountered = true; |
| 1282 |
nothing calls this directly
no test coverage detected