2 /* This file is part of Paul's XA51 Assembler, Copyright 1997,2002 Paul Stoffregen
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.
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.
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
18 /* Author contact: paul@pjrc.com */
23 #include "xa_rasm.tab.h"
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)
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;}
187 dptr {LIST; return DPTR;}
188 pc {LIST; return PC;}
191 usp {LIST; return USP;}
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;}
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;}
233 if (is_def(yytext)) {
234 yylval = get_value(yytext);
236 if (p1) build_sym_list(yytext);
238 //if (p3) error("Symbol undefined");
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;
253 strcpy (operand[1], yytext);
255 strcpy (operand[0], yytext);
262 /* should print error if base_symbol_name */
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);
270 if (p3) error("Symbol undefined");
276 yylval = binary2int(yytext);
281 sscanf(yytext, "%*c%*c%x", &yylval);
286 sscanf(yytext, "%x%*[hH]", &yylval);
291 sscanf(yytext, "$%x", &yylval);
296 sscanf(yytext, "%d", &yylval);
301 yylval = (int)yytext[1];
308 case 'N': yylval = 10; break;
310 case 'R': yylval = 13; break;
311 case '0': yylval = 0; break;
312 default: yylval = (int)yytext[1];
313 /* print a warning here */
322 ;[^\n]* {LIST; /* comments */}
323 [ \t\r] {LIST; /* whitespace */}
326 strcpy(last_line_text, line_text);
332 . {LIST; return yytext[0];}