Exemple #1
0
static glui32 * DecodeVMUstring (git_uint32 addr)
{
    glui32 end;
    glui32 * data;
    glui32 * c;
    
    // The string must be a Unicode string.
    if (memRead8(addr) != 0xE2)
    {
        fatalError ("Illegal string type passed to Glk function");
    }
    addr += 4;
    
    end = addr;
    while (memRead32(end) != 0)
        end += 4;
    
    data = glulx_malloc (end - addr + 4);
    if (data == NULL)
        fatalError ("Couldn't allocate string");

    c = data;
    while (addr < end)
    {
        *c++ = memRead32(addr);
        addr += 4;
    }
    *c = 0;
    
    return data;
}
Exemple #2
0
u32 R5900DebugInterface::read32(u32 address)
{
	if (!isValidAddress(address) || address % 4)
		return -1;

	return memRead32(address);
}
Exemple #3
0
static glui32 *grab_temp_i_array(glui32 addr, glui32 len, int passin)
{
  arrayref_t *arref = NULL;
  glui32 *arr = NULL;
  glui32 ix, addr2;

  if (len) {
    arr = (glui32 *)glulx_malloc(len * sizeof(glui32));
    arref = (arrayref_t *)glulx_malloc(sizeof(arrayref_t));
    if (!arr || !arref) 
      fatalError("Unable to allocate space for array argument to Glk call.");

    arref->array = arr;
    arref->addr = addr;
    arref->elemsize = 4;
    arref->retained = FALSE;
    arref->len = len;
    arref->next = arrays;
    arrays = arref;

    if (passin) {
      for (ix=0, addr2=addr; ix<len; ix++, addr2+=4) {
        arr[ix] = memRead32(addr2);
      }
    }
  }

  return arr;
}
Exemple #4
0
static void gitMain (const git_uint8 * game, git_uint32 gameSize, git_uint32 cacheSize, git_uint32 undoSize)
{
    git_uint32 version;
    enum IOMode ioMode = IO_NULL;
    
    init_accel ();

    // Initialise the Glk dispatch layer.
    git_init_dispatch();

    // Set various globals.    
    gPeephole = 1;
    gDebug = 0;
    
    // Load the gamefile into memory
    // and initialise undo records.
    initMemory (game, gameSize);
    initUndo (undoSize);
    
    // Check that we're compatible with the
    // glulx spec version that the game uses.
    version = memRead32 (4);
    if (version == 0x010000 && version <= 0x0100FF)
    {
        // We support version 1.0.0 even though it's
        // officially obsolete. The only significant
        // difference is the lack of I/O modes. In 1.0,
        // all output goes directly to the Glk library.
        ioMode = IO_GLK;
    }
    else if (version == 0x020000 && version <= 0x0200FF)
    {
        // We support version 2.0, which most people currently use.
    }
    else if (version >= 0x030000 && version <= 0x0300FF)
    {
        // We support version 3.0, which adds Unicode functionality.
    }
    else if (version >= 0x030100 && version <= 0x0301FF)
    {
        // We support version 3.1, which adds some memory-management opcodes.
    }
    else
    {
        fatalError ("Can't run this game, because it uses a newer version "
            "of the gamefile format than Git understands. You should check "
            "whether a newer version of Git is available.");
    }
    
    // Call the top-level function.
    startProgram (cacheSize, ioMode);
    
    // Shut everything down cleanly.
    shutdownUndo();
    shutdownMemory();
}
static u32 computeHash(u32 address, u32 size)
{
	u32 end = address+size;
	u32 hash = 0xBACD7814;
	while (address < end)
	{
		hash += memRead32(address);
		address += 4;
	}
	return hash;
}
static void clarifyResults(const SignatureHeader *cfg, ResultList *list, const unsigned char *sigFile)
{
  static unsigned char *mask = NULL;
  if (!mask) {
    mask = malloc(cfg->sig_width / 8);
    memset(mask, 0xFF, cfg->sig_width / 8);
  }

  ClarifyEntry *clarify = malloc(sizeof(ClarifyEntry) * list->results);

  for (int i = 0; i < list->results; i++) {
    list->distances[i] = cfg->sig_width - list->issl_scores[i];
    
    const char *sigDocname = (const char *)(sigFile + ((size_t)cfg->sig_record_size * list->docids[i]));
    
    list->metadata[i].docname = sigDocname;
    
    unsigned const char *sigMetadata = (unsigned const char *)(sigDocname + cfg->max_name_len + 1);
    
    list->metadata[i].uniqueTerms = memRead32(sigMetadata + 0*4);
    list->metadata[i].documentCharLength = memRead32(sigMetadata + 1*4);
    list->metadata[i].totalTerms = memRead32(sigMetadata + 2*4);
    list->metadata[i].quality = memRead32(sigMetadata + 3*4);
    list->metadata[i].offsetBegin = memRead32(sigMetadata + 4*4);
    list->metadata[i].offsetEnd = memRead32(sigMetadata + 5*4);
    list->metadata[i].unused7 = memRead32(sigMetadata + 6*4);
    list->metadata[i].unused8 = memRead32(sigMetadata + 7*4);

    clarify[i].list = list;
    clarify[i].i = i;
  }
  qsort(clarify, list->results, sizeof(ClarifyEntry), compareResultLists);

  ResultList newlist = createResultList(list->results);

  for (int i = 0; i < list->results; i++) {
    int j = clarify[i].i;
    newlist.issl_scores[i] = list->issl_scores[j];
    newlist.distances[i] = list->distances[j];
    newlist.docids[i] = list->docids[j];
    newlist.metadata[i] = list->metadata[j];
  }

  destroyResultList(list);
  *list = newlist;

  free(clarify);
}
Exemple #7
0
static glui32 get_prop(glui32 obj, glui32 id)
{
    glui32 cla = 0;
    glui32 prop;
    glui32 call_argv[2];

    if (id & 0xFFFF0000) {
        cla = memRead32(classes_table+((id & 0xFFFF) * 4));
        ARG(call_argv, 2, 0) = obj;
        ARG(call_argv, 2, 1) = cla;
        if (func_5_oc__cl(2, call_argv) == 0)
            return 0;

        id >>= 16;
        obj = cla;
    }
/***********************************************************
 Function: r--simple read memory command
           adpt for gu
 Input:    the start address
 return:  void
************************************************************/
void r(unsigned int * newMemAddr32)
{
    memRead32(newMemAddr32);
}
Exemple #9
0
static int obj_in_class(glui32 obj)
{
    /* This checks whether obj is contained in Class, not whether
       it is a member of Class. */
    return (memRead32(obj + 13 + num_attr_bytes) == class_metaclass);
}
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);
		}
	}
}
Exemple #11
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;
}
Exemple #12
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 ();
}
Exemple #13
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 ();
}
Exemple #14
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;
    }
}
Exemple #15
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;
				}
			}
		}
	}
}
Exemple #16
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;
	}
}