/*
* 'S1' record to hex
- * Accept only S1 and S9.
+ * Accept only S2 and S8.
*/
-char str_shex2bin(unsigned char *s, unsigned char *p, unsigned int *addr, unsigned char *len)
+char str_shex2bin(unsigned char *s, unsigned char *p, unsigned long *addr, unsigned char *len)
{
unsigned char sum = 0;
unsigned char pp;
unsigned int i;
unsigned char bytes;
- unsigned char h, l;
+ unsigned char h, l, l2;
unsigned char c;
// Get Header
if(s[0] != 'S') return TERM_NONSREC;
- if(s[1] == '1') { // Data coire
+ if(s[1] == '2') { // Data coire
for(i = 2; i < 8; i += 2) if(migrate_hex(&s[i]) == 0) return TERM_SRECERR;
bytes = hex2byte(&s[2]);
- if(bytes <= 3) return TERM_SRECERR;
+ if(bytes <= 4) return TERM_SRECERR;
sum = bytes;
h = hex2byte(&s[4]);
l = hex2byte(&s[6]);
- *addr = (h << 8) | l;
- sum = sum + h + l;
- bytes -= 2;
+ l2 = hex2byte(&s[8]);
+ *addr = (h * 65536) | (l << 8) | l2;
+ sum = sum + h + l + l2;
+ bytes -= 3;
*len = bytes - 1;
pp = 0;
- i = 8;
+ i = 10;
while(bytes > 1) {
if(migrate_hex(&s[i]) == 0) return TERM_SRECERR;
c = hex2byte(&s[i]);
/*
* OK!
*/
- } else if(s[1] == '9') {
+ } else if(s[1] == '8') {
if((s[2] != '0') || (s[3] != '3')) return TERM_SRECERR;
for(i = 4; i < 10; i += 2) if(migrate_hex(&s[i]) == 0) return TERM_SRECERR;
sum = 3;
h = hex2byte(&s[4]);
l = hex2byte(&s[6]);
- c = hex2byte(&s[8]);
- *addr = (h << 8) | l;
+ l2 = hex2byte(&s[8]);
+ c = hex2byte(&s[10]);
+ *addr = (h * 65536) | (l << 8) | l2;
*len = 0;
- sum = ~(sum + h + l);
+ sum = ~(sum + h + l + l2);
if(c != sum) return TERM_SUMERR;
return TERM_SRECEND;
} else {
/*
* Set "S1" Record
*/
-unsigned char str_bin2hex(unsigned char *s, unsigned char *p, unsigned int addr, unsigned char len)
+unsigned char str_bin2hex(unsigned char *s, unsigned char *p, unsigned long addr, unsigned char len)
{
unsigned int pp;
unsigned char pv;
unsigned char i;
unsigned char c;
s[0] = 'S';
- s[1] = '1';
+ s[1] = '2';
if(len > 254) len = 254;
i = len + 1;
sum = i;
bin2hex(&s[2], i);
- c = addr >> 8;
+ c = (addr >> 16) & 255;
sum += c;
bin2hex(&s[4], c);
- c = addr & 255;
+ c = (addr >> 8) & 255;
sum += c;
bin2hex(&s[6], c);
- pp = 8;
+ c = addr & 255;
+ sum += c;
+ bin2hex(&s[8], c);
+
+ pp = 10;
for(pv = 0; pv < len ; pv++){
c = p[pv];
sum += c;
extern unsigned char migrate_hex(unsigned char *p);
extern char str_shexheader(unsigned char *s, unsigned char *file);
-extern char str_shex2bin(unsigned char *s, unsigned char *p, unsigned int *addr, unsigned char *len);
+extern char str_shex2bin(unsigned char *s, unsigned char *p, unsigned long *addr, unsigned char *len);
extern unsigned char str_put_shexheader(unsigned char *s, char *filename);
-extern unsigned char str_bin2hex(unsigned char *s, unsigned char *p, unsigned int addr, unsigned char len);
+extern unsigned char str_bin2hex(unsigned char *s, unsigned char *p, unsigned long addr, unsigned char len);
extern unsigned char str_put_shexfooter(unsigned char *s);
extern unsigned char shell_strlen(char *s);
if(shell_strcmp(xarg1, "INT") == 0) { // Internal EEPROM
put_hexheader("INT_EEPROM");
len = sizeof(__radioset_t);
- p = &setup;
+ pv = &setup;
for(pp = 0; pp < sizeof(__radioset_t); pp += 16){
if(len > 16) {
put_hexline(&pv[pp], pp, 16);