static void GBACheatRefresh(struct mCheatSet* cheats, struct mCheatDevice* device) { struct GBACheatSet* gbaset = (struct GBACheatSet*) cheats; if (cheats->enabled) { _patchROM(device, gbaset); } else { _unpatchROM(device, gbaset); } }
void GBACheatDeviceInit(struct ARMCore* cpu, struct ARMComponent* component) { struct GBACheatDevice* device = (struct GBACheatDevice*) component; device->p = (struct GBA*) cpu->master; size_t i; for (i = 0; i < GBACheatSetsSize(&device->cheats); ++i) { struct GBACheatSet* cheats = *GBACheatSetsGetPointer(&device->cheats, i); _addBreakpoint(device, cheats); _patchROM(device, cheats); } }
void GBACheatRefresh(struct GBACheatDevice* device, struct GBACheatSet* cheats) { if (!cheats->enabled) { return; } bool condition = true; int conditionRemaining = 0; int negativeConditionRemaining = 0; _patchROM(device, cheats); size_t nCodes = GBACheatListSize(&cheats->list); size_t i; for (i = 0; i < nCodes; ++i) { if (conditionRemaining > 0) { --conditionRemaining; if (!condition) { continue; } } else if (negativeConditionRemaining > 0) { conditionRemaining = negativeConditionRemaining - 1; negativeConditionRemaining = 0; condition = !condition; if (!condition) { continue; } } else { condition = true; } struct GBACheat* cheat = GBACheatListGetPointer(&cheats->list, i); int32_t value = 0; int32_t operand = cheat->operand; uint32_t operationsRemaining = cheat->repeat; uint32_t address = cheat->address; bool performAssignment = false; for (; operationsRemaining; --operationsRemaining) { switch (cheat->type) { case CHEAT_ASSIGN: value = operand; performAssignment = true; break; case CHEAT_ASSIGN_INDIRECT: value = operand; address = _readMem(device->p->cpu, address + cheat->addressOffset, 4); performAssignment = true; break; case CHEAT_AND: value = _readMem(device->p->cpu, address, cheat->width) & operand; performAssignment = true; break; case CHEAT_ADD: value = _readMem(device->p->cpu, address, cheat->width) + operand; performAssignment = true; break; case CHEAT_OR: value = _readMem(device->p->cpu, address, cheat->width) | operand; performAssignment = true; break; case CHEAT_IF_EQ: condition = _readMem(device->p->cpu, address, cheat->width) == operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; break; case CHEAT_IF_NE: condition = _readMem(device->p->cpu, address, cheat->width) != operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; break; case CHEAT_IF_LT: condition = _readMem(device->p->cpu, address, cheat->width) < operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; break; case CHEAT_IF_GT: condition = _readMem(device->p->cpu, address, cheat->width) > operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; break; case CHEAT_IF_ULT: condition = (uint32_t) _readMem(device->p->cpu, address, cheat->width) < (uint32_t) operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; break; case CHEAT_IF_UGT: condition = (uint32_t) _readMem(device->p->cpu, address, cheat->width) > (uint32_t) operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; break; case CHEAT_IF_AND: condition = _readMem(device->p->cpu, address, cheat->width) & operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; break; case CHEAT_IF_LAND: condition = _readMem(device->p->cpu, address, cheat->width) && operand; conditionRemaining = cheat->repeat; negativeConditionRemaining = cheat->negativeRepeat; break; } if (performAssignment) { _writeMem(device->p->cpu, address, cheat->width, value); } address += cheat->addressOffset; operand += cheat->operandOffset; } } }
void GBACheatAddSet(struct GBACheatDevice* device, struct GBACheatSet* cheats) { *GBACheatSetsAppend(&device->cheats) = cheats; _addBreakpoint(device, cheats); _patchROM(device, cheats); }
static void GBACheatRefresh(struct mCheatSet* cheats, struct mCheatDevice* device) { struct GBACheatSet* gbaset = (struct GBACheatSet*) cheats; _patchROM(device, gbaset); }
static void GBACheatAddSet(struct mCheatSet* cheats, struct mCheatDevice* device) { struct GBACheatSet* gbaset = (struct GBACheatSet*) cheats; _addBreakpoint(device, gbaset); _patchROM(device, gbaset); }