Mercurial > hg > index.cgi
annotate lwasm/main.c @ 502:14a40f8bb4eb
Add various operators to lwcc
Add various binary and ternary operators to lwcc, but only those which can
work with constant operands. Seems like variables are probably required
next.
author | William Astle <lost@l-w.ca> |
---|---|
date | Wed, 25 Sep 2019 20:23:49 -0600 |
parents | 7fbf3171ca15 |
children | e10618b48e68 |
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 main.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 |
2c24602be78f
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 Copyright © 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
|
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
|
6 This file is part of LWTOOLS. |
2c24602be78f
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 |
2c24602be78f
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 LWTOOLS 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
|
9 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
|
10 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
|
11 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
|
12 |
2c24602be78f
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 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
|
14 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
|
15 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
|
16 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
|
17 |
2c24602be78f
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 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
|
19 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
|
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 |
2c24602be78f
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 #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
|
23 #include <stdlib.h> |
2
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
24 #include <string.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
|
25 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
26 #include <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
|
27 #include <lw_string.h> |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
28 #include <lw_stringlist.h> |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
29 #include <lw_expr.h> |
7 | 30 #include <lw_cmdline.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
|
31 |
2c24602be78f
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 "lwasm.h" |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
33 #include "input.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
|
34 |
374 | 35 void lwasm_do_unicorns(asmstate_t *as); |
222
03f7192fcd20
Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents:
219
diff
changeset
|
36 |
374 | 37 int parse_pragma_string(asmstate_t *as, char *str, int ignoreerr); |
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
|
38 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
39 /* command line option handling */ |
7 | 40 #define PROGVER "lwasm from " PACKAGE_STRING |
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
|
41 char *program_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
|
42 |
7 | 43 static struct lw_cmdline_options options[] = |
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
|
44 { |
7 | 45 { "output", 'o', "FILE", 0, "Output to FILE"}, |
46 { "debug", 'd', "LEVEL", lw_cmdline_opt_optional, "Set debug mode"}, | |
444
141a1beb98ae
Improve usage for --format for lwasm
William Astle <lost@l-w.ca>
parents:
442
diff
changeset
|
47 { "format", 'f', "TYPE", 0, "Select output format: decb, basic, raw, obj, os9, ihex, srec"}, |
7 | 48 { "list", 'l', "FILE", lw_cmdline_opt_optional, "Generate list [to FILE]"}, |
442
61580fc48f98
Add option to omit file names from lwasm listings
William Astle <lost@l-w.ca>
parents:
441
diff
changeset
|
49 { "list-nofiles", 0x104, 0, 0, "Omit file names in list output"}, |
7 | 50 { "symbols", 's', 0, lw_cmdline_opt_optional, "Generate symbol list in listing, no effect without --list"}, |
365
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
51 { "symbols-nolocals", 0x103, 0, lw_cmdline_opt_optional, "Same as --symbols but with local labels ignored"}, |
487
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
52 { "symbol-dump", 0x106, "FILE", lw_cmdline_opt_optional, "Dump global symbol table in assembly format" }, |
390
1ebb5a0b2874
Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents:
375
diff
changeset
|
53 { "tabs", 't', "WIDTH", 0, "Set tab spacing in listing (0=don't expand tabs)" }, |
365
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
54 { "map", 'm', "FILE", lw_cmdline_opt_optional, "Generate map [to FILE]"}, |
7 | 55 { "decb", 'b', 0, 0, "Generate DECB .bin format output, equivalent of --format=decb"}, |
56 { "raw", 'r', 0, 0, "Generate raw binary format output, equivalent of --format=raw"}, | |
57 { "obj", 0x100, 0, 0, "Generate proprietary object file format for later linking, equivalent of --format=obj" }, | |
58 { "depend", 0x101, 0, 0, "Output a dependency list to stdout; do not do any actual output though assembly is completed as usual" }, | |
73
1f77ae5c3590
Added --dependnoerr flag to list dependencies on non-existent files without bailing out; also suppress error reports during dependency generation
lost@l-w.ca
parents:
70
diff
changeset
|
59 { "dependnoerr", 0x102, 0, 0, "Output a dependency list to stdout; do not do any actual output though assembly is completed as usual; don't bail on missing include files" }, |
7 | 60 { "pragma", 'p', "PRAGMA", 0, "Set an assembler pragma to any value understood by the \"pragma\" pseudo op"}, |
61 { "6809", '9', 0, 0, "Set assembler to 6809 only mode" }, | |
62 { "6309", '3', 0, 0, "Set assembler to 6309 mode (default)" }, | |
63 { "includedir", 'I', "PATH", 0, "Add entry to include path" }, | |
390
1ebb5a0b2874
Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents:
375
diff
changeset
|
64 { "define", 'D', "SYM[=VAL]",0, "Automatically define SYM to be VAL (or 1)"}, |
219 | 65 { "preprocess", 'P', 0, 0, "Preprocess macros and conditionals and output revised source to stdout" }, |
224
3864d96ee8c7
Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents:
222
diff
changeset
|
66 { "unicorns", 0x142, 0, 0, "Add sooper sekrit sauce"}, |
333
507f442dc71e
Add support for 6800 compatibility instructions.
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
67 { "6800compat", 0x200, 0, 0, "Enable 6800 compatibility instructions, equivalent to --pragma=6800compat" }, |
484
469a130e7029
Add option to suppress output file
William Astle <lost@l-w.ca>
parents:
444
diff
changeset
|
68 { "no-output", 0x105, 0, 0, "Inhibit creation of output file" }, |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
69 { 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
|
70 }; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
71 |
2c24602be78f
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 |
7 | 73 static int parse_opts(int key, char *arg, void *state) |
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
|
74 { |
7 | 75 asmstate_t *as = state; |
106 | 76 |
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
|
77 switch (key) |
2c24602be78f
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 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
79 case '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
|
80 lw_stringlist_addstring(as -> include_list, arg); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
81 break; |
101
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
82 |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
83 case 'D': |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
84 { |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
85 char *offs; |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
86 int val = 1; |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
87 lw_expr_t te; |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
88 |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
89 if ((offs = strchr(arg, '='))) |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
90 { |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
91 *offs = '\0'; |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
92 val = strtol(offs + 1, NULL, 0); |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
93 } |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
94 |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
95 /* register global symbol */ |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
96 te = lw_expr_build(lw_expr_type_int, val); |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
97 register_symbol(as, NULL, arg, te, symbol_flag_nocheck | symbol_flag_set); |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
98 lw_expr_destroy(te); |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
99 |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
100 if (offs) |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
101 *offs = '='; |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
102 break; |
ed7f970f3688
Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents:
73
diff
changeset
|
103 } |
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
|
104 case 'o': |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
105 if (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
|
106 lw_free(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
|
107 as -> output_file = lw_strdup(arg); |
484
469a130e7029
Add option to suppress output file
William Astle <lost@l-w.ca>
parents:
444
diff
changeset
|
108 as -> flags &= ~FLAG_NOOUT; |
469a130e7029
Add option to suppress output file
William Astle <lost@l-w.ca>
parents:
444
diff
changeset
|
109 break; |
469a130e7029
Add option to suppress output file
William Astle <lost@l-w.ca>
parents:
444
diff
changeset
|
110 |
469a130e7029
Add option to suppress output file
William Astle <lost@l-w.ca>
parents:
444
diff
changeset
|
111 case 0x105: |
469a130e7029
Add option to suppress output file
William Astle <lost@l-w.ca>
parents:
444
diff
changeset
|
112 as -> flags |= FLAG_NOOUT; |
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
|
113 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
|
114 |
487
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
115 case 0x106: |
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
116 if (as -> symbol_dump_file) |
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
117 lw_free(as -> symbol_dump_file); |
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
118 if (!arg) |
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
119 as -> symbol_dump_file = lw_strdup("-"); |
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
120 else |
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
121 as -> symbol_dump_file = lw_strdup(arg); |
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
122 as -> flags |= FLAG_SYMDUMP; |
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
123 break; |
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
124 |
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
|
125 case 'd': |
338
5d401d1eb3e9
Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents:
333
diff
changeset
|
126 #ifdef LWASM_NODEBUG |
5d401d1eb3e9
Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents:
333
diff
changeset
|
127 fprintf(stderr, "This binary has been built without debugging message support\n"); |
5d401d1eb3e9
Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents:
333
diff
changeset
|
128 #else |
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
|
129 if (!arg) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
130 as -> debug_level = 50; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
131 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
|
132 as -> debug_level = atoi(arg); |
338
5d401d1eb3e9
Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents:
333
diff
changeset
|
133 #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
|
134 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
|
135 |
390
1ebb5a0b2874
Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents:
375
diff
changeset
|
136 case 't': |
1ebb5a0b2874
Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents:
375
diff
changeset
|
137 if (arg) |
1ebb5a0b2874
Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents:
375
diff
changeset
|
138 as -> tabwidth = atoi(arg); |
1ebb5a0b2874
Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents:
375
diff
changeset
|
139 break; |
1ebb5a0b2874
Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents:
375
diff
changeset
|
140 |
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
|
141 case '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
|
142 if (as -> list_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
|
143 lw_free(as -> list_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
|
144 if (!arg) |
106 | 145 as -> list_file = lw_strdup("-"); |
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
|
146 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
|
147 as -> list_file = lw_strdup(arg); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
148 as -> flags |= FLAG_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
|
149 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
|
150 |
365
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
151 case 'm': |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
152 if (as -> map_file) |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
153 lw_free(as -> map_file); |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
154 if (!arg) |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
155 as -> map_file = lw_strdup("-"); |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
156 else |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
157 as -> map_file = lw_strdup(arg); |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
158 as -> flags |= FLAG_MAP; |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
159 break; |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
160 |
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
|
161 case '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
|
162 as -> flags |= FLAG_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
|
163 break; |
365
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
164 |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
165 case 0x103: |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
166 as -> flags |= FLAG_SYMBOLS | FLAG_SYMBOLS_NOLOCALS; |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
167 break; |
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
168 |
442
61580fc48f98
Add option to omit file names from lwasm listings
William Astle <lost@l-w.ca>
parents:
441
diff
changeset
|
169 case 0x104: |
61580fc48f98
Add option to omit file names from lwasm listings
William Astle <lost@l-w.ca>
parents:
441
diff
changeset
|
170 as -> listnofile = 1; |
61580fc48f98
Add option to omit file names from lwasm listings
William Astle <lost@l-w.ca>
parents:
441
diff
changeset
|
171 break; |
61580fc48f98
Add option to omit file names from lwasm listings
William Astle <lost@l-w.ca>
parents:
441
diff
changeset
|
172 |
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
|
173 case '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
|
174 as -> output_format = 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
|
175 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
|
176 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
177 case 'r': |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
178 as -> output_format = 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
|
179 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
|
180 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
181 case 0x100: |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
182 as -> output_format = 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
|
183 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
|
184 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
185 case 0x101: |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
186 as -> flags |= FLAG_DEPEND; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
187 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
|
188 |
73
1f77ae5c3590
Added --dependnoerr flag to list dependencies on non-existent files without bailing out; also suppress error reports during dependency generation
lost@l-w.ca
parents:
70
diff
changeset
|
189 case 0x102: |
1f77ae5c3590
Added --dependnoerr flag to list dependencies on non-existent files without bailing out; also suppress error reports during dependency generation
lost@l-w.ca
parents:
70
diff
changeset
|
190 as -> flags |= FLAG_DEPEND | FLAG_DEPENDNOERR; |
1f77ae5c3590
Added --dependnoerr flag to list dependencies on non-existent files without bailing out; also suppress error reports during dependency generation
lost@l-w.ca
parents:
70
diff
changeset
|
191 break; |
222
03f7192fcd20
Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents:
219
diff
changeset
|
192 |
224
3864d96ee8c7
Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents:
222
diff
changeset
|
193 case 0x142: |
222
03f7192fcd20
Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents:
219
diff
changeset
|
194 as -> flags |= FLAG_UNICORNS; |
03f7192fcd20
Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents:
219
diff
changeset
|
195 break; |
73
1f77ae5c3590
Added --dependnoerr flag to list dependencies on non-existent files without bailing out; also suppress error reports during dependency generation
lost@l-w.ca
parents:
70
diff
changeset
|
196 |
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
|
197 case 'f': |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
198 if (!strcasecmp(arg, "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
|
199 as -> output_format = OUTPUT_DECB; |
411
9f796134d6f4
Fix wrong sense in strcasecmp()
William Astle <lost@l-w.ca>
parents:
406
diff
changeset
|
200 else if (!strcasecmp(arg, "basic")) |
406 | 201 as -> output_format = OUTPUT_BASIC; |
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
|
202 else if (!strcasecmp(arg, "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
|
203 as -> output_format = OUTPUT_RAW; |
276 | 204 else if (!strcasecmp(arg, "rawrel")) |
205 as -> output_format = OUTPUT_RAWREL; | |
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
|
206 else if (!strcasecmp(arg, "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
|
207 as -> output_format = OUTPUT_OBJ; |
321
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
276
diff
changeset
|
208 else if (!strcasecmp(arg, "srec")) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
276
diff
changeset
|
209 as -> output_format = OUTPUT_SREC; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
276
diff
changeset
|
210 else if (!strcasecmp(arg, "ihex")) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
276
diff
changeset
|
211 as -> output_format = OUTPUT_IHEX; |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
276
diff
changeset
|
212 else if (!strcasecmp(arg, "hex")) |
d4ac484d0ec6
Add support for Motorola SREC and Intel Hex output formats to lwasm.
Tom LeMense <tlemense@yahoo.com>
parents:
276
diff
changeset
|
213 as -> output_format = OUTPUT_HEX; |
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
|
214 else if (!strcasecmp(arg, "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
|
215 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
216 as -> pragmas |= PRAGMA_DOLLARNOTLOCAL; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
217 as -> output_format = 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
|
218 } |
432
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
426
diff
changeset
|
219 else if (!strcasecmp(arg, "lwmod")) |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
426
diff
changeset
|
220 { |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
426
diff
changeset
|
221 as -> output_format = OUTPUT_LWMOD; |
58cafa61ab40
Add support for undocumented custom module format (for LW)
William Astle <lost@l-w.ca>
parents:
426
diff
changeset
|
222 } |
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
|
223 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
|
224 { |
2c24602be78f
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 fprintf(stderr, "Invalid output format: %s\n", arg); |
2c24602be78f
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 exit(1); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
227 } |
2c24602be78f
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 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
|
229 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
230 case 'p': |
2c24602be78f
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 if (parse_pragma_string(as, arg, 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
|
232 { |
2c24602be78f
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 fprintf(stderr, "Unrecognized pragma string: %s\n", arg); |
2c24602be78f
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 exit(1); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
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 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
|
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 case '9': |
367
c6d2a1f54e0c
Change processor target variations to pragmas.
William Astle <lost@l-w.ca>
parents:
366
diff
changeset
|
239 as -> pragmas |= PRAGMA_6809; |
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
|
240 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
|
241 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
242 case '3': |
367
c6d2a1f54e0c
Change processor target variations to pragmas.
William Astle <lost@l-w.ca>
parents:
366
diff
changeset
|
243 as -> pragmas &= ~PRAGMA_6809; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
244 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
|
245 |
219 | 246 case 'P': |
247 as -> preprocess = 1; | |
248 break; | |
333
507f442dc71e
Add support for 6800 compatibility instructions.
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
249 |
507f442dc71e
Add support for 6800 compatibility instructions.
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
250 case 0x200: |
507f442dc71e
Add support for 6800 compatibility instructions.
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
251 as -> pragmas |= PRAGMA_6800COMPAT; |
507f442dc71e
Add support for 6800 compatibility instructions.
William Astle <lost@l-w.ca>
parents:
321
diff
changeset
|
252 break; |
219 | 253 |
7 | 254 case lw_cmdline_key_end: |
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 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
|
256 |
7 | 257 case lw_cmdline_key_arg: |
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
|
258 lw_stringlist_addstring(as -> input_files, arg); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
259 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
|
260 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
261 default: |
7 | 262 return lw_cmdline_err_unknown; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
263 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
264 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
|
265 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
266 |
7 | 267 static struct lw_cmdline_parser cmdline_parser = |
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
|
268 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
269 options, |
2c24602be78f
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 parse_opts, |
7 | 271 "INPUTFILE", |
272 "lwasm, a HD6309 and MC6809 cross-assembler\vPlease report bugs to lost@l-w.ca.", | |
273 PROGVER | |
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
|
274 }; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
275 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
276 /* |
2c24602be78f
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 main function; parse command line, set up assembler state, and run 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
|
278 assembler on the first 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
|
279 */ |
374 | 280 void do_pass1(asmstate_t *as); |
281 void do_pass2(asmstate_t *as); | |
282 void do_pass3(asmstate_t *as); | |
283 void do_pass4(asmstate_t *as); | |
284 void do_pass5(asmstate_t *as); | |
285 void do_pass6(asmstate_t *as); | |
286 void do_pass7(asmstate_t *as); | |
287 void do_output(asmstate_t *as); | |
487
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
288 void do_symdump(asmstate_t *as); |
374 | 289 void do_list(asmstate_t *as); |
290 void do_map(asmstate_t *as); | |
291 lw_expr_t lwasm_evaluate_special(int t, void *ptr, void *priv); | |
292 lw_expr_t lwasm_evaluate_var(char *var, void *priv); | |
293 lw_expr_t lwasm_parse_term(char **p, void *priv); | |
294 void lwasm_dividezero(void *priv); | |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
295 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
296 struct passlist_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
|
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 char *passname; |
2c24602be78f
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 void (*fn)(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
|
300 int fordep; |
2c24602be78f
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 } passlist[] = { |
2c24602be78f
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 { "parse", do_pass1, 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
|
303 { "symcheck", do_pass2 }, |
2c24602be78f
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 { "resolve1", do_pass3 }, |
2c24602be78f
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 { "resolve2", do_pass4 }, |
2c24602be78f
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 { "addressresolve", do_pass5 }, |
2c24602be78f
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 { "finalize", do_pass6 }, |
2c24602be78f
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 { "emit", do_pass7 }, |
2c24602be78f
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 { NULL, 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
|
310 }; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
311 |
2c24602be78f
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 |
2c24602be78f
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 main(int argc, char **argv) |
2c24602be78f
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 { |
2c24602be78f
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 passnum; |
2c24602be78f
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 /* assembler state */ |
2c24602be78f
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 asmstate_t asmstate = { 0 }; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
319 program_name = argv[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 |
2c24602be78f
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 lw_expr_set_special_handler(lwasm_evaluate_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
|
322 lw_expr_set_var_handler(lwasm_evaluate_var); |
2c24602be78f
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 lw_expr_set_term_parser(lwasm_parse_term); |
249
1f1a28b797e1
Add trap for divide by zero in expression library
William Astle <lost@l-w.ca>
parents:
229
diff
changeset
|
324 lw_expr_setdivzero(lwasm_dividezero); |
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
|
325 |
2c24602be78f
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 /* initialize assembler state */ |
2c24602be78f
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 asmstate.include_list = lw_stringlist_create(); |
2c24602be78f
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 asmstate.input_files = lw_stringlist_create(); |
2c24602be78f
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 asmstate.nextcontext = 1; |
366
433dbc18fb41
Make byte overflow detection for 8 bit immediate not fail with COM operator
William Astle <lost@l-w.ca>
parents:
365
diff
changeset
|
330 asmstate.exprwidth = 16; |
390
1ebb5a0b2874
Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents:
375
diff
changeset
|
331 asmstate.tabwidth = 8; |
426
b4825b42c151
Change to engage forwardrefmax pragma by default
William Astle <lost@l-w.ca>
parents:
411
diff
changeset
|
332 |
b4825b42c151
Change to engage forwardrefmax pragma by default
William Astle <lost@l-w.ca>
parents:
411
diff
changeset
|
333 // enable the "forward reference maximum size" pragma; old available |
b4825b42c151
Change to engage forwardrefmax pragma by default
William Astle <lost@l-w.ca>
parents:
411
diff
changeset
|
334 // can be obtained with --pragma=noforwardrefmax |
b4825b42c151
Change to engage forwardrefmax pragma by default
William Astle <lost@l-w.ca>
parents:
411
diff
changeset
|
335 asmstate.pragmas = PRAGMA_FORWARDREFMAX; |
212
b0d53e2f3f53
Make --6309/--6809 work properly
William Astle <lost@l-w.ca>
parents:
186
diff
changeset
|
336 |
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
|
337 /* parse command line arguments */ |
441
b138b4005125
Make missing command line arguments fail properly
William Astle <lost@l-w.ca>
parents:
432
diff
changeset
|
338 if (lw_cmdline_parse(&cmdline_parser, argc, argv, 0, 0, &asmstate) != 0) |
b138b4005125
Make missing command line arguments fail properly
William Astle <lost@l-w.ca>
parents:
432
diff
changeset
|
339 { |
b138b4005125
Make missing command line arguments fail properly
William Astle <lost@l-w.ca>
parents:
432
diff
changeset
|
340 exit(1); |
b138b4005125
Make missing command line arguments fail properly
William Astle <lost@l-w.ca>
parents:
432
diff
changeset
|
341 } |
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
|
342 |
2c24602be78f
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 if (!asmstate.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
|
344 { |
2c24602be78f
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 asmstate.output_file = lw_strdup("a.out"); |
2c24602be78f
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 } |
2c24602be78f
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 input_init(&asmstate); |
2c24602be78f
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 for (passnum = 0; passlist[passnum].fn; passnum++) |
2c24602be78f
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 { |
2c24602be78f
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 if ((asmstate.flags & FLAG_DEPEND) && passlist[passnum].fordep == 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
|
353 continue; |
70
ceab04fd2969
Fixed premature installation of external reference under UNDEFEXTERN pragma; should not resolve to external references until after the initial parsing pass
lost@l-w.ca
parents:
7
diff
changeset
|
354 asmstate.passno = passnum; |
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
|
355 debug_message(&asmstate, 50, "Doing pass %d (%s)\n", passnum, passlist[passnum].passname); |
2c24602be78f
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 (passlist[passnum].fn)(&asmstate); |
2c24602be78f
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 debug_message(&asmstate, 50, "After pass %d (%s)\n", passnum, passlist[passnum].passname); |
2c24602be78f
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 dump_state(&asmstate); |
219 | 359 |
360 if (asmstate.preprocess) | |
361 { | |
362 /* we're done if we were preprocessing */ | |
363 exit(0); | |
364 } | |
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
|
365 if (asmstate.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
|
366 { |
73
1f77ae5c3590
Added --dependnoerr flag to list dependencies on non-existent files without bailing out; also suppress error reports during dependency generation
lost@l-w.ca
parents:
70
diff
changeset
|
367 if (asmstate.flags & FLAG_DEPEND) |
1f77ae5c3590
Added --dependnoerr flag to list dependencies on non-existent files without bailing out; also suppress error reports during dependency generation
lost@l-w.ca
parents:
70
diff
changeset
|
368 { |
1f77ae5c3590
Added --dependnoerr flag to list dependencies on non-existent files without bailing out; also suppress error reports during dependency generation
lost@l-w.ca
parents:
70
diff
changeset
|
369 // don't show errors during dependency scanning but |
1f77ae5c3590
Added --dependnoerr flag to list dependencies on non-existent files without bailing out; also suppress error reports during dependency generation
lost@l-w.ca
parents:
70
diff
changeset
|
370 // stop processing immediately |
1f77ae5c3590
Added --dependnoerr flag to list dependencies on non-existent files without bailing out; also suppress error reports during dependency generation
lost@l-w.ca
parents:
70
diff
changeset
|
371 break; |
1f77ae5c3590
Added --dependnoerr flag to list dependencies on non-existent files without bailing out; also suppress error reports during dependency generation
lost@l-w.ca
parents:
70
diff
changeset
|
372 } |
226
7c2c2239ec9c
Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents:
224
diff
changeset
|
373 if (asmstate.flags & FLAG_UNICORNS) |
7c2c2239ec9c
Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents:
224
diff
changeset
|
374 lwasm_do_unicorns(&asmstate); |
7c2c2239ec9c
Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents:
224
diff
changeset
|
375 else |
7c2c2239ec9c
Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents:
224
diff
changeset
|
376 lwasm_show_errors(&asmstate); |
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
|
377 exit(1); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
378 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
379 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
380 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
381 if (asmstate.flags & FLAG_DEPEND) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
382 { |
224
3864d96ee8c7
Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents:
222
diff
changeset
|
383 // output dependencies (other than "includebin") |
3864d96ee8c7
Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents:
222
diff
changeset
|
384 char *n; |
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
|
385 |
224
3864d96ee8c7
Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents:
222
diff
changeset
|
386 while ((n = lw_stack_pop(asmstate.includelist))) |
3864d96ee8c7
Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents:
222
diff
changeset
|
387 { |
3864d96ee8c7
Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents:
222
diff
changeset
|
388 fprintf(stdout, "%s\n", n); |
3864d96ee8c7
Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents:
222
diff
changeset
|
389 lw_free(n); |
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
|
390 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
391 } |
484
469a130e7029
Add option to suppress output file
William Astle <lost@l-w.ca>
parents:
444
diff
changeset
|
392 else if ((asmstate.flags & FLAG_NOOUT) == 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
|
393 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
394 debug_message(&asmstate, 50, "Doing 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
|
395 do_output(&asmstate); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
396 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
397 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
398 debug_message(&asmstate, 50, "Done assembly"); |
222
03f7192fcd20
Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents:
219
diff
changeset
|
399 |
03f7192fcd20
Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents:
219
diff
changeset
|
400 if (asmstate.flags & FLAG_UNICORNS) |
03f7192fcd20
Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents:
219
diff
changeset
|
401 { |
224
3864d96ee8c7
Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents:
222
diff
changeset
|
402 debug_message(&asmstate, 50, "Invoking unicorns"); |
222
03f7192fcd20
Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents:
219
diff
changeset
|
403 lwasm_do_unicorns(&asmstate); |
03f7192fcd20
Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents:
219
diff
changeset
|
404 } |
487
7fbf3171ca15
Add symbol table dump in assembly format
William Astle <lost@l-w.ca>
parents:
484
diff
changeset
|
405 do_symdump(&asmstate); |
229
164487152dd9
Add flag to output stream for end of unicorns
William Astle <lost@l-w.ca>
parents:
226
diff
changeset
|
406 do_list(&asmstate); |
365
3f8abaac214c
Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents:
338
diff
changeset
|
407 do_map(&asmstate); |
375 | 408 |
409 if (asmstate.testmode_errorcount > 0) exit(1); | |
410 | |
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
|
411 exit(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
|
412 } |