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); }
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); }
/**************************************************************************** * 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); }