Mercurial > hg > index.cgi
annotate lwlink/output.c @ 541:5fb1110c043f
Update version number to reflect ongoing development
author | William Astle <lost@l-w.ca> |
---|---|
date | Wed, 17 Aug 2022 17:05:01 -0600 |
parents | 1744f2d1a821 |
children | cde1a5a48636 |
rev | line source |
---|---|
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
1 /* |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
2 output.c |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
3 Copyright © 2009 William Astle |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
4 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
5 This file is part of LWLINK. |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
6 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
7 LWLINK is free software: you can redistribute it and/or modify it under the |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
8 terms of the GNU General Public License as published by the Free Software |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
9 Foundation, either version 3 of the License, or (at your option) any later |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
10 version. |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
11 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
12 This program is distributed in the hope that it will be useful, but WITHOUT |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
15 more details. |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
16 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
17 You should have received a copy of the GNU General Public License along with |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
18 this program. If not, see <http://www.gnu.org/licenses/>. |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
19 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
20 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
21 Actually output the binary |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
22 */ |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
23 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
24 #include <stdio.h> |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
25 #include <stdlib.h> |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
26 #include <string.h> |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
27 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
28 #include "lwlink.h" |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
29 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
30 // this prevents warnings about not using the return value of fwrite() |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
31 // and, theoretically, can be replaced with a function that handles things |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
32 // better in the future |
264
346966cffeef
Clean up various warnings when building under -Wall
William Astle <lost@l-w.ca>
parents:
262
diff
changeset
|
33 //#define writebytes(s, l, c, f) do { int r; r = fwrite((s), (l), (c), (f)); (void)r; } while (0) |
346966cffeef
Clean up various warnings when building under -Wall
William Astle <lost@l-w.ca>
parents:
262
diff
changeset
|
34 #define writebytes(s, l, c, f) do { (void)(fwrite((s), (l), (c), (f)) && 1); } while (0) |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
35 |
148 | 36 void do_output_os9(FILE *of); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
37 void do_output_decb(FILE *of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
38 void do_output_raw(FILE *of); |
523
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
39 void do_output_raw2(FILE *of); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
40 void do_output_lwex0(FILE *of); |
344
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
41 void do_output_srec(FILE *of); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
42 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
43 void do_output(void) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
44 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
45 FILE *of; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
46 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
47 of = fopen(outfile, "wb"); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
48 if (!of) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
49 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
50 fprintf(stderr, "Cannot open output file %s: ", outfile); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
51 perror(""); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
52 exit(1); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
53 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
54 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
55 switch (outformat) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
56 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
57 case OUTPUT_DECB: |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
58 do_output_decb(of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
59 break; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
60 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
61 case OUTPUT_RAW: |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
62 do_output_raw(of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
63 break; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
64 |
523
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
65 case OUTPUT_RAW2: |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
66 do_output_raw2(of); |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
67 break; |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
68 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
69 case OUTPUT_LWEX0: |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
70 do_output_lwex0(of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
71 break; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
72 |
148 | 73 case OUTPUT_OS9: |
74 do_output_os9(of); | |
75 break; | |
76 | |
344
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
77 case OUTPUT_SREC: |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
78 do_output_srec(of); |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
79 break; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
80 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
81 default: |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
82 fprintf(stderr, "Unknown output format doing output!\n"); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
83 exit(111); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
84 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
85 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
86 fclose(of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
87 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
88 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
89 void do_output_decb(FILE *of) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
90 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
91 int sn, sn2; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
92 int cloc, olen; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
93 unsigned char buf[5]; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
94 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
95 for (sn = 0; sn < nsects; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
96 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
97 if (sectlist[sn].ptr -> flags & SECTION_BSS) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
98 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
99 // no output for a BSS section |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
100 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
101 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
102 if (sectlist[sn].ptr -> codesize == 0) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
103 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
104 // don't generate output for a zero size section |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
105 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
106 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
107 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
108 // calculate the length of this output block |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
109 cloc = sectlist[sn].ptr -> loadaddress; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
110 olen = 0; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
111 for (sn2 = sn; sn2 < nsects; sn2++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
112 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
113 // ignore BSS sections |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
114 if (sectlist[sn2].ptr -> flags & SECTION_BSS) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
115 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
116 // ignore zero length sections |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
117 if (sectlist[sn2].ptr -> codesize == 0) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
118 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
119 if (cloc != sectlist[sn2].ptr -> loadaddress) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
120 break; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
121 olen += sectlist[sn2].ptr -> codesize; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
122 cloc += sectlist[sn2].ptr -> codesize; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
123 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
124 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
125 // write a preamble |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
126 buf[0] = 0x00; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
127 buf[1] = olen >> 8; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
128 buf[2] = olen & 0xff; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
129 buf[3] = sectlist[sn].ptr -> loadaddress >> 8; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
130 buf[4] = sectlist[sn].ptr -> loadaddress & 0xff; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
131 writebytes(buf, 1, 5, of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
132 for (; sn < sn2; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
133 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
134 if (sectlist[sn].ptr -> flags & SECTION_BSS) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
135 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
136 if (sectlist[sn].ptr -> codesize == 0) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
137 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
138 writebytes(sectlist[sn].ptr -> code, 1, sectlist[sn].ptr -> codesize, of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
139 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
140 sn--; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
141 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
142 // write a postamble |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
143 buf[0] = 0xff; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
144 buf[1] = 0x00; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
145 buf[2] = 0x00; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
146 buf[3] = linkscript.execaddr >> 8; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
147 buf[4] = linkscript.execaddr & 0xff; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
148 writebytes(buf, 1, 5, of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
149 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
150 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
151 void do_output_raw(FILE *of) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
152 { |
523
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
153 int sn; |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
154 |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
155 |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
156 for (sn = 0; sn < nsects; sn++) |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
157 { |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
158 if (sectlist[sn].ptr -> flags & SECTION_BSS) |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
159 { |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
160 // no output for a BSS section |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
161 continue; |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
162 } |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
163 writebytes(sectlist[sn].ptr -> code, 1, sectlist[sn].ptr -> codesize, of); |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
164 } |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
165 } |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
166 |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
167 void do_output_raw2(FILE *of) |
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
168 { |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
169 int nskips = 0; // used to output blanks for BSS inline |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
170 int sn; |
523
1744f2d1a821
Change behaviour of --format=raw; old behaviour kept for --format=raw2
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
171 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
172 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
173 for (sn = 0; sn < nsects; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
174 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
175 if (sectlist[sn].ptr -> flags & SECTION_BSS) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
176 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
177 // no output for a BSS section |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
178 nskips += sectlist[sn].ptr -> codesize; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
179 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
180 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
181 while (nskips > 0) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
182 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
183 // the "" is not an error - it turns into a single NUL byte! |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
184 writebytes("", 1, 1, of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
185 nskips--; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
186 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
187 writebytes(sectlist[sn].ptr -> code, 1, sectlist[sn].ptr -> codesize, of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
188 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
189 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
190 |
344
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
191 void do_output_srec(FILE *of) |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
192 { |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
193 const int SRECLEN = 16; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
194 |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
195 int sn; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
196 int remainingcodebytes; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
197 |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
198 int codeaddr; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
199 int i; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
200 int recaddr = 0; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
201 int recdlen = 0; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
202 int recsum; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
203 int reccnt = -1; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
204 unsigned char* sectcode; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
205 // no header yet; unnecessary |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
206 |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
207 for (sn = 0; sn < nsects; sn++) // check all sections |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
208 { |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
209 if (sectlist[sn].ptr -> flags & SECTION_BSS) // ignore BSS sections |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
210 continue; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
211 if (sectlist[sn].ptr -> codesize == 0) // ignore empty sections |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
212 continue; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
213 |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
214 recaddr = sectlist[sn].ptr -> loadaddress; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
215 remainingcodebytes = sectlist[sn].ptr -> codesize; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
216 sectcode = sectlist[sn].ptr -> code; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
217 |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
218 while (remainingcodebytes) |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
219 { |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
220 recdlen = (SRECLEN>remainingcodebytes)?remainingcodebytes:SRECLEN; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
221 recsum = recdlen + 3; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
222 codeaddr = recaddr - sectlist[sn].ptr -> loadaddress; |
425
9f0448022f1f
Fix address overflows in SREC and IHEX file formats
William Astle <lost@l-w.ca>
parents:
344
diff
changeset
|
223 fprintf(of, "S1%02X%04X", recdlen + 3, recaddr & 0xffff); |
344
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
224 for (i = 0; i < recdlen; i++) |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
225 { |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
226 fprintf(of, "%02X", sectcode[codeaddr+i]); |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
227 recsum += sectcode[codeaddr+i]; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
228 } |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
229 recsum += (recaddr >> 8) & 0xFF; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
230 recsum += recaddr & 0xFF; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
231 fprintf(of, "%02X\r\n", (unsigned char)(~recsum)); |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
232 reccnt += 1; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
233 remainingcodebytes -= recdlen; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
234 recaddr += recdlen; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
235 } |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
236 } |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
237 // S9 record as a footer to inform about start addr |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
238 recsum = 3; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
239 recsum += (linkscript.execaddr >> 8) & 0xFF; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
240 recsum += linkscript.execaddr & 0xFF; |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
241 fprintf(of,"S903%04X%02X\r\n",linkscript.execaddr,(unsigned char)(~recsum)); |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
242 } |
55c1f9a321e9
Add S-record output support to lwlink
William Astle <lost@l-w.ca>
parents:
320
diff
changeset
|
243 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
244 void do_output_lwex0(FILE *of) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
245 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
246 int nskips = 0; // used to output blanks for BSS inline |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
247 int sn; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
248 int codedatasize = 0; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
249 unsigned char buf[32]; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
250 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
251 // calculate items for the file header |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
252 for (sn = 0; sn < nsects; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
253 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
254 if (sectlist[sn].ptr -> flags & SECTION_BSS) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
255 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
256 // no output for a BSS section |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
257 nskips += sectlist[sn].ptr -> codesize; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
258 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
259 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
260 codedatasize += nskips; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
261 nskips = 0; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
262 codedatasize += sectlist[sn].ptr -> codesize; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
263 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
264 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
265 // output the file header |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
266 buf[0] = 'L'; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
267 buf[1] = 'W'; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
268 buf[2] = 'E'; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
269 buf[3] = 'X'; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
270 buf[4] = 0; // version 0 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
271 buf[5] = 0; // low stack |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
272 buf[6] = linkscript.stacksize / 256; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
273 buf[7] = linkscript.stacksize & 0xff; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
274 buf[8] = nskips / 256; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
275 buf[9] = nskips & 0xff; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
276 buf[10] = codedatasize / 256; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
277 buf[11] = codedatasize & 0xff; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
278 buf[12] = linkscript.execaddr / 256; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
279 buf[13] = linkscript.execaddr & 0xff; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
280 memset(buf + 14, 0, 18); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
281 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
282 writebytes(buf, 1, 32, of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
283 // output the data |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
284 // NOTE: disjoint load addresses will not work correctly!!!!! |
180 | 285 nskips = 0; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
286 for (sn = 0; sn < nsects; sn++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
287 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
288 if (sectlist[sn].ptr -> flags & SECTION_BSS) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
289 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
290 // no output for a BSS section |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
291 nskips += sectlist[sn].ptr -> codesize; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
292 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
293 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
294 while (nskips > 0) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
295 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
296 // the "" is not an error - it turns into a single NUL byte! |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
297 writebytes("", 1, 1, of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
298 nskips--; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
299 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
300 writebytes(sectlist[sn].ptr -> code, 1, sectlist[sn].ptr -> codesize, of); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
301 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
302 } |
148 | 303 |
304 void os9crc(unsigned char crc[3], unsigned char b) | |
305 { | |
306 b ^= crc[0]; | |
307 crc[0] = crc[1]; | |
308 crc[1] = crc[2]; | |
309 crc[1] ^= b >> 7; | |
310 crc[2] = b << 1; | |
311 crc[1] ^= b >> 2; | |
312 crc[2] ^= b << 6; | |
313 b ^= b << 1; | |
314 b ^= b << 2; | |
315 b ^= b << 4; | |
316 if (b & 0x80) | |
317 { | |
318 crc[0] ^= 0x80; | |
319 crc[2] ^= 0x21; | |
320 } | |
321 } | |
322 | |
323 | |
324 void do_output_os9(FILE *of) | |
325 { | |
326 int sn; | |
327 int codedatasize = 0; | |
328 int bsssize = 0; | |
151
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
329 int nameoff; |
148 | 330 int i; |
331 | |
332 unsigned char buf[16]; | |
333 unsigned char crc[3]; | |
334 | |
335 // calculate items for the file header | |
336 for (sn = 0; sn < nsects; sn++) | |
337 { | |
338 if (sectlist[sn].ptr -> flags & SECTION_BSS) | |
339 { | |
340 // no output for a BSS section | |
341 bsssize += sectlist[sn].ptr -> codesize; | |
342 continue; | |
343 } | |
344 codedatasize += sectlist[sn].ptr -> codesize; | |
345 } | |
258
ebda5c96665e
Improved stack handling for os9 target in lwlink
William Astle <lost@l-w.ca>
parents:
180
diff
changeset
|
346 bsssize += linkscript.stacksize; |
148 | 347 |
348 // now bss size is the data size for the module | |
349 // and codesize is the length of the module minus the module header | |
350 // and CRC | |
351 | |
151
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
352 codedatasize += 13; // add in headers |
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
353 nameoff = codedatasize; // we'll put the name at the end |
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
354 codedatasize += 3; // add in CRC |
148 | 355 codedatasize += strlen(linkscript.name); // add in name length |
262
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
356 if (linkscript.edition >= 0) |
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
357 codedatasize += 1; |
148 | 358 |
359 // output the file header | |
360 buf[0] = 0x87; | |
361 buf[1] = 0xCD; | |
362 buf[2] = (codedatasize >> 8) & 0xff; | |
363 buf[3] = codedatasize & 0xff; | |
151
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
364 buf[4] = (nameoff >> 8) & 0xff; |
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
365 buf[5] = nameoff & 0xff; |
148 | 366 buf[6] = (linkscript.modtype << 4) | (linkscript.modlang); |
367 buf[7] = (linkscript.modattr << 4) | (linkscript.modrev); | |
368 buf[8] = (~(buf[0] ^ buf[1] ^ buf[2] ^ buf[3] ^ buf[4] ^ buf[5] ^ buf[6] ^ buf[7])) & 0xff; | |
369 buf[9] = (linkscript.execaddr >> 8) & 0xff; | |
370 buf[10] = linkscript.execaddr & 0xff; | |
371 buf[11] = (bsssize >> 8) & 0xff; | |
372 buf[12] = bsssize & 0xff; | |
373 | |
374 crc[0] = 0xff; | |
375 crc[1] = 0xff; | |
376 crc[2] = 0xff; | |
377 | |
378 os9crc(crc, buf[0]); | |
379 os9crc(crc, buf[1]); | |
380 os9crc(crc, buf[2]); | |
381 os9crc(crc, buf[3]); | |
382 os9crc(crc, buf[4]); | |
383 os9crc(crc, buf[5]); | |
384 os9crc(crc, buf[6]); | |
385 os9crc(crc, buf[7]); | |
386 os9crc(crc, buf[8]); | |
387 os9crc(crc, buf[9]); | |
388 os9crc(crc, buf[10]); | |
389 os9crc(crc, buf[11]); | |
390 os9crc(crc, buf[12]); | |
391 | |
392 | |
393 writebytes(buf, 1, 13, of); | |
394 | |
395 // output the data | |
396 // NOTE: disjoint load addresses will not work correctly!!!!! | |
397 for (sn = 0; sn < nsects; sn++) | |
398 { | |
399 if (sectlist[sn].ptr -> flags & SECTION_BSS) | |
400 { | |
401 // no output for a BSS section | |
402 continue; | |
403 } | |
404 writebytes(sectlist[sn].ptr -> code, 1, sectlist[sn].ptr -> codesize, of); | |
405 for (i = 0; i < sectlist[sn].ptr -> codesize; i++) | |
406 os9crc(crc, sectlist[sn].ptr -> code[i]); | |
407 } | |
408 | |
151
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
409 // output the name |
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
410 for (i = 0; linkscript.name[i + 1]; i++) |
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
411 { |
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
412 writebytes(linkscript.name + i, 1, 1, of); |
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
413 os9crc(crc, linkscript.name[i]); |
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
414 } |
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
415 buf[0] = linkscript.name[i] | 0x80; |
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
416 writebytes(buf, 1, 1, of); |
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
417 os9crc(crc, buf[0]); |
3b58d76ea032
Fix up some minor thinkos in handling the module layout and header
lost@l-w.ca
parents:
148
diff
changeset
|
418 |
262
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
419 if (linkscript.edition >= 0) |
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
420 { |
320
a640ff4ed95f
Fix dumbosity in outputting the edition byte in os9 target
William Astle <lost@l-w.ca>
parents:
264
diff
changeset
|
421 buf[0] = linkscript.edition & 0xff; |
262
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
422 writebytes(buf, 1, 1, of); |
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
423 os9crc(crc, buf[0]); |
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
424 } |
7de7b14ebaee
Add support for os9 module edition byte
William Astle <lost@l-w.ca>
parents:
258
diff
changeset
|
425 |
148 | 426 crc[0] ^= 0xff; |
427 crc[1] ^= 0xff; | |
428 crc[2] ^= 0xff; | |
429 writebytes(crc, 1, 3, of); | |
430 } |