Beispiel #1
0
void Mempak::ReadFrom(int Control, int Address, BYTE * Buffer)
{
	if (Address < 0x8000)
	{
		if (hMempakFile[Control] == NULL)
		{
			LoadMempak(Control);
		}
		memcpy(Buffer, &Mempaks[Control][Address], 0x20);
	}
	else
	{
		memset(Buffer, 0, 0x20);
		/* Rumble pack area */
	}

	Buffer[0x20] = CalculateCrc(Buffer);
}
Beispiel #2
0
void Mempak::WriteTo(int Control, int Address, BYTE * Buffer)
{
	DWORD dwWritten;

	if (Address < 0x8000)
	{
		if (hMempakFile[Control] == NULL)
		{
			LoadMempak(Control);
		}
		memcpy(&Mempaks[Control][Address], Buffer, 0x20);

		SetFilePointer(hMempakFile[Control], 0,NULL,FILE_BEGIN);
		WriteFile(hMempakFile[Control], &Mempaks[Control][0], 0x8000, &dwWritten, NULL);
	}
	else
	{
		/* Rumble pack area */
	}
	Buffer[0x20] = CalculateCrc(Buffer);
}
Beispiel #3
0
/****************************************************************************
 * Verifies flash
 *
 * \param  StartAddress: Pointer to program start address
 * \param  ProgLen: Pointer to Program length in bytes 
 * \param  crc : Pointer to CRC
 * \return      
 *****************************************************************************/
void CHexManager::VerifyFlash(unsigned int* StartAdress, unsigned int* ProgLen, unsigned short* crc)
{
	unsigned short HexRecLen;
	char HexRec[255];
	T_HEX_RECORD HexRecordSt;
	unsigned int VirtualFlashAdrs;
	unsigned int ProgAddress;
	
	// Virtual Flash Erase (Set all bytes to 0xFF)
	memset((void*)VirtualFlash, 0xFF, sizeof(VirtualFlash));


	// Start decoding the hex file and write into virtual flash
	// Reset file pointer.
	fseek(HexFilePtr, 0, 0);

	// Reset max address and min address.
	HexRecordSt.MaxAddress = 0;
	HexRecordSt.MinAddress = 0xFFFFFFFF;

    while((HexRecLen = GetNextHexRecord(&HexRec[0], 255)) != 0)
	{
		HexRecordSt.RecDataLen = HexRec[0];
		HexRecordSt.RecType = HexRec[3];	
		HexRecordSt.Data = (unsigned char*)&HexRec[4];

		switch(HexRecordSt.RecType)
		{

			case DATA_RECORD:  //Record Type 00, data record.
				HexRecordSt.Address = (((HexRec[1] << 8) & 0x0000FF00) | (HexRec[2] & 0x000000FF)) & (0x0000FFFF);
				HexRecordSt.Address = HexRecordSt.Address + HexRecordSt.ExtLinAddress + HexRecordSt.ExtSegAddress;
				
				ProgAddress = PA_TO_KVA0(HexRecordSt.Address);

				if(ProgAddress < BOOT_SECTOR_BEGIN) // Make sure we are not writing boot sector.
				{
					if(HexRecordSt.MaxAddress < (ProgAddress + HexRecordSt.RecDataLen))
					{
						HexRecordSt.MaxAddress = ProgAddress + HexRecordSt.RecDataLen;
					}

					if(HexRecordSt.MinAddress > ProgAddress)
					{
						HexRecordSt.MinAddress = ProgAddress;
					}
				
					VirtualFlashAdrs = PA_TO_VFA(ProgAddress); // Program address to local virtual flash address

					memcpy((void *)&VirtualFlash[VirtualFlashAdrs], HexRecordSt.Data, HexRecordSt.RecDataLen);
				}
				break;
			
			case EXT_SEG_ADRS_RECORD:  // Record Type 02, defines 4 to 19 of the data address.
				HexRecordSt.ExtSegAddress = ((HexRecordSt.Data[0] << 16) & 0x00FF0000) | ((HexRecordSt.Data[1] << 8) & 0x0000FF00);				
				HexRecordSt.ExtLinAddress = 0;
				break;
					
			case EXT_LIN_ADRS_RECORD:
				HexRecordSt.ExtLinAddress = ((HexRecordSt.Data[0] << 24) & 0xFF000000) | ((HexRecordSt.Data[1] << 16) & 0x00FF0000);
				HexRecordSt.ExtSegAddress = 0;
				break;


			case END_OF_FILE_RECORD:  //Record Type 01
			default: 
				HexRecordSt.ExtSegAddress = 0;
				HexRecordSt.ExtLinAddress = 0;
				break;
		}	
	}

	HexRecordSt.MinAddress -= HexRecordSt.MinAddress % 4;
	HexRecordSt.MaxAddress += HexRecordSt.MaxAddress % 4;

	*ProgLen = HexRecordSt.MaxAddress - HexRecordSt.MinAddress;
	*StartAdress = HexRecordSt.MinAddress;
	VirtualFlashAdrs = PA_TO_VFA(HexRecordSt.MinAddress);
	*crc = CalculateCrc((char*)&VirtualFlash[VirtualFlashAdrs], *ProgLen);	
}