Mercurial > hg > index.cgi
comparison lwlink/output.c @ 548:cde1a5a48636
Add IHEX output format to lwlink
At the request of Craig Iannello who provided a small bribe, IHEX output
format is now available in lwlink. At least a first pass version of it.
author | William Astle <lost@l-w.ca> |
---|---|
date | Thu, 16 Mar 2023 16:59:50 -0600 |
parents | 1744f2d1a821 |
children |
comparison
equal
deleted
inserted
replaced
547:33e37b3d98cf | 548:cde1a5a48636 |
---|---|
37 void do_output_decb(FILE *of); | 37 void do_output_decb(FILE *of); |
38 void do_output_raw(FILE *of); | 38 void do_output_raw(FILE *of); |
39 void do_output_raw2(FILE *of); | 39 void do_output_raw2(FILE *of); |
40 void do_output_lwex0(FILE *of); | 40 void do_output_lwex0(FILE *of); |
41 void do_output_srec(FILE *of); | 41 void do_output_srec(FILE *of); |
42 void do_output_ihex(FILE *of); | |
42 | 43 |
43 void do_output(void) | 44 void do_output(void) |
44 { | 45 { |
45 FILE *of; | 46 FILE *of; |
46 | 47 |
74 do_output_os9(of); | 75 do_output_os9(of); |
75 break; | 76 break; |
76 | 77 |
77 case OUTPUT_SREC: | 78 case OUTPUT_SREC: |
78 do_output_srec(of); | 79 do_output_srec(of); |
80 break; | |
81 | |
82 case OUTPUT_IHEX: | |
83 do_output_ihex(of); | |
79 break; | 84 break; |
80 | 85 |
81 default: | 86 default: |
82 fprintf(stderr, "Unknown output format doing output!\n"); | 87 fprintf(stderr, "Unknown output format doing output!\n"); |
83 exit(111); | 88 exit(111); |
237 // S9 record as a footer to inform about start addr | 242 // S9 record as a footer to inform about start addr |
238 recsum = 3; | 243 recsum = 3; |
239 recsum += (linkscript.execaddr >> 8) & 0xFF; | 244 recsum += (linkscript.execaddr >> 8) & 0xFF; |
240 recsum += linkscript.execaddr & 0xFF; | 245 recsum += linkscript.execaddr & 0xFF; |
241 fprintf(of,"S903%04X%02X\r\n",linkscript.execaddr,(unsigned char)(~recsum)); | 246 fprintf(of,"S903%04X%02X\r\n",linkscript.execaddr,(unsigned char)(~recsum)); |
247 } | |
248 | |
249 void do_output_ihex(FILE *of) | |
250 { | |
251 const int IRECLEN = 16; | |
252 | |
253 int sn; | |
254 int remainingcodebytes; | |
255 | |
256 int codeaddr; | |
257 int i; | |
258 int recaddr = 0; | |
259 int recdlen = 0; | |
260 int recsum; | |
261 int reccnt = -1; | |
262 unsigned char* sectcode; | |
263 // no header yet; unnecessary | |
264 | |
265 for (sn = 0; sn < nsects; sn++) // check all sections | |
266 { | |
267 if (sectlist[sn].ptr -> flags & SECTION_BSS) // ignore BSS sections | |
268 continue; | |
269 if (sectlist[sn].ptr -> codesize == 0) // ignore empty sections | |
270 continue; | |
271 | |
272 recaddr = sectlist[sn].ptr -> loadaddress; | |
273 remainingcodebytes = sectlist[sn].ptr -> codesize; | |
274 sectcode = sectlist[sn].ptr -> code; | |
275 | |
276 while (remainingcodebytes) | |
277 { | |
278 recdlen = (IRECLEN>remainingcodebytes)?remainingcodebytes:IRECLEN; | |
279 recsum = recdlen; | |
280 codeaddr = recaddr - sectlist[sn].ptr -> loadaddress; | |
281 fprintf(of, ":%02X%04X00", recdlen, recaddr & 0xffff); | |
282 for (i = 0; i < recdlen; i++) | |
283 { | |
284 fprintf(of, "%02X", sectcode[codeaddr+i]); | |
285 recsum += sectcode[codeaddr+i]; | |
286 } | |
287 recsum += (recaddr >> 8) & 0xFF; | |
288 recsum += recaddr & 0xFF; | |
289 fprintf(of, "%02X\r\n", (unsigned char)(256 - recsum)); | |
290 reccnt += 1; | |
291 remainingcodebytes -= recdlen; | |
292 recaddr += recdlen; | |
293 } | |
294 } | |
295 if (reccnt > 0) | |
296 { | |
297 fprintf(of, ":00%04X01FF\r\n", linkscript.execaddr); | |
298 } | |
242 } | 299 } |
243 | 300 |
244 void do_output_lwex0(FILE *of) | 301 void do_output_lwex0(FILE *of) |
245 { | 302 { |
246 int nskips = 0; // used to output blanks for BSS inline | 303 int nskips = 0; // used to output blanks for BSS inline |