-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathreadhex.c
134 lines (114 loc) · 2.97 KB
/
readhex.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//-----------------------------------------------------------------------------
extern void load_word ( unsigned int add, unsigned char hi, unsigned char lo );
//-----------------------------------------------------------------------------
int readhex ( FILE *fp )
{
char gstring[80];
char newline[1024];
unsigned char hexline[1024];
#define RAMMASK 0xFFFF
//unsigned int errors;
//unsigned int addhigh;
unsigned int add;
unsigned int data;
unsigned int ra;
//unsigned int rb;
//unsigned int pages;
//unsigned int page;
unsigned int line;
unsigned char checksum;
unsigned int len;
unsigned int hexlen;
unsigned int maxadd;
unsigned char t;
maxadd=0;
//addhigh=0;
line=0;
while(fgets(newline,sizeof(newline)-1,fp))
{
line++;
//printf("%s",newline);
if(newline[0]!=':')
{
printf("Syntax error <%u> no colon\n",line);
continue;
}
gstring[0]=newline[1];
gstring[1]=newline[2];
gstring[2]=0;
len=strtoul(gstring,NULL,16);
for(ra=0;ra<(len+5);ra++)
{
gstring[0]=newline[(ra<<1)+1];
gstring[1]=newline[(ra<<1)+2];
gstring[2]=0;
hexline[ra]=(unsigned char)strtoul(gstring,NULL,16);
}
checksum=0;
for(ra=0;ra<(len+5);ra++) checksum+=hexline[ra];
//checksum&=0xFF;
if(checksum)
{
printf("checksum error <%u>\n",line);
}
add=hexline[1]; add<<=8;
add|=hexline[2];
//add|=addhigh;
if(add>RAMMASK)
{
printf("address too big 0x%08X\n",add);
//return(1);
continue;
}
t=hexline[3];
if(t!=0x02)
{
if(len&1)
{
printf("bad length\n");
return(1);
}
}
//:0011223344
//;llaaaattdddddd
//01234567890
switch(t)
{
case 0x00:
{
for(ra=0;ra<len;ra+=4)
{
if(add>RAMMASK)
{
printf("address too big 0x%08X\n",add);
break;
}
load_word(add++,hexline[ra+4+0],hexline[ra+4+1]);
if(add>maxadd) maxadd=add;
}
break;
}
case 0x01:
{
// printf("End of data\n");
break;
}
default:
{
printf("UNKNOWN type %02X <%u>\n",t,line);
break;
}
}
if(t==0x01) break; //end of data
}
//printf("%u lines processed\n",line);
//printf("%08X\n",maxadd);
//for(ra=0;ra<maxadd;ra+=4)
//{
//printf("0x%08X: 0x%08X\n",ra,ram[ra>>2]);
//}
return(0);
}