--- /dev/null
+%{
+/* 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_rasm.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 {
+ if (p1) build_sym_list(yytext);
+ 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];}
+
+%%