Mercurial > hg > index.cgi
annotate lwasm/output.c @ 455:cad5937314cb
Add operandsizewarning pragma
Add operandsizewarning pragma that will raise warnings for certain operands
if the operand size could be smaller. (Long branch used instead of short
branch, for instance.)
author | William Astle <lost@l-w.ca> |
---|---|
date | Fri, 16 Feb 2018 22:53:46 -0700 |
parents | 999ae00d0919 |
children | 733fd05ca2a8 |
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, 2010 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 LWASM. |
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 LWASM 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 Contains the code for actually outputting the assembled code |
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 #include <errno.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
|
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 <string.h> |
360
ade217fd76a5
Use #define instead of const int to avoid issues with some compilers
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
26 |
ade217fd76a5
Use #define instead of const int to avoid issues with some compilers
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
27 #ifndef _MSC_VER |
ade217fd76a5
Use #define instead of const int to avoid issues with some compilers
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
28 #include <unistd.h> // for unlink |
ade217fd76a5
Use #define instead of const int to avoid issues with some compilers
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
29 #endif |
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
|
30 |
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 #include <lw_alloc.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
|
32 #include <lw_expr.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
|
33 |
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
|
34 #include "lwasm.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
|
35 |
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
|
36 void write_code_raw(asmstate_t *as, 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
|
37 void write_code_decb(asmstate_t *as, FILE *of); |
406 | 38 void write_code_BASIC(asmstate_t *as, 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
|
39 void write_code_rawrel(asmstate_t *as, 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
|
40 void write_code_obj(asmstate_t *as, 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
|
41 void write_code_os9(asmstate_t *as, FILE *of); |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
42 void write_code_hex(asmstate_t *as, FILE *of); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
43 void write_code_srec(asmstate_t *as, FILE *of); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
44 void write_code_ihex(asmstate_t *as, FILE *of); |
432
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
45 void write_code_lwmod(asmstate_t *as, 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
|
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 // this prevents warnings about not using the return value of fwrite() |
221 | 48 // r++ prevents the "set but not used" warnings; should be optimized out |
49 #define writebytes(s, l, c, f) do { int r; r = fwrite((s), (l), (c), (f)); r++; } 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
|
50 |
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 void do_output(asmstate_t *as) |
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 { |
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 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
|
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 if (as -> errorcount > 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
|
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 fprintf(stderr, "Not doing output due to assembly errors.\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
|
58 return; |
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 } |
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 of = fopen(as -> output_file, "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
|
62 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
|
63 { |
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 fprintf(stderr, "Cannot open '%s' for output", as -> output_file); |
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
|
65 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
|
66 return; |
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
|
67 } |
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
|
68 |
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 switch (as -> output_format) |
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 { |
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 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
|
72 write_code_raw(as, 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
|
73 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
|
74 |
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
|
75 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
|
76 write_code_decb(as, 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
|
77 break; |
406 | 78 |
79 case OUTPUT_BASIC: | |
80 write_code_BASIC(as, of); | |
81 break; | |
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
|
82 |
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 case OUTPUT_RAWREL: |
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 write_code_rawrel(as, 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
|
85 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
|
86 |
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 case OUTPUT_OBJ: |
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 write_code_obj(as, 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
|
89 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
|
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 case OUTPUT_OS9: |
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 write_code_os9(as, 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
|
93 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
|
94 |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
95 case OUTPUT_HEX: |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
96 write_code_hex(as, of); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
97 break; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
98 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
99 case OUTPUT_SREC: |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
100 write_code_srec(as, of); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
101 break; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
102 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
103 case OUTPUT_IHEX: |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
104 write_code_ihex(as, of); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
105 break; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
106 |
432
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
107 case OUTPUT_LWMOD: |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
108 write_code_lwmod(as, of); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
109 break; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
110 |
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 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
|
112 fprintf(stderr, "BUG: unrecognized output format when generating output file\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
|
113 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
|
114 unlink(as -> output_file); |
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 return; |
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 } |
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 |
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 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
|
119 } |
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 |
406 | 121 int write_code_BASIC_fprintf(FILE *of, int linelength, int *linenumber, int value) |
122 { | |
123 if (linelength > 247) | |
124 { | |
125 fprintf(of, "\n"); | |
126 linelength = fprintf(of, "%d DATA ", *linenumber); | |
127 *linenumber += 10; | |
128 } | |
129 else | |
130 { | |
131 linelength += fprintf(of, ","); | |
132 } | |
133 linelength += fprintf(of, "%d", value); | |
134 | |
135 return linelength; | |
136 } | |
137 | |
138 void write_code_BASIC(asmstate_t *as, FILE *of) | |
139 { | |
140 line_t *cl; | |
141 line_t *startblock = as -> line_head; | |
142 line_t *endblock; | |
143 int linenumber, linelength, startaddress, lastaddress, address; | |
144 int outidx; | |
145 | |
146 fprintf(of, "10 READ A,B\n"); | |
147 fprintf(of, "20 IF A=-1 THEN 70\n"); | |
148 fprintf(of, "30 FOR C = A TO B\n"); | |
149 fprintf(of, "40 READ D:POKE C,D\n"); | |
150 fprintf(of, "50 NEXT C\n"); | |
151 fprintf(of, "60 GOTO 10\n"); | |
152 | |
153 if (as -> execaddr == 0) | |
154 { | |
155 fprintf(of, "70 END"); | |
156 } | |
157 else | |
158 { | |
159 fprintf(of, "70 EXEC %d", as -> execaddr); | |
160 } | |
161 | |
162 linenumber = 80; | |
163 linelength = 255; | |
164 | |
165 while(startblock) | |
166 { | |
167 startaddress = -1; | |
168 endblock = NULL; | |
169 | |
170 for (cl = startblock; cl; cl = cl -> next) | |
171 { | |
172 if (cl -> outputl < 0) | |
173 continue; | |
174 | |
175 address = lw_expr_intval(cl -> addr); | |
176 | |
177 if (startaddress == -1) | |
178 { | |
179 startaddress = address; | |
180 lastaddress = address + cl -> outputl - 1; | |
181 } | |
182 else | |
183 { | |
184 if (lastaddress != address - 1) | |
185 { | |
186 endblock = cl; | |
187 break; | |
188 } | |
189 | |
190 lastaddress += cl -> outputl; | |
191 } | |
192 } | |
193 | |
410
7f538053492c
Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
194 if (startaddress != -1) |
406 | 195 { |
410
7f538053492c
Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
196 linelength = write_code_BASIC_fprintf(of, linelength, &linenumber, startaddress); |
7f538053492c
Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
197 linelength = write_code_BASIC_fprintf(of, linelength, &linenumber, lastaddress); |
7f538053492c
Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
198 |
7f538053492c
Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
199 for (cl = startblock; cl != endblock; cl = cl -> next) |
7f538053492c
Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
200 { |
7f538053492c
Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
201 if (cl -> outputl < 0) |
7f538053492c
Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
202 continue; |
406 | 203 |
410
7f538053492c
Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
204 for (outidx=0; outidx<cl -> outputl; outidx++) |
7f538053492c
Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
205 { |
7f538053492c
Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
206 linelength = write_code_BASIC_fprintf(of, linelength, &linenumber, cl -> output[outidx]); |
7f538053492c
Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
207 } |
406 | 208 } |
209 } | |
210 | |
211 startblock = cl; | |
212 } | |
213 | |
214 linelength = write_code_BASIC_fprintf(of, linelength, &linenumber, -1); | |
215 linelength = write_code_BASIC_fprintf(of, linelength, &linenumber, -1); | |
216 | |
217 fprintf(of, "\n"); | |
218 } | |
219 | |
220 | |
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
|
221 /* |
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
|
222 rawrel output treats an ORG directive as an offset from the start of 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
|
223 file. Undefined results will occur if an ORG directive moves the output |
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
|
224 pointer backward. This particular implementation uses "fseek" to handle |
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
|
225 ORG requests and to skip over RMBs. |
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
|
226 |
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
|
227 This simple brain damanged method simply does an fseek before outputting |
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
|
228 each instruction. |
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
|
229 */ |
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
|
230 void write_code_rawrel(asmstate_t *as, 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
|
231 { |
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
|
232 line_t *cl; |
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
|
233 |
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
|
234 for (cl = as -> line_head; cl; cl = cl -> next) |
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
|
235 { |
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
|
236 if (cl -> outputl <= 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
|
237 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
|
238 |
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
|
239 fseek(of, lw_expr_intval(cl -> addr), SEEK_SET); |
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
|
240 writebytes(cl -> output, cl -> outputl, 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
|
241 } |
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
|
242 } |
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
|
243 |
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 /* |
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 raw merely writes all the bytes directly to the file as is. ORG is just a |
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 reference for the assembler to handle absolute references. Multiple ORG |
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 statements will produce mostly useless results |
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 */ |
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 void write_code_raw(asmstate_t *as, 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
|
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 line_t *cl; |
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 |
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 for (cl = as -> line_head; cl; cl = cl -> next) |
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 { |
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 if (cl -> len > 0 && cl -> outputl == 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
|
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
|
257 int i; |
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 for (i = 0; i < cl -> len; i++) |
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 writebytes("\0", 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
|
260 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
|
261 } |
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 else if (cl -> outputl > 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
|
263 writebytes(cl -> output, cl -> outputl, 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
|
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 } |
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 |
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 |
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 /* |
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 OS9 target also just writes all the bytes in order. No need for anything |
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 else. |
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 */ |
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 void write_code_os9(asmstate_t *as, 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
|
273 { |
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 line_t *cl; |
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 |
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 for (cl = as -> line_head; cl; cl = cl -> next) |
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 { |
127
d92b9c968731
Removed protection from outputting code outside os9 module in os9 target
lost@l-w.ca
parents:
12
diff
changeset
|
278 // if (cl -> inmod == 0) |
d92b9c968731
Removed protection from outputting code outside os9 module in os9 target
lost@l-w.ca
parents:
12
diff
changeset
|
279 // continue; |
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
|
280 if (cl -> len > 0 && cl -> outputl == 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
|
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 int i; |
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 for (i = 0; i < cl -> len; i++) |
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 writebytes("\0", 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
|
285 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
|
286 } |
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 else if (cl -> outputl > 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
|
288 writebytes(cl -> output, cl -> outputl, 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
|
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 } |
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 |
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 void write_code_decb(asmstate_t *as, 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
|
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 long preambloc; |
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 line_t *cl; |
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 int blocklen = -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
|
297 int nextcalc = -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
|
298 unsigned char outbuf[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
|
299 int caddr; |
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 |
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 for (cl = as -> line_head; cl; cl = cl -> next) |
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 { |
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
|
303 if (cl -> outputl < 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
|
304 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
|
305 caddr = lw_expr_intval(cl -> addr); |
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
|
306 if (caddr != nextcalc && cl -> outputl > 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
|
307 { |
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
|
308 // need preamble here |
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
|
309 if (blocklen > 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
|
310 { |
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
|
311 // update previous preamble if needed |
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
|
312 fseek(of, preambloc, SEEK_SET); |
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
|
313 outbuf[0] = (blocklen >> 8) & 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
|
314 outbuf[1] = blocklen & 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
|
315 writebytes(outbuf, 2, 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
|
316 fseek(of, 0, SEEK_END); |
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
|
317 } |
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
|
318 blocklen = 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
|
319 nextcalc = caddr; |
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
|
320 outbuf[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
|
321 outbuf[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
|
322 outbuf[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
|
323 outbuf[3] = (nextcalc >> 8) & 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
|
324 outbuf[4] = nextcalc & 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
|
325 preambloc = ftell(of) + 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
|
326 writebytes(outbuf, 5, 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
|
327 } |
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
|
328 nextcalc += cl -> outputl; |
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
|
329 writebytes(cl -> output, cl -> outputl, 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
|
330 blocklen += cl -> outputl; |
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
|
331 } |
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
|
332 if (blocklen > 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
|
333 { |
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
|
334 fseek(of, preambloc, SEEK_SET); |
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
|
335 outbuf[0] = (blocklen >> 8) & 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
|
336 outbuf[1] = blocklen & 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
|
337 writebytes(outbuf, 2, 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
|
338 fseek(of, 0, SEEK_END); |
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
|
339 } |
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
|
340 |
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
|
341 // now write 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
|
342 outbuf[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
|
343 outbuf[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
|
344 outbuf[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
|
345 outbuf[3] = (as -> execaddr >> 8) & 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
|
346 outbuf[4] = (as -> 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
|
347 writebytes(outbuf, 5, 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
|
348 } |
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
|
349 |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
350 int fetch_output_byte(line_t *cl, char *value, int *addr) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
351 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
352 static int outidx = 0; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
353 static int lastaddr = -2; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
354 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
355 // try to read next byte in current line's output field |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
356 if ((cl -> outputl > 0) && (outidx < cl -> outputl)) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
357 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
358 *addr = lw_expr_intval(cl -> addr) + outidx; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
359 *value = *(cl -> output + outidx++); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
360 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
361 // this byte follows the previous byte (contiguous, rc = 1) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
362 if (*addr == lastaddr + 1) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
363 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
364 lastaddr = *addr; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
365 return 1; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
366 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
367 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
368 // this byte does not follow prev byte (disjoint, rc = -1) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
369 else |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
370 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
371 lastaddr = *addr; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
372 return -1; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
373 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
374 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
375 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
376 // no (more) output from this line (rc = 0) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
377 else |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
378 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
379 outidx = 0; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
380 return 0; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
381 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
382 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
383 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
384 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
385 /* a simple ASCII hex file format */ |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
386 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
387 void write_code_hex(asmstate_t *as, FILE *of) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
388 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
389 const int RECLEN = 16; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
390 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
391 line_t *cl; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
392 char outbyte; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
393 int outaddr; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
394 int rc; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
395 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
396 for (cl = as -> line_head; cl; cl = cl -> next) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
397 do |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
398 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
399 rc = fetch_output_byte(cl, &outbyte, &outaddr); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
400 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
401 // if address jump or xxx0 address, start new line |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
402 if ((rc == -1) || ((rc == 1) && (outaddr % RECLEN == 0))) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
403 { |
425
9f0448022f1f
Fix address overflows in SREC and IHEX file formats
William Astle <lost@l-w.ca>
parents:
410
diff
changeset
|
404 fprintf(of, "\r\n%04X:", (unsigned int)(outaddr & 0xffff)); |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
405 fprintf(of, "%02X", (unsigned char)outbyte); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
406 rc = -1; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
407 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
408 if (rc == 1) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
409 fprintf(of, ",%02X", (unsigned char)outbyte); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
410 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
411 while (rc); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
412 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
413 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
414 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
415 /* Motorola S19 hex file format */ |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
416 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
417 void write_code_srec(asmstate_t *as, FILE *of) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
418 { |
360
ade217fd76a5
Use #define instead of const int to avoid issues with some compilers
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
419 #define SRECLEN 16 |
ade217fd76a5
Use #define instead of const int to avoid issues with some compilers
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
420 #define HDRLEN 51 |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
421 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
422 line_t *cl; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
423 char outbyte; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
424 int outaddr; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
425 int rc; |
360
ade217fd76a5
Use #define instead of const int to avoid issues with some compilers
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
426 unsigned int i; |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
427 int recaddr = 0; |
360
ade217fd76a5
Use #define instead of const int to avoid issues with some compilers
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
428 unsigned int recdlen = 0; |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
429 unsigned char recdata[SRECLEN]; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
430 int recsum; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
431 int reccnt = -1; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
432 char rechdr[HDRLEN]; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
433 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
434 for (cl = as -> line_head; cl; cl = cl -> next) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
435 do |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
436 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
437 rc = fetch_output_byte(cl, &outbyte, &outaddr); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
438 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
439 // if address jump or xxx0 address, start new S1 record |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
440 if ((rc == -1) || ((rc == 1) && (outaddr % SRECLEN == 0))) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
441 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
442 // if not already done so, emit an S0 header record |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
443 if (reccnt < 0) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
444 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
445 // build header from version and filespec |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
446 // e.g. "[lwtools X.Y] filename.asm" |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
447 strcpy(rechdr, "["); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
448 strcat(rechdr, PACKAGE_STRING); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
449 strcat(rechdr, "] "); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
450 i = strlen(rechdr); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
451 strncat(rechdr, cl -> linespec, HDRLEN - 1 - i); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
452 recsum = strlen(rechdr) + 3; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
453 fprintf(of, "S0%02X0000", recsum); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
454 for (i = 0; i < strlen(rechdr); i++) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
455 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
456 fprintf(of, "%02X", (unsigned char)rechdr[i]); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
457 recsum += (unsigned char)rechdr[i]; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
458 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
459 fprintf(of, "%02X\r\n", (unsigned char)(~recsum)); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
460 reccnt = 0; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
461 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
462 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
463 // flush any current S1 record before starting new one |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
464 if (recdlen > 0) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
465 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
466 recsum = recdlen + 3; |
425
9f0448022f1f
Fix address overflows in SREC and IHEX file formats
William Astle <lost@l-w.ca>
parents:
410
diff
changeset
|
467 fprintf(of, "S1%02X%04X", recdlen + 3, recaddr & 0xffff); |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
468 for (i = 0; i < recdlen; i++) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
469 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
470 fprintf(of, "%02X", (unsigned char)recdata[i]); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
471 recsum += (unsigned char)recdata[i]; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
472 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
473 recsum += (recaddr >> 8) & 0xFF; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
474 recsum += recaddr & 0xFF; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
475 fprintf(of, "%02X\r\n", (unsigned char)(~recsum)); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
476 reccnt += 1; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
477 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
478 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
479 // now start the new S1 record |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
480 recdlen = 0; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
481 recaddr = outaddr; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
482 rc = 1; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
483 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
484 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
485 // for each new byte read, add to recdata[] |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
486 if (rc == 1) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
487 recdata[recdlen++] = outbyte; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
488 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
489 while (rc); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
490 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
491 // done with all output lines, flush the final S1 record (if any) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
492 if (recdlen > 0) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
493 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
494 recsum = recdlen + 3; |
425
9f0448022f1f
Fix address overflows in SREC and IHEX file formats
William Astle <lost@l-w.ca>
parents:
410
diff
changeset
|
495 fprintf(of, "S1%02X%04X", recdlen + 3, recaddr & 0xffff); |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
496 for (i = 0; i < recdlen; i++) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
497 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
498 fprintf(of, "%02X", (unsigned char)recdata[i]); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
499 recsum += (unsigned char)recdata[i]; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
500 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
501 recsum += (recaddr >> 8) & 0xFF; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
502 recsum += recaddr & 0xFF; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
503 fprintf(of, "%02X\r\n", (unsigned char)(~recsum)); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
504 reccnt += 1; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
505 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
506 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
507 // if any S1 records were output, close with S5 and S9 records |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
508 if (reccnt > 0) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
509 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
510 // emit S5 count record |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
511 recsum = 3; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
512 recsum += (reccnt >> 8) & 0xFF; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
513 recsum += reccnt & 0xFF; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
514 fprintf(of, "S503%04X", (unsigned int)reccnt); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
515 fprintf(of, "%02X\r\n", (unsigned char)(~recsum)); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
516 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
517 // emit S9 end-of-file record |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
518 recsum = 3; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
519 recsum += (as -> execaddr >> 8) & 0xFF; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
520 recsum += (as -> execaddr) & 0xFF; |
425
9f0448022f1f
Fix address overflows in SREC and IHEX file formats
William Astle <lost@l-w.ca>
parents:
410
diff
changeset
|
521 fprintf(of, "S903%04X", as -> execaddr & 0xffff); |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
522 fprintf(of, "%02X\r\n", (unsigned char)(~recsum)); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
523 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
524 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
525 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
526 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
527 /* Intel hex file format */ |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
528 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
529 void write_code_ihex(asmstate_t *as, FILE *of) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
530 { |
360
ade217fd76a5
Use #define instead of const int to avoid issues with some compilers
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
531 #define IRECLEN 16 |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
532 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
533 line_t *cl; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
534 char outbyte; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
535 int outaddr; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
536 int rc; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
537 int i; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
538 int recaddr = 0; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
539 int recdlen = 0; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
540 unsigned char recdata[IRECLEN]; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
541 int recsum; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
542 int reccnt = 0; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
543 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
544 for (cl = as -> line_head; cl; cl = cl -> next) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
545 do |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
546 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
547 rc = fetch_output_byte(cl, &outbyte, &outaddr); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
548 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
549 // if address jump or xxx0 address, start new ihx record |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
550 if ((rc == -1) || ((rc == 1) && (outaddr % IRECLEN == 0))) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
551 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
552 // flush any current ihex record before starting new one |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
553 if (recdlen > 0) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
554 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
555 recsum = recdlen; |
425
9f0448022f1f
Fix address overflows in SREC and IHEX file formats
William Astle <lost@l-w.ca>
parents:
410
diff
changeset
|
556 fprintf(of, ":%02X%04X00", recdlen, recaddr & 0xffff); |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
557 for (i = 0; i < recdlen; i++) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
558 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
559 fprintf(of, "%02X", (unsigned char)recdata[i]); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
560 recsum += (unsigned char)recdata[i]; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
561 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
562 recsum += (recaddr >> 8) & 0xFF; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
563 recsum += recaddr & 0xFF; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
564 fprintf(of, "%02X\r\n", (unsigned char)(256 - recsum)); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
565 reccnt += 1; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
566 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
567 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
568 // now start the new ihex record |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
569 recdlen = 0; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
570 recaddr = outaddr; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
571 rc = 1; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
572 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
573 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
574 // for each new byte read, add to recdata[] |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
575 if (rc == 1) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
576 recdata[recdlen++] = outbyte; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
577 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
578 while (rc); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
579 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
580 // done with all output lines, flush the final ihex record (if any) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
581 if (recdlen > 0) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
582 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
583 recsum = recdlen; |
425
9f0448022f1f
Fix address overflows in SREC and IHEX file formats
William Astle <lost@l-w.ca>
parents:
410
diff
changeset
|
584 fprintf(of, ":%02X%04X00", recdlen, recaddr & 0xffff); |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
585 for (i = 0; i < recdlen; i++) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
586 { |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
587 fprintf(of, "%02X", (unsigned char)recdata[i]); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
588 recsum += (unsigned char)recdata[i]; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
589 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
590 recsum += (recaddr >> 8) & 0xFF; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
591 recsum += recaddr & 0xFF; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
592 fprintf(of, "%02X\r\n", (unsigned char)(256 - recsum)); |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
593 reccnt += 1; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
594 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
595 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
596 // if any ihex records were output, close with a "01" record |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
597 if (reccnt > 0) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
598 { |
443
999ae00d0919
Fix up execution address handling for ihex and srec output (lwasm)
William Astle <lost@l-w.ca>
parents:
432
diff
changeset
|
599 fprintf(of, ":00%04X01FF", as -> execaddr & 0xffff); |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
600 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
601 } |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
602 |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
221
diff
changeset
|
603 |
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
|
604 void write_code_obj_sbadd(sectiontab_t *s, unsigned char b) |
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
|
605 { |
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
|
606 if (s -> oblen >= s -> obsize) |
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
|
607 { |
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
|
608 s -> obytes = lw_realloc(s -> obytes, s -> obsize + 128); |
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
|
609 s -> obsize += 128; |
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
|
610 } |
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
|
611 s -> obytes[s -> oblen] = b; |
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
|
612 s -> oblen += 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
|
613 } |
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
|
614 |
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
|
615 |
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
|
616 int write_code_obj_expraux(lw_expr_t e, void *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
|
617 { |
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
|
618 int tt; |
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
|
619 int v; |
12
6b9991fb39b6
Brought forward patch to fix bug with complex external references generating invalid relocations in the object file
lost@l-w.ca
parents:
2
diff
changeset
|
620 int count = 1; |
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
|
621 unsigned char buf[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
|
622 |
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
|
623 tt = lw_expr_type(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
|
624 |
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
|
625 switch (tt) |
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
|
626 { |
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
|
627 case lw_expr_type_oper: |
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
|
628 buf[0] = 0x04; |
12
6b9991fb39b6
Brought forward patch to fix bug with complex external references generating invalid relocations in the object file
lost@l-w.ca
parents:
2
diff
changeset
|
629 |
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
|
630 switch (lw_expr_whichop(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
|
631 { |
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
|
632 case lw_expr_oper_plus: |
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
|
633 buf[1] = 0x01; |
12
6b9991fb39b6
Brought forward patch to fix bug with complex external references generating invalid relocations in the object file
lost@l-w.ca
parents:
2
diff
changeset
|
634 count = lw_expr_operandcount(e) - 1; |
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
|
635 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
|
636 |
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
|
637 case lw_expr_oper_minus: |
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
|
638 buf[1] = 0x02; |
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
|
639 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
|
640 |
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
|
641 case lw_expr_oper_times: |
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
|
642 buf[1] = 0x03; |
12
6b9991fb39b6
Brought forward patch to fix bug with complex external references generating invalid relocations in the object file
lost@l-w.ca
parents:
2
diff
changeset
|
643 count = lw_expr_operandcount(e) - 1; |
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
|
644 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
|
645 |
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
|
646 case lw_expr_oper_divide: |
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
|
647 buf[1] = 0x04; |
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
|
648 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
|
649 |
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
|
650 case lw_expr_oper_mod: |
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
|
651 buf[1] = 0x05; |
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
|
652 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
|
653 |
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
|
654 case lw_expr_oper_intdiv: |
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
|
655 buf[1] = 0x06; |
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
|
656 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
|
657 |
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
|
658 case lw_expr_oper_bwand: |
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
|
659 buf[1] = 0x07; |
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
|
660 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
|
661 |
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
|
662 case lw_expr_oper_bwor: |
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
|
663 buf[1] = 0x08; |
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
|
664 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
|
665 |
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
|
666 case lw_expr_oper_bwxor: |
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
|
667 buf[1] = 0x09; |
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
|
668 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
|
669 |
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
|
670 case lw_expr_oper_and: |
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
|
671 buf[1] = 0x0A; |
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
|
672 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
|
673 |
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
|
674 case lw_expr_oper_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
|
675 buf[1] = 0x0B; |
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
|
676 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
|
677 |
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
|
678 case lw_expr_oper_neg: |
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
|
679 buf[1] = 0x0C; |
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
|
680 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
|
681 |
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
|
682 case lw_expr_oper_com: |
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
|
683 buf[1] = 0x0D; |
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
|
684 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
|
685 |
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
|
686 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
|
687 buf[1] = 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
|
688 } |
12
6b9991fb39b6
Brought forward patch to fix bug with complex external references generating invalid relocations in the object file
lost@l-w.ca
parents:
2
diff
changeset
|
689 while (count--) |
6b9991fb39b6
Brought forward patch to fix bug with complex external references generating invalid relocations in the object file
lost@l-w.ca
parents:
2
diff
changeset
|
690 writebytes(buf, 2, 1, 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
|
691 return 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
|
692 |
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
|
693 case lw_expr_type_int: |
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
|
694 v = lw_expr_intval(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
|
695 buf[0] = 0x01; |
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
|
696 buf[1] = (v >> 8) & 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
|
697 buf[2] = v & 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
|
698 writebytes(buf, 3, 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
|
699 return 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
|
700 |
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
|
701 case lw_expr_type_special: |
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
|
702 v = lw_expr_specint(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
|
703 switch (v) |
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
|
704 { |
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
|
705 case lwasm_expr_secbase: |
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
|
706 { |
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
|
707 // replaced with a synthetic symbol |
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
|
708 sectiontab_t *se; |
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
|
709 se = lw_expr_specptr(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
|
710 |
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
|
711 writebytes("\x03\x02", 2, 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
|
712 writebytes(se -> name, strlen(se -> name) + 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
|
713 return 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
|
714 } |
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
|
715 case lwasm_expr_import: |
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
|
716 { |
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
|
717 importlist_t *ie; |
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
|
718 ie = lw_expr_specptr(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
|
719 buf[0] = 0x02; |
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
|
720 writebytes(buf, 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
|
721 writebytes(ie -> symbol, strlen(ie -> symbol) + 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
|
722 return 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
|
723 } |
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
|
724 case lwasm_expr_syment: |
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
|
725 { |
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
|
726 struct symtabe *se; |
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
|
727 se = lw_expr_specptr(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
|
728 buf[0] = 0x03; |
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
|
729 writebytes(buf, 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
|
730 writebytes(se -> symbol, strlen(se -> symbol), 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
|
731 if (se -> context != -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
|
732 { |
2
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
733 sprintf((char *)buf, "\x01%d", se -> context); |
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
734 writebytes(buf, strlen((char *)buf), 1, 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
|
735 } |
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
|
736 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
|
737 return 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
|
738 } |
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
|
739 } |
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
|
740 |
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
|
741 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
|
742 // unrecognized term type - replace with integer 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
|
743 // fprintf(stderr, "Unrecognized term type: %s\n", lw_expr_print(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
|
744 buf[0] = 0x01; |
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
|
745 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
|
746 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
|
747 writebytes(buf, 3, 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
|
748 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
|
749 } |
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
|
750 return 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
|
751 } |
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
|
752 |
195
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
753 void write_code_obj_auxsym(asmstate_t *as, FILE *of, sectiontab_t *s, struct symtabe *se2) |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
754 { |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
755 struct symtabe *se; |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
756 unsigned char buf[16]; |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
757 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
758 if (!se2) |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
759 return; |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
760 write_code_obj_auxsym(as, of, s, se2 -> left); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
761 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
762 for (se = se2; se; se = se -> nextver) |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
763 { |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
764 lw_expr_t te; |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
765 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
766 debug_message(as, 200, "Consider symbol %s (%p) for export in section %p", se -> symbol, se -> section, s); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
767 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
768 // ignore symbols not in this section |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
769 if (se -> section != s) |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
770 continue; |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
771 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
772 debug_message(as, 200, " In section"); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
773 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
774 if (se -> flags & symbol_flag_set) |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
775 continue; |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
776 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
777 debug_message(as, 200, " Not symbol_flag_set"); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
778 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
779 te = lw_expr_copy(se -> value); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
780 debug_message(as, 200, " Value=%s", lw_expr_print(te)); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
781 as -> exportcheck = 1; |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
782 as -> csect = s; |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
783 lwasm_reduce_expr(as, te); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
784 as -> exportcheck = 0; |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
785 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
786 debug_message(as, 200, " Value2=%s", lw_expr_print(te)); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
787 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
788 // don't output non-constant symbols |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
789 if (!lw_expr_istype(te, lw_expr_type_int)) |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
790 { |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
791 lw_expr_destroy(te); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
792 continue; |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
793 } |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
794 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
795 writebytes(se -> symbol, strlen(se -> symbol), 1, of); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
796 if (se -> context >= 0) |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
797 { |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
798 writebytes("\x01", 1, 1, of); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
799 sprintf((char *)buf, "%d", se -> context); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
800 writebytes(buf, strlen((char *)buf), 1, of); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
801 } |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
802 // the "" is NOT an error |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
803 writebytes("", 1, 1, of); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
804 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
805 // write the address |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
806 buf[0] = (lw_expr_intval(te) >> 8) & 0xff; |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
807 buf[1] = lw_expr_intval(te) & 0xff; |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
808 writebytes(buf, 2, 1, of); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
809 lw_expr_destroy(te); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
810 } |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
811 write_code_obj_auxsym(as, of, s, se2 -> right); |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
812 } |
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
|
813 |
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
|
814 void write_code_obj(asmstate_t *as, 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
|
815 { |
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
|
816 line_t *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
|
817 sectiontab_t *s; |
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
|
818 reloctab_t *re; |
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
|
819 exportlist_t *ex; |
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
|
820 |
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
|
821 int i; |
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
|
822 unsigned char buf[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
|
823 |
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
|
824 // output the magic number and 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
|
825 // the 8 is NOT an error |
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
|
826 writebytes("LWOBJ16", 8, 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
|
827 |
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
|
828 // run through the entire system and build the byte streams for each |
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
|
829 // section; at the same time, generate a list of "local" symbols to |
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
|
830 // output for each 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
|
831 // NOTE: for "local" symbols, we will append \x01 and the ascii string |
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
|
832 // of the context identifier (so sym in context 1 would be "sym\x011" |
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
|
833 // we can do this because the linker can handle symbols with any |
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
|
834 // character other than NUL. |
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
|
835 // also we will generate a list of incomplete references for each |
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
|
836 // section along with the actual definition that will be output |
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
|
837 |
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
|
838 // once all this information is generated, we will output each 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
|
839 // to the file |
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
|
840 |
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
|
841 // NOTE: we build everything in memory then output it because 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
|
842 // assembler accepts multiple instances of the same section but 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
|
843 // linker expects only one instance of each section in the object file |
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
|
844 // so we need to collect all the various pieces of a section together |
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
|
845 // (also, the assembler treated multiple instances of the same 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
|
846 // as continuations of previous sections so we would need to collect |
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
|
847 // them together anyway. |
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
|
848 |
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
|
849 for (l = as -> line_head; l; l = l -> next) |
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
|
850 { |
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
|
851 if (l -> csect) |
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
|
852 { |
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
|
853 // we're in a section - need to output some bytes |
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
|
854 if (l -> outputl > 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
|
855 for (i = 0; i < l -> outputl; i++) |
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
|
856 write_code_obj_sbadd(l -> csect, l -> output[i]); |
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
|
857 else if (l -> outputl == 0 || l -> outputl == -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
|
858 for (i = 0; i < l -> len; i++) |
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
|
859 write_code_obj_sbadd(l -> csect, 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
|
860 } |
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
|
861 } |
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
|
862 |
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
|
863 // run through the 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
|
864 for (s = as -> sections; s; s = s -> next) |
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
|
865 { |
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
|
866 // write the name |
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
|
867 writebytes(s -> name, strlen(s -> name) + 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
|
868 |
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
|
869 // write the flags |
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
|
870 if (s -> flags & section_flag_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
|
871 writebytes("\x01", 1, 1, of); |
156
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
872 if (s -> flags & section_flag_constant) |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
873 writebytes("\x02", 1, 1, of); |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
874 |
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
|
875 // indicate end of flags - the "" is NOT an error |
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
|
876 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
|
877 |
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
|
878 // now the local symbols |
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
|
879 |
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
|
880 // a symbol for section base address |
156
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
881 if ((s -> flags & section_flag_constant) == 0) |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
882 { |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
883 writebytes("\x02", 1, 1, of); |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
884 writebytes(s -> name, strlen(s -> name) + 1, 1, of); |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
885 // address 0; "\0" is not an error |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
886 writebytes("\0", 2, 1, of); |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
887 } |
195
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
888 |
17bd59f045af
Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents:
156
diff
changeset
|
889 write_code_obj_auxsym(as, of, s, as -> symtab.head); |
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
|
890 // flag end of local symbol table - "" is NOT an error |
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
|
891 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
|
892 |
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
|
893 // now the exports -- FIXME |
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
|
894 for (ex = as -> exportlist; ex; ex = ex -> next) |
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
|
895 { |
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
|
896 int eval; |
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
|
897 lw_expr_t te; |
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
|
898 line_t tl; |
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
|
899 |
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
|
900 if (ex -> se == NULL) |
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
|
901 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
|
902 if (ex -> se -> section != s) |
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
|
903 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
|
904 te = lw_expr_copy(ex -> se -> value); |
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
|
905 as -> csect = ex -> se -> 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
|
906 as -> exportcheck = 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
|
907 tl.as = as; |
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
|
908 as -> cl = &tl; |
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
|
909 lwasm_reduce_expr(as, te); |
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
|
910 as -> exportcheck = 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
|
911 as -> cl = NULL; |
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
|
912 if (!lw_expr_istype(te, lw_expr_type_int)) |
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
|
913 { |
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
|
914 lw_expr_destroy(te); |
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
|
915 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
|
916 } |
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
|
917 eval = lw_expr_intval(te); |
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
|
918 lw_expr_destroy(te); |
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
|
919 writebytes(ex -> symbol, strlen(ex -> symbol) + 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
|
920 buf[0] = (eval >> 8) & 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
|
921 buf[1] = eval & 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
|
922 writebytes(buf, 2, 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
|
923 } |
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
|
924 |
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
|
925 // flag end of exported symbols - "" is NOT an error |
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
|
926 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
|
927 |
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
|
928 // FIXME - relocation table |
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
|
929 for (re = s -> reloctab; re; re = re -> next) |
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
|
930 { |
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
|
931 int offset; |
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
|
932 lw_expr_t te; |
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
|
933 line_t tl; |
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
|
934 |
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
|
935 tl.as = as; |
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
|
936 as -> cl = &tl; |
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
|
937 as -> csect = s; |
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
|
938 as -> exportcheck = 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
|
939 |
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
|
940 if (re -> expr == NULL) |
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
|
941 { |
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
|
942 // this is an error but we'll simply ignore it |
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
|
943 // and not output this expression |
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
|
944 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
|
945 } |
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
|
946 |
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
|
947 // work through each term in the expression and output |
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
|
948 // the proper equivalent to the object file |
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
|
949 if (re -> size == 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
|
950 { |
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
|
951 // flag an 8 bit relocation (low 8 bits will be used) |
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
|
952 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
|
953 buf[1] = 0x01; |
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
|
954 writebytes(buf, 2, 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
|
955 } |
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
|
956 |
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
|
957 te = lw_expr_copy(re -> offset); |
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
|
958 lwasm_reduce_expr(as, te); |
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
|
959 if (!lw_expr_istype(te, lw_expr_type_int)) |
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
|
960 { |
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
|
961 lw_expr_destroy(te); |
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
|
962 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
|
963 } |
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
|
964 offset = lw_expr_intval(te); |
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
|
965 lw_expr_destroy(te); |
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
|
966 |
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
|
967 // output expression |
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
|
968 lw_expr_testterms(re -> expr, write_code_obj_expraux, 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
|
969 |
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
|
970 // flag end of expressions |
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
|
971 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
|
972 |
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
|
973 // write the offset |
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
|
974 buf[0] = (offset >> 8) & 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
|
975 buf[1] = offset & 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
|
976 writebytes(buf, 2, 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
|
977 } |
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
|
978 |
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
|
979 // flag end of incomplete references list |
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
|
980 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
|
981 |
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
|
982 // now blast out the code |
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
|
983 |
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
|
984 // length |
156
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
985 if (s -> flags & section_flag_constant) |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
986 { |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
987 buf[0] = 0; |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
988 buf[1] = 0; |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
989 } |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
990 else |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
991 { |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
992 buf[0] = s -> oblen >> 8 & 0xff; |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
993 buf[1] = s -> oblen & 0xff; |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
994 } |
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
|
995 writebytes(buf, 2, 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
|
996 |
156
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
997 |
fc8386b13399
Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents:
127
diff
changeset
|
998 if (!(s -> flags & section_flag_bss) && !(s -> flags & section_flag_constant)) |
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
|
999 { |
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
|
1000 writebytes(s -> obytes, s -> oblen, 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
|
1001 } |
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
|
1002 } |
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
|
1003 |
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
|
1004 // flag no more 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
|
1005 // the "" is NOT an error |
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
|
1006 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
|
1007 } |
432
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1008 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1009 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1010 void write_code_lwmod(asmstate_t *as, FILE *of) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1011 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1012 line_t *l; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1013 sectiontab_t *s; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1014 reloctab_t *re; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1015 int initsize, bsssize, mainsize, callsnum, namesize; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1016 unsigned char *initcode, *maincode, *callscode, *namecode; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1017 int relocsize; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1018 unsigned char *reloccode; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1019 int tsize, bssoff; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1020 int initaddr = -1; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1021 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1022 int i; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1023 unsigned char buf[16]; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1024 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1025 // the magic number |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1026 buf[0] = 0x8f; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1027 buf[1] = 0xcf; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1028 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1029 // run through the entire system and build the byte streams for each |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1030 // section; we will make sure we only have simple references for |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1031 // any undefined references. That means at most an ADD (or SUB) operation |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1032 // with a single BSS symbol reference and a single constant value. |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1033 // We will use the constant value in the code stream and record the |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1034 // offset in a separate code stream for the BSS relocation table. |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1035 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1036 // We build everything in memory here because we need to calculate the |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1037 // sizes of everything before we can output the complete header. |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1038 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1039 for (l = as -> line_head; l; l = l -> next) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1040 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1041 if (l -> csect) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1042 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1043 // we're in a section - need to output some bytes |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1044 if (l -> outputl > 0) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1045 for (i = 0; i < l -> outputl; i++) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1046 write_code_obj_sbadd(l -> csect, l -> output[i]); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1047 else if (l -> outputl == 0 || l -> outputl == -1) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1048 for (i = 0; i < l -> len; i++) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1049 write_code_obj_sbadd(l -> csect, 0); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1050 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1051 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1052 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1053 // now run through sections and set various parameters |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1054 initsize = 0; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1055 bsssize = 0; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1056 mainsize = 0; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1057 callsnum = 0; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1058 callscode = NULL; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1059 maincode = NULL; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1060 initcode = NULL; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1061 namecode = NULL; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1062 namesize = 0; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1063 relocsize = 0; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1064 for (s = as -> sections; s; s = s -> next) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1065 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1066 if (!strcmp(s -> name, "bss")) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1067 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1068 bsssize = s -> oblen; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1069 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1070 else if (!strcmp(s -> name, "main")) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1071 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1072 maincode = s -> obytes; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1073 mainsize = s -> oblen; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1074 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1075 else if (!strcmp(s -> name, "init")) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1076 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1077 initcode = s -> obytes; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1078 initsize = s -> oblen; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1079 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1080 else if (!strcmp(s -> name, "calls")) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1081 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1082 callscode = s -> obytes; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1083 callsnum = s -> oblen / 2; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1084 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1085 else if (!strcmp(s -> name, "modname")) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1086 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1087 namecode = s -> obytes; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1088 namesize = 0; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1089 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1090 for (re = s -> reloctab; re; re = re -> next) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1091 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1092 if (re -> expr == NULL) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1093 relocsize += 2; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1094 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1095 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1096 if (namesize == 0) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1097 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1098 namecode = (unsigned char *)(as -> output_file); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1099 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1100 else |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1101 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1102 if (namecode[namesize - 1] != '\0') |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1103 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1104 namecode[namesize - 1] = '\0'; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1105 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1106 if (!*namecode) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1107 namecode = (unsigned char *)(as -> output_file); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1108 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1109 namesize = strlen((char *)namecode); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1110 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1111 tsize = namesize + 1 + initsize + mainsize + callsnum * 2 + relocsize + 11; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1112 bssoff = namesize + 1 + mainsize + callsnum * 2 + 11; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1113 // set up section base addresses |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1114 for (s = as -> sections; s; s = s -> next) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1115 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1116 if (!strcmp(s -> name, "main")) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1117 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1118 s -> tbase = 11 + namesize + 1 + callsnum * 2; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1119 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1120 else if (!strcmp(s -> name, "init")) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1121 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1122 s -> tbase = bssoff + relocsize; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1123 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1124 else if (!strcmp(s -> name, "calls")) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1125 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1126 s -> tbase = 11; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1127 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1128 else if (!strcmp(s -> name, "modname")) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1129 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1130 s -> tbase = 11 + callsnum * 2; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1131 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1132 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1133 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1134 // resolve the "init" address |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1135 if (as -> execaddr_expr) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1136 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1137 // need to resolve address with proper section bases |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1138 lwasm_reduce_expr(as, as -> execaddr_expr); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1139 initaddr = lw_expr_intval(as -> execaddr_expr); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1140 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1141 else |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1142 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1143 initaddr = as -> execaddr; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1144 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1145 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1146 // build relocation data |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1147 reloccode = NULL; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1148 if (relocsize) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1149 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1150 unsigned char *tptr; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1151 reloccode = lw_alloc(relocsize); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1152 tptr = reloccode; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1153 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1154 for (s = as -> sections; s; s = s -> next) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1155 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1156 for (re = s -> reloctab; re; re = re -> next) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1157 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1158 lw_expr_t te; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1159 line_t tl; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1160 int offset; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1161 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1162 tl.as = as; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1163 as -> cl = &tl; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1164 as -> csect = s; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1165 // as -> exportcheck = 1; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1166 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1167 if (re -> expr) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1168 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1169 int val; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1170 int x; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1171 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1172 te = lw_expr_copy(re -> expr); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1173 lwasm_reduce_expr(as, te); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1174 if (!lw_expr_istype(te, lw_expr_type_int)) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1175 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1176 val = 0; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1177 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1178 else |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1179 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1180 val = lw_expr_intval(te); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1181 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1182 lw_expr_destroy(te); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1183 x = s -> tbase; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1184 s -> tbase = 0; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1185 te = lw_expr_copy(re -> offset); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1186 lwasm_reduce_expr(as, te); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1187 offset = lw_expr_intval(te); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1188 lw_expr_destroy(te); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1189 s -> tbase = x; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1190 // offset *should* be the offset in the section |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1191 s -> obytes[offset] = val >> 8; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1192 s -> obytes[offset + 1] = val & 0xff; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1193 continue; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1194 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1195 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1196 offset = 0; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1197 te = lw_expr_copy(re -> offset); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1198 lwasm_reduce_expr(as, te); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1199 if (!lw_expr_istype(te, lw_expr_type_int)) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1200 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1201 lw_expr_destroy(te); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1202 offset = 0; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1203 continue; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1204 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1205 offset = lw_expr_intval(te); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1206 lw_expr_destroy(te); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1207 //offset += sbase; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1208 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1209 *tptr++ = offset >> 8; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1210 *tptr++ = offset & 0xff; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1211 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1212 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1213 } |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1214 |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1215 // total size |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1216 buf[2] = tsize >> 8; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1217 buf[3] = tsize & 0xff; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1218 // offset to BSS relocs |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1219 buf[4] = bssoff >> 8; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1220 buf[5] = bssoff & 0xff; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1221 // BSS size |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1222 buf[6] = bsssize >> 8; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1223 buf[7] = bsssize & 0xff; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1224 // init routine offset |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1225 buf[8] = initaddr >> 8; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1226 buf[9] = initaddr & 0xff; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1227 // number of call entries |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1228 buf[10] = callsnum; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1229 // write the header |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1230 writebytes(buf, 11, 1, of); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1231 // call data |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1232 if (callsnum) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1233 writebytes(callscode, callsnum * 2, 1, of); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1234 // module name |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1235 writebytes(namecode, namesize + 1, 1, of); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1236 // main code |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1237 if (mainsize) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1238 writebytes(maincode, mainsize, 1, of); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1239 // bss relocs |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1240 if (relocsize) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1241 writebytes(reloccode, relocsize, 1, of); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1242 // init stuff |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1243 if (initsize) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1244 writebytes(initcode, initsize, 1, of); |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
425
diff
changeset
|
1245 } |