Mercurial > hg > index.cgi
annotate lwasm/pass1.c @ 460:3d53f2e8d0e0
Allow macros to shadow instructions that are not supported by current CPU.
When assembling in 6809 mode, 6309 instructions should be usable as macros.
When assembling in 6309 mode, instructions not valid on the 6309 should be
usable as macros.
author | William Astle <lost@l-w.ca> |
---|---|
date | Wed, 28 Feb 2018 20:43:14 -0700 |
parents | b1adf549d181 |
children | c8d4f3486ad7 |
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 pass1.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 <string.h> |
2
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
24 #include <ctype.h> |
7317fbe024af
Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents:
0
diff
changeset
|
25 #include <stdlib.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
|
26 |
2c24602be78f
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_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
|
28 #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
|
29 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
30 #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
|
31 #include "instab.h" |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
32 #include "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
|
33 |
374 | 34 int expand_macro(asmstate_t *as, line_t *l, char **p, char *opc); |
35 int expand_struct(asmstate_t *as, line_t *l, char **p, char *opc); | |
36 int add_macro_line(asmstate_t *as, char *optr); | |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
37 |
2c24602be78f
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 pass 1: parse the lines |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
40 |
399
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
41 line format if PRAGMA_NEWSOURCE is not in force: |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
42 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
43 [<symbol>] <opcode> <operand>[ <comment>] |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
44 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
45 If <symbol> is followed by a :, whitespace may precede the symbol |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
46 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
47 A line may optionally start with a number which must not be preceded by |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
48 white space and must be followed by a single whitespace character. After |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
49 that whitespace character, the line is parsed as if it had no line number. |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
50 |
399
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
51 Also, no spaces are permitted within <operand>. |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
52 |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
53 With PRAGMA_NEWSOURCE in effect, line numbers are not allowed and there |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
54 is no automatic comment at the end of each line. All comments must be |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
55 introduced with the comment character. This allows the parser to handle |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
56 spaces in operands unambiguously so in this mode, spaces are permitted |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
57 within operands. |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
58 |
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
|
59 */ |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
60 void do_pass1(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
|
61 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
62 char *line; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
63 line_t *cl; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
64 char *p1; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
65 int stspace; |
93
5bf9edabd661
Squashed the remaining memory leaks revealed by valgrind
lost@l-w.ca
parents:
85
diff
changeset
|
66 char *tok, *sym = NULL; |
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 int opnum; |
2c24602be78f
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 int lc = 1; |
59
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
69 int nomacro; |
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
70 |
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 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
|
72 { |
59
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
73 nomacro = 0; |
93
5bf9edabd661
Squashed the remaining memory leaks revealed by valgrind
lost@l-w.ca
parents:
85
diff
changeset
|
74 if (sym) |
5bf9edabd661
Squashed the remaining memory leaks revealed by valgrind
lost@l-w.ca
parents:
85
diff
changeset
|
75 lw_free(sym); |
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
|
76 sym = 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
|
77 line = input_readline(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
|
78 if (!line) |
2c24602be78f
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 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
|
80 if (line[0] == 1 && line[1] == 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
|
81 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
82 // special internal directive |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
83 // these DO NOT appear in the output anywhere |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
84 // they are generated by the parser to pass information |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
85 // forward |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
86 for (p1 = line + 2; *p1 && !isspace(*p1); p1++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
87 /* do nothing */ ; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
88 *p1++ = '\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
|
89 if (!strcmp(line + 2, "SETCONTEXT")) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
90 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
91 as -> context = strtol(p1, NULL, 10); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
92 } |
40
d96037ea0b80
Fixed line number counting being broken by macros
lost@l-w.ca
parents:
2
diff
changeset
|
93 else if (!strcmp(line + 2, "SETLINENO")) |
d96037ea0b80
Fixed line number counting being broken by macros
lost@l-w.ca
parents:
2
diff
changeset
|
94 { |
d96037ea0b80
Fixed line number counting being broken by macros
lost@l-w.ca
parents:
2
diff
changeset
|
95 lc = strtol(p1, NULL, 10); |
d96037ea0b80
Fixed line number counting being broken by macros
lost@l-w.ca
parents:
2
diff
changeset
|
96 } |
49
bd8b3fbd1e28
Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents:
43
diff
changeset
|
97 else if (!strcmp(line + 2, "SETNOEXPANDSTART")) |
bd8b3fbd1e28
Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents:
43
diff
changeset
|
98 { |
273
1409debcb1a0
Fix crash on listing when nested noexpand macros are used
William Astle <lost@l-w.ca>
parents:
220
diff
changeset
|
99 as -> line_tail -> noexpand_start += 1; |
49
bd8b3fbd1e28
Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents:
43
diff
changeset
|
100 } |
bd8b3fbd1e28
Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents:
43
diff
changeset
|
101 else if (!strcmp(line + 2, "SETNOEXPANDEND")) |
bd8b3fbd1e28
Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents:
43
diff
changeset
|
102 { |
273
1409debcb1a0
Fix crash on listing when nested noexpand macros are used
William Astle <lost@l-w.ca>
parents:
220
diff
changeset
|
103 as -> line_tail -> noexpand_end += 1; |
49
bd8b3fbd1e28
Added ability to flag macros as "noexpand" so they are not expanded in the listing
lost@l-w.ca
parents:
43
diff
changeset
|
104 } |
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
|
105 lw_free(line); |
40
d96037ea0b80
Fixed line number counting being broken by macros
lost@l-w.ca
parents:
2
diff
changeset
|
106 if (lc == 0) |
d96037ea0b80
Fixed line number counting being broken by macros
lost@l-w.ca
parents:
2
diff
changeset
|
107 lc = 1; |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
108 continue; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
109 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
110 debug_message(as, 75, "Read line: %s", line); |
2c24602be78f
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 |
2c24602be78f
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 cl = lw_alloc(sizeof(line_t)); |
2c24602be78f
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 memset(cl, 0, sizeof(line_t)); |
2c24602be78f
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 cl -> outputl = -1; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
115 cl -> linespec = lw_strdup(input_curspec(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
|
116 cl -> prev = as -> line_tail; |
2c24602be78f
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 cl -> insn = -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
|
118 cl -> as = as; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
119 cl -> inmod = as -> inmod; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
120 cl -> csect = as -> csect; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
121 cl -> pragmas = as -> pragmas; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
122 cl -> context = as -> context; |
2c24602be78f
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 cl -> ltext = lw_strdup(line); |
2c24602be78f
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 cl -> soff = -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
|
125 cl -> dshow = -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
|
126 cl -> dsize = 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
|
127 cl -> dptr = 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
|
128 cl -> isbrpt = 0; |
142
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
129 cl -> dlen = 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
|
130 as -> cl = cl; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
131 if (!as -> line_tail) |
2c24602be78f
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 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
133 as -> line_head = cl; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
134 cl -> addr = lw_expr_build(lw_expr_type_int, 0); |
142
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
135 cl -> daddr = lw_expr_build(lw_expr_type_int, 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
|
136 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
137 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
|
138 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
139 lw_expr_t te; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
140 |
2c24602be78f
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 cl -> lineno = as -> line_tail -> lineno + 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
|
142 as -> line_tail -> next = cl; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
143 |
2c24602be78f
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 // set the line address |
2c24602be78f
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 te = lw_expr_build(lw_expr_type_special, lwasm_expr_linelen, cl -> prev); |
2c24602be78f
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 cl -> addr = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, cl -> prev -> addr, te); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
147 lw_expr_destroy(te); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
148 lwasm_reduce_expr(as, cl -> addr); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
149 // lw_expr_simplify(cl -> addr, 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
|
150 |
142
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
151 // set the data address if relevant |
166
324f28905144
Fixed problem with rmb, etc., not working right wrt line address when not in os9 mode
lost@l-w.ca
parents:
147
diff
changeset
|
152 if (as -> output_format == OUTPUT_OS9) |
324f28905144
Fixed problem with rmb, etc., not working right wrt line address when not in os9 mode
lost@l-w.ca
parents:
147
diff
changeset
|
153 { |
324f28905144
Fixed problem with rmb, etc., not working right wrt line address when not in os9 mode
lost@l-w.ca
parents:
147
diff
changeset
|
154 te = lw_expr_build(lw_expr_type_special, lwasm_expr_linedlen, cl -> prev); |
324f28905144
Fixed problem with rmb, etc., not working right wrt line address when not in os9 mode
lost@l-w.ca
parents:
147
diff
changeset
|
155 cl -> daddr = lw_expr_build(lw_expr_type_oper, lw_expr_oper_plus, cl -> prev -> daddr, te); |
324f28905144
Fixed problem with rmb, etc., not working right wrt line address when not in os9 mode
lost@l-w.ca
parents:
147
diff
changeset
|
156 lw_expr_destroy(te); |
324f28905144
Fixed problem with rmb, etc., not working right wrt line address when not in os9 mode
lost@l-w.ca
parents:
147
diff
changeset
|
157 lwasm_reduce_expr(as, cl -> daddr); |
324f28905144
Fixed problem with rmb, etc., not working right wrt line address when not in os9 mode
lost@l-w.ca
parents:
147
diff
changeset
|
158 } |
324f28905144
Fixed problem with rmb, etc., not working right wrt line address when not in os9 mode
lost@l-w.ca
parents:
147
diff
changeset
|
159 else |
324f28905144
Fixed problem with rmb, etc., not working right wrt line address when not in os9 mode
lost@l-w.ca
parents:
147
diff
changeset
|
160 { |
324f28905144
Fixed problem with rmb, etc., not working right wrt line address when not in os9 mode
lost@l-w.ca
parents:
147
diff
changeset
|
161 cl -> daddr = lw_expr_copy(cl -> addr); |
324f28905144
Fixed problem with rmb, etc., not working right wrt line address when not in os9 mode
lost@l-w.ca
parents:
147
diff
changeset
|
162 } |
142
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
163 |
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
|
164 // carry DP value forward |
2c24602be78f
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 cl -> dpval = cl -> prev -> dpval; |
2c24602be78f
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 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
167 } |
433
b1adf549d181
Add some debugging instrumentation for tracking an expression bug
William Astle <lost@l-w.ca>
parents:
399
diff
changeset
|
168 debug_message(as, 100, "Line pointer: %p", cl); |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
169 if (!lc && strcmp(cl -> linespec, cl -> prev -> linespec)) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
170 lc = 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
|
171 if (lc) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
172 { |
40
d96037ea0b80
Fixed line number counting being broken by macros
lost@l-w.ca
parents:
2
diff
changeset
|
173 cl -> lineno = lc; |
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
|
174 lc = 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 } |
2c24602be78f
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 as -> line_tail = cl; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
177 // blank lines don't count for anything |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
178 // except a local symbol context 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
|
179 if (!*line) |
2c24602be78f
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 as -> context = lwasm_next_context(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
|
182 goto nextline; |
2c24602be78f
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 } |
2c24602be78f
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 // skip comments |
399
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
186 // comments do not create a context break |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
187 if (*line == '*' || *line == ';' || *line == '#') |
2c24602be78f
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 goto nextline; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
189 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
190 p1 = line; |
399
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
191 if (isdigit(*p1) && !CURPRAGMA(cl, PRAGMA_NEWSOURCE)) |
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
|
192 { |
2c24602be78f
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 // skip line number |
2c24602be78f
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 while (*p1 && isdigit(*p1)) |
2c24602be78f
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 p1++; |
2c24602be78f
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 if (!*p1 && !isspace(*p1)) |
2c24602be78f
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 p1 = line; |
2c24602be78f
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 else if (*p1 && !isspace(*p1)) |
2c24602be78f
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 p1 = line; |
2c24602be78f
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 else if (*p1 && isspace(*p1)) |
2c24602be78f
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 p1++; |
2c24602be78f
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 } |
2c24602be78f
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 |
2c24602be78f
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 // blank line - context 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
|
205 if (!*p1) |
2c24602be78f
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 { |
2c24602be78f
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 -> context = lwasm_next_context(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
|
208 goto nextline; |
2c24602be78f
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 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
211 // comment - no context 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
|
212 if (*p1 == '*' || *p1 == ';' || *p1 == '#') |
2c24602be78f
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 goto nextline; |
2c24602be78f
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 |
2c24602be78f
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 if (isspace(*p1)) |
2c24602be78f
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 { |
2c24602be78f
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 for (; *p1 && isspace(*p1); p1++) |
2c24602be78f
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 /* do nothing */ ; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
219 stspace = 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
|
220 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
221 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
|
222 stspace = 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 |
2c24602be78f
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 if (!*p1) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
225 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
226 // nothing but whitespace - context 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
|
227 as -> context = lwasm_next_context(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
|
228 goto nextline; |
2c24602be78f
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 |
2c24602be78f
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 // find the end of the first token |
2c24602be78f
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 for (tok = p1; *p1 && !isspace(*p1) && *p1 != ':' && *p1 != '='; p1++) |
2c24602be78f
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 /* do nothing */ ; |
2c24602be78f
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 |
2c24602be78f
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 if (*p1 == ':' || *p1 == '=' || stspace == 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
|
236 { |
85 | 237 if (*tok == '*' || *tok == ';' || *tok == '#') |
238 goto nextline; | |
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
|
239 // have a symbol here |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
240 sym = lw_strndup(tok, p1 - tok); |
2c24602be78f
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 if (*p1 == ':') |
2c24602be78f
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 p1++; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
243 for (; *p1 && isspace(*p1); p1++) |
2c24602be78f
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 /* do nothing */ ; |
399
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
245 |
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 if (*p1 == '=') |
2c24602be78f
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 tok = p1++; |
2c24602be78f
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 } |
2c24602be78f
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 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
|
251 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
252 for (tok = p1; *p1 && !isspace(*p1); p1++) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
253 /* do nothing */ ; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
254 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
255 } |
2c24602be78f
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 if (sym && strcmp(sym, "!") == 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
|
257 cl -> isbrpt = 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
|
258 else if (sym) |
2c24602be78f
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 cl -> sym = lw_strdup(sym); |
2c24602be78f
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 cl -> symset = 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
|
261 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
262 // tok points to the opcode for the line or NUL if none |
59
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
263 |
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
264 // if the first two chars of the opcode are "??", that's |
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
265 // a flag to inhibit macro expansion |
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
266 if (*tok && tok[0] == '?' && tok[1] == '?') |
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
267 { |
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
268 nomacro = 1; |
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
269 tok += 2; |
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
270 } |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
271 if (*tok) |
2c24602be78f
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 { |
399
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
273 if (CURPRAGMA(cl, PRAGMA_TESTMODE)) |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
274 { |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
275 /* in test mode, terminate the line here so we don't affect the parsers */ |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
276 /* (cl -> ltext retains the full, unmodified string) */ |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
277 char *t = strstr(p1, ";."); |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
278 if (t) *t = 0; |
375 | 279 } |
280 | |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
281 // look up operation code |
93
5bf9edabd661
Squashed the remaining memory leaks revealed by valgrind
lost@l-w.ca
parents:
85
diff
changeset
|
282 lw_free(sym); |
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
|
283 sym = lw_strndup(tok, p1 - tok); |
2c24602be78f
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 for (; *p1 && isspace(*p1); p1++) |
2c24602be78f
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 /* do nothing */ ; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
286 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
287 for (opnum = 0; instab[opnum].opcode; opnum++) |
2c24602be78f
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 { |
385 | 289 // ignore 6800 compatibility opcodes unless asked for |
290 if ((instab[opnum].flags & lwasm_insn_is6800) && !CURPRAGMA(cl, PRAGMA_6800COMPAT)) continue; | |
291 // ignore 6809 convenience opcodes unless asked for | |
292 if ((instab[opnum].flags & lwasm_insn_is6809conv) && !CURPRAGMA(cl, PRAGMA_6809CONV)) continue; | |
293 // ignore 6809 convenience opcodes in 6309 mode | |
294 if ((instab[opnum].flags & lwasm_insn_is6809conv) && !CURPRAGMA(cl, PRAGMA_6809)) continue; | |
295 // ignore 6309 convenience opcodes unless asked for | |
296 if ((instab[opnum].flags & lwasm_insn_is6309conv) && !CURPRAGMA(cl, PRAGMA_6309CONV)) continue; | |
297 | |
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
|
298 if (!strcasecmp(instab[opnum].opcode, sym)) |
2c24602be78f
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 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
|
300 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
301 |
107
b3557f8325f7
Fixed bug with symbol on a line with a comment not getting registered
lost@l-w.ca
parents:
93
diff
changeset
|
302 // have to go to linedone here in case there was a symbol |
b3557f8325f7
Fixed bug with symbol on a line with a comment not getting registered
lost@l-w.ca
parents:
93
diff
changeset
|
303 // to register on this line |
85 | 304 if (instab[opnum].opcode == NULL && (*tok == '*' || *tok == ';' || *tok == '#')) |
107
b3557f8325f7
Fixed bug with symbol on a line with a comment not getting registered
lost@l-w.ca
parents:
93
diff
changeset
|
305 goto linedone; |
85 | 306 |
0
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
307 // p1 points to the start of the operand |
2c24602be78f
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 // if we're inside a macro definition and not at ENDM, |
2c24602be78f
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 // add the line to the macro definition and continue |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
311 if (as -> inmacro && !(instab[opnum].flags & lwasm_insn_endm)) |
2c24602be78f
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 add_macro_line(as, line); |
2c24602be78f
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 goto linedone; |
2c24602be78f
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 |
2c24602be78f
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 // if skipping a condition and the operation code doesn't |
2c24602be78f
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 // operate within a condition (not a conditional) |
2c24602be78f
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 // do nothing |
2c24602be78f
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 if (as -> skipcond && !(instab[opnum].flags & lwasm_insn_cond)) |
2c24602be78f
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 goto linedone; |
2c24602be78f
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 |
371
2593fd529be5
Change PRAGMA_SHADOW to behave more as expected
William Astle <lost@l-w.ca>
parents:
370
diff
changeset
|
323 if (!nomacro && (as->pragmas & PRAGMA_SHADOW)) |
53
cb4efc47ce9d
Allow macros to shadow/override builtin operations when the "shadow" pragma is active, which is NOT the default
lost@l-w.ca
parents:
49
diff
changeset
|
324 { |
cb4efc47ce9d
Allow macros to shadow/override builtin operations when the "shadow" pragma is active, which is NOT the default
lost@l-w.ca
parents:
49
diff
changeset
|
325 // check for macros even if they shadow real operations |
cb4efc47ce9d
Allow macros to shadow/override builtin operations when the "shadow" pragma is active, which is NOT the default
lost@l-w.ca
parents:
49
diff
changeset
|
326 // NOTE: "ENDM" cannot be shadowed |
cb4efc47ce9d
Allow macros to shadow/override builtin operations when the "shadow" pragma is active, which is NOT the default
lost@l-w.ca
parents:
49
diff
changeset
|
327 if (expand_macro(as, cl, &p1, sym) == 0) |
cb4efc47ce9d
Allow macros to shadow/override builtin operations when the "shadow" pragma is active, which is NOT the default
lost@l-w.ca
parents:
49
diff
changeset
|
328 { |
cb4efc47ce9d
Allow macros to shadow/override builtin operations when the "shadow" pragma is active, which is NOT the default
lost@l-w.ca
parents:
49
diff
changeset
|
329 // a macro was expanded here |
cb4efc47ce9d
Allow macros to shadow/override builtin operations when the "shadow" pragma is active, which is NOT the default
lost@l-w.ca
parents:
49
diff
changeset
|
330 goto linedone; |
cb4efc47ce9d
Allow macros to shadow/override builtin operations when the "shadow" pragma is active, which is NOT the default
lost@l-w.ca
parents:
49
diff
changeset
|
331 } |
cb4efc47ce9d
Allow macros to shadow/override builtin operations when the "shadow" pragma is active, which is NOT the default
lost@l-w.ca
parents:
49
diff
changeset
|
332 } |
460
3d53f2e8d0e0
Allow macros to shadow instructions that are not supported by current CPU.
William Astle <lost@l-w.ca>
parents:
433
diff
changeset
|
333 |
3d53f2e8d0e0
Allow macros to shadow instructions that are not supported by current CPU.
William Astle <lost@l-w.ca>
parents:
433
diff
changeset
|
334 if (instab[opnum].opcode == NULL || |
3d53f2e8d0e0
Allow macros to shadow instructions that are not supported by current CPU.
William Astle <lost@l-w.ca>
parents:
433
diff
changeset
|
335 ( |
3d53f2e8d0e0
Allow macros to shadow instructions that are not supported by current CPU.
William Astle <lost@l-w.ca>
parents:
433
diff
changeset
|
336 (CURPRAGMA(cl, PRAGMA_6809) && (instab[opnum].flags & lwasm_insn_is6309)) || |
3d53f2e8d0e0
Allow macros to shadow instructions that are not supported by current CPU.
William Astle <lost@l-w.ca>
parents:
433
diff
changeset
|
337 (!CURPRAGMA(cl, PRAGMA_6809) && (instab[opnum].flags & lwasm_insn_is6809)) |
3d53f2e8d0e0
Allow macros to shadow instructions that are not supported by current CPU.
William Astle <lost@l-w.ca>
parents:
433
diff
changeset
|
338 )) |
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
|
339 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
340 cl -> insn = -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
|
341 if (*tok != ';' && *tok != '*') |
2c24602be78f
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 // bad opcode; check for macro here |
59
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
344 // but don't expand it if "nomacro" is in effect |
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
345 if (nomacro || expand_macro(as, cl, &p1, sym) != 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
|
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 // macro expansion failed |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
348 if (expand_struct(as, cl, &p1, sym) != 0) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
349 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
350 // structure expansion failed |
370
8764142b3192
Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents:
367
diff
changeset
|
351 lwasm_register_error(as, cl, E_OPCODE_BAD); |
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
|
352 } |
2c24602be78f
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 } |
2c24602be78f
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 cl -> insn = opnum; |
2c24602be78f
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 // no parse func means operand doesn't matter |
2c24602be78f
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 if (instab[opnum].parse) |
2c24602be78f
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 { |
367
c6d2a1f54e0c
Change processor target variations to pragmas.
William Astle <lost@l-w.ca>
parents:
343
diff
changeset
|
362 if (CURPRAGMA(cl, PRAGMA_6809) && (instab[opnum].flags & lwasm_insn_is6309)) |
370
8764142b3192
Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents:
367
diff
changeset
|
363 lwasm_register_error2(as, cl, E_6309_INVALID, "(%s)", sym); |
367
c6d2a1f54e0c
Change processor target variations to pragmas.
William Astle <lost@l-w.ca>
parents:
343
diff
changeset
|
364 if (!CURPRAGMA(cl, PRAGMA_6809) && (instab[opnum].flags & lwasm_insn_is6809)) |
370
8764142b3192
Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents:
367
diff
changeset
|
365 lwasm_register_error2(as, cl, E_6809_INVALID, "(%s)", sym); |
367
c6d2a1f54e0c
Change processor target variations to pragmas.
William Astle <lost@l-w.ca>
parents:
343
diff
changeset
|
366 |
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
|
367 if (as -> instruct == 0 || instab[opnum].flags & lwasm_insn_struct) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
368 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
369 cl -> len = -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
|
370 // call parse function |
329
9f7889139b06
Fix 6809 mode to count 6309 instructions as non-existent
William Astle <lost@l-w.ca>
parents:
273
diff
changeset
|
371 debug_message(as, 100, "len = %d, dlen = %d", cl -> len, cl -> dlen); |
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
|
372 (instab[opnum].parse)(as, cl, &p1); |
382 | 373 |
343
98f3e016cfd8
Add pragma to turn off forward reference optimization
William Astle <lost@l-w.ca>
parents:
336
diff
changeset
|
374 // if we're forcing address modes on pass 1, force a resolution |
98f3e016cfd8
Add pragma to turn off forward reference optimization
William Astle <lost@l-w.ca>
parents:
336
diff
changeset
|
375 if (CURPRAGMA(cl, PRAGMA_FORWARDREFMAX) && instab[opnum].resolve) |
98f3e016cfd8
Add pragma to turn off forward reference optimization
William Astle <lost@l-w.ca>
parents:
336
diff
changeset
|
376 { |
98f3e016cfd8
Add pragma to turn off forward reference optimization
William Astle <lost@l-w.ca>
parents:
336
diff
changeset
|
377 (instab[opnum].resolve)(as, cl, 1); |
98f3e016cfd8
Add pragma to turn off forward reference optimization
William Astle <lost@l-w.ca>
parents:
336
diff
changeset
|
378 } |
142
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
379 if ((cl -> inmod == 0) && cl -> len >= 0 && cl -> dlen >= 0) |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
380 { |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
381 if (cl -> len == 0) |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
382 cl -> len = cl -> dlen; |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
383 else |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
384 cl -> dlen = cl -> len; |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
385 } |
399
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
386 if (!CURPRAGMA(cl, PRAGMA_NEWSOURCE)) |
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
|
387 { |
399
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
388 if (*p1 && !isspace(*p1) && !(cl -> err)) |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
389 { |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
390 // flag bad operand error |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
391 lwasm_register_error2(as, cl, E_OPERAND_BAD, "(%s)", p1); |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
392 } |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
393 } |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
394 else |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
395 { |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
396 lwasm_skip_to_next_token(cl, &p1); |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
397 /* if we did not hit the end of the line and we aren't at a comment character, error out */ |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
398 if (*p1 && *p1 != ';' && *p1 != '#' && *p1 != ';') |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
399 { |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
400 // flag bad operand error |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
401 lwasm_register_error2(as, cl, E_OPERAND_BAD, "%s", p1); |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
402 } |
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
|
403 } |
43
18b49cf10ae9
Added an instruction reduction immediately after instruction parsing to minimize memory footprint and expression complexity
lost@l-w.ca
parents:
40
diff
changeset
|
404 |
18b49cf10ae9
Added an instruction reduction immediately after instruction parsing to minimize memory footprint and expression complexity
lost@l-w.ca
parents:
40
diff
changeset
|
405 /* do a reduction on the line expressions to avoid carrying excessive expression baggage if not needed */ |
336
30b2bad9b5eb
Factor some code for simplifying lines so it can be reused
William Astle <lost@l-w.ca>
parents:
333
diff
changeset
|
406 lwasm_reduce_line_exprs(cl); |
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
|
407 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
408 else if (as -> instruct == 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
|
409 { |
370
8764142b3192
Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents:
367
diff
changeset
|
410 lwasm_register_error2(as, cl, E_OPERAND_BAD, "(%s)", p1); |
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 } |
2c24602be78f
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 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
413 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
414 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
415 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
416 linedone: |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
417 if (!as -> skipcond && !as -> inmacro) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
418 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
419 if (cl -> sym && cl -> symset == 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
|
420 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
421 debug_message(as, 50, "Register symbol %s: %s", cl -> sym, lw_expr_print(cl -> addr)); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
422 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
423 // register symbol at line address |
142
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
424 if (instab[cl -> insn].flags & lwasm_insn_setdata) |
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
|
425 { |
142
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
426 if (!register_symbol(as, cl, cl -> sym, cl -> daddr, symbol_flag_none)) |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
427 { |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
428 // symbol error |
370
8764142b3192
Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents:
367
diff
changeset
|
429 // lwasm_register_error2(as, cl, E_SYMBOL_BAD, "(%s)", cl -> sym); |
142
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
430 } |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
431 } |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
432 else |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
433 { |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
434 if (!register_symbol(as, cl, cl -> sym, cl -> addr, symbol_flag_none)) |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
435 { |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
436 // symbol error |
370
8764142b3192
Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents:
367
diff
changeset
|
437 // lwasm_register_error2(as, cl, E_SYMBOL_BAD, "(%s)", cl -> sym); |
142
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
438 } |
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
|
439 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
440 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
441 debug_message(as, 40, "Line address: %s", lw_expr_print(cl -> addr)); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
442 } |
219 | 443 if (as -> skipcond || as -> inmacro || cl -> ltext[0] == 1) |
444 cl -> hideline = 1; | |
445 | |
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
|
446 nextline: |
93
5bf9edabd661
Squashed the remaining memory leaks revealed by valgrind
lost@l-w.ca
parents:
85
diff
changeset
|
447 if (sym) |
5bf9edabd661
Squashed the remaining memory leaks revealed by valgrind
lost@l-w.ca
parents:
85
diff
changeset
|
448 lw_free(sym); |
5bf9edabd661
Squashed the remaining memory leaks revealed by valgrind
lost@l-w.ca
parents:
85
diff
changeset
|
449 sym = NULL; |
5bf9edabd661
Squashed the remaining memory leaks revealed by valgrind
lost@l-w.ca
parents:
85
diff
changeset
|
450 |
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
|
451 lw_free(line); |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
452 |
220 | 453 if (as -> preprocess && cl -> hideline == 0) |
219 | 454 { |
455 printf("%s\n", cl -> ltext); | |
456 } | |
457 | |
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
|
458 // if we've hit the "end" bit, finish 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
|
459 if (as -> endseen) |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
460 return; |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
461 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
462 } |