xa_asm: fixed parsing of symbols used with DS directive in BSEG (pass 2&3).
[fw/sdcc] / as / xa51 / xa_asm.l
1 %{
2 /* This file is part of Paul's XA51 Assembler, Copyright 1997,2002 Paul Stoffregen
3  *
4  * Paul's XA51 Assembler is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 2.
7  *
8  * Paul's XA51 Assembler is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with Foobar; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16  */
17
18 /* Author contact: paul@pjrc.com */
19
20 #include <stdio.h>
21 #include <string.h>
22 #include "xa_main.h"
23 #include "xa_asm.tab.h"
24
25 extern int inst_size, yylval;
26 char line_text[MAX_LINE]={'\0'}, last_line_text[MAX_LINE];
27 char lex_sym_name[MAX_SYMBOL];
28 extern char base_symbol_name[];
29 #define LIST if (p3) strcat(line_text, yytext)
30 %}
31
32 %%
33
34 add\.w          {LIST; inst_size=SIZE16; return ADD;}
35 add\.b          {LIST; inst_size=SIZE8; return ADD;}
36 add             {LIST; inst_size=UNKNOWN; return ADD;}
37 addc\.w         {LIST; inst_size=SIZE16; return ADDC;}
38 addc\.b         {LIST; inst_size=SIZE8; return ADDC;}
39 addc            {LIST; inst_size=UNKNOWN; return ADDC;}
40 adds\.w         {LIST; inst_size=SIZE16; return ADDS;}
41 adds\.b         {LIST; inst_size=SIZE8; return ADDS;}
42 adds            {LIST; inst_size=UNKNOWN; return ADDS;}
43 and\.w          {LIST; inst_size=SIZE16; return AND;}
44 and\.b          {LIST; inst_size=SIZE8; return AND;}
45 and             {LIST; inst_size=UNKNOWN; return AND;}
46 anl             {LIST; inst_size=UNKNOWN; return ANL;}
47 asl\.d          {LIST; inst_size=SIZE32; return ASL;}
48 asl\.w          {LIST; inst_size=SIZE16; return ASL;}
49 asl\.b          {LIST; inst_size=SIZE8; return ASL;}
50 asl             {LIST; inst_size=UNKNOWN; return ASL;}
51 asr\.d          {LIST; inst_size=SIZE32; return ASR;}
52 asr\.w          {LIST; inst_size=SIZE16; return ASR;}
53 asr\.b          {LIST; inst_size=SIZE8; return ASR;}
54 asr             {LIST; inst_size=UNKNOWN; return ASR;}
55 bcc             {LIST; inst_size=UNKNOWN; return BCC;}
56 bcs             {LIST; inst_size=UNKNOWN; return BCS;}
57 beq             {LIST; inst_size=UNKNOWN; return BEQ;}
58 bg              {LIST; inst_size=UNKNOWN; return BG;}
59 bge             {LIST; inst_size=UNKNOWN; return BGE;}
60 bgt             {LIST; inst_size=UNKNOWN; return BGT;}
61 bkpt            {LIST; inst_size=UNKNOWN; return BKPT;}
62 bl              {LIST; inst_size=UNKNOWN; return BL;}
63 ble             {LIST; inst_size=UNKNOWN; return BLE;}
64 blt             {LIST; inst_size=UNKNOWN; return BLT;}
65 bmi             {LIST; inst_size=UNKNOWN; return BMI;}
66 bne             {LIST; inst_size=UNKNOWN; return BNE;}
67 bnv             {LIST; inst_size=UNKNOWN; return BNV;}
68 bov             {LIST; inst_size=UNKNOWN; return BOV;}
69 bpl             {LIST; inst_size=UNKNOWN; return BPL;}
70 br              {LIST; inst_size=UNKNOWN; return BR;}
71 call            {LIST; inst_size=UNKNOWN; return CALL;}
72 cjne\.w         {LIST; inst_size=SIZE16; return CJNE;}
73 cjne\.b         {LIST; inst_size=SIZE8; return CJNE;}
74 cjne            {LIST; inst_size=UNKNOWN; return CJNE;}
75 clr             {LIST; inst_size=UNKNOWN; return CLR;}
76 cmp\.w          {LIST; inst_size=SIZE16; return CMP;}
77 cmp\.b          {LIST; inst_size=SIZE8; return CMP;}
78 cmp             {LIST; inst_size=UNKNOWN; return CMP;}
79 cpl\.w          {LIST; inst_size=SIZE16; return CPL;}
80 cpl\.b          {LIST; inst_size=SIZE8; return CPL;}
81 cpl             {LIST; inst_size=UNKNOWN; return CPL;}
82 da\.b           {LIST; inst_size=SIZE8; return DA;}
83 da              {LIST; inst_size=UNKNOWN; return DA;}
84 div\.d          {LIST; inst_size=SIZE32; return DIV;}
85 div\.w          {LIST; inst_size=SIZE16; return DIV;}
86 div\.b          {LIST; inst_size=SIZE8; return DIV;}
87 div             {LIST; inst_size=UNKNOWN; return DIV;}
88 divu\.d         {LIST; inst_size=SIZE32; return DIVU;}
89 divu\.w         {LIST; inst_size=SIZE16; return DIVU;}
90 divu\.b         {LIST; inst_size=SIZE8; return DIVU;}
91 divu            {LIST; inst_size=UNKNOWN; return DIVU;}
92 djnz\.w         {LIST; inst_size=SIZE16; return DJNZ;}
93 djnz\.b         {LIST; inst_size=SIZE8; return DJNZ;}
94 djnz            {LIST; inst_size=UNKNOWN; return DJNZ;}
95 fcall           {LIST; inst_size=UNKNOWN; return FCALL;}
96 fjmp            {LIST; inst_size=UNKNOWN; return FJMP;}
97 jb              {LIST; inst_size=UNKNOWN; return JB;}
98 jbc             {LIST; inst_size=UNKNOWN; return JBC;}
99 jmp             {LIST; inst_size=UNKNOWN; return JMP;}
100 jnb             {LIST; inst_size=UNKNOWN; return JNB;}
101 jnz             {LIST; inst_size=UNKNOWN; return JNZ;}
102 jz              {LIST; inst_size=UNKNOWN; return JZ;}
103 lea\.w          {LIST; inst_size=SIZE16; return LEA;}
104 lea             {LIST; inst_size=UNKNOWN; return LEA;}
105 lsr\.d          {LIST; inst_size=SIZE32; return LSR;}
106 lsr\.w          {LIST; inst_size=SIZE16; return LSR;}
107 lsr\.b          {LIST; inst_size=SIZE8; return LSR;}
108 lsr             {LIST; inst_size=UNKNOWN; return LSR;}
109 mov\.w          {LIST; inst_size=SIZE16; return MOV;}
110 mov\.b          {LIST; inst_size=SIZE8; return MOV;}
111 mov             {LIST; inst_size=UNKNOWN; return MOV;}
112 movc\.w         {LIST; inst_size=SIZE16; return MOVC;}
113 movc\.b         {LIST; inst_size=SIZE8; return MOVC;}
114 movc            {LIST; inst_size=UNKNOWN; return MOVC;}
115 movs\.w         {LIST; inst_size=SIZE16; return MOVS;}
116 movs\.b         {LIST; inst_size=SIZE8; return MOVS;}
117 movs            {LIST; inst_size=UNKNOWN; return MOVS;}
118 movx\.w         {LIST; inst_size=SIZE16; return MOVX;}
119 movx\.b         {LIST; inst_size=SIZE8; return MOVX;}
120 movx            {LIST; inst_size=UNKNOWN; return MOVX;}
121 mul\.d          {LIST; inst_size=SIZE32; return MUL;}
122 mul\.w          {LIST; inst_size=SIZE16; return MUL;}
123 mul\.b          {LIST; inst_size=SIZE8; return MUL;}
124 mul             {LIST; inst_size=UNKNOWN; return MUL;}
125 mulu\.d         {LIST; inst_size=SIZE32; return MULU;}
126 mulu\.w         {LIST; inst_size=SIZE16; return MULU;}
127 mulu\.b         {LIST; inst_size=SIZE8; return MULU;}
128 mulu            {LIST; inst_size=UNKNOWN; return MULU;}
129 neg\.w          {LIST; inst_size=SIZE16; return NEG;}
130 neg\.b          {LIST; inst_size=SIZE8; return NEG;}
131 neg             {LIST; inst_size=UNKNOWN; return NEG;}
132 nop             {LIST; inst_size=UNKNOWN; return NOP;}
133 norm\.d         {LIST; inst_size=SIZE32; return NORM;}
134 norm\.w         {LIST; inst_size=SIZE16; return NORM;}
135 norm\.b         {LIST; inst_size=SIZE8; return NORM;}
136 norm            {LIST; inst_size=UNKNOWN; return NORM;}
137 or\.w           {LIST; inst_size=SIZE16; return OR;}
138 or\.b           {LIST; inst_size=SIZE8; return OR;}
139 or              {LIST; inst_size=UNKNOWN; return OR;}
140 orl             {LIST; inst_size=UNKNOWN; return ORL;}
141 pop\.w          {LIST; inst_size=SIZE16; return POP;}
142 pop\.b          {LIST; inst_size=SIZE8; return POP;}
143 pop             {LIST; inst_size=UNKNOWN; return POP;}
144 popu\.w         {LIST; inst_size=SIZE16; return POPU;}
145 popu\.b         {LIST; inst_size=SIZE8; return POPU;}
146 popu            {LIST; inst_size=UNKNOWN; return POPU;}
147 push\.w         {LIST; inst_size=SIZE16; return PUSH;}
148 push\.b         {LIST; inst_size=SIZE8; return PUSH;}
149 push            {LIST; inst_size=UNKNOWN; return PUSH;}
150 pushu\.w        {LIST; inst_size=SIZE16; return PUSHU;}
151 pushu\.b        {LIST; inst_size=SIZE8; return PUSHU;}
152 pushu           {LIST; inst_size=UNKNOWN; return PUSHU;}
153 reset           {LIST; inst_size=UNKNOWN; return RESET;}
154 ret             {LIST; inst_size=UNKNOWN; return RET;}
155 reti            {LIST; inst_size=UNKNOWN; return RETI;}
156 rl\.w           {LIST; inst_size=SIZE16; return RL;}
157 rl\.b           {LIST; inst_size=SIZE8; return RL;}
158 rl              {LIST; inst_size=UNKNOWN; return RL;}
159 rlc\.w          {LIST; inst_size=SIZE16; return RLC;}
160 rlc\.b          {LIST; inst_size=SIZE8; return RLC;}
161 rlc             {LIST; inst_size=UNKNOWN; return RLC;}
162 rr\.w           {LIST; inst_size=SIZE16; return RR;}
163 rr\.b           {LIST; inst_size=SIZE8; return RR;}
164 rr              {LIST; inst_size=UNKNOWN; return RR;}
165 rrc\.w          {LIST; inst_size=SIZE16; return RRC;}
166 rrc\.b          {LIST; inst_size=SIZE8; return RRC;}
167 rrc             {LIST; inst_size=UNKNOWN; return RRC;}
168 setb            {LIST; inst_size=UNKNOWN; return SETB;}
169 sext\.w         {LIST; inst_size=SIZE16; return SEXT;}
170 sext\.b         {LIST; inst_size=SIZE8; return SEXT;}
171 sext            {LIST; inst_size=UNKNOWN; return SEXT;}
172 sub\.w          {LIST; inst_size=SIZE16; return SUB;}
173 sub\.b          {LIST; inst_size=SIZE8; return SUB;}
174 sub             {LIST; inst_size=UNKNOWN; return SUB;}
175 subb\.w         {LIST; inst_size=SIZE16; return SUBB;}
176 subb\.b         {LIST; inst_size=SIZE8; return SUBB;}
177 subb            {LIST; inst_size=UNKNOWN; return SUBB;}
178 trap            {LIST; inst_size=UNKNOWN; return TRAP;}
179 xch\.w          {LIST; inst_size=SIZE16; return XCH;}
180 xch\.b          {LIST; inst_size=SIZE8; return XCH;}
181 xch             {LIST; inst_size=UNKNOWN; return XCH;}
182 xor\.w          {LIST; inst_size=SIZE16; return XOR;}
183 xor\.b          {LIST; inst_size=SIZE8; return XOR;}
184 xor             {LIST; inst_size=UNKNOWN; return XOR;}
185
186
187 dptr            {LIST; return DPTR;}
188 pc              {LIST; return PC;}
189 a               {LIST; return A;}
190 c               {LIST; return C;}
191 usp             {LIST; return USP;}
192
193 org             {LIST; return ORG;}
194 equ             {LIST; return EQU;}
195 sfr             {LIST; return EQU;}
196 db              {LIST; return DB;}
197 dw              {LIST; return DW;}
198 byte            {LIST; return DB;}
199 bit             {LIST; return BITDEF;}
200 reg             {LIST; return REGDEF;}
201 area            {LIST; return AREA;}
202 ds              {LIST; return DS;}
203 DSEG            {LIST; yylval = AREA_DSEG; return AREA_NAME;}
204 OSEG            {LIST; yylval = AREA_OSEG; return AREA_NAME;}
205 ISEG            {LIST; yylval = AREA_ISEG; return AREA_NAME;}
206 BSEG            {LIST; yylval = AREA_BSEG; return AREA_NAME;}
207 XSEG            {LIST; yylval = AREA_XSEG; return AREA_NAME;}
208 XISEG           {LIST; yylval = AREA_XISEG; return AREA_NAME;}
209 XINIT           {LIST; yylval = AREA_XINIT; return AREA_NAME;}
210 GSINIT          {LIST; yylval = AREA_GSINIT; return AREA_NAME;}
211 GSFINAL         {LIST; yylval = AREA_GSFINAL; return AREA_NAME;}
212 HOME            {LIST; yylval = AREA_HOME; return AREA_NAME;}
213 CSEG            {LIST; yylval = AREA_CSEG; return AREA_NAME;}
214 module          {LIST; return MODULE;}
215 globl           {LIST; return GLOBL;}
216 \(DATA\)        {LIST; return AREA_DESC;}
217 \(OVR,DATA\)    {LIST; return AREA_DESC;}
218 \(BIT\)         {LIST; return AREA_DESC;}
219 \(XDATA\)       {LIST; return AREA_DESC;}
220 \(CODE\)        {LIST; return AREA_DESC;}
221 low             {LIST; return LOW;}
222 high            {LIST; return HIGH;}
223 >>              {LIST; return RSHIFT;}
224 \<\<            {LIST; return LSHIFT;}
225
226
227 R[0-9]          {LIST; yylval = yytext[1] - '0' + WORD_REG; return REG;}
228 R1[0-5]         {LIST; yylval = yytext[2] - '0' + 10 + WORD_REG; return REG;}
229 R[0-7]L         {LIST; yylval = (yytext[1] - '0') * 2 + BYTE_REG; return REG;}
230 R[0-7]H         {LIST; yylval = (yytext[1] - '0') * 2 + 1 + BYTE_REG; return REG;}
231
232
233 [a-z_][a-z0-9_]*        {
234                                 LIST;
235                                 if (is_def(yytext)) {
236                                         yylval = get_value(yytext);
237                                 } else {
238                                         yylval = 0;
239                                         if (p3) error("Symbol undefined");
240                                 }
241                                 /* keep name in lex_sym_name since yytext */
242                                 /* could be overwritten if the parser does */
243                                 /* a lookahead operation */
244                                 strcpy(lex_sym_name, yytext);
245                                 if (is_def(lex_sym_name)) {
246                                         yylval = get_value(lex_sym_name);
247                                         /* return correct type if special */
248                                         if (is_bit(lex_sym_name)) return BIT;
249                                         if (is_reg(lex_sym_name)) return REG;
250                                 }
251                                 return WORD;
252                         }
253 [0-9]+\$                {
254                                 LIST;
255                                 /* should print error is base_symbol_name */
256                                 /* is not defined */
257                                 sprintf(lex_sym_name, "%s:%s",
258                                         base_symbol_name, yytext);
259                                 if (is_def(lex_sym_name)) {
260                                         yylval = get_value(lex_sym_name);
261                                 } else {
262                                         yylval = 0;
263                                         if (p3) error("Symbol undefined");
264                                 }
265                                 return WORD;
266                         }
267 [01]+[bq]               {
268                                 LIST;
269                                 yylval = binary2int(yytext);
270                                 return NUMBER;
271                         }
272 0x[0-9a-f]+             {
273                                 LIST;
274                                 sscanf(yytext, "%*c%*c%x", &yylval);
275                                 return NUMBER;
276                         }
277 [0-9a-f]+[h]            {
278                                 LIST;
279                                 sscanf(yytext, "%x%*[hH]", &yylval);
280                                 return NUMBER;
281                         }
282 \$[0-9a-f]+             {
283                                 LIST;
284                                 sscanf(yytext, "$%x", &yylval);
285                                 return NUMBER;
286                         }
287 -?[0-9]+                {
288                                 LIST;
289                                 sscanf(yytext, "%d", &yylval);
290                                 return NUMBER;
291                         }
292 \'.\'                   {
293                                 LIST;
294                                 yylval = (int)yytext[1];
295                                 return CHAR;
296                         }
297 \'\\.\'                 {
298                                 LIST;
299                                 switch (yytext[1]) {
300                                         case 'n':
301                                         case 'N': yylval = 10; break;
302                                         case 'r':
303                                         case 'R': yylval = 13; break;
304                                         case '0': yylval = 0; break;
305                                         default:  yylval = (int)yytext[1];
306                                         /* print a warning here */
307                                 }
308                                 return CHAR;
309                         }
310 \"[^"\n]*["\n]          {
311                                 LIST;
312                                 return STRING;
313                         }
314
315 ;[^\n]*         {LIST; /* comments */}
316 [ \t\r]         {LIST; /* whitespace */}
317
318 \n              {
319                         strcpy(last_line_text, line_text);
320                         line_text[0] = '\0';
321                         ++lineno;
322                         return EOL;
323                 }
324
325 .               {LIST; return yytext[0];}
326
327 %%