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