Пример #1
0
u32 R5900DebugInterface::read16(u32 address)
{
	if (!isValidAddress(address) || address % 2)
		return -1;

	return memRead16(address);
}
Пример #2
0
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;
}
Пример #3
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);
		}
	}
}
Пример #4
0
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 ();
}
Пример #5
0
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 ();
}
Пример #6
0
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;
    }
}
Пример #7
0
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;
				}
			}
		}
	}
}
Пример #8
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;
	}
}