xa51, work in progress
[fw/sdcc] / as / xa51 / xa_asm.l
diff --git a/as/xa51/xa_asm.l b/as/xa51/xa_asm.l
deleted file mode 100644 (file)
index 5366ec1..0000000
+++ /dev/null
@@ -1,326 +0,0 @@
-%{
-/* This file is part of Paul's XA51 Assembler, Copyright 1997,2002 Paul Stoffregen
- *
- * Paul's XA51 Assembler is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2.
- *
- * Paul's XA51 Assembler is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Foobar; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-/* Author contact: paul@pjrc.com */
-
-#include <stdio.h>
-#include <string.h>
-#include "xa_main.h"
-#include "xa_asm.tab.h"
-
-extern int inst_size, yylval;
-char line_text[MAX_LINE]={'\0'}, last_line_text[MAX_LINE];
-char lex_sym_name[MAX_SYMBOL];
-extern char base_symbol_name[];
-#define LIST if (p3) strcat(line_text, yytext)
-%}
-
-%%
-
-add\.w         {LIST; inst_size=SIZE16; return ADD;}
-add\.b         {LIST; inst_size=SIZE8; return ADD;}
-add            {LIST; inst_size=UNKNOWN; return ADD;}
-addc\.w                {LIST; inst_size=SIZE16; return ADDC;}
-addc\.b                {LIST; inst_size=SIZE8; return ADDC;}
-addc           {LIST; inst_size=UNKNOWN; return ADDC;}
-adds\.w                {LIST; inst_size=SIZE16; return ADDS;}
-adds\.b                {LIST; inst_size=SIZE8; return ADDS;}
-adds           {LIST; inst_size=UNKNOWN; return ADDS;}
-and\.w         {LIST; inst_size=SIZE16; return AND;}
-and\.b         {LIST; inst_size=SIZE8; return AND;}
-and            {LIST; inst_size=UNKNOWN; return AND;}
-anl            {LIST; inst_size=UNKNOWN; return ANL;}
-asl\.d         {LIST; inst_size=SIZE32; return ASL;}
-asl\.w         {LIST; inst_size=SIZE16; return ASL;}
-asl\.b         {LIST; inst_size=SIZE8; return ASL;}
-asl            {LIST; inst_size=UNKNOWN; return ASL;}
-asr\.d         {LIST; inst_size=SIZE32; return ASR;}
-asr\.w         {LIST; inst_size=SIZE16; return ASR;}
-asr\.b         {LIST; inst_size=SIZE8; return ASR;}
-asr            {LIST; inst_size=UNKNOWN; return ASR;}
-bcc            {LIST; inst_size=UNKNOWN; return BCC;}
-bcs            {LIST; inst_size=UNKNOWN; return BCS;}
-beq            {LIST; inst_size=UNKNOWN; return BEQ;}
-bg             {LIST; inst_size=UNKNOWN; return BG;}
-bge            {LIST; inst_size=UNKNOWN; return BGE;}
-bgt            {LIST; inst_size=UNKNOWN; return BGT;}
-bkpt           {LIST; inst_size=UNKNOWN; return BKPT;}
-bl             {LIST; inst_size=UNKNOWN; return BL;}
-ble            {LIST; inst_size=UNKNOWN; return BLE;}
-blt            {LIST; inst_size=UNKNOWN; return BLT;}
-bmi            {LIST; inst_size=UNKNOWN; return BMI;}
-bne            {LIST; inst_size=UNKNOWN; return BNE;}
-bnv            {LIST; inst_size=UNKNOWN; return BNV;}
-bov            {LIST; inst_size=UNKNOWN; return BOV;}
-bpl            {LIST; inst_size=UNKNOWN; return BPL;}
-br             {LIST; inst_size=UNKNOWN; return BR;}
-call           {LIST; inst_size=UNKNOWN; return CALL;}
-cjne\.w                {LIST; inst_size=SIZE16; return CJNE;}
-cjne\.b                {LIST; inst_size=SIZE8; return CJNE;}
-cjne           {LIST; inst_size=UNKNOWN; return CJNE;}
-clr            {LIST; inst_size=UNKNOWN; return CLR;}
-cmp\.w         {LIST; inst_size=SIZE16; return CMP;}
-cmp\.b         {LIST; inst_size=SIZE8; return CMP;}
-cmp            {LIST; inst_size=UNKNOWN; return CMP;}
-cpl\.w         {LIST; inst_size=SIZE16; return CPL;}
-cpl\.b         {LIST; inst_size=SIZE8; return CPL;}
-cpl            {LIST; inst_size=UNKNOWN; return CPL;}
-da\.b          {LIST; inst_size=SIZE8; return DA;}
-da             {LIST; inst_size=UNKNOWN; return DA;}
-div\.d         {LIST; inst_size=SIZE32; return DIV;}
-div\.w         {LIST; inst_size=SIZE16; return DIV;}
-div\.b         {LIST; inst_size=SIZE8; return DIV;}
-div            {LIST; inst_size=UNKNOWN; return DIV;}
-divu\.d                {LIST; inst_size=SIZE32; return DIVU;}
-divu\.w                {LIST; inst_size=SIZE16; return DIVU;}
-divu\.b                {LIST; inst_size=SIZE8; return DIVU;}
-divu           {LIST; inst_size=UNKNOWN; return DIVU;}
-djnz\.w                {LIST; inst_size=SIZE16; return DJNZ;}
-djnz\.b                {LIST; inst_size=SIZE8; return DJNZ;}
-djnz           {LIST; inst_size=UNKNOWN; return DJNZ;}
-fcall          {LIST; inst_size=UNKNOWN; return FCALL;}
-fjmp           {LIST; inst_size=UNKNOWN; return FJMP;}
-jb             {LIST; inst_size=UNKNOWN; return JB;}
-jbc            {LIST; inst_size=UNKNOWN; return JBC;}
-jmp            {LIST; inst_size=UNKNOWN; return JMP;}
-jnb            {LIST; inst_size=UNKNOWN; return JNB;}
-jnz            {LIST; inst_size=UNKNOWN; return JNZ;}
-jz             {LIST; inst_size=UNKNOWN; return JZ;}
-lea\.w         {LIST; inst_size=SIZE16; return LEA;}
-lea            {LIST; inst_size=UNKNOWN; return LEA;}
-lsr\.d         {LIST; inst_size=SIZE32; return LSR;}
-lsr\.w         {LIST; inst_size=SIZE16; return LSR;}
-lsr\.b         {LIST; inst_size=SIZE8; return LSR;}
-lsr            {LIST; inst_size=UNKNOWN; return LSR;}
-mov\.w         {LIST; inst_size=SIZE16; return MOV;}
-mov\.b         {LIST; inst_size=SIZE8; return MOV;}
-mov            {LIST; inst_size=UNKNOWN; return MOV;}
-movc\.w                {LIST; inst_size=SIZE16; return MOVC;}
-movc\.b                {LIST; inst_size=SIZE8; return MOVC;}
-movc           {LIST; inst_size=UNKNOWN; return MOVC;}
-movs\.w                {LIST; inst_size=SIZE16; return MOVS;}
-movs\.b                {LIST; inst_size=SIZE8; return MOVS;}
-movs           {LIST; inst_size=UNKNOWN; return MOVS;}
-movx\.w                {LIST; inst_size=SIZE16; return MOVX;}
-movx\.b                {LIST; inst_size=SIZE8; return MOVX;}
-movx           {LIST; inst_size=UNKNOWN; return MOVX;}
-mul\.d         {LIST; inst_size=SIZE32; return MUL;}
-mul\.w         {LIST; inst_size=SIZE16; return MUL;}
-mul\.b         {LIST; inst_size=SIZE8; return MUL;}
-mul            {LIST; inst_size=UNKNOWN; return MUL;}
-mulu\.d                {LIST; inst_size=SIZE32; return MULU;}
-mulu\.w                {LIST; inst_size=SIZE16; return MULU;}
-mulu\.b                {LIST; inst_size=SIZE8; return MULU;}
-mulu           {LIST; inst_size=UNKNOWN; return MULU;}
-neg\.w         {LIST; inst_size=SIZE16; return NEG;}
-neg\.b         {LIST; inst_size=SIZE8; return NEG;}
-neg            {LIST; inst_size=UNKNOWN; return NEG;}
-nop            {LIST; inst_size=UNKNOWN; return NOP;}
-norm\.d                {LIST; inst_size=SIZE32; return NORM;}
-norm\.w                {LIST; inst_size=SIZE16; return NORM;}
-norm\.b                {LIST; inst_size=SIZE8; return NORM;}
-norm           {LIST; inst_size=UNKNOWN; return NORM;}
-or\.w          {LIST; inst_size=SIZE16; return OR;}
-or\.b          {LIST; inst_size=SIZE8; return OR;}
-or             {LIST; inst_size=UNKNOWN; return OR;}
-orl            {LIST; inst_size=UNKNOWN; return ORL;}
-pop\.w         {LIST; inst_size=SIZE16; return POP;}
-pop\.b         {LIST; inst_size=SIZE8; return POP;}
-pop            {LIST; inst_size=UNKNOWN; return POP;}
-popu\.w                {LIST; inst_size=SIZE16; return POPU;}
-popu\.b                {LIST; inst_size=SIZE8; return POPU;}
-popu           {LIST; inst_size=UNKNOWN; return POPU;}
-push\.w                {LIST; inst_size=SIZE16; return PUSH;}
-push\.b                {LIST; inst_size=SIZE8; return PUSH;}
-push           {LIST; inst_size=UNKNOWN; return PUSH;}
-pushu\.w       {LIST; inst_size=SIZE16; return PUSHU;}
-pushu\.b       {LIST; inst_size=SIZE8; return PUSHU;}
-pushu          {LIST; inst_size=UNKNOWN; return PUSHU;}
-reset          {LIST; inst_size=UNKNOWN; return RESET;}
-ret            {LIST; inst_size=UNKNOWN; return RET;}
-reti           {LIST; inst_size=UNKNOWN; return RETI;}
-rl\.w          {LIST; inst_size=SIZE16; return RL;}
-rl\.b          {LIST; inst_size=SIZE8; return RL;}
-rl             {LIST; inst_size=UNKNOWN; return RL;}
-rlc\.w         {LIST; inst_size=SIZE16; return RLC;}
-rlc\.b         {LIST; inst_size=SIZE8; return RLC;}
-rlc            {LIST; inst_size=UNKNOWN; return RLC;}
-rr\.w          {LIST; inst_size=SIZE16; return RR;}
-rr\.b          {LIST; inst_size=SIZE8; return RR;}
-rr             {LIST; inst_size=UNKNOWN; return RR;}
-rrc\.w         {LIST; inst_size=SIZE16; return RRC;}
-rrc\.b         {LIST; inst_size=SIZE8; return RRC;}
-rrc            {LIST; inst_size=UNKNOWN; return RRC;}
-setb           {LIST; inst_size=UNKNOWN; return SETB;}
-sext\.w                {LIST; inst_size=SIZE16; return SEXT;}
-sext\.b                {LIST; inst_size=SIZE8; return SEXT;}
-sext           {LIST; inst_size=UNKNOWN; return SEXT;}
-sub\.w         {LIST; inst_size=SIZE16; return SUB;}
-sub\.b         {LIST; inst_size=SIZE8; return SUB;}
-sub            {LIST; inst_size=UNKNOWN; return SUB;}
-subb\.w                {LIST; inst_size=SIZE16; return SUBB;}
-subb\.b                {LIST; inst_size=SIZE8; return SUBB;}
-subb           {LIST; inst_size=UNKNOWN; return SUBB;}
-trap           {LIST; inst_size=UNKNOWN; return TRAP;}
-xch\.w         {LIST; inst_size=SIZE16; return XCH;}
-xch\.b         {LIST; inst_size=SIZE8; return XCH;}
-xch            {LIST; inst_size=UNKNOWN; return XCH;}
-xor\.w         {LIST; inst_size=SIZE16; return XOR;}
-xor\.b         {LIST; inst_size=SIZE8; return XOR;}
-xor            {LIST; inst_size=UNKNOWN; return XOR;}
-
-
-dptr           {LIST; return DPTR;}
-pc             {LIST; return PC;}
-a              {LIST; return A;}
-c              {LIST; return C;}
-usp            {LIST; return USP;}
-
-org            {LIST; return ORG;}
-equ            {LIST; return EQU;}
-sfr            {LIST; return SFR;}
-db             {LIST; return DB;}
-dw             {LIST; return DW;}
-byte           {LIST; return DB;}
-bit            {LIST; return BITDEF;}
-reg            {LIST; return REGDEF;}
-area           {LIST; return AREA;}
-ds             {LIST; return DS;}
-DSEG           {LIST; yylval = AREA_DSEG; return AREA_NAME;}
-BSEG           {LIST; yylval = AREA_BSEG; return AREA_NAME;}
-XSEG           {LIST; yylval = AREA_XSEG; return AREA_NAME;}
-XISEG          {LIST; yylval = AREA_XISEG; return AREA_NAME;}
-XINIT          {LIST; yylval = AREA_XINIT; return AREA_NAME;}
-GSINIT         {LIST; yylval = AREA_GSINIT; return AREA_NAME;}
-GSFINAL                {LIST; yylval = AREA_GSFINAL; return AREA_NAME;}
-HOME           {LIST; yylval = AREA_HOME; return AREA_NAME;}
-SSEG            {LIST; yylval = AREA_SSEG; return AREA_NAME;}
-CSEG           {LIST; yylval = AREA_CSEG; return AREA_NAME;}
-module         {LIST; return MODULE;}
-globl          {LIST; return GLOBL;}
-\(DATA\)       {LIST; return AREA_DESC;}
-\(OVR,XDATA\)  {LIST; return AREA_DESC;}
-\(BIT\)                {LIST; return AREA_DESC;}
-\(XDATA\)      {LIST; return AREA_DESC;}
-\(CODE\)       {LIST; return AREA_DESC;}
-low            {LIST; return LOW;}
-high           {LIST; return HIGH;}
->>             {LIST; return RSHIFT;}
-\<\<           {LIST; return LSHIFT;}
-
-
-R[0-9]         {LIST; yylval = yytext[1] - '0' + WORD_REG; return REG;}
-R1[0-5]                {LIST; yylval = yytext[2] - '0' + 10 + WORD_REG; return REG;}
-R[0-7]L                {LIST; yylval = (yytext[1] - '0') * 2 + BYTE_REG; return REG;}
-R[0-7]H                {LIST; yylval = (yytext[1] - '0') * 2 + 1 + BYTE_REG; return REG;}
-
-
-[a-z_][a-z0-9_]*       {
-                               LIST;
-                               if (is_def(yytext)) {
-                                       yylval = get_value(yytext);
-                               } else {
-                                       yylval = 0;
-                                       if (p3) error("Symbol undefined");
-                               }
-                               /* keep name in lex_sym_name since yytext */
-                               /* could be overwritten if the parser does */
-                               /* a lookahead operation */
-                               strcpy(lex_sym_name, yytext);
-                               if (is_def(lex_sym_name)) {
-                                       yylval = get_value(lex_sym_name);
-                                       /* return correct type if special */
-                                       if (is_bit(lex_sym_name)) return BIT;
-                                       if (is_reg(lex_sym_name)) return REG;
-                               }
-                               return WORD;
-                       }
-[0-9]+\$               {
-                               LIST;
-                               /* should print error if base_symbol_name */
-                               /* is not defined */
-                               sprintf(lex_sym_name, "%s:%s",
-                                       base_symbol_name, yytext);
-                               if (is_def(lex_sym_name)) {
-                                       yylval = get_value(lex_sym_name);
-                               } else {
-                                       yylval = 0;
-                                       if (p3) error("Symbol undefined");
-                               }
-                               return WORD;
-                       }
-[01]+[bq]              {
-                               LIST;
-                               yylval = binary2int(yytext);
-                               return NUMBER;
-                       }
-0x[0-9a-f]+            {
-                               LIST;
-                               sscanf(yytext, "%*c%*c%x", &yylval);
-                               return NUMBER;
-                       }
-[0-9a-f]+[h]           {
-                               LIST;
-                               sscanf(yytext, "%x%*[hH]", &yylval);
-                               return NUMBER;
-                       }
-\$[0-9a-f]+            {
-                               LIST;
-                               sscanf(yytext, "$%x", &yylval);
-                               return NUMBER;
-                       }
--?[0-9]+               {
-                               LIST;
-                               sscanf(yytext, "%d", &yylval);
-                               return NUMBER;
-                       }
-\'.\'                  {
-                               LIST;
-                               yylval = (int)yytext[1];
-                               return CHAR;
-                       }
-\'\\.\'                        {
-                               LIST;
-                               switch (yytext[1]) {
-                                       case 'n':
-                                       case 'N': yylval = 10; break;
-                                       case 'r':
-                                       case 'R': yylval = 13; break;
-                                       case '0': yylval = 0; break;
-                                       default:  yylval = (int)yytext[1];
-                                       /* print a warning here */
-                               }
-                               return CHAR;
-                       }
-\"[^"\n]*["\n]         {
-                               LIST;
-                               return STRING;
-                       }
-
-;[^\n]*                {LIST; /* comments */}
-[ \t\r]                {LIST; /* whitespace */}
-
-\n             {
-                       strcpy(last_line_text, line_text);
-                       line_text[0] = '\0';
-                       ++lineno;
-                       return EOL;
-               }
-
-.              {LIST; return yytext[0];}
-
-%%