private void FillMemorySpace() { FileStream tFileStream = null; if (m_Access == FileAccess.Write) { return; } else if (m_Access == FileAccess.Read) { tFileStream = new FileStream(m_FilePath, m_FileMode, m_Access, FileShare.Read); } else { tFileStream = new FileStream(m_FilePath, m_FileMode, m_Access, FileShare.ReadWrite); } StreamReader tStreamReader = new StreamReader(tFileStream); String tRecordStr = null; try { Boolean bSeeEOF = true; UInt32 tAddress = 0; do { tRecordStr = tStreamReader.ReadLine(); if (null != tRecordStr) { Record tRecord = Record.Parse(tRecordStr); bSeeEOF = false; if (null == tRecord) { throw new IOException("Illegal Hexadecimal Object File."); } switch (tRecord.RecordType) { case Record.Type.DATA_RECORD: m_MemorySpace.Write(tAddress + tRecord.LoadOffset, tRecord.Data); break; case Record.Type.END_OF_FILE_RECORD: bSeeEOF = true; break; case Record.Type.EXTEND_SEGMENT_ADDRESS_RECORD: tAddress = ((ExtendSegmentAddressRecord)tRecord).ExtendSegmentBaseAddress; break; case Record.Type.START_SEGMENT_ADDRESS_RECORD: tAddress = ((StartSegmentAddressRecord)tRecord).StartSegmentAddress; break; case Record.Type.EXTEND_LINEAR_ADDRESS_RECORD: tAddress = ((ExtendLinearAddressRecord)tRecord).UpperLinearBaseAddress; break; case Record.Type.START_LINEAR_ADDRESS_RECORD: tAddress = ((StartLinearAddressRecord)tRecord).StartLinearAddress; StartLinearAddress = tAddress; break; default: break; } } else { break; } }while (!bSeeEOF); } catch (Exception Err) { Err.ToString(); throw Err; } finally { tStreamReader.Close(); } }
//! \brief load memory block from hex file private Boolean LoadMemoryBlockFromHexFile(UInt32 tTargetAddress, ref Byte[] tData, Int32 tSize) { if (m_Access == FileAccess.Write) { return(false); } else if (null == m_FileStream) { return(false); } else if (!m_FileStream.CanRead) { return(false); } VirtualMemorySpace tMemorySpace = new VirtualMemorySpace(); tMemorySpace.SpaceLength = UInt32.MaxValue; StreamReader tStreamReader = null; try { FileStream tFileStream = null; if (m_Access == FileAccess.Read) { tFileStream = new FileStream(m_FilePath, m_FileMode, m_Access, FileShare.Read); } else { tFileStream = new FileStream(m_FilePath, m_FileMode, m_Access, FileShare.ReadWrite); } tStreamReader = new StreamReader(tFileStream); if (null == tStreamReader) { return(false); } } catch (Exception Err) { Err.ToString(); tStreamReader.Close(); return(false); } String tRecordStr = null; try { Boolean bSeeEOF = false; UInt32 tAddress = 0; do { tRecordStr = tStreamReader.ReadLine(); if (null != tRecordStr) { Record tRecord = Record.Parse(tRecordStr); if (null == tRecord) { break; } switch (tRecord.RecordType) { case Record.Type.DATA_RECORD: if ( ((tRecord.LoadOffset + tAddress) < tTargetAddress) && ((tRecord.LoadOffset + tAddress + tRecord.Data.Length) <= tTargetAddress) ) { continue; } else if ( ((tRecord.LoadOffset + tAddress) > tTargetAddress) && ((tTargetAddress + tSize) <= (tRecord.LoadOffset + tAddress)) ) { break; } tMemorySpace.Write(tAddress + tRecord.LoadOffset, tRecord.Data); break; case Record.Type.END_OF_FILE_RECORD: bSeeEOF = true; break; case Record.Type.EXTEND_SEGMENT_ADDRESS_RECORD: tAddress = ((ExtendSegmentAddressRecord)tRecord).ExtendSegmentBaseAddress; break; case Record.Type.START_SEGMENT_ADDRESS_RECORD: tAddress = ((StartSegmentAddressRecord)tRecord).StartSegmentAddress; break; case Record.Type.EXTEND_LINEAR_ADDRESS_RECORD: tAddress = ((ExtendLinearAddressRecord)tRecord).UpperLinearBaseAddress; break; case Record.Type.START_LINEAR_ADDRESS_RECORD: tAddress = ((StartLinearAddressRecord)tRecord).StartLinearAddress; break; default: break; } } }while (!bSeeEOF); } catch (Exception Err) { Err.ToString(); } finally { tStreamReader.Dispose(); } return(tMemorySpace.Read(tTargetAddress, ref tData, tSize)); }