annotate lwasm/output.c @ 536:33a59e232a5b

Fix basic output target to keep lines below 249 characters The line length limiter in the basic output was not properly moving to the next before 249 characters, which is the limit Color Basic can read in an ASCII basic program. Changed the line limiter to 240 from 247 to account for a possible 5 digit number plus a comma and just a bit of extra breathing space.
author William Astle <lost@l-w.ca>
date Thu, 16 Jun 2022 13:55:34 -0600
parents a584b9ddffc4
children e10618b48e68
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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"
535
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
35 #include "instab.h"
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
36
2c24602be78f 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_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
38 void write_code_decb(asmstate_t *as, FILE *of);
406
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
39 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
40 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
41 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
42 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
43 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
44 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
45 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
46 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
47
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
48 // this prevents warnings about not using the return value of fwrite()
221
2b784a28428e Silence a few warnings
William Astle <lost@l-w.ca>
parents: 195
diff changeset
49 // r++ prevents the "set but not used" warnings; should be optimized out
2b784a28428e Silence a few warnings
William Astle <lost@l-w.ca>
parents: 195
diff changeset
50 #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
51
2c24602be78f 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 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
53 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
54 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
55
2c24602be78f 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 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
57 {
2c24602be78f 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 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
59 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
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
2c24602be78f 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 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
63 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
64 {
2c24602be78f 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 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
66 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
67 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
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
2c24602be78f 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 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
71 {
2c24602be78f 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 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
73 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
74 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
75
2c24602be78f 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 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
77 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
78 break;
406
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
79
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
80 case OUTPUT_BASIC:
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
81 write_code_BASIC(as, of);
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
82 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
83
2c24602be78f 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 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
85 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
86 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
87
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
88 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
89 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
90 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
91
2c24602be78f 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 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
93 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
94 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
95
321
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
96 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
97 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
98 break;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
99
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
100 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
101 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
102 break;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
103
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
104 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
105 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
106 break;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
107
432
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
108 case OUTPUT_LWMOD:
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
109 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
110 break;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
111
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
112 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
113 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
114 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
115 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
116 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
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
2c24602be78f 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 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
120 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
121
406
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
122 int write_code_BASIC_fprintf(FILE *of, int linelength, int *linenumber, int value)
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
123 {
536
33a59e232a5b Fix basic output target to keep lines below 249 characters
William Astle <lost@l-w.ca>
parents: 535
diff changeset
124 // 240 should give enough room for a 5 digit value and a comma with a bit of extra
33a59e232a5b Fix basic output target to keep lines below 249 characters
William Astle <lost@l-w.ca>
parents: 535
diff changeset
125 // space in case something unusual happens without going over the 249 character
33a59e232a5b Fix basic output target to keep lines below 249 characters
William Astle <lost@l-w.ca>
parents: 535
diff changeset
126 // limit Color Basic has on input lines.
33a59e232a5b Fix basic output target to keep lines below 249 characters
William Astle <lost@l-w.ca>
parents: 535
diff changeset
127 if (linelength > 240)
406
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
128 {
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
129 fprintf(of, "\n");
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
130 linelength = fprintf(of, "%d DATA ", *linenumber);
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
131 *linenumber += 10;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
132 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
133 else
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
134 {
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
135 linelength += fprintf(of, ",");
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
136 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
137 linelength += fprintf(of, "%d", value);
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
138
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
139 return linelength;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
140 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
141
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
142 void write_code_BASIC(asmstate_t *as, FILE *of)
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
143 {
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
144 line_t *cl;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
145 line_t *startblock = as -> line_head;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
146 line_t *endblock;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
147 int linenumber, linelength, startaddress, lastaddress, address;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
148 int outidx;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
149
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
150 fprintf(of, "10 READ A,B\n");
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
151 fprintf(of, "20 IF A=-1 THEN 70\n");
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
152 fprintf(of, "30 FOR C = A TO B\n");
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
153 fprintf(of, "40 READ D:POKE C,D\n");
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
154 fprintf(of, "50 NEXT C\n");
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
155 fprintf(of, "60 GOTO 10\n");
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
156
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
157 if (as -> execaddr == 0)
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
158 {
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
159 fprintf(of, "70 END");
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
160 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
161 else
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
162 {
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
163 fprintf(of, "70 EXEC %d", as -> execaddr);
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
164 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
165
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
166 linenumber = 80;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
167 linelength = 255;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
168
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
169 while(startblock)
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
170 {
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
171 startaddress = -1;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
172 endblock = NULL;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
173
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
174 for (cl = startblock; cl; cl = cl -> next)
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
175 {
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
176 if (cl -> outputl < 0)
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
177 continue;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
178
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
179 address = lw_expr_intval(cl -> addr);
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
180
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
181 if (startaddress == -1)
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
182 {
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
183 startaddress = address;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
184 lastaddress = address + cl -> outputl - 1;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
185 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
186 else
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
187 {
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
188 if (lastaddress != address - 1)
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
189 {
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
190 endblock = cl;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
191 break;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
192 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
193
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
194 lastaddress += cl -> outputl;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
195 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
196 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
197
410
7f538053492c Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents: 406
diff changeset
198 if (startaddress != -1)
406
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
199 {
410
7f538053492c Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents: 406
diff changeset
200 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
201 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
202
7f538053492c Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents: 406
diff changeset
203 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
204 {
7f538053492c Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents: 406
diff changeset
205 if (cl -> outputl < 0)
7f538053492c Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents: 406
diff changeset
206 continue;
406
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
207
410
7f538053492c Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents: 406
diff changeset
208 for (outidx=0; outidx<cl -> outputl; outidx++)
7f538053492c Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents: 406
diff changeset
209 {
7f538053492c Fix a possible uninitialized variable reference
William Astle <lost@l-w.ca>
parents: 406
diff changeset
210 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
211 }
406
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
212 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
213 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
214
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
215 startblock = cl;
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
216 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
217
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
218 linelength = write_code_BASIC_fprintf(of, linelength, &linenumber, -1);
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
219 linelength = write_code_BASIC_fprintf(of, linelength, &linenumber, -1);
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
220
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
221 fprintf(of, "\n");
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
222 }
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
223
4411a6123716 Add "basic" output format
William Astle <lost@l-w.ca>
parents: 360
diff changeset
224
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
225 /*
2c24602be78f 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 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
227 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
228 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
229 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
230
2c24602be78f 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 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
232 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
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 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
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 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
237
2c24602be78f 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 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
239 {
2c24602be78f 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 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
241 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
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 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
244 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
245 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
246 }
2c24602be78f 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
2c24602be78f 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 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
250 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
251 statements will produce mostly useless results
535
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
252
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
253 However, if a run of RMBs exists at the start that is ended by an ORG
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
254 statement, that run of RMBs will not be output as a zero fill.
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
255 */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
256 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
257 {
2c24602be78f 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 line_t *cl;
535
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
259 line_t *sl;
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
260
535
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
261 sl = as -> line_head;
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
262 for (cl = sl; cl; cl = cl -> next)
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
263 {
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
264 if (cl -> outputl > 0)
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
265 break;
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
266 if (instab[cl -> insn].flags & lwasm_insn_org)
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
267 sl = cl;
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
268 }
a584b9ddffc4 Update raw output to work with RMB only definitions at the start
William Astle <lost@l-w.ca>
parents: 531
diff changeset
269 for (cl = sl; cl; cl = cl -> next)
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
270 {
531
a812bb4d3a51 Correct raw output target in lwasm to NUL pad RMBs
William Astle <lost@l-w.ca>
parents: 500
diff changeset
271 if (cl -> len > 0 && cl -> outputl < 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
272 {
2c24602be78f 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 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
274 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
275 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
276 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
277 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
278 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
279 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
280 }
2c24602be78f 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
2c24602be78f 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
2c24602be78f 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 /*
2c24602be78f 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 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
286 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
287 */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
288 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
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 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
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 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
293 {
127
d92b9c968731 Removed protection from outputting code outside os9 module in os9 target
lost@l-w.ca
parents: 12
diff changeset
294 // if (cl -> inmod == 0)
d92b9c968731 Removed protection from outputting code outside os9 module in os9 target
lost@l-w.ca
parents: 12
diff changeset
295 // 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
296 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
297 {
2c24602be78f 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 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
299 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
300 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
301 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
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 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
304 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
305 }
2c24602be78f 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 }
2c24602be78f 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 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
309 {
2c24602be78f 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 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
311 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
312 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
313 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
314 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
315 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
316
2c24602be78f 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 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
318 {
2c24602be78f 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 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
320 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
321 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
322 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
323 {
2c24602be78f 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 // 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
325 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
326 {
2c24602be78f 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 // 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
328 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
329 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
330 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
331 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
332 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
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 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
335 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
336 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
337 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
338 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
339 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
340 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
341 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
342 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
343 }
2c24602be78f 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 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
345 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
346 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
347 }
2c24602be78f 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 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
349 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
350 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
351 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
352 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
353 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
354 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
355 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
356
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
357 // 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
358 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
359 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
360 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
361 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
362 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
363 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
364 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
365
321
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
366 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
367 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
368 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
369 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
370
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
371 // 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
372 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
373 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
374 *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
375 *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
376
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
377 // 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
378 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
379 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
380 lastaddr = *addr;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
381 return 1;
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 // 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
385 else
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 lastaddr = *addr;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
388 return -1;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
389 }
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
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
392 // 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
393 else
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
394 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
395 outidx = 0;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
396 return 0;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
397 }
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
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 /* 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
402
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
403 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
404 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
405 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
406
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
407 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
408 char outbyte;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
409 int outaddr;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
410 int rc;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
411
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
412 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
413 do
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 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
416
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
417 // 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
418 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
419 {
425
9f0448022f1f Fix address overflows in SREC and IHEX file formats
William Astle <lost@l-w.ca>
parents: 410
diff changeset
420 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
421 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
422 rc = -1;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
423 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
424 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
425 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
426 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
427 while (rc);
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
428 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
429
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
430
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
431 /* 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
432
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
433 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
434 {
360
ade217fd76a5 Use #define instead of const int to avoid issues with some compilers
William Astle <lost@l-w.ca>
parents: 321
diff changeset
435 #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
436 #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
437
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
438 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
439 char outbyte;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
440 int outaddr;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
441 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
442 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
443 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
444 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
445 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
446 int recsum;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
447 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
448 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
449
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
450 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
451 do
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
452 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
453 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
454
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
455 // 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
456 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
457 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
458 // 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
459 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
460 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
461 // 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
462 // 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
463 strcpy(rechdr, "[");
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
464 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
465 strcat(rechdr, "] ");
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
466 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
467 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
468 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
469 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
470 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
471 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
472 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
473 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
474 }
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 = 0;
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 // 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
480 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
481 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
482 recsum = recdlen + 3;
425
9f0448022f1f Fix address overflows in SREC and IHEX file formats
William Astle <lost@l-w.ca>
parents: 410
diff changeset
483 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
484 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
485 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
486 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
487 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
488 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
489 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
490 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
491 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
492 reccnt += 1;
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
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
495 // 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
496 recdlen = 0;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
497 recaddr = outaddr;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
498 rc = 1;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
499 }
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 // 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
502 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
503 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
504 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
505 while (rc);
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 // 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
508 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
509 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
510 recsum = recdlen + 3;
425
9f0448022f1f Fix address overflows in SREC and IHEX file formats
William Astle <lost@l-w.ca>
parents: 410
diff changeset
511 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
512 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
513 {
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, "%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
515 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
516 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
517 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
518 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
519 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
520 reccnt += 1;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
521 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
522
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
523 // 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
524 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
525 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
526 // 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
527 recsum = 3;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
528 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
529 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
530 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
531 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
532
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
533 // 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
534 recsum = 3;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
535 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
536 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
537 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
538 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
539 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
540 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
541
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
542
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
543 /* 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
544
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
545 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
546 {
360
ade217fd76a5 Use #define instead of const int to avoid issues with some compilers
William Astle <lost@l-w.ca>
parents: 321
diff changeset
547 #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
548
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
549 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
550 char outbyte;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
551 int outaddr;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
552 int rc;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
553 int i;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
554 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
555 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
556 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
557 int recsum;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
558 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
559
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
560 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
561 do
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
562 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
563 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
564
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
565 // 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
566 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
567 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
568 // 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
569 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
570 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
571 recsum = recdlen;
425
9f0448022f1f Fix address overflows in SREC and IHEX file formats
William Astle <lost@l-w.ca>
parents: 410
diff changeset
572 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
573 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
574 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
575 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
576 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
577 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
578 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
579 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
580 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
581 reccnt += 1;
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
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
584 // 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
585 recdlen = 0;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
586 recaddr = outaddr;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
587 rc = 1;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
588 }
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 // 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
591 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
592 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
593 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
594 while (rc);
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 // 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
597 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
598 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
599 recsum = recdlen;
425
9f0448022f1f Fix address overflows in SREC and IHEX file formats
William Astle <lost@l-w.ca>
parents: 410
diff changeset
600 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
601 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
602 {
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
603 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
604 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
605 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
606 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
607 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
608 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
609 reccnt += 1;
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
610 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
611
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
612 // 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
613 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
614 {
443
999ae00d0919 Fix up execution address handling for ihex and srec output (lwasm)
William Astle <lost@l-w.ca>
parents: 432
diff changeset
615 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
616 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
617 }
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
618
d4ac484d0ec6 Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents: 221
diff changeset
619
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
620 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
621 {
2c24602be78f 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 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
623 {
2c24602be78f 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 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
625 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
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 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
628 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
629 }
2c24602be78f 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
2c24602be78f 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 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
633 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
634 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
635 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
636 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
637 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
638
2c24602be78f 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 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
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 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
642 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
643 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
644 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
645
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
646 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
647 {
2c24602be78f 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 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
649 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
650 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
651 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
652
2c24602be78f 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 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
654 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
655 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
656
2c24602be78f 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 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
658 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
659 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
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_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
663 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
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_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
667 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
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_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
671 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
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_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
675 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
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_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
679 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
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_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
683 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
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 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
687 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
688 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
689
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
690 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
691 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
692 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
693
2c24602be78f 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 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
695 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
696 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
697
2c24602be78f 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 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
699 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
700 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
701
2c24602be78f 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 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
703 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
704 }
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
705 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
706 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
707 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
708
2c24602be78f 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 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
710 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
711 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
712 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
713 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
714 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
715 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
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 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
718 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
719 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
720 {
2c24602be78f 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 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
722 {
2c24602be78f 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 // 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
724 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
725 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
726
2c24602be78f 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 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
728 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
729 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
730 }
2c24602be78f 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 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
732 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
733 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
734 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
735 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
736 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
737 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
738 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
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 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
741 {
2c24602be78f 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 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
743 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
744 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
745 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
746 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
747 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
748 {
2
7317fbe024af Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents: 0
diff changeset
749 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
750 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
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 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
753 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
754 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
755 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
756
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
757 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
758 // 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
759 // 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
760 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
761 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
762 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
763 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
764 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
765 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
766 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
767 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
768
195
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
769 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
770 {
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
771 struct symtabe *se;
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
772 unsigned char buf[16];
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 (!se2)
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
775 return;
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
776 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
777
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
778 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
779 {
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
780 lw_expr_t te;
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
781
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
782 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
783
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
784 // 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
785 if (se -> section != s)
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
786 continue;
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 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
789
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
790 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
791 continue;
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
792
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
793 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
794
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
795 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
796 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
797 as -> exportcheck = 1;
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
798 as -> csect = s;
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
799 lwasm_reduce_expr(as, te);
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
800 as -> exportcheck = 0;
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 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
803
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
804 // 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
805 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
806 {
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
807 lw_expr_destroy(te);
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
808 continue;
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
809 }
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 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
812 if (se -> context >= 0)
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
813 {
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
814 writebytes("\x01", 1, 1, of);
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
815 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
816 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
817 }
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
818 // the "" is NOT an error
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
819 writebytes("", 1, 1, of);
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
820
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
821 // write the address
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
822 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
823 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
824 writebytes(buf, 2, 1, of);
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
825 lw_expr_destroy(te);
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
826 }
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
827 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
828 }
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
829
2c24602be78f 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 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
831 {
2c24602be78f 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 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
833 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
834 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
835 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
836
2c24602be78f 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 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
838 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
839
2c24602be78f 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 // 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
841 // 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
842 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
843
2c24602be78f 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 // 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
845 // 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
846 // 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
847 // 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
848 // 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
849 // 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
850 // 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
851 // 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
852 // 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
853
2c24602be78f 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 // 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
855 // 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
856
2c24602be78f 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 // 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
858 // 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
859 // 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
860 // 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
861 // (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
862 // 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
863 // 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
864
2c24602be78f 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 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
866 {
2c24602be78f 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 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
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 // 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
870 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
871 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
872 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
873 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
874 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
875 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
876 }
2c24602be78f 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
2c24602be78f 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 // 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
880 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
881 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
882 // 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
883 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
884
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
885 // 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
886 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
887 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
888 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
889 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
890
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
891 // 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
892 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
893
2c24602be78f 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 // 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
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 // 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
897 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
898 {
fc8386b13399 Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents: 127
diff changeset
899 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
900 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
901 // 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
902 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
903 }
195
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
904
17bd59f045af Changed symbol table to use a binary tree.
William Astle <lost@l-w.ca>
parents: 156
diff changeset
905 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
906 // 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
907 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
908
2c24602be78f 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 // 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
910 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
911 {
2c24602be78f 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 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
913 lw_expr_t te;
500
733fd05ca2a8 Initialize temporary line structures properly
William Astle <lost@l-w.ca>
parents: 443
diff changeset
914 line_t tl = { 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
915
2c24602be78f 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 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
917 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
918 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
919 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
920 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
921 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
922 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
923 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
924 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
925 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
926 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
927 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
928 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
929 {
2c24602be78f 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 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
931 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
932 }
2c24602be78f 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 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
934 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
935 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
936 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
937 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
938 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
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
2c24602be78f 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 // 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
942 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
943
2c24602be78f 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 // 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
945 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
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 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
948 lw_expr_t te;
500
733fd05ca2a8 Initialize temporary line structures properly
William Astle <lost@l-w.ca>
parents: 443
diff changeset
949 line_t tl = { 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
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 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
952 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
953 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
954 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
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 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
957 {
2c24602be78f 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 // 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
959 // 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
960 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
961 }
2c24602be78f 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
2c24602be78f 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 // 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
964 // 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
965 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
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 // 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
968 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
969 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
970 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
971 }
2c24602be78f 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 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
974 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
975 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
976 {
2c24602be78f 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 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
978 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
979 }
2c24602be78f 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 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
981 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
982
2c24602be78f 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 // 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
984 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
985
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
986 // 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
987 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
988
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
989 // 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
990 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
991 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
992 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
993 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
994
2c24602be78f 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 // 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
996 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
997
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
998 // 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
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 // length
156
fc8386b13399 Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents: 127
diff changeset
1001 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
1002 {
fc8386b13399 Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents: 127
diff changeset
1003 buf[0] = 0;
fc8386b13399 Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents: 127
diff changeset
1004 buf[1] = 0;
fc8386b13399 Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents: 127
diff changeset
1005 }
fc8386b13399 Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents: 127
diff changeset
1006 else
fc8386b13399 Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents: 127
diff changeset
1007 {
fc8386b13399 Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents: 127
diff changeset
1008 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
1009 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
1010 }
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
1011 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
1012
156
fc8386b13399 Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents: 127
diff changeset
1013
fc8386b13399 Added 'constant' sections to object file handling for lwasm and lwlink
lost@l-w.ca
parents: 127
diff changeset
1014 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
1015 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1016 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
1017 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1018 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1019
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1020 // 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
1021 // 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
1022 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
1023 }
432
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
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1026 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
1027 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1028 line_t *l;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1029 sectiontab_t *s;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1030 reloctab_t *re;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1031 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
1032 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
1033 int relocsize;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1034 unsigned char *reloccode;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1035 int tsize, bssoff;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1036 int initaddr = -1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1037
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1038 int i;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1039 unsigned char buf[16];
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 // the magic number
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1042 buf[0] = 0x8f;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1043 buf[1] = 0xcf;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1044
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1045 // 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
1046 // 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
1047 // 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
1048 // 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
1049 // 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
1050 // 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
1051
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1052 // 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
1053 // 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
1054
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1055 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
1056 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1057 if (l -> csect)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1058 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1059 // 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
1060 if (l -> outputl > 0)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1061 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
1062 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
1063 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
1064 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
1065 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
1066 }
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
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1069 // 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
1070 initsize = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1071 bsssize = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1072 mainsize = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1073 callsnum = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1074 callscode = NULL;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1075 maincode = NULL;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1076 initcode = NULL;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1077 namecode = NULL;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1078 namesize = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1079 relocsize = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1080 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
1081 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1082 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
1083 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1084 bsssize = s -> oblen;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1085 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1086 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
1087 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1088 maincode = s -> obytes;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1089 mainsize = s -> oblen;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1090 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1091 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
1092 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1093 initcode = s -> obytes;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1094 initsize = s -> oblen;
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 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
1097 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1098 callscode = s -> obytes;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1099 callsnum = s -> oblen / 2;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1100 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1101 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
1102 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1103 namecode = s -> obytes;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1104 namesize = 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 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
1107 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1108 if (re -> expr == NULL)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1109 relocsize += 2;
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 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1112 if (namesize == 0)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1113 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1114 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
1115 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1116 else
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 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
1119 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1120 namecode[namesize - 1] = '\0';
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 if (!*namecode)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1123 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
1124 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1125 namesize = strlen((char *)namecode);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1126
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1127 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
1128 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
1129 // 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
1130 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
1131 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1132 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
1133 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1134 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
1135 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1136 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
1137 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1138 s -> tbase = bssoff + relocsize;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1139 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1140 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
1141 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1142 s -> tbase = 11;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1143 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1144 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
1145 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1146 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
1147 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1148 }
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 // resolve the "init" address
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1151 if (as -> execaddr_expr)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1152 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1153 // 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
1154 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
1155 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
1156 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1157 else
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1158 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1159 initaddr = as -> execaddr;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1160 }
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 // build relocation data
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1163 reloccode = NULL;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1164 if (relocsize)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1165 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1166 unsigned char *tptr;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1167 reloccode = lw_alloc(relocsize);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1168 tptr = reloccode;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1169
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1170 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
1171 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1172 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
1173 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1174 lw_expr_t te;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1175 line_t tl;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1176 int offset;
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 tl.as = as;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1179 as -> cl = &tl;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1180 as -> csect = s;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1181 // as -> exportcheck = 1;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1182
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1183 if (re -> expr)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1184 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1185 int val;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1186 int x;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1187
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1188 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
1189 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
1190 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
1191 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1192 val = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1193 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1194 else
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 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
1197 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1198 lw_expr_destroy(te);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1199 x = s -> tbase;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1200 s -> tbase = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1201 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
1202 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
1203 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
1204 lw_expr_destroy(te);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1205 s -> tbase = x;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1206 // 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
1207 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
1208 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
1209 continue;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1210 }
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 offset = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1213 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
1214 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
1215 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
1216 {
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1217 lw_expr_destroy(te);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1218 offset = 0;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1219 continue;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1220 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1221 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
1222 lw_expr_destroy(te);
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1223 //offset += sbase;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1224
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1225 *tptr++ = offset >> 8;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1226 *tptr++ = offset & 0xff;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1227 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1228 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1229 }
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1230
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1231 // total size
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1232 buf[2] = tsize >> 8;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1233 buf[3] = tsize & 0xff;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1234 // offset to BSS relocs
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1235 buf[4] = bssoff >> 8;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1236 buf[5] = bssoff & 0xff;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1237 // BSS size
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1238 buf[6] = bsssize >> 8;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1239 buf[7] = bsssize & 0xff;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1240 // init routine offset
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1241 buf[8] = initaddr >> 8;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1242 buf[9] = initaddr & 0xff;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1243 // number of call entries
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1244 buf[10] = callsnum;
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1245 // write the header
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1246 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
1247 // call data
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1248 if (callsnum)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1249 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
1250 // module name
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1251 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
1252 // main code
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1253 if (mainsize)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1254 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
1255 // bss relocs
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1256 if (relocsize)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1257 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
1258 // init stuff
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1259 if (initsize)
58cafa61ab40 Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents: 425
diff changeset
1260 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
1261 }