u32 R5900DebugInterface::read16(u32 address) { if (!isValidAddress(address) || address % 2) return -1; return memRead16(address); }
git_uint32 parseLoad (git_uint32 * pc, LoadReg reg, int mode, TransferSize size, git_sint32 * constVal) { git_uint32 value; switch (mode) { case 0x0: // Constant zero. (Zero bytes) value = 0; goto load_const; case 0x1: // Constant, -80 to 7F. (One byte) value = (git_sint32) ((git_sint8) memRead8(*pc)); *pc += 1; goto load_const; case 0x2: // Constant, -8000 to 7FFF. (Two bytes) value = (git_sint32) ((git_sint16) memRead16(*pc)); *pc += 2; goto load_const; case 0x3: // Constant, any value. (Four bytes) value = memRead32(*pc); *pc += 4; goto load_const; case 0x5: // Contents of address 00 to FF. (One byte) value = memRead8(*pc); *pc += 1; goto load_addr; case 0x6: // Contents of address 0000 to FFFF. (Two bytes) value = memRead16(*pc); *pc += 2; goto load_addr; case 0x7: // Contents of any address. (Four bytes) value = memRead32(*pc); *pc += 4; goto load_addr; case 0x8: // Value popped off stack. (Zero bytes) goto load_stack; case 0x9: // Call frame local at address 00 to FF. (One byte) value = memRead8(*pc); *pc += 1; goto load_local; case 0xA: // Call frame local at address 0000 to FFFF. (Two bytes) value = memRead16(*pc); *pc += 2; goto load_local; case 0xB: // Call frame local at any address. (Four bytes) value = memRead32(*pc); *pc += 4; goto load_local; case 0xD: // Contents of RAM address 00 to FF. (One byte) value = memRead8(*pc) + gRamStart; *pc += 1; goto load_addr; case 0xE: // Contents of RAM address 0000 to FFFF. (Two bytes) value = memRead16(*pc) + gRamStart; *pc += 2; goto load_addr; case 0xF: // Contents of RAM, any address. (Four bytes) value = memRead32(*pc) + gRamStart; *pc += 4; goto load_addr; default: // Illegal addressing mode abortCompilation(); break; // ------------------------------------------------------ load_const: if (constVal) { *constVal = value; return 1; } else { emitCode (label_L1_const + reg); emitData (value); } break; load_stack: emitCode (label_L1_stack + reg); break; load_addr: if (value < gRamStart) { if (size == size32) value = memRead32(value); else if (size == size16) value = memRead16(value); else value = memRead8(value); goto load_const; } switch (size) { case size8: assert (reg == reg_L1); emitCode (label_L1_addr8); break; case size16: assert (reg == reg_L1); emitCode (label_L1_addr16); break; case size32: emitCode (label_L1_addr + reg); break; } emitData (value); break; load_local: emitCode (label_L1_local + reg); emitData (value / 4); // Convert byte offset to word offset. break; } return 0; }
void DisassemblyData::createLines() { lines.clear(); lineAddresses.clear(); u32 pos = address; u32 end = address+size; u32 maxChars = DisassemblyManager::getMaxParamChars(); std::string currentLine; u32 currentLineStart = pos; int lineCount = 0; if (type == DATATYPE_ASCII) { bool inString = false; while (pos < end) { u8 b = memRead8(pos++); if (b >= 0x20 && b <= 0x7F) { if (currentLine.size()+1 >= maxChars) { if (inString == true) currentLine += "\""; DataEntry entry = {currentLine,pos-1-currentLineStart,lineCount++}; lines[currentLineStart] = entry; lineAddresses.push_back(currentLineStart); currentLine = ""; currentLineStart = pos-1; inString = false; } if (inString == false) currentLine += "\""; currentLine += (char)b; inString = true; } else { char buffer[64]; if (pos == end && b == 0) strcpy(buffer,"0"); else sprintf(buffer,"0x%02X",b); if (currentLine.size()+strlen(buffer) >= maxChars) { if (inString == true) currentLine += "\""; DataEntry entry = {currentLine,pos-1-currentLineStart,lineCount++}; lines[currentLineStart] = entry; lineAddresses.push_back(currentLineStart); currentLine = ""; currentLineStart = pos-1; inString = false; } bool comma = false; if (currentLine.size() != 0) comma = true; if (inString) currentLine += "\""; if (comma) currentLine += ","; currentLine += buffer; inString = false; } } if (inString == true) currentLine += "\""; if (currentLine.size() != 0) { DataEntry entry = {currentLine,pos-currentLineStart,lineCount++}; lines[currentLineStart] = entry; lineAddresses.push_back(currentLineStart); } } else { while (pos < end) { char buffer[64]; u32 value; u32 currentPos = pos; switch (type) { case DATATYPE_BYTE: value = memRead8(pos); sprintf(buffer,"0x%02X",value); pos++; break; case DATATYPE_HALFWORD: value = memRead16(pos); sprintf(buffer,"0x%04X",value); pos += 2; break; case DATATYPE_WORD: { value = memRead32(pos); const std::string label = symbolMap.GetLabelString(value); if (!label.empty()) sprintf(buffer,"%s",label.c_str()); else sprintf(buffer,"0x%08X",value); pos += 4; } break; default: break; } size_t len = strlen(buffer); if (currentLine.size() != 0 && currentLine.size()+len >= maxChars) { DataEntry entry = {currentLine,currentPos-currentLineStart,lineCount++}; lines[currentLineStart] = entry; lineAddresses.push_back(currentLineStart); currentLine = ""; currentLineStart = currentPos; } if (currentLine.size() != 0) currentLine += ","; currentLine += buffer; } if (currentLine.size() != 0) { DataEntry entry = {currentLine,pos-currentLineStart,lineCount++}; lines[currentLineStart] = entry; lineAddresses.push_back(currentLineStart); } } }
void parseCatchStub (git_uint32 * pc, int * modes) { git_uint32 tokenVal; git_sint32 branchVal; git_uint32 branchConst = 0; Block stubCode; switch (modes[0]) { case 0x0: // Discard goto store_discard; case 0x5: // Contents of address 00 to FF. (One byte) tokenVal = memRead8(*pc); *pc += 1; goto store_addr; case 0x6: // Contents of address 0000 to FFFF. (Two bytes) tokenVal = memRead16(*pc); *pc += 2; goto store_addr; case 0x7: // Contents of any address. (Four bytes) tokenVal = memRead32(*pc); *pc += 4; goto store_addr; case 0x8: // Value popped off stack. (Zero bytes) goto store_stack; case 0x9: // Call frame local at store_address 00 to FF. (One byte) tokenVal = memRead8(*pc); *pc += 1; goto store_local; case 0xA: // Call frame local at store_address 0000 to FFFF. (Two bytes) tokenVal = memRead16(*pc); *pc += 2; goto store_local; case 0xB: // Call frame local at any store_address. (Four bytes) tokenVal = memRead32(*pc); *pc += 4; goto store_local; case 0xD: // Contents of RAM address 00 to FF. (One byte) tokenVal = memRead8(*pc) + gRamStart; *pc += 1; goto store_addr; case 0xE: // Contents of RAM address 0000 to FFFF. (Two bytes) tokenVal = memRead16(*pc) + gRamStart; *pc += 2; goto store_addr; case 0xF: // Contents of RAM, any address. (Four bytes) tokenVal = memRead32(*pc) + gRamStart; *pc += 4; goto store_addr; // ------------------------------------------------------ store_discard: branchConst = parseLoad (pc, reg_L1, modes[1], size32, &branchVal); emitCode (label_catch_stub_discard); break; store_stack: branchConst = parseLoad (pc, reg_L1, modes[1], size32, &branchVal); emitCode (label_catch_stub_stack); break; store_addr: branchConst = parseLoad (pc, reg_L1, modes[1], size32, &branchVal); emitCode (label_catch_stub_addr); emitData (tokenVal); break; store_local: branchConst = parseLoad (pc, reg_L1, modes[1], size32, &branchVal); emitCode (label_catch_stub_local); emitData (tokenVal); break; } // The catch stub ends with the address to go to on throw, // which is after the branch, so we don't know what it is yet. emitData (0); stubCode = peekAtEmittedStuff (1); // Emit the branch taken after storing the catch token. if (branchConst) { if (branchVal == 0) emitCode (label_jump_return0); else if (branchVal == 1) emitCode (label_jump_return1); else emitConstBranch (label_jump_const, *pc + branchVal - 2); } else { emitCode (label_jump_var); emitData (*pc); } // Fix up the throw return address *stubCode = *pc; nextInstructionIsReferenced (); }
static void parseStub (git_uint32 * pc, int mode, Label discardOp) { git_uint32 value; switch (mode) { case 0x0: // Discard goto store_discard; case 0x5: // Contents of address 00 to FF. (One byte) value = memRead8(*pc); *pc += 1; goto store_addr; case 0x6: // Contents of address 0000 to FFFF. (Two bytes) value = memRead16(*pc); *pc += 2; goto store_addr; case 0x7: // Contents of any address. (Four bytes) value = memRead32(*pc); *pc += 4; goto store_addr; case 0x8: // Value popped off stack. (Zero bytes) goto store_stack; case 0x9: // Call frame local at store_address 00 to FF. (One byte) value = memRead8(*pc); *pc += 1; goto store_local; case 0xA: // Call frame local at store_address 0000 to FFFF. (Two bytes) value = memRead16(*pc); *pc += 2; goto store_local; case 0xB: // Call frame local at any store_address. (Four bytes) value = memRead32(*pc); *pc += 4; goto store_local; case 0xD: // Contents of RAM address 00 to FF. (One byte) value = memRead8(*pc) + gRamStart; *pc += 1; goto store_addr; case 0xE: // Contents of RAM address 0000 to FFFF. (Two bytes) value = memRead16(*pc) + gRamStart; *pc += 2; goto store_addr; case 0xF: // Contents of RAM, any address. (Four bytes) value = memRead32(*pc) + gRamStart; *pc += 4; goto store_addr; // ------------------------------------------------------ store_discard: emitCode (discardOp); break; store_stack: emitCode (discardOp + (label_call_stub_stack - label_call_stub_discard)); break; store_addr: emitCode (discardOp + (label_call_stub_addr - label_call_stub_discard)); emitData (value); break; store_local: emitCode (discardOp + (label_call_stub_local - label_call_stub_discard)); emitData (value); break; } // Every call stub ends with the glulx return address. emitData (*pc); // ...which means that every call stub references the next instruction. nextInstructionIsReferenced (); }
void parseStore (git_uint32 * pc, StoreReg reg, int mode, TransferSize size) { git_uint32 value; switch (mode) { case 0x0: // Discard break; case 0x5: // Contents of address 00 to FF. (One byte) value = memRead8(*pc); *pc += 1; goto store_addr; case 0x6: // Contents of address 0000 to FFFF. (Two bytes) value = memRead16(*pc); *pc += 2; goto store_addr; case 0x7: // Contents of any address. (Four bytes) value = memRead32(*pc); *pc += 4; goto store_addr; case 0x8: // Value popped off stack. (Zero bytes) goto store_stack; case 0x9: // Call frame local at store_address 00 to FF. (One byte) value = memRead8(*pc); *pc += 1; goto store_local; case 0xA: // Call frame local at store_address 0000 to FFFF. (Two bytes) value = memRead16(*pc); *pc += 2; goto store_local; case 0xB: // Call frame local at any store_address. (Four bytes) value = memRead32(*pc); *pc += 4; goto store_local; case 0xD: // Contents of RAM address 00 to FF. (One byte) value = memRead8(*pc) + gRamStart; *pc += 1; goto store_addr; case 0xE: // Contents of RAM address 0000 to FFFF. (Two bytes) value = memRead16(*pc) + gRamStart; *pc += 2; goto store_addr; case 0xF: // Contents of RAM, any address. (Four bytes) value = memRead32(*pc) + gRamStart; *pc += 4; goto store_addr; // ------------------------------------------------------ store_stack: emitCode (reg == reg_S1 ? label_S1_stack : label_S2_stack); break; store_addr: if (size == size32) { emitCode (reg == reg_S1 ? label_S1_addr : label_S2_addr); } else { assert (reg == reg_S1); emitCode (size == size16 ? label_S1_addr16 : label_S1_addr8); } emitData (value); break; store_local: emitCode (reg == reg_S1 ? label_S1_local : label_S2_local); emitData (value / 4); // Convert byte offset to word offset. break; } }
void handle_extended_t(IniPatch *p) { if (SkipCount > 0) { SkipCount--; } else switch (PrevCheatType) { case 0x3040: // vvvvvvvv 00000000 Inc { u32 mem = memRead32(PrevCheatAddr); memWrite32(PrevCheatAddr, mem + (p->addr)); PrevCheatType = 0; break; } case 0x3050: // vvvvvvvv 00000000 Dec { u32 mem = memRead32(PrevCheatAddr); memWrite32(PrevCheatAddr, mem - (p->addr)); PrevCheatType = 0; break; } case 0x4000: // vvvvvvvv iiiiiiii for (u32 i = 0; i < IterationCount; i++) { memWrite32((u32)(PrevCheatAddr + (i * IterationIncrement)), (u32)(p->addr + ((u32)p->data * i))); } PrevCheatType = 0; break; case 0x5000: // dddddddd iiiiiiii for (u32 i = 0; i < IterationCount; i++) { u8 mem = memRead8(PrevCheatAddr + i); memWrite8(((u32)p->data) + i, mem); } PrevCheatType = 0; break; case 0x6000: // 000Xnnnn iiiiiiii if (IterationIncrement == 0x0) { //LastType = ((u32)p->addr & 0x000F0000) >> 16; u32 mem = memRead32(PrevCheatAddr); if ((u32)p->addr < 0x100) { LastType = 0x0; PrevCheatAddr = mem + ((u32)p->addr); } else if ((u32)p->addr < 0x1000) { LastType = 0x1; PrevCheatAddr = mem + ((u32)p->addr * 2); } else { LastType = 0x2; PrevCheatAddr = mem + ((u32)p->addr * 4); } // Check if needed to read another pointer PrevCheatType = 0; if (((mem & 0x0FFFFFFF) & 0x3FFFFFFC) != 0) { switch (LastType) { case 0x0: memWrite8(PrevCheatAddr, (u8)p->data & 0xFF); break; case 0x1: memWrite16(PrevCheatAddr, (u16)p->data & 0x0FFFF); break; case 0x2: memWrite32(PrevCheatAddr, (u32)p->data); break; default: break; } } } else { // Get Number of pointers if (((u32)p->addr & 0x0000FFFF) == 0) IterationCount = 1; else IterationCount = (u32)p->addr & 0x0000FFFF; // Read first pointer LastType = ((u32)p->addr & 0x000F0000) >> 16; u32 mem = memRead32(PrevCheatAddr); PrevCheatAddr = mem + (u32)p->data; IterationCount--; // Check if needed to read another pointer if (IterationCount == 0) { PrevCheatType = 0; if (((mem & 0x0FFFFFFF) & 0x3FFFFFFC) != 0) writeCheat(); } else { if (((mem & 0x0FFFFFFF) & 0x3FFFFFFC) != 0) PrevCheatType = 0; else PrevCheatType = 0x6001; } } break; case 0x6001: // 000Xnnnn iiiiiiii { // Read first pointer u32 mem = memRead32(PrevCheatAddr & 0x0FFFFFFF); PrevCheatAddr = mem + (u32)p->addr; IterationCount--; // Check if needed to read another pointer if (IterationCount == 0) { PrevCheatType = 0; if (((mem & 0x0FFFFFFF) & 0x3FFFFFFC) != 0) writeCheat(); } else { mem = memRead32(PrevCheatAddr); PrevCheatAddr = mem + (u32)p->data; IterationCount--; if (IterationCount == 0) { PrevCheatType = 0; if (((mem & 0x0FFFFFFF) & 0x3FFFFFFC) != 0) writeCheat(); } } } break; default: if ((p->addr & 0xF0000000) == 0x00000000) // 0aaaaaaa 0000000vv { memWrite8(p->addr & 0x0FFFFFFF, (u8)p->data & 0x000000FF); PrevCheatType = 0; } else if ((p->addr & 0xF0000000) == 0x10000000) // 1aaaaaaa 0000vvvv { memWrite16(p->addr & 0x0FFFFFFF, (u16)p->data & 0x0000FFFF); PrevCheatType = 0; } else if ((p->addr & 0xF0000000) == 0x20000000) // 2aaaaaaa vvvvvvvv { memWrite32(p->addr & 0x0FFFFFFF, (u32)p->data); PrevCheatType = 0; } else if ((p->addr & 0xFFFF0000) == 0x30000000) // 300000vv 0aaaaaaa Inc { u8 mem = memRead8((u32)p->data); memWrite8((u32)p->data, mem + (p->addr & 0x000000FF)); PrevCheatType = 0; } else if ((p->addr & 0xFFFF0000) == 0x30100000) // 301000vv 0aaaaaaa Dec { u8 mem = memRead8((u32)p->data); memWrite8((u32)p->data, mem - (p->addr & 0x000000FF)); PrevCheatType = 0; } else if ((p->addr & 0xFFFF0000) == 0x30200000) // 3020vvvv 0aaaaaaa Inc { u16 mem = memRead16((u32)p->data); memWrite16((u32)p->data, mem + (p->addr & 0x0000FFFF)); PrevCheatType = 0; } else if ((p->addr & 0xFFFF0000) == 0x30300000) // 3030vvvv 0aaaaaaa Dec { u16 mem = memRead16((u32)p->data); memWrite16((u32)p->data, mem - (p->addr & 0x0000FFFF)); PrevCheatType = 0; } else if ((p->addr & 0xFFFF0000) == 0x30400000) // 30400000 0aaaaaaa Inc + Another line { PrevCheatType = 0x3040; PrevCheatAddr = (u32)p->data; } else if ((p->addr & 0xFFFF0000) == 0x30500000) // 30500000 0aaaaaaa Inc + Another line { PrevCheatType = 0x3050; PrevCheatAddr = (u32)p->data; } else if ((p->addr & 0xF0000000) == 0x40000000) // 4aaaaaaa nnnnssss + Another line { IterationCount = ((u32)p->data & 0xFFFF0000) / 0x10000; IterationIncrement = ((u32)p->data & 0x0000FFFF) * 4; PrevCheatAddr = (u32)p->addr & 0x0FFFFFFF; PrevCheatType = 0x4000; } else if ((p->addr & 0xF0000000) == 0x50000000) // 5sssssss nnnnnnnn + Another line { PrevCheatAddr = (u32)p->addr & 0x0FFFFFFF; IterationCount = ((u32)p->data); PrevCheatType = 0x5000; } else if ((p->addr & 0xF0000000) == 0x60000000) // 6aaaaaaa 000000vv + Another line/s { PrevCheatAddr = (u32)p->addr & 0x0FFFFFFF; IterationIncrement = ((u32)p->data); IterationCount = 0; PrevCheatType = 0x6000; } else if ((p->addr & 0xF0000000) == 0x70000000) { if ((p->data & 0x00F00000) == 0x00000000) // 7aaaaaaa 000000vv { u8 mem = memRead8((u32)p->addr & 0x0FFFFFFF); memWrite8((u32)p->addr & 0x0FFFFFFF, (u8)(mem | (p->data & 0x000000FF))); } else if ((p->data & 0x00F00000) == 0x00100000) // 7aaaaaaa 0010vvvv { u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); memWrite16((u32)p->addr & 0x0FFFFFFF, (u16)(mem | (p->data & 0x0000FFFF))); } else if ((p->data & 0x00F00000) == 0x00200000) // 7aaaaaaa 002000vv { u8 mem = memRead8((u32)p->addr & 0x0FFFFFFF); memWrite8((u32)p->addr & 0x0FFFFFFF, (u8)(mem & (p->data & 0x000000FF))); } else if ((p->data & 0x00F00000) == 0x00300000) // 7aaaaaaa 0030vvvv { u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); memWrite16((u32)p->addr & 0x0FFFFFFF, (u16)(mem & (p->data & 0x0000FFFF))); } else if ((p->data & 0x00F00000) == 0x00400000) // 7aaaaaaa 004000vv { u8 mem = memRead8((u32)p->addr & 0x0FFFFFFF); memWrite8((u32)p->addr & 0x0FFFFFFF, (u8)(mem ^ (p->data & 0x000000FF))); } else if ((p->data & 0x00F00000) == 0x00500000) // 7aaaaaaa 0050vvvv { u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); memWrite16((u32)p->addr & 0x0FFFFFFF, (u16)(mem ^ (p->data & 0x0000FFFF))); } } else if (p->addr < 0xE0000000) { if (((u32)p->data & 0xFFFF0000) == 0x00000000) // Daaaaaaa 0000dddd { u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); if (mem != (0x0000FFFF & (u32)p->data)) { SkipCount = 1; } PrevCheatType = 0; } else if (((u32)p->data & 0xFFFF0000) == 0x00100000) // Daaaaaaa 0010dddd { u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); if (mem == (0x0000FFFF & (u32)p->data)) { SkipCount = 1; } PrevCheatType = 0; } else if (((u32)p->data & 0xFFFF0000) == 0x00200000) // Daaaaaaa 0020dddd { u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); if (mem >= (0x0000FFFF & (u32)p->data)) { SkipCount = 1; } PrevCheatType = 0; } else if (((u32)p->data & 0xFFFF0000) == 0x00300000) // Daaaaaaa 0030dddd { u16 mem = memRead16((u32)p->addr & 0x0FFFFFFF); if (mem <= (0x0000FFFF & (u32)p->data)) { SkipCount = 1; } PrevCheatType = 0; } } else if (p->addr < 0xF0000000) { if (((u32)p->data & 0xF0000000) == 0x00000000) // Ezyyvvvv 0aaaaaaa { u8 z = ((u32)p->addr & 0x0F000000) / 0x01000000; if (z == 0) // E0yyvvvv 0aaaaaaa { u16 mem = memRead16((u32)p->data & 0x0FFFFFFF); if (mem != (0x0000FFFF & (u32)p->addr)) { SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; } PrevCheatType = 0; } else if (z == 1) // E1yy00vv 0aaaaaaa { u8 mem = memRead8((u32)p->data & 0x0FFFFFFF); if (mem != (0x000000FF & (u32)p->addr)) { SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; } PrevCheatType = 0; } } else if (((u32)p->data & 0xF0000000) == 0x10000000) // Ezyyvvvv 1aaaaaaa { u8 z = ((u32)p->addr & 0x0F000000) / 0x01000000; if (z == 0) // E0yyvvvv 1aaaaaaa { u16 mem = memRead16((u32)p->data & 0x0FFFFFFF); if (mem == (0x0000FFFF & (u32)p->addr)) { SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; } PrevCheatType = 0; } else if (z == 1) // E1yy00vv 1aaaaaaa { u8 mem = memRead8((u32)p->data & 0x0FFFFFFF); if (mem == (0x000000FF & (u32)p->addr)) { SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; } PrevCheatType = 0; } } else if (((u32)p->data & 0xF0000000) == 0x20000000) // Ezyyvvvv 2aaaaaaa { u8 z = ((u32)p->addr & 0x0F000000) / 0x01000000; if (z == 0) // E0yyvvvv 2aaaaaaa { u16 mem = memRead16((u32)p->data & 0x0FFFFFFF); if (mem >= (0x0000FFFF & (u32)p->addr)) { SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; } PrevCheatType = 0; } else if (z == 1) // E1yy00vv 2aaaaaaa { u8 mem = memRead8((u32)p->data & 0x0FFFFFFF); if (mem >= (0x000000FF & (u32)p->addr)) { SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; } PrevCheatType = 0; } } else if (((u32)p->data & 0xF0000000) == 0x30000000) // Ezyyvvvv 3aaaaaaa { u8 z = ((u32)p->addr & 0x0F000000) / 0x01000000; if (z == 0) // E0yyvvvv 3aaaaaaa { u16 mem = memRead16((u32)p->data & 0x0FFFFFFF); if (mem <= (0x0000FFFF & (u32)p->addr)) { SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; } PrevCheatType = 0; } else if (z == 1) // E1yy00vv 3aaaaaaa { u8 mem = memRead8((u32)p->data & 0x0FFFFFFF); if (mem <= (0x000000FF & (u32)p->addr)) { SkipCount = ((u32)p->addr & 0x00FF0000) / 0x10000; } PrevCheatType = 0; } } } } }
void _ApplyPatch(IniPatch *p) { if (p->enabled == 0) return; switch (p->cpu) { case CPU_EE: switch (p->type) { case BYTE_T: if (memRead8(p->addr) != (u8)p->data) memWrite8(p->addr, (u8)p->data); break; case SHORT_T: if (memRead16(p->addr) != (u16)p->data) memWrite16(p->addr, (u16)p->data); break; case WORD_T: if (memRead32(p->addr) != (u32)p->data) memWrite32(p->addr, (u32)p->data); break; case DOUBLE_T: u64 mem; memRead64(p->addr, &mem); if (mem != p->data) memWrite64(p->addr, &p->data); break; case EXTENDED_T: handle_extended_t(p); break; default: break; } break; case CPU_IOP: switch (p->type) { case BYTE_T: if (iopMemRead8(p->addr) != (u8)p->data) iopMemWrite8(p->addr, (u8)p->data); break; case SHORT_T: if (iopMemRead16(p->addr) != (u16)p->data) iopMemWrite16(p->addr, (u16)p->data); break; case WORD_T: if (iopMemRead32(p->addr) != (u32)p->data) iopMemWrite32(p->addr, (u32)p->data); break; default: break; } break; default: break; } }