annotate lwasm/main.c @ 390:1ebb5a0b2874

Add option to specify tab width in listing There is much insistence that generating the asm listing should absolutely not ever in the entire expanse of space and time expand tabs. lwasm, however, does so, and it does so for a reason. That reason is that there are enough users that have enough trouble even understanding what a tab is that it was simpler to just expand them. That said, having a means to actually specify the tab width is pretty much required if you're going to do that, and having a way to disable such expansion is also a good idea. Thanks to Erik G <erik@6809.org> for the base patch to handle this.
author William Astle <lost@l-w.ca>
date Mon, 13 Jul 2015 21:52:43 -0600
parents 71f507f404f1
children 4411a6123716
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 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
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
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
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
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
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
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
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
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
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
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
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
45 { "output", 'o', "FILE", 0, "Output to FILE"},
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
46 { "debug", 'd', "LEVEL", lw_cmdline_opt_optional, "Set debug mode"},
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
47 { "format", 'f', "TYPE", 0, "Select output format: decb, raw, obj, os9"},
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
48 { "list", 'l', "FILE", lw_cmdline_opt_optional, "Generate list [to FILE]"},
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
49 { "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
50 { "symbols-nolocals", 0x103, 0, lw_cmdline_opt_optional, "Same as --symbols but with local labels ignored"},
390
1ebb5a0b2874 Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
51 { "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
52 { "map", 'm', "FILE", lw_cmdline_opt_optional, "Generate map [to FILE]"},
7
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
53 { "decb", 'b', 0, 0, "Generate DECB .bin format output, equivalent of --format=decb"},
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
54 { "raw", 'r', 0, 0, "Generate raw binary format output, equivalent of --format=raw"},
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
55 { "obj", 0x100, 0, 0, "Generate proprietary object file format for later linking, equivalent of --format=obj" },
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
56 { "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
57 { "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
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
58 { "pragma", 'p', "PRAGMA", 0, "Set an assembler pragma to any value understood by the \"pragma\" pseudo op"},
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
59 { "6809", '9', 0, 0, "Set assembler to 6809 only mode" },
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
60 { "6309", '3', 0, 0, "Set assembler to 6309 mode (default)" },
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
61 { "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
62 { "define", 'D', "SYM[=VAL]",0, "Automatically define SYM to be VAL (or 1)"},
219
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 212
diff changeset
63 { "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
64 { "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
65 { "6800compat", 0x200, 0, 0, "Enable 6800 compatibility instructions, equivalent to --pragma=6800compat" },
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
66 { 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
67 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
68
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
69
7
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
70 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
71 {
7
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
72 asmstate_t *as = state;
106
43a3f1068027 Adjustments for list code
lost@l-w.ca
parents: 101
diff changeset
73
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 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
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 '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
77 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
78 break;
101
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
79
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
80 case 'D':
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
81 {
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
82 char *offs;
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
83 int val = 1;
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
84 lw_expr_t te;
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
85
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
86 if ((offs = strchr(arg, '=')))
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
87 {
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
88 *offs = '\0';
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
89 val = strtol(offs + 1, NULL, 0);
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
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
92 /* register global symbol */
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
93 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
94 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
95 lw_expr_destroy(te);
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
96
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
97 if (offs)
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
98 *offs = '=';
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
99 break;
ed7f970f3688 Added --define= option to predfine a symbol for assembly
lost@l-w.ca
parents: 73
diff changeset
100 }
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
101 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
102 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
103 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
104 as -> output_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
105 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
106
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
107 case 'd':
338
5d401d1eb3e9 Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents: 333
diff changeset
108 #ifdef LWASM_NODEBUG
5d401d1eb3e9 Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents: 333
diff changeset
109 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
110 #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
111 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
112 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
113 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
114 as -> debug_level = atoi(arg);
338
5d401d1eb3e9 Allow disabling debugging messages.
William Astle <lost@l-w.ca>
parents: 333
diff changeset
115 #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
116 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
117
390
1ebb5a0b2874 Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
118 case 't':
1ebb5a0b2874 Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
119 if (arg)
1ebb5a0b2874 Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
120 as -> tabwidth = atoi(arg);
1ebb5a0b2874 Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
121 break;
1ebb5a0b2874 Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
122
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
123 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
124 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
125 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
126 if (!arg)
106
43a3f1068027 Adjustments for list code
lost@l-w.ca
parents: 101
diff changeset
127 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
128 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
129 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
130 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
131 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
132
365
3f8abaac214c Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents: 338
diff changeset
133 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
134 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
135 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
136 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
137 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
138 else
3f8abaac214c Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents: 338
diff changeset
139 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
140 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
141 break;
3f8abaac214c Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents: 338
diff changeset
142
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
143 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
144 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
145 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
146
3f8abaac214c Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents: 338
diff changeset
147 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
148 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
149 break;
3f8abaac214c Add map file output and option to suppress local symbols in listings
William Astle <lost@l-w.ca>
parents: 338
diff changeset
150
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
151 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
152 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
153 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
154
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
155 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
156 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
157 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
158
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
159 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
160 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
161 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
162
2c24602be78f 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 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
164 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
165 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
166
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
167 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
168 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
169 break;
222
03f7192fcd20 Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents: 219
diff changeset
170
224
3864d96ee8c7 Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents: 222
diff changeset
171 case 0x142:
222
03f7192fcd20 Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents: 219
diff changeset
172 as -> flags |= FLAG_UNICORNS;
03f7192fcd20 Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents: 219
diff changeset
173 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
174
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
175 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
176 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
177 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
178 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
179 as -> output_format = OUTPUT_RAW;
276
49010c6653e7 Re-enable rawrel output format
William Astle <lost@l-w.ca>
parents: 249
diff changeset
180 else if (!strcasecmp(arg, "rawrel"))
49010c6653e7 Re-enable rawrel output format
William Astle <lost@l-w.ca>
parents: 249
diff changeset
181 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
182 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
183 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
184 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
185 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
186 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
187 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
188 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
189 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
190 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
191 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
192 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
193 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
194 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
195 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
196 {
2c24602be78f 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 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
198 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
199 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
200 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
201
2c24602be78f 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 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
203 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
204 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
205 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
206 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
207 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
208 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
209
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
210 case '9':
367
c6d2a1f54e0c Change processor target variations to pragmas.
William Astle <lost@l-w.ca>
parents: 366
diff changeset
211 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
212 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
213
2c24602be78f 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 case '3':
367
c6d2a1f54e0c Change processor target variations to pragmas.
William Astle <lost@l-w.ca>
parents: 366
diff changeset
215 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
216 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
217
219
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 212
diff changeset
218 case 'P':
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 212
diff changeset
219 as -> preprocess = 1;
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 212
diff changeset
220 break;
333
507f442dc71e Add support for 6800 compatibility instructions.
William Astle <lost@l-w.ca>
parents: 321
diff changeset
221
507f442dc71e Add support for 6800 compatibility instructions.
William Astle <lost@l-w.ca>
parents: 321
diff changeset
222 case 0x200:
507f442dc71e Add support for 6800 compatibility instructions.
William Astle <lost@l-w.ca>
parents: 321
diff changeset
223 as -> pragmas |= PRAGMA_6800COMPAT;
507f442dc71e Add support for 6800 compatibility instructions.
William Astle <lost@l-w.ca>
parents: 321
diff changeset
224 break;
219
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 212
diff changeset
225
7
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
226 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
227 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
228
7
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
229 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
230 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
231 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
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 default:
7
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
234 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
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 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
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
7
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
239 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
240 {
2c24602be78f 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 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
242 parse_opts,
7
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
243 "INPUTFILE",
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
244 "lwasm, a HD6309 and MC6809 cross-assembler\vPlease report bugs to lost@l-w.ca.",
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
245 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
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 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
250 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
251 */
374
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
252 void do_pass1(asmstate_t *as);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
253 void do_pass2(asmstate_t *as);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
254 void do_pass3(asmstate_t *as);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
255 void do_pass4(asmstate_t *as);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
256 void do_pass5(asmstate_t *as);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
257 void do_pass6(asmstate_t *as);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
258 void do_pass7(asmstate_t *as);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
259 void do_output(asmstate_t *as);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
260 void do_list(asmstate_t *as);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
261 void do_map(asmstate_t *as);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
262 lw_expr_t lwasm_evaluate_special(int t, void *ptr, void *priv);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
263 lw_expr_t lwasm_evaluate_var(char *var, void *priv);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
264 lw_expr_t lwasm_parse_term(char **p, void *priv);
8e25147c2aa8 Clean up various "externs"
William Astle <lost@l-w.ca>
parents: 367
diff changeset
265 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
266
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
267 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
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 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
270 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
271 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
272 } 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
273 { "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
274 { "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
275 { "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
276 { "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
277 { "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
278 { "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
279 { "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
280 { 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
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 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
285 {
2c24602be78f 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 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
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 /* 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
289 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
290 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
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 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
293 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
294 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
295 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
296
2c24602be78f 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 /* 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
298 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
299 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
300 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
301 asmstate.exprwidth = 16;
390
1ebb5a0b2874 Add option to specify tab width in listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
302 asmstate.tabwidth = 8;
212
b0d53e2f3f53 Make --6309/--6809 work properly
William Astle <lost@l-w.ca>
parents: 186
diff changeset
303
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 /* parse command line arguments */
7
917b608b8c66 Switched lwasm to lw_cmdline from argp
lost@l-w.ca
parents: 2
diff changeset
305 lw_cmdline_parse(&cmdline_parser, argc, argv, 0, 0, &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
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 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
308 {
2c24602be78f 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 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
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 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
313
2c24602be78f 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 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
315 {
2c24602be78f 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 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
317 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
318 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
319 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
320 (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
321 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
322 dump_state(&asmstate);
219
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 212
diff changeset
323
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 212
diff changeset
324 if (asmstate.preprocess)
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 212
diff changeset
325 {
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 212
diff changeset
326 /* we're done if we were preprocessing */
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 212
diff changeset
327 exit(0);
afd50d6b4113 Add --preprocess option
William Astle <lost@l-w.ca>
parents: 212
diff changeset
328 }
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
329 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
330 {
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
331 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
332 {
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
333 // 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
334 // 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
335 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
336 }
226
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 224
diff changeset
337 if (asmstate.flags & FLAG_UNICORNS)
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 224
diff changeset
338 lwasm_do_unicorns(&asmstate);
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 224
diff changeset
339 else
7c2c2239ec9c Make unicorns grok errors and warnings.
William Astle <lost@l-w.ca>
parents: 224
diff changeset
340 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
341 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
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 }
2c24602be78f 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 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
346 {
224
3864d96ee8c7 Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents: 222
diff changeset
347 // output dependencies (other than "includebin")
3864d96ee8c7 Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents: 222
diff changeset
348 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
349
224
3864d96ee8c7 Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents: 222
diff changeset
350 while ((n = lw_stack_pop(asmstate.includelist)))
3864d96ee8c7 Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents: 222
diff changeset
351 {
3864d96ee8c7 Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents: 222
diff changeset
352 fprintf(stdout, "%s\n", n);
3864d96ee8c7 Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents: 222
diff changeset
353 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
354 }
2c24602be78f 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 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
357 {
2c24602be78f 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 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
359 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
360 }
2c24602be78f 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
2c24602be78f 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 debug_message(&asmstate, 50, "Done assembly");
222
03f7192fcd20 Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents: 219
diff changeset
363
03f7192fcd20 Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents: 219
diff changeset
364 if (asmstate.flags & FLAG_UNICORNS)
03f7192fcd20 Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents: 219
diff changeset
365 {
224
3864d96ee8c7 Make unicorns notice referenced files better
William Astle <lost@l-w.ca>
parents: 222
diff changeset
366 debug_message(&asmstate, 50, "Invoking unicorns");
222
03f7192fcd20 Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents: 219
diff changeset
367 lwasm_do_unicorns(&asmstate);
03f7192fcd20 Add --unicorns option for IDE integration
William Astle <lost@l-w.ca>
parents: 219
diff changeset
368 }
229
164487152dd9 Add flag to output stream for end of unicorns
William Astle <lost@l-w.ca>
parents: 226
diff changeset
369 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
370 do_map(&asmstate);
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
371
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
372 if (asmstate.testmode_errorcount > 0) exit(1);
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 374
diff changeset
373
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
374 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
375 }