home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
messroms.de
/
2007-01-13_www.messroms.de.zip
/
VZ200
/
TOOLS
/
AZ80.ZIP
/
az80.l
< prev
next >
Wrap
Text File
|
1999-12-27
|
8KB
|
309 lines
%{
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include "az80_tab.h"
extern char lstbuff[256];
extern char * plst;
extern int line_no;
extern int pass_no;
extern FILE * inpfile;
extern unsigned short PC;
int aton(char * src, int base, char * valid, char end);
#define TOKEN if(plst) plst+=sprintf(plst,"%s",yytext)
%}
delim [\t ,;()]
bin [0-1]
oct [0-7]
dec [0-9]
hex [0-9A-Fa-f]
alnum [0-9A-Za-z_]
%s cc
%%
<cc>[Nn][Zz] { TOKEN; return _cNZ; }
<cc>[Zz] { TOKEN; return _cZ; }
<cc>[Nn][Cc] { TOKEN; return _cNC; }
<cc>[Cc] { TOKEN; return _cC; }
<cc>[Pp][Oo] { TOKEN; return _cPO; }
<cc>[Pp][Ee] { TOKEN; return _cPE; }
<cc>[Pp] { TOKEN; return _cP; }
<cc>[Mm] { TOKEN; return _cM; }
[Bb][Cc] { TOKEN; return _BC; }
[Dd][Ee] { TOKEN; return _DE; }
[Hh][Ll] { TOKEN; return _HL; }
[Ss][Pp] { TOKEN; return _SP; }
[Aa][Ff] { TOKEN; return _AF; }
[Ii][Xx] { TOKEN; return _IX; }
[Ii][Yy] { TOKEN; return _IY; }
[Bb] { TOKEN; return _B; }
[Cc] { TOKEN; return _C; }
[Dd] { TOKEN; return _D; }
[Ee] { TOKEN; return _E; }
[Hh] { TOKEN; return _H; }
[Ll] { TOKEN; return _L; }
"("[Hh][Ll]")" { TOKEN; return _M; }
[Aa] { TOKEN; return _A; }
[Ff] { TOKEN; return _F; }
[Ii] { TOKEN; return _I; }
[Rr] { TOKEN; return _R; }
"("[Ii][Xx][+-]{bin}+[Bb]")" {
TOKEN;
yylval.i = aton(yytext+3,2,"01",'B');
return _MX;
}
"("[Ii][Xx][+-]{oct}+[Oo]")" {
TOKEN;
yylval.i = aton(yytext+3,8,"01234567",'O');
return _MX;
}
"("[Ii][Xx][+-]{dec}+[Dd]?")" {
TOKEN;
yylval.i = aton(yytext+3,10,"0123456789",'D');
return _MX;
}
"("[Ii][Xx][+-]{hex}+[Hh]")" {
TOKEN;
yylval.i = aton(yytext+3,16,"0123456789ABCDEF",'H');
return _MX;
}
"("[Ii][Xx]")" { TOKEN; yylval.i = 0; return _MX; }
"("[Ii][Yy][+-]{bin}+[Bb]")" {
TOKEN;
yylval.i = aton(yytext+3,2,"01",'B');
return _MY;
}
"("[Ii][Yy][+-]{oct}+[Oo]")" {
TOKEN;
yylval.i = aton(yytext+3,8,"01234567",'O');
return _MY;
}
"("[Ii][Yy][+-]{dec}+[Dd]?")" {
TOKEN;
yylval.i = aton(yytext+3,10,"0123456789",'D');
return _MY;
}
"("[Ii][Yy][+-]{hex}+[Hh]")" {
TOKEN;
yylval.i = aton(yytext+3,16,"0123456789ABCDEF",'H');
return _MY;
}
"("[Ii][Yy]")" { TOKEN; yylval.i = 0; return _MY; }
"("[Cc]")" { TOKEN; return _PORTC; }
[Aa][Dd][Cc] { TOKEN; return _ADC; }
[Aa][Dd][Dd] { TOKEN; return _ADD; }
[Aa][Nn][Dd] { TOKEN; return _AND; }
[Bb][Ii][Tt] { TOKEN; return _BIT; }
[Cc][Aa][Ll][Ll] { TOKEN; BEGIN(cc); return _CALL; }
[Cc][Cc][Ff] { TOKEN; return _CCF; }
[Cc][Pp] { TOKEN; return _CP; }
[Cc][Pp][Dd] { TOKEN; return _CPD; }
[Cc][Pp][Dd][Rr] { TOKEN; return _CPDR; }
[Cc][Pp][Ii] { TOKEN; return _CPI; }
[Cc][Pp][Ii][Rr] { TOKEN; return _CPIR; }
[Cc][Pp][Ll] { TOKEN; return _CPL; }
[Dd][Aa][Aa] { TOKEN; return _DAA; }
[Dd][Ee][Cc] { TOKEN; return _DEC; }
[Dd][Ii] { TOKEN; return _DI; }
[Dd][Jj][Nn][Zz] { TOKEN; return _DJNZ; }
[Ee][Ii] { TOKEN; return _EI; }
[Ee][Xx] { TOKEN; return _EX; }
[Ee][Xx][Xx] { TOKEN; return _EXX; }
[Hh][Aa][Ll][Tt] { TOKEN; return _HALT; }
[Ii][Mm] { TOKEN; return _IM; }
[Ii][Nn] { TOKEN; return _IN; }
[Ii][Nn][Cc] { TOKEN; return _INC; }
[Ii][Nn][Dd] { TOKEN; return _IND; }
[Ii][Nn][Dd][Rr] { TOKEN; return _INDR; }
[Ii][Nn][Ii] { TOKEN; return _INI; }
[Ii][Nn][Ii][Rr] { TOKEN; return _INIR; }
[Jj][Pp] { TOKEN; BEGIN(cc); return _JP; }
[Jj][Rr] { TOKEN; BEGIN(cc); return _JR; }
[Ll][Dd] { TOKEN; return _LD; }
[Ll][Dd][Dd] { TOKEN; return _LDD; }
[Ll][Dd][Dd][Rr] { TOKEN; return _LDDR; }
[Ll][Dd][Ii] { TOKEN; return _LDI; }
[Ll][Dd][Ii][Rr] { TOKEN; return _LDIR; }
[Nn][Ee][Gg] { TOKEN; return _NEG; }
[Nn][Oo][Pp] { TOKEN; return _NOP; }
[Oo][Rr] { TOKEN; return _OR; }
[Oo][Tt][Dd][Rr] { TOKEN; return _OTDR; }
[Oo][Tt][Ii][Rr] { TOKEN; return _OTIR; }
[Oo][Uu][Tt] { TOKEN; return _OUT; }
[Oo][Uu][Tt][Dd] { TOKEN; return _OUTD; }
[Oo][Uu][Tt][Ii] { TOKEN; return _OUTI; }
[Pp][Oo][Pp] { TOKEN; return _POP; }
[Pp][Uu][Ss][Hh] { TOKEN; return _PUSH; }
[Rr][Ee][Ss] { TOKEN; return _RES; }
[Rr][Ee][Tt] { TOKEN; BEGIN(cc); return _RET; }
[Rr][Ee][Tt][Ii] { TOKEN; return _RETI; }
[Rr][Ee][Tt][Nn] { TOKEN; return _RETN; }
[Rr][Ll] { TOKEN; return _RL; }
[Rr][Ll][Aa] { TOKEN; return _RLA; }
[Rr][Ll][Cc] { TOKEN; return _RLC; }
[Rr][Ll][Cc][Aa] { TOKEN; return _RLCA; }
[Rr][Ll][Dd] { TOKEN; return _RLD; }
[Rr][Rr] { TOKEN; return _RR; }
[Rr][Rr][Aa] { TOKEN; return _RRA; }
[Rr][Rr][Cc] { TOKEN; return _RRC; }
[Rr][Rr][Cc][Aa] { TOKEN; return _RRCA; }
[Rr][Rr][Dd] { TOKEN; return _RRD; }
[Rr][Ss][Tt] { TOKEN; return _RST; }
[Ss][Bb][Cc] { TOKEN; return _SBC; }
[Ss][Cc][Ff] { TOKEN; return _SCF; }
[Ss][Ee][Tt] { TOKEN; return _SET; }
[Ss][Ll][Aa] { TOKEN; return _SLA; }
[Ss][Rr][Aa] { TOKEN; return _SRA; }
[Ss][Ll][Ll] { TOKEN; return _SLL; }
[Ss][Rr][Ll] { TOKEN; return _SRL; }
[Ss][Uu][Bb] { TOKEN; return _SUB; }
[Xx][Oo][Rr] { TOKEN; return _XOR; }
[Dd][Ee][Ff][Bb] { TOKEN; return _DEFB; }
[Dd][Ee][Ff][Ll] { TOKEN; return _DEFL; }
[Dd][Ee][Ff][Mm] { TOKEN; return _DEFM; }
[Dd][Ee][Ff][Ss] { TOKEN; return _DEFS; }
[Dd][Ee][Ff][Ww] { TOKEN; return _DEFW; }
[Ee][Nn][Dd] { TOKEN; return _END; }
[Ee][Qq][Uu] { TOKEN; return _EQU; }
[Oo][Rr][Gg] { TOKEN; return _ORG; }
{bin}+[Bb] {
TOKEN;
yylval.i = aton(yytext,2,"01",'B');
return _VAL;
}
{dec}+[Dd]? {
TOKEN;
yylval.i = aton(yytext,10,"0123456789",'D');
return _VAL;
}
{hex}+[Hh] {
TOKEN;
yylval.i = aton(yytext,16,"0123456789ABCDEF",'H');
return _VAL;
}
"$" { TOKEN; yylval.i = PC; return _VAL; }
"," { TOKEN; return COMMA; }
":" { TOKEN; return COLON; }
"(" { TOKEN; return LPAREN; }
")" { TOKEN; return RPAREN; }
"+" { TOKEN; return PLUS; }
"-" { TOKEN; return MINUS; }
"*" { TOKEN; return MUL; }
"/" { TOKEN; return DIV; }
"<<" { TOKEN; return SHL; }
">>" { TOKEN; return SHR; }
"&" { TOKEN; return AND; }
"|" { TOKEN; return OR; }
"^" { TOKEN; return XOR; }
"~" { TOKEN; return NOT; }
\"[^\"\n]+\" {
TOKEN;
yylval.s = strdup(yytext + 1);
yylval.s[strlen(yylval.s)-1] = '\0';
return _STR;
}
\'[^\'\n]+\' {
TOKEN;
yylval.i = yytext[1];
if (yyleng > 3)
yylval.i += 256 * yytext[2];
return _VAL;
}
[A-Za-z_]{alnum}* {
TOKEN;
yylval.s = strdup(yytext);
return _SYM;
}
[\t ] {
TOKEN;
}
";"[^\n]*\n |
[\n] {
TOKEN;
if (plst)
plst = lstbuff;
BEGIN(INITIAL);
line_no++;
return EOL;
}
%%
int aton(char * src, int base, char * valid, char end)
{
int result = 0;
int sign = 1;
char * pos;
while (*src && !strchr(valid, toupper(*src)) && (toupper(*src) != end))
{
if (*src == '+')
sign = +1;
if (*src == '-')
sign = -sign;
src++;
}
while (*src && ((pos = strchr(valid, toupper(*src))) != NULL))
{
result *= base;
if (pos)
result += (int)(pos - valid);
src++;
}
result *= sign;
return result;
}
void yyerror(char * msg, ...)
{
va_list arg;
fprintf(stderr, "line %d: ", line_no);
va_start(arg, msg);
fprintf(stderr, msg, arg);
va_end(arg);
fprintf(stderr, " at \"%s\"\n", yytext);
}
int yywrap(void)
{
if (pass_no < 2)
{
rewind(inpfile);
PC = 0;
line_no = 1;
pass_no++;
printf("pass %d\n", pass_no);
return 0;
}
return 1;
}