Mercurial > hg > index.cgi
annotate lwasm/pass1.c @ 506:7e8298f7bc0a
Add basic syntax for typecasting
Add parser support for type casts. This current scheme handles only integer
types.
Also include parenthesis grouping in expressions.
author | William Astle <lost@l-w.ca> |
---|---|
date | Sun, 27 Oct 2019 12:06:01 -0600 |
parents | 74d0c394666e |
children | 7e41d6123175 |
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; | |
472
e97f9a302c6a
Add emuext pragma and associated instructions.
William Astle <lost@l-w.ca>
parents:
461
diff
changeset
|
297 // ignore emulator extension opcodes unless asked for |
e97f9a302c6a
Add emuext pragma and associated instructions.
William Astle <lost@l-w.ca>
parents:
461
diff
changeset
|
298 if ((instab[opnum].flags & lwasm_insn_isemuext) && !CURPRAGMA(cl, PRAGMA_EMUEXT)) continue; |
385 | 299 |
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
|
300 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
|
301 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
|
302 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
303 |
107
b3557f8325f7
Fixed bug with symbol on a line with a comment not getting registered
lost@l-w.ca
parents:
93
diff
changeset
|
304 // 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
|
305 // to register on this line |
85 | 306 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
|
307 goto linedone; |
85 | 308 |
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
|
309 // 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
|
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 // 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
|
312 // 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
|
313 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
|
314 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
315 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
|
316 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
|
317 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
318 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
319 // if 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
|
320 // 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
|
321 // 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
|
322 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
|
323 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
|
324 |
371
2593fd529be5
Change PRAGMA_SHADOW to behave more as expected
William Astle <lost@l-w.ca>
parents:
370
diff
changeset
|
325 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
|
326 { |
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 // 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
|
328 // 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
|
329 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
|
330 { |
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 // 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
|
332 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
|
333 } |
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
|
334 } |
460
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 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
|
337 (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
|
338 (!CURPRAGMA(cl, PRAGMA_6809) && (instab[opnum].flags & lwasm_insn_is6809)) |
461
c8d4f3486ad7
Make 6309/6809 warnings work again.
William Astle <lost@l-w.ca>
parents:
460
diff
changeset
|
339 ) |
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
|
340 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
341 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
|
342 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
|
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 // bad opcode; check for macro here |
59
1830faeef332
Added ?? prefix for opcode to inhibit macro expansion
lost@l-w.ca
parents:
53
diff
changeset
|
345 // 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
|
346 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
|
347 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
348 // 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
|
349 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
|
350 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
351 // structure expansion failed |
461
c8d4f3486ad7
Make 6309/6809 warnings work again.
William Astle <lost@l-w.ca>
parents:
460
diff
changeset
|
352 if (CURPRAGMA(cl, PRAGMA_6809) && (instab[opnum].flags & lwasm_insn_is6309)) |
c8d4f3486ad7
Make 6309/6809 warnings work again.
William Astle <lost@l-w.ca>
parents:
460
diff
changeset
|
353 lwasm_register_error2(as, cl, E_6309_INVALID, "(%s)", sym); |
c8d4f3486ad7
Make 6309/6809 warnings work again.
William Astle <lost@l-w.ca>
parents:
460
diff
changeset
|
354 else if (!CURPRAGMA(cl, PRAGMA_6809) && (instab[opnum].flags & lwasm_insn_is6809)) |
c8d4f3486ad7
Make 6309/6809 warnings work again.
William Astle <lost@l-w.ca>
parents:
460
diff
changeset
|
355 lwasm_register_error2(as, cl, E_6809_INVALID, "(%s)", sym); |
c8d4f3486ad7
Make 6309/6809 warnings work again.
William Astle <lost@l-w.ca>
parents:
460
diff
changeset
|
356 else |
c8d4f3486ad7
Make 6309/6809 warnings work again.
William Astle <lost@l-w.ca>
parents:
460
diff
changeset
|
357 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
|
358 } |
2c24602be78f
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 } |
2c24602be78f
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 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
|
363 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
364 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
|
365 // 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
|
366 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
|
367 { |
367
c6d2a1f54e0c
Change processor target variations to pragmas.
William Astle <lost@l-w.ca>
parents:
343
diff
changeset
|
368 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
|
369 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
|
370 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
|
371 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
|
372 |
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
|
373 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
|
374 { |
2c24602be78f
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 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
|
376 // 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
|
377 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
|
378 (instab[opnum].parse)(as, cl, &p1); |
382 | 379 |
343
98f3e016cfd8
Add pragma to turn off forward reference optimization
William Astle <lost@l-w.ca>
parents:
336
diff
changeset
|
380 // 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
|
381 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
|
382 { |
98f3e016cfd8
Add pragma to turn off forward reference optimization
William Astle <lost@l-w.ca>
parents:
336
diff
changeset
|
383 (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
|
384 } |
142
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
385 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
|
386 { |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
387 if (cl -> len == 0) |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
388 cl -> len = cl -> dlen; |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
389 else |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
390 cl -> dlen = cl -> len; |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
391 } |
399
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
392 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
|
393 { |
399
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
394 if (*p1 && !isspace(*p1) && !(cl -> err)) |
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 // flag bad operand error |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
397 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
|
398 } |
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 else |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
401 { |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
402 lwasm_skip_to_next_token(cl, &p1); |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
403 /* 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
|
404 if (*p1 && *p1 != ';' && *p1 != '#' && *p1 != ';') |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
405 { |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
406 // flag bad operand error |
6153cb49403c
Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents:
385
diff
changeset
|
407 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
|
408 } |
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
|
409 } |
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
|
410 |
18b49cf10ae9
Added an instruction reduction immediately after instruction parsing to minimize memory footprint and expression complexity
lost@l-w.ca
parents:
40
diff
changeset
|
411 /* 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
|
412 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
|
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 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
|
415 { |
370
8764142b3192
Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents:
367
diff
changeset
|
416 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
|
417 } |
2c24602be78f
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 } |
2c24602be78f
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 |
2c24602be78f
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 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
|
423 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
|
424 { |
2c24602be78f
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 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
|
426 { |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
427 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
|
428 |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
429 // register symbol at line address |
142
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
430 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
|
431 { |
142
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
432 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
|
433 { |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
434 // 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
|
435 // 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
|
436 } |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
437 } |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
438 else |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
439 { |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
440 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
|
441 { |
697bc543368c
Implement distinction between . and * for OS9 modules
lost@l-w.ca
parents:
107
diff
changeset
|
442 // 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
|
443 // 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
|
444 } |
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
|
445 } |
2c24602be78f
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 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
447 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
|
448 } |
219 | 449 if (as -> skipcond || as -> inmacro || cl -> ltext[0] == 1) |
450 cl -> hideline = 1; | |
474
74d0c394666e
Add "noexpandcond" pragma (cleans up listings)
William Astle <lost@l-w.ca>
parents:
472
diff
changeset
|
451 if (as -> skipcond) |
74d0c394666e
Add "noexpandcond" pragma (cleans up listings)
William Astle <lost@l-w.ca>
parents:
472
diff
changeset
|
452 cl -> hidecond = 1; |
74d0c394666e
Add "noexpandcond" pragma (cleans up listings)
William Astle <lost@l-w.ca>
parents:
472
diff
changeset
|
453 |
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
|
454 nextline: |
93
5bf9edabd661
Squashed the remaining memory leaks revealed by valgrind
lost@l-w.ca
parents:
85
diff
changeset
|
455 if (sym) |
5bf9edabd661
Squashed the remaining memory leaks revealed by valgrind
lost@l-w.ca
parents:
85
diff
changeset
|
456 lw_free(sym); |
5bf9edabd661
Squashed the remaining memory leaks revealed by valgrind
lost@l-w.ca
parents:
85
diff
changeset
|
457 sym = NULL; |
5bf9edabd661
Squashed the remaining memory leaks revealed by valgrind
lost@l-w.ca
parents:
85
diff
changeset
|
458 |
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
|
459 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
|
460 |
220 | 461 if (as -> preprocess && cl -> hideline == 0) |
219 | 462 { |
463 printf("%s\n", cl -> ltext); | |
464 } | |
465 | |
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
|
466 // 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
|
467 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
|
468 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
|
469 } |
2c24602be78f
Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff
changeset
|
470 } |