#include #include #include #include #include #include #define Uses_FileLoad #include "utils.h" /* FileLoad name :: Name of file to read type :: type of file, for checking d :: address for the data n :: nb data read a :: address of the data */ FileLoad::FileLoad(char *name, int type, uchar *d, ushort *n, ushort *a) { fileType = type; data = d; nbytes = n; address = a; error = FALSE; FileName = name; if ( checkFile() ) { readFile(); if ( type == typMCSFile ) swapBits(data, *nbytes); } else error = errFileNotExist; } /* ~FileLoad() */ FileLoad::~FileLoad() { } /* checkFile() */ int FileLoad::checkFile() { return ((access(FileName, 0) == 0) ? TRUE : FALSE); } void FileLoad::readFile() { FILE *fp; char *line = new char[256]; char *dline= new char[256]; ushort addr; int count; int type; ushort start1; ushort start2; ushort start3; int ptr = 0; int sum; int lineCount; ushort word48[3]; int p48 = 0; char *endptr; *nbytes = 0; fp = fopen(FileName, "r"); while (fgets(line, 256, fp)!=NULL) if ( fileType == typLDRFile ) { word48[2 - p48] = swapByte((ushort) strtol(line, &endptr, 0)); if ( ++p48 == 3 ) { memcpy(data+ptr, word48, 6); ptr += 6; p48 = 0; *nbytes = ptr; } } else { for ( int i = 1, j = 0; i < strlen(line); i += 2, j++ ) sscanf(&line[i], "%02x", &dline[j]); lineCount = j - 1; count = dline[0]; addr = (dline[1] << 8) | dline[2]; type = dline[3]; for ( i = 0, sum = 0; i < count + 5; i++ ) sum = (sum + dline[i]) & 0xFF; if ( fileType == typBNMFile && type == 0 ) sum--; if ( sum ) { error = errCheckSum; break; } if ( type == 0 ) { if ( *nbytes == 0 ) start2 = addr; *nbytes = *nbytes + count; for ( i = 4; i < (lineCount - 1); i++ ) data[ptr++] = dline[i]; if ( *nbytes != ptr ) { error = errByteCount; break; } } else if ( type == 1 ) { start3 = addr; } else if ( type == 2 || type == 4 ) { start1 = addr; } } if ( fileType == typLDRFile ) { *address = 0; } else { if ( start1 != start2 || start3 != start2 ) error = errAddress; *address = start3; } fclose(fp); delete line; delete dline; } ushort FileLoad::checkError() { return error; }