Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed
#define STRICT#include "HexFile.h"HexFile::HexFile(){// Constructior}HexFile::~HexFile(){//Destructor}bool HexFile::isValid(){// Returns if file is a valid hex file.// TBD!return true;}bool HexFile::loadHex(char filepath[], bool isMC18){// Populate bufferunsigned char lineDataCount = 0;unsigned long lineAddrHigh = 0;unsigned long lineAddr = 0;unsigned char lineCode = 0;unsigned long fullAddr = 0;strcpy_s(HexFile::filepath,FILE_PATH_SIZE,filepath);HexFile::length = 0;HexFile::addrLower = 0x7FFFFFFF;HexFile::addrUpper = 0;// Prime the bufferfor (int i = 0; i < BUFFER_SIZE; i++) buff[i] = 0xFF;// Try opening fileifstream a_file (filepath);if ( !a_file.is_open() ){// The file could not be openedstrcpy_s(lastError,ERROR_BUFFER_SIZE,"Err! Unable to open file.");return false;}else{// Safely use the file streamchar oneLine[LINE_MAX_SIZE];// For each line, read until eof.while (!a_file.eof()){// read one linea_file.getline(&oneLine[0],LINE_MAX_SIZE);// If valid lineif (strcmp(oneLine,"")!=0 && oneLine[0]==':'){lineDataCount = (unsigned char)HexFile::hexToLong(oneLine,1,2);lineAddr = (unsigned long)HexFile::hexToLong(oneLine,3,4) & 65535;lineCode = (unsigned char)HexFile::hexToLong(oneLine,7,2);fullAddr = (lineAddrHigh * 65536) + lineAddr;switch(lineCode){case 0:HexFile::length +=lineDataCount;if ((fullAddr + lineDataCount - 1) > HexFile::addrUpper) HexFile::addrUpper = fullAddr + lineDataCount - 1;if (lineCode == 0 && fullAddr < HexFile::addrLower) HexFile::addrLower = fullAddr;for (int j = 0; j < lineDataCount; j++){buff[fullAddr] = (unsigned char)HexFile::hexToLong(oneLine,j * 2 + 9, 2); //byte.Parse(oneLine.Substring(j * 2 + 9, 2), System.Globalization.NumberStyles.HexNumber);buff[fullAddr] &= 255; //(byte)255;fullAddr++;}break;case 4:lineAddrHigh = (unsigned long)HexFile::hexToLong(oneLine,9, 4) & 65535; //long.Parse(oneLine.Substring(9, 4), System.Globalization.NumberStyles.HexNumber) & 65535;break;case 1: break; break;}}}}// Force lower addr to startHexFile::addrLower = USER_RESET_ADDR;return true;}unsigned long HexFile::getAddrUpper(void) { return addrUpper; }unsigned long HexFile::getAddrLower(void) { return addrLower; }unsigned long HexFile::getLength(void) { return length; }unsigned char HexFile::getByte(unsigned long addr){if (addr>=BUFFER_SIZE) return 0xFF;return HexFile::buff[addr];}// hex to integerunsigned long HexFile::hexToLong(char *str,unsigned int start,unsigned int length){unsigned long lng = 0;for (unsigned int i=0;i<length;i++){unsigned int newi=i+start;if (newi>=strlen(str)) break;if(str[newi]>='0' && str[newi]<='9') { lng +=(unsigned long)pow(16.0,(double)(length-i-1))*(str[newi]-'0'+00); }else if(str[newi]>='a' && str[newi]<='f'){ lng +=(unsigned long)pow(16.0,(double)(length-i-1))*(str[newi]-'a'+10); }else if(str[newi]>='A' && str[newi]<='F'){ lng +=(unsigned long)pow(16.0,(double)(length-i-1))*(str[newi]-'A'+10); }else { lng = 0; break; }}return lng;}