00001
00002
00003
00004
00005
00006
00007
00008 #include <utility/srec.h>
00009 #include <utility/string.h>
00010
00011 __BEGIN_SYS
00012
00013 void * SREC::entry()
00014 {
00015 srec_t srec;
00016 int pos;
00017
00018 char* s_image = (char *) this;
00019 for (pos = 0; s_image[pos] == 'S'; pos++) {
00020 if ((s_image[pos + 1] == '7') ||
00021 (s_image[pos + 1] == '8') ||
00022 (s_image[pos + 1] == '9')) {
00023 srec_decode(&srec,&s_image[pos]);
00024 return((void *) srec.addr);
00025 }
00026 while (s_image[pos + 1] != 'S')
00027 pos++;
00028 }
00029 return ((void *) (0x0));
00030 }
00031
00032
00033 int SREC::segment_size(int i)
00034 {
00035 int seg_size = 0;
00036 int pos = 0;
00037 srec_t srec;
00038
00039 char* s_image = (char *) this;
00040 if (i > segments())
00041 return -1;
00042
00043 for (pos = 0; s_image[pos] == 'S'; pos++) {
00044 if ((s_image[pos + 1] == '7') ||
00045 (s_image[pos + 1] == '8') ||
00046 (s_image[pos + 1] == '9'))
00047 break;
00048
00049 switch (s_image[pos+1]) {
00050 case '0': break;
00051 case '5': break;
00052 case '1': case '2': case '3':
00053 if (srec_decode(&srec,&s_image[pos]))
00054 seg_size += srec.count;
00055 else
00056 return(-1);
00057 break;
00058
00059 default:
00060 return(-1);
00061 break;
00062 }
00063
00064 while (s_image[pos + 1] != 'S') pos++;
00065 }
00066
00067 return(seg_size);
00068 }
00069
00070 int SREC::load_segment(int i, void * addr)
00071 {
00072 int seg_size = 0;
00073 int pos = 0;
00074 srec_t srec;
00075 void * dst;
00076
00077 char* s_image = (char *) this;
00078 if (i > segments())
00079 return -1;
00080
00081 for (pos = 0; s_image[pos] == 'S'; pos++) {
00082 if ((s_image[pos + 1] == '7') ||
00083 (s_image[pos + 1] == '8') ||
00084 (s_image[pos + 1] == '9'))
00085 break;
00086
00087 switch (s_image[pos+1]) {
00088 case '0': break;
00089 case '5': break;
00090 case '1': case '2': case '3':
00091 if (!(srec_decode(&srec,&s_image[pos])))
00092 return(-1);
00093 else {
00094 dst = (addr) ? ( (void *) (((int) addr) + seg_size) ) : ((void *) srec.addr);
00095 seg_size += srec.count;
00096 memcpy(dst,srec.data,srec.count);
00097 }
00098 break;
00099
00100 default:
00101 return(-1);
00102 break;
00103 }
00104
00105 while (s_image[pos + 1] != 'S') pos++;
00106 }
00107
00108 return(seg_size);
00109 };
00110
00111
00112 bool SREC::srec_decode(srec_t *srec, char *_line)
00113 {
00114 int len, pos = 0, count, alen, sum = 0;
00115 unsigned char *line = (unsigned char *)_line;
00116
00117 for (len = 0; line[len]; len++)
00118 if (line[len] == '\n' || line[len] == '\r')
00119 break;
00120
00121 if ((srec->type = C1(line, 1)) > 9)
00122 return (false);
00123
00124 count = C2(line, 2);
00125 alen = ltab[srec->type];
00126 sum += count;
00127 len -= 4;
00128 line += 4;
00129
00130 srec->addr = 0;
00131 for (pos = 0; pos < alen; pos += 2) {
00132 unsigned char value = C2(line, pos);
00133 srec->addr = (srec->addr << 8) | value;
00134 sum += value;
00135 }
00136
00137 len -= alen;
00138 line += alen;
00139 for (pos = 0; pos < len - 2; pos += 2) {
00140 unsigned char value = C2(line, pos);
00141 srec->data[pos / 2] = value;
00142 sum += value;
00143 }
00144
00145 srec->count = count - (alen / 2) - 1;
00146 sum += C2(line, pos);
00147 if ((sum & 0xff) != 0xff)
00148 return(false);
00149
00150 return(true);
00151 };
00152
00153
00154 signed char SREC::ctab[] = {
00155 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00156 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00157 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00158 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
00159 -1,10,11,12,13,14,15,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00160 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00161 -1,10,11,12,13,14,15,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00162 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00163 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00164 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00165 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00166 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00167 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00168 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00169 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00170 -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,
00171 };
00172
00173 int SREC::ltab[] = {4,4,6,8,0,4,0,8,6,4};
00174
00175
00176 __END_SYS