* Removed svn:executable property from non-executable files
[fw/sdcc] / as / xa51 / xa_rasm.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_rasm.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 SFR;}
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 BSEG            {LIST; yylval = AREA_BSEG; return AREA_NAME;}
205 XSEG            {LIST; yylval = AREA_XSEG; return AREA_NAME;}
206 XISEG           {LIST; yylval = AREA_XISEG; return AREA_NAME;}
207 XINIT           {LIST; yylval = AREA_XINIT; return AREA_NAME;}
208 GSINIT          {LIST; yylval = AREA_GSINIT; return AREA_NAME;}
209 GSFINAL         {LIST; yylval = AREA_GSFINAL; return AREA_NAME;}
210 HOME            {LIST; yylval = AREA_HOME; return AREA_NAME;}
211 SSEG            {LIST; yylval = AREA_SSEG; return AREA_NAME;}
212 CSEG            {LIST; yylval = AREA_CSEG; return AREA_NAME;}
213 module          {LIST; return MODULE;}
214 globl           {LIST; return GLOBL;}
215 \(DATA\)        {LIST; return AREA_DESC;}
216 \(OVR,XDATA\)   {LIST; return AREA_DESC;}
217 \(BIT\)         {LIST; return AREA_DESC;}
218 \(XDATA\)       {LIST; return AREA_DESC;}
219 \(CODE\)        {LIST; return AREA_DESC;}
220 low             {LIST; return LOW;}
221 high            {LIST; return HIGH;}
222 >>              {LIST; return RSHIFT;}
223 \<\<            {LIST; return LSHIFT;}
224
225 R[0-9]          {LIST; yylval = yytext[1] - '0' + WORD_REG; return REG;}
226 R1[0-5]         {LIST; yylval = yytext[2] - '0' + 10 + WORD_REG; return REG;}
227 R[0-7]L         {LIST; yylval = (yytext[1] - '0') * 2 + BYTE_REG; return REG;}
228 R[0-7]H         {LIST; yylval = (yytext[1] - '0') * 2 + 1 + BYTE_REG; return REG;}
229
230
231 [a-z_][a-z0-9_]*        {
232                                 LIST;
233                                 if (is_def(yytext)) {
234                                         yylval = get_value(yytext);
235                                 } else {
236                                         if (p1) build_sym_list(yytext);
237                                         yylval = 0;
238                                         //if (p3) error("Symbol undefined");
239                                 }
240                                 /* keep name in lex_sym_name since yytext */
241                                 /* could be overwritten if the parser does */
242                                 /* a lookahead operation */
243                                 strcpy(lex_sym_name, yytext);
244                                 if (is_def(lex_sym_name)) {
245                                         yylval = get_value(lex_sym_name);
246                                         /* return correct type if special */
247                                         if (is_bit(lex_sym_name)) return BIT;
248                                         if (is_reg(lex_sym_name)) return REG;
249                                 }
250                                 if (p3) {
251                                  if (*operand[0]) {
252                                    // first one in use
253                                    strcpy (operand[1], yytext);
254                                  } else {
255                                    strcpy (operand[0], yytext);
256                                  }
257                                 }
258                                 return WORD;
259                         }
260 [0-9]+\$                {
261                                 LIST;
262                                 /* should print error if base_symbol_name */
263                                 /* is not defined */
264                                 sprintf(lex_sym_name, "%s:%s",
265                                         base_symbol_name, yytext);
266                                 if (is_def(lex_sym_name)) {
267                                         yylval = get_value(lex_sym_name);
268                                 } else {
269                                         yylval = 0;
270                                         if (p3) error("Symbol undefined");
271                                 }
272                                 return WORD;
273                         }
274 [01]+[bq]               {
275                                 LIST;
276                                 yylval = binary2int(yytext);
277                                 return NUMBER;
278                         }
279 0x[0-9a-f]+             {
280                                 LIST;
281                                 sscanf(yytext, "%*c%*c%x", &yylval);
282                                 return NUMBER;
283                         }
284 [0-9a-f]+[h]            {
285                                 LIST;
286                                 sscanf(yytext, "%x%*[hH]", &yylval);
287                                 return NUMBER;
288                         }
289 \$[0-9a-f]+             {
290                                 LIST;
291                                 sscanf(yytext, "$%x", &yylval);
292                                 return NUMBER;
293                         }
294 -?[0-9]+                {
295                                 LIST;
296                                 sscanf(yytext, "%d", &yylval);
297                                 return NUMBER;
298                         }
299 \'.\'                   {
300                                 LIST;
301                                 yylval = (int)yytext[1];
302                                 return CHAR;
303                         }
304 \'\\.\'                 {
305                                 LIST;
306                                 switch (yytext[1]) {
307                                         case 'n':
308                                         case 'N': yylval = 10; break;
309                                         case 'r':
310                                         case 'R': yylval = 13; break;
311                                         case '0': yylval = 0; break;
312                                         default:  yylval = (int)yytext[1];
313                                         /* print a warning here */
314                                 }
315                                 return CHAR;
316                         }
317 \"[^"\n]*["\n]          {
318                                 LIST;
319                                 return STRING;
320                         }
321
322 ;[^\n]*         {LIST; /* comments */}
323 [ \t\r]         {LIST; /* whitespace */}
324
325 \n              {
326                         strcpy(last_line_text, line_text);
327                         line_text[0] = '\0';
328                         ++lineno;
329                         return EOL;
330                 }
331
332 .               {LIST; return yytext[0];}
333
334 %%