home *** CD-ROM | disk | FTP | other *** search
- From: markz@ssc.UUCP (Mark Zenier)
- Newsgroups: alt.sources
- Subject: Frankenstein Cross Assemblers, Intel 8048 "Flavor", Part 2 of 2
- Message-ID: <597@ssc.UUCP>
- Date: 4 Dec 90 08:16:44 GMT
-
- ---- Cut Here and feed the following to sh ----
- #!/bin/sh
- # This is part 02 of Frankasm/As8048
- # ============= as8048.y ==============
- if test -f 'as8048.y' -a X"$1" != X"-c"; then
- echo 'x - skipping as8048.y (File already exists)'
- else
- echo 'x - extracting as8048.y (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'as8048.y' &&
- X%{
- X
- X/*
- XHEADER: ;
- XTITLE: Frankenstein Cross Assemblers;
- XVERSION: 2.0;
- XDESCRIPTION: " Reconfigurable Cross-assembler producing Intel (TM)
- X Hex format object records. ";
- XKEYWORDS: cross-assemblers, 1805, 2650, 6301, 6502, 6805, 6809,
- X 6811, tms7000, 8048, 8051, 8096, z8, z80;
- XSYSTEM: UNIX, MS-Dos ;
- XFILENAME: as8048.y;
- XWARNINGS: "This software is in the public domain.
- X Any prior copyright claims are relinquished.
- X
- X This software is distributed with no warranty whatever.
- X The author takes no responsibility for the consequences
- X of its use.
- X
- X Yacc (or Bison) required to compile." ;
- XSEE-ALSO: as8048.doc,frasmain.c;
- XAUTHORS: Mark Zenier;
- XCOMPILERS: Microport Sys V/AT, ATT Yacc, Turbo C V1.5, Bison (CUG disk 285)
- X (previous versions Xenix, Unisoft 68000 Version 7, Sun 3);
- X*/
- X/* 8048 et al instruction generation file */
- X/* November 17, 1990 */
- X
- X/*
- X description frame work parser description for framework cross
- X assemblers
- X history February 2, 1988
- X September 11, 1990 - merge table definition
- X September 12, 1990 - short file names
- X September 14, 1990 - short variable names
- X September 17, 1990 - use yylex as external
- X*/
- X#include <stdio.h>
- X#include "frasmdat.h"
- X#include "fragcon.h"
- X
- X#define yylex lexintercept
- X
- X/* 0000.0000.0000.xxxx interrupt selections */
- X#define ISELMASK 0xf
- X#define ISELI 0x1
- X#define ISELTCNTI 0x2
- X#define ISELDMA 0x4
- X#define ISELFLAGS 0x8
- X/* 0000.0000.0000.xxxx accum-flag selections */
- X#define AFSELMASK 0xf
- X#define AFSELA 0x1
- X#define AFSELC 0x2
- X#define AFSELF0 0x4
- X#define AFSELF1 0x8
- X/* 0000.0000.xxxx.0000 low port selections */
- X#define PSELMASK 0xf0
- X#define PSELBUS 0x10
- X#define PSELP1 0x20
- X#define PSELP2 0x40
- X#define PSELDBB 0x80
- X/* 0000.00xx.xxxx.0000 misc register selections */
- X#define MSELMASK 0x3f0
- X#define MSELPSW 0x10
- X#define MSELT 0x20
- X#define MSELCNT 0x40
- X#define MSELTCNT 0x80
- X#define MSELCLK 0x100
- X#define MSELSTS 0x200
- X/* 0000.xx00.0000.0000 ram size */
- X#define RAMSIZEMASK 0xc00
- X#define RAMSIZE64 0x400
- X#define RAMSIZE128 0x800
- X#define RAMSIZE256 0xc00
- X/* xxx0.0000.0000.0000 instruction set variations */
- X#define INSTIDL 0x8000
- X#define INSTNOT41 0x4000
- X#define INST41 0x2000
- X#define CPU8048 INSTNOT41|RAMSIZE64
- X#define CPU8049 INSTNOT41|RAMSIZE128
- X#define CPU8050 INSTNOT41|RAMSIZE256
- X#define CPU80C48 INSTNOT41|INSTIDL|RAMSIZE64
- X#define CPU80C49 INSTNOT41|INSTIDL|RAMSIZE128
- X#define CPU80C50 INSTNOT41|INSTIDL|RAMSIZE256
- X#define CPU8041 INST41|RAMSIZE64
- X#define CPU8042 INST41|RAMSIZE128
- X#define ST_AF 0x1
- X#define ST_REG 0x2
- X#define ST_EXPR 0x4
- X#define ST_AR 0x8
- X#define ST_AINDIRR 0x10
- X#define ST_AIMMED 0x20
- X#define ST_INDIRA 0x40
- X#define ST_INDIRR 0x80
- X#define ST_REGEXP 0x100
- X#define ST_PA2 0x200
- X#define ST_PA4 0x400
- X#define ST_P2A 0x800
- X#define ST_P4A 0x1000
- X#define ST_P2IMMED 0x2000
- X#define ST_INH 0x1
- X#define ST_INT 0x2
- X#define ST_RSELC 0x4
- X#define ST_MSELC 0x8
- X#define ST_MREG 0x10
- X#define ST_MAR 0x1
- X#define ST_MAINDIRA 0x2
- X#define ST_MAINDIRR 0x4
- X#define ST_MAIMMED 0x8
- X#define ST_MAMR 0x10
- X#define ST_MMRA 0x20
- X#define ST_MRA 0x40
- X#define ST_MRIMMED 0x80
- X#define ST_MINDIRRA 0x100
- X#define ST_MINDIRRIM 0x200
- X
- X static char genbdef[] = "[1=];";
- X static char genwdef[] = "[1=]y"; /* x for normal, y for byte rev */
- X char ignosyn[] = "[Xinvalid syntax for instruction";
- X char ignosel[] = "[Xinvalid operands/illegal instruction for cpu";
- X int cpuselect = CPU80C50;
- X
- X long labelloc;
- X static int satsub;
- X int ifstkpt = 0;
- X int fraifskip = FALSE;
- X
- X struct symel * endsymbol = SYMNULL;
- X
- X%}
- X%union {
- X int intv;
- X long longv;
- X char *strng;
- X struct symel *symb;
- X}
- X
- X%token <intv> RSELC
- X%token <intv> MSELC
- X%token <intv> INT
- X%token <intv> AF
- X%token <intv> REG
- X%token <intv> P02
- X%token <intv> P47
- X%token <intv> MREG
- X%token <intv> KOC_BDEF
- X%token <intv> KOC_ELSE
- X%token <intv> KOC_END
- X%token <intv> KOC_ENDI
- X%token <intv> KOC_EQU
- X%token <intv> KOC_IF
- X%token <intv> KOC_INCLUDE
- X%token <intv> KOC_ORG
- X%token <intv> KOC_RESM
- X%token <intv> KOC_SDEF
- X%token <intv> KOC_SET
- X%token <intv> KOC_WDEF
- X%token <intv> KOC_CHSET
- X%token <intv> KOC_CHDEF
- X%token <intv> KOC_CHUSE
- X%token <intv> KOC_CPU
- X%token <intv> KOC_REG
- X%token <intv> KOC_opcode
- X%token <intv> KOC_misc
- X%token <intv> KOC_mov
- X
- X%token <longv> CONSTANT
- X%token EOL
- X%token KEOP_AND
- X%token KEOP_DEFINED
- X%token KEOP_EQ
- X%token KEOP_GE
- X%token KEOP_GT
- X%token KEOP_HIGH
- X%token KEOP_LE
- X%token KEOP_LOW
- X%token KEOP_LT
- X%token KEOP_MOD
- X%token KEOP_MUN
- X%token KEOP_NE
- X%token KEOP_NOT
- X%token KEOP_OR
- X%token KEOP_SHL
- X%token KEOP_SHR
- X%token KEOP_XOR
- X%token KEOP_locctr
- X%token <symb> LABEL
- X%token <strng> STRING
- X%token <symb> SYMBOL
- X
- X%token KTK_invalid
- X
- X%right KEOP_HIGH KEOP_LOW
- X%left KEOP_OR KEOP_XOR
- X%left KEOP_AND
- X%right KEOP_NOT
- X%nonassoc KEOP_GT KEOP_GE KEOP_LE KEOP_LT KEOP_NE KEOP_EQ
- X%left '+' '-'
- X%left '*' '/' KEOP_MOD KEOP_SHL KEOP_SHR
- X%right KEOP_MUN
- X
- X
- X%type <intv> expr exprlist stringlist
- X
- X%start file
- X
- X%%
- X
- Xfile : file allline
- X | allline
- X ;
- X
- Xallline : line EOL
- X {
- X clrexpr();
- X }
- X | EOL
- X | error EOL
- X {
- X clrexpr();
- X yyerrok;
- X }
- X ;
- X
- Xline : LABEL KOC_END
- X {
- X endsymbol = $1;
- X nextreadact = Nra_end;
- X }
- X | KOC_END
- X {
- X nextreadact = Nra_end;
- X }
- X | KOC_INCLUDE STRING
- X {
- X if(nextfstk >= FILESTKDPTH)
- X {
- X fraerror("include file nesting limit exceeded");
- X }
- X else
- X {
- X infilestk[nextfstk].fnm = savestring($2,strlen($2));
- X if( (infilestk[nextfstk].fpt = fopen($2,"r"))
- X ==(FILE *)NULL )
- X {
- X fraerror("cannot open include file");
- X }
- X else
- X {
- X nextreadact = Nra_new;
- X }
- X }
- X }
- X | LABEL KOC_EQU expr
- X {
- X if($1 -> seg == SSG_UNDEF)
- X {
- X pevalexpr(0, $3);
- X if(evalr[0].seg == SSG_ABS)
- X {
- X $1 -> seg = SSG_EQU;
- X $1 -> value = evalr[0].value;
- X prtequvalue("C: 0x%lx\n",
- X evalr[0].value);
- X }
- X else
- X {
- X fraerror(
- X "noncomputable expression for EQU");
- X }
- X }
- X else
- X {
- X fraerror(
- X "cannot change symbol value with EQU");
- X }
- X }
- X | LABEL KOC_SET expr
- X {
- X if($1 -> seg == SSG_UNDEF
- X || $1 -> seg == SSG_SET)
- X {
- X pevalexpr(0, $3);
- X if(evalr[0].seg == SSG_ABS)
- X {
- X $1 -> seg = SSG_SET;
- X $1 -> value = evalr[0].value;
- X prtequvalue("C: 0x%lx\n",
- X evalr[0].value);
- X }
- X else
- X {
- X fraerror(
- X "noncomputable expression for SET");
- X }
- X }
- X else
- X {
- X fraerror(
- X "cannot change symbol value with SET");
- X }
- X }
- X | KOC_IF expr
- X {
- X if((++ifstkpt) < IFSTKDEPTH)
- X {
- X pevalexpr(0, $2);
- X if(evalr[0].seg == SSG_ABS)
- X {
- X if(evalr[0].value != 0)
- X {
- X elseifstk[ifstkpt] = If_Skip;
- X endifstk[ifstkpt] = If_Active;
- X }
- X else
- X {
- X fraifskip = TRUE;
- X elseifstk[ifstkpt] = If_Active;
- X endifstk[ifstkpt] = If_Active;
- X }
- X }
- X else
- X {
- X fraifskip = TRUE;
- X elseifstk[ifstkpt] = If_Active;
- X endifstk[ifstkpt] = If_Active;
- X }
- X }
- X else
- X {
- X fraerror("IF stack overflow");
- X }
- X }
- X
- X | KOC_IF
- X {
- X if(fraifskip)
- X {
- X if((++ifstkpt) < IFSTKDEPTH)
- X {
- X elseifstk[ifstkpt] = If_Skip;
- X endifstk[ifstkpt] = If_Skip;
- X }
- X else
- X {
- X fraerror("IF stack overflow");
- X }
- X }
- X else
- X {
- X yyerror("syntax error");
- X YYERROR;
- X }
- X }
- X
- X | KOC_ELSE
- X {
- X switch(elseifstk[ifstkpt])
- X {
- X case If_Active:
- X fraifskip = FALSE;
- X break;
- X
- X case If_Skip:
- X fraifskip = TRUE;
- X break;
- X
- X case If_Err:
- X fraerror("ELSE with no matching if");
- X break;
- X }
- X }
- X
- X | KOC_ENDI
- X {
- X switch(endifstk[ifstkpt])
- X {
- X case If_Active:
- X fraifskip = FALSE;
- X ifstkpt--;
- X break;
- X
- X case If_Skip:
- X fraifskip = TRUE;
- X ifstkpt--;
- X break;
- X
- X case If_Err:
- X fraerror("ENDI with no matching if");
- X break;
- X }
- X }
- X | LABEL KOC_ORG expr
- X {
- X pevalexpr(0, $3);
- X if(evalr[0].seg == SSG_ABS)
- X {
- X locctr = labelloc = evalr[0].value;
- X if($1 -> seg == SSG_UNDEF)
- X {
- X $1 -> seg = SSG_ABS;
- X $1 -> value = labelloc;
- X }
- X else
- X fraerror(
- X "multiple definition of label");
- X prtequvalue("C: 0x%lx\n",
- X evalr[0].value);
- X }
- X else
- X {
- X fraerror(
- X "noncomputable expression for ORG");
- X }
- X }
- X | KOC_ORG expr
- X {
- X pevalexpr(0, $2);
- X if(evalr[0].seg == SSG_ABS)
- X {
- X locctr = labelloc = evalr[0].value;
- X prtequvalue("C: 0x%lx\n",
- X evalr[0].value);
- X }
- X else
- X {
- X fraerror(
- X "noncomputable expression for ORG");
- X }
- X }
- X | LABEL KOC_CHSET
- X {
- X if($1 -> seg == SSG_UNDEF)
- X {
- X $1 -> seg = SSG_EQU;
- X if( ($1->value = chtcreate()) <= 0)
- X {
- X fraerror( "cannot create character translation table");
- X }
- X prtequvalue("C: 0x%lx\n", $1 -> value);
- X }
- X else
- X {
- X fraerror( "multiple definition of label");
- X }
- X }
- X | KOC_CHUSE
- X {
- X chtcpoint = (int *) NULL;
- X prtequvalue("C: 0x%lx\n", 0L);
- X }
- X | KOC_CHUSE expr
- X {
- X pevalexpr(0, $2);
- X if( evalr[0].seg == SSG_ABS)
- X {
- X if( evalr[0].value == 0)
- X {
- X chtcpoint = (int *)NULL;
- X prtequvalue("C: 0x%lx\n", 0L);
- X }
- X else if(evalr[0].value < chtnxalph)
- X {
- X chtcpoint = chtatab[evalr[0].value];
- X prtequvalue("C: 0x%lx\n", evalr[0].value);
- X }
- X else
- X {
- X fraerror("nonexistent character translation table");
- X }
- X }
- X else
- X {
- X fraerror("noncomputable expression");
- X }
- X }
- X | KOC_CHDEF STRING ',' exprlist
- X {
- X int findrv, numret, *charaddr;
- X char *sourcestr = $2, *before;
- X
- X if(chtnpoint != (int *)NULL)
- X {
- X for(satsub = 0; satsub < $4; satsub++)
- X {
- X before = sourcestr;
- X
- X pevalexpr(0, exprlist[satsub]);
- X findrv = chtcfind(chtnpoint, &sourcestr,
- X &charaddr, &numret);
- X if(findrv == CF_END)
- X {
- X fraerror("more expressions than characters");
- X break;
- X }
- X
- X if(evalr[0].seg == SSG_ABS)
- X {
- X switch(findrv)
- X {
- X case CF_UNDEF:
- X {
- X if(evalr[0].value < 0 ||
- X evalr[0].value > 255)
- X {
- X frawarn("character translation value truncated");
- X }
- X *charaddr = evalr[0].value & 0xff;
- X prtequvalue("C: 0x%lx\n", evalr[0].value);
- X }
- X break;
- X
- X case CF_INVALID:
- X case CF_NUMBER:
- X fracherror("invalid character to define",
- X before, sourcestr);
- X break;
- X
- X case CF_CHAR:
- X fracherror("character already defined",
- X before, sourcestr);
- X break;
- X }
- X }
- X else
- X {
- X fraerror("noncomputable expression");
- X }
- X }
- X
- X if( *sourcestr != '\0')
- X {
- X fraerror("more characters than expressions");
- X }
- X }
- X else
- X {
- X fraerror("no CHARSET statement active");
- X }
- X
- X }
- X | LABEL
- X {
- X if($1 -> seg == SSG_UNDEF)
- X {
- X $1 -> seg = SSG_ABS;
- X $1 -> value = labelloc;
- X prtequvalue("C: 0x%lx\n", labelloc);
- X
- X }
- X else
- X fraerror(
- X "multiple definition of label");
- X }
- X | labeledline
- X ;
- X
- Xlabeledline : LABEL genline
- X {
- X if($1 -> seg == SSG_UNDEF)
- X {
- X $1 -> seg = SSG_ABS;
- X $1 -> value = labelloc;
- X }
- X else
- X fraerror(
- X "multiple definition of label");
- X labelloc = locctr;
- X }
- X
- X | genline
- X {
- X labelloc = locctr;
- X }
- X ;
- X
- Xgenline : KOC_BDEF exprlist
- X {
- X genlocrec(currseg, labelloc);
- X for( satsub = 0; satsub < $2; satsub++)
- X {
- X pevalexpr(1, exprlist[satsub]);
- X locctr += geninstr(genbdef);
- X }
- X }
- X | KOC_SDEF stringlist
- X {
- X genlocrec(currseg, labelloc);
- X for(satsub = 0; satsub < $2; satsub++)
- X {
- X locctr += genstring(stringlist[satsub]);
- X }
- X }
- X | KOC_WDEF exprlist
- X {
- X genlocrec(currseg, labelloc);
- X for( satsub = 0; satsub < $2; satsub++)
- X {
- X pevalexpr(1, exprlist[satsub]);
- X locctr += geninstr(genwdef);
- X }
- X }
- X | KOC_RESM expr
- X {
- X pevalexpr(0, $2);
- X if(evalr[0].seg == SSG_ABS)
- X {
- X locctr = labelloc + evalr[0].value;
- X prtequvalue("C: 0x%lx\n", labelloc);
- X }
- X else
- X {
- X fraerror(
- X "noncomputable result for RMB expression");
- X }
- X }
- X ;
- X
- Xexprlist : exprlist ',' expr
- X {
- X exprlist[nextexprs ++ ] = $3;
- X $$ = nextexprs;
- X }
- X | expr
- X {
- X nextexprs = 0;
- X exprlist[nextexprs ++ ] = $1;
- X $$ = nextexprs;
- X }
- X ;
- X
- Xstringlist : stringlist ',' STRING
- X {
- X stringlist[nextstrs ++ ] = $3;
- X $$ = nextstrs;
- X }
- X | STRING
- X {
- X nextstrs = 0;
- X stringlist[nextstrs ++ ] = $1;
- X $$ = nextstrs;
- X }
- X ;
- X
- X
- Xline : KOC_CPU STRING
- X {
- X if( ! cpumatch($2))
- X {
- X fraerror("unknown cpu type, 80C50 assumed");
- X cpuselect = CPU80C50;
- X }
- X }
- X ;
- Xline : LABEL KOC_REG expr
- X {
- X if($1 -> seg == SSG_UNDEF
- X || $1 -> seg == SSG_SET)
- X {
- X pevalexpr(0, $3);
- X if(evalr[0].seg == SSG_ABS)
- X {
- X switch(cpuselect & RAMSIZEMASK)
- X {
- X case RAMSIZE64:
- X if(evalr[0].value < 0 ||
- X evalr[0].value > 63)
- X {
- X fraerror(
- X "unimplemented register address");
- X }
- X break;
- X
- X case RAMSIZE128:
- X if(evalr[0].value < 0 ||
- X evalr[0].value > 127)
- X {
- X fraerror(
- X "unimplemented register address");
- X }
- X break;
- X
- X case RAMSIZE256:
- X if(evalr[0].value < 0 ||
- X evalr[0].value > 255)
- X {
- X fraerror(
- X "unimplemented register address");
- X }
- X break;
- X
- X default:
- X break;
- X }
- X
- X $1 -> seg = SSG_SET;
- X $1 -> value = evalr[0].value;
- X prtequvalue("C: 0x%lx\n",
- X evalr[0].value);
- X }
- X else
- X {
- X fraerror(
- X "noncomputable expression for REGISTER SET");
- X }
- X }
- X else
- X {
- X fraerror(
- X "cannot change symbol value with REGISTER SET");
- X }
- X }
- X ;
- Xgenline : KOC_opcode AF
- X {
- X genlocrec(currseg, labelloc);
- X locctr += geninstr(findgen($1, ST_AF, $2|cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode REG
- X {
- X genlocrec(currseg, labelloc);
- X evalr[1].value = $2;
- X locctr += geninstr(findgen($1, ST_REG, cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode expr
- X {
- X genlocrec(currseg, labelloc);
- X pevalexpr(1, $2);
- X locctr += geninstr(findgen($1, ST_EXPR, cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode AF ',' REG
- X {
- X genlocrec(currseg, labelloc);
- X evalr[1].value = $4;
- X locctr += geninstr(findgen($1, ST_AR, $2|cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode AF ',' '@' REG
- X {
- X genlocrec(currseg, labelloc);
- X if($5 > 1)
- X {
- X fraerror("invalid register for indirect mode");
- X evalr[1].value = 0;
- X }
- X else
- X {
- X evalr[1].value = $5;
- X }
- X locctr += geninstr(findgen($1, ST_AINDIRR, $2|cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode AF ',' '#' expr
- X {
- X genlocrec(currseg, labelloc);
- X pevalexpr(1, $5);
- X locctr += geninstr(findgen($1, ST_AIMMED, $2|cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode '@' AF
- X {
- X genlocrec(currseg, labelloc);
- X locctr += geninstr(findgen($1, ST_INDIRA, $3|cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode '@' REG
- X {
- X genlocrec(currseg, labelloc);
- X if($3 > 1)
- X {
- X fraerror("invalid register for indirect mode");
- X evalr[1].value = 0;
- X }
- X else
- X {
- X evalr[1].value = $3;
- X }
- X locctr += geninstr(findgen($1, ST_INDIRR, cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode REG ',' expr
- X {
- X genlocrec(currseg, labelloc);
- X evalr[1].value = $2;
- X pevalexpr(2, $4);
- X locctr += geninstr(findgen($1, ST_REGEXP, cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode AF ',' P02
- X {
- X genlocrec(currseg, labelloc);
- X locctr += geninstr(findgen($1, ST_PA2, $2 | $4|cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode AF ',' P47
- X {
- X genlocrec(currseg, labelloc);
- X evalr[1].value = $4;
- X locctr += geninstr(findgen($1, ST_PA4, $2|cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode P02 ',' AF
- X {
- X genlocrec(currseg, labelloc);
- X locctr += geninstr(findgen($1, ST_P2A, $2 | $4|cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode P47 ',' AF
- X {
- X genlocrec(currseg, labelloc);
- X evalr[1].value = $2;
- X locctr += geninstr(findgen($1, ST_P4A, $4|cpuselect));
- X }
- X ;
- Xgenline : KOC_opcode P02 ',' '#' expr
- X {
- X genlocrec(currseg, labelloc);
- X pevalexpr(1, $5);
- X locctr += geninstr(findgen($1, ST_P2IMMED, $2|cpuselect));
- X }
- X ;
- Xgenline : KOC_misc
- X {
- X genlocrec(currseg, labelloc);
- X locctr += geninstr(findgen($1, ST_INH, cpuselect));
- X }
- X ;
- Xgenline : KOC_misc INT
- X {
- X genlocrec(currseg, labelloc);
- X locctr += geninstr(findgen($1, ST_INT, $2|cpuselect));
- X }
- X ;
- Xgenline : KOC_misc RSELC
- X {
- X genlocrec(currseg, labelloc);
- X evalr[1].value = $2 << 4;
- X locctr += geninstr(findgen($1, ST_RSELC, cpuselect));
- X }
- X ;
- Xgenline : KOC_misc MSELC
- X {
- X genlocrec(currseg, labelloc);
- X evalr[1].value = $2 << 4;
- X locctr += geninstr(findgen($1, ST_MSELC, cpuselect));
- X }
- X ;
- Xgenline : KOC_misc MREG
- X {
- X genlocrec(currseg, labelloc);
- X locctr += geninstr(findgen($1, ST_MREG, $2|cpuselect));
- X }
- X ;
- Xgenline : KOC_mov AF ',' REG
- X {
- X genlocrec(currseg, labelloc);
- X evalr[1].value = $4;
- X locctr += geninstr(findgen($1, ST_MAR, $2|cpuselect));
- X }
- X ;
- Xgenline : KOC_mov AF ',' '@' AF
- X {
- X genlocrec(currseg, labelloc);
- X locctr += geninstr(findgen($1, ST_MAINDIRA, $2|$5|cpuselect));
- X }
- X ;
- Xgenline : KOC_mov AF ',' '@' REG
- X {
- X genlocrec(currseg, labelloc);
- X if($5 > 1)
- X {
- X fraerror("invalid register for indirect mode");
- X evalr[1].value = 0;
- X }
- X else
- X {
- X evalr[1].value = $5;
- X }
- X locctr += geninstr(findgen($1, ST_MAINDIRR, $2|cpuselect));
- X }
- X ;
- Xgenline : KOC_mov AF ',' '#' expr
- X {
- X genlocrec(currseg, labelloc);
- X pevalexpr(1, $5);
- X locctr += geninstr(findgen($1, ST_MAIMMED, $2|cpuselect));
- X }
- X ;
- Xgenline : KOC_mov AF ',' MREG
- X {
- X genlocrec(currseg, labelloc);
- X locctr += geninstr(findgen($1, ST_MAMR, $2 | $4|cpuselect));
- X }
- X ;
- Xgenline : KOC_mov MREG ',' AF
- X {
- X genlocrec(currseg, labelloc);
- X locctr += geninstr(findgen($1, ST_MMRA, $2 | $4|cpuselect));
- X }
- X ;
- Xgenline : KOC_mov REG ',' AF
- X {
- X genlocrec(currseg, labelloc);
- X evalr[1].value = $2;
- X locctr += geninstr(findgen($1, ST_MRA, $4|cpuselect));
- X }
- X ;
- Xgenline : KOC_mov REG ',' '#' expr
- X {
- X genlocrec(currseg, labelloc);
- X evalr[1].value = $2;
- X pevalexpr(2, $5);
- X locctr += geninstr(findgen($1, ST_MRIMMED, cpuselect));
- X }
- X ;
- Xgenline : KOC_mov '@' REG ',' AF
- X {
- X genlocrec(currseg, labelloc);
- X if($3 > 1)
- X {
- X fraerror("invalid register for indirect mode");
- X evalr[1].value = 0;
- X }
- X else
- X {
- X evalr[1].value = $3;
- X }
- X locctr += geninstr(findgen($1, ST_MINDIRRA, $5|cpuselect));
- X }
- X ;
- Xgenline : KOC_mov '@' REG ',' '#' expr
- X {
- X genlocrec(currseg, labelloc);
- X if($3 > 1)
- X {
- X fraerror("invalid register for indirect mode");
- X evalr[1].value = 0;
- X }
- X else
- X {
- X evalr[1].value = $3;
- X }
- X pevalexpr(2, $6);
- X locctr += geninstr(findgen($1, ST_MINDIRRIM, cpuselect));
- X }
- X ;
- Xexpr : '+' expr %prec KEOP_MUN
- X {
- X $$ = $2;
- X }
- X | '-' expr %prec KEOP_MUN
- X {
- X $$ = exprnode(PCCASE_UN,$2,IFC_NEG,0,0L,
- X SYMNULL);
- X }
- X | KEOP_NOT expr
- X {
- X $$ = exprnode(PCCASE_UN,$2,IFC_NOT,0,0L,
- X SYMNULL);
- X }
- X | KEOP_HIGH expr
- X {
- X $$ = exprnode(PCCASE_UN,$2,IFC_HIGH,0,0L,
- X SYMNULL);
- X }
- X | KEOP_LOW expr
- X {
- X $$ = exprnode(PCCASE_UN,$2,IFC_LOW,0,0L,
- X SYMNULL);
- X }
- X | expr '*' expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_MUL,$3,0L,
- X SYMNULL);
- X }
- X | expr '/' expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_DIV,$3,0L,
- X SYMNULL);
- X }
- X | expr '+' expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_ADD,$3,0L,
- X SYMNULL);
- X }
- X | expr '-' expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_SUB,$3,0L,
- X SYMNULL);
- X }
- X | expr KEOP_MOD expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_MOD,$3,0L,
- X SYMNULL);
- X }
- X | expr KEOP_SHL expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_SHL,$3,0L,
- X SYMNULL);
- X }
- X | expr KEOP_SHR expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_SHR,$3,0L,
- X SYMNULL);
- X }
- X | expr KEOP_GT expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_GT,$3,0L,
- X SYMNULL);
- X }
- X | expr KEOP_GE expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_GE,$3,0L,
- X SYMNULL);
- X }
- X | expr KEOP_LT expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_LT,$3,0L,
- X SYMNULL);
- X }
- X | expr KEOP_LE expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_LE,$3,0L,
- X SYMNULL);
- X }
- X | expr KEOP_NE expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_NE,$3,0L,
- X SYMNULL);
- X }
- X | expr KEOP_EQ expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_EQ,$3,0L,
- X SYMNULL);
- X }
- X | expr KEOP_AND expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_AND,$3,0L,
- X SYMNULL);
- X }
- X | expr KEOP_OR expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_OR,$3,0L,
- X SYMNULL);
- X }
- X | expr KEOP_XOR expr
- X {
- X $$ = exprnode(PCCASE_BIN,$1,IFC_XOR,$3,0L,
- X SYMNULL);
- X }
- X | KEOP_DEFINED SYMBOL
- X {
- X $$ = exprnode(PCCASE_DEF,0,IGP_DEFINED,0,0L,$2);
- X }
- X | SYMBOL
- X {
- X $$ = exprnode(PCCASE_SYMB,0,IFC_SYMB,0,0L,$1);
- X }
- X | '*'
- X {
- X $$ = exprnode(PCCASE_PROGC,0,IFC_PROGCTR,0,
- X labelloc, SYMNULL);
- X }
- X | CONSTANT
- X {
- X $$ = exprnode(PCCASE_CONS,0,IGP_CONSTANT,0,$1,
- X SYMNULL);
- X }
- X | STRING
- X {
- X char *sourcestr = $1;
- X long accval = 0;
- X
- X if(strlen($1) > 0)
- X {
- X accval = chtran(&sourcestr);
- X if(*sourcestr != '\0')
- X {
- X accval = (accval << 8) +
- X chtran(&sourcestr);
- X }
- X
- X if( *sourcestr != '\0')
- X {
- X frawarn("string constant in expression more than 2 characters long");
- X }
- X }
- X $$ = exprnode(PCCASE_CONS, 0, IGP_CONSTANT, 0,
- X accval, SYMNULL);
- X }
- X | '(' expr ')'
- X {
- X $$ = $2;
- X }
- X ;
- X
- X
- X
- X%%
- X
- Xlexintercept()
- X/*
- X description intercept the call to yylex (the lexical analyzer)
- X and filter out all unnecessary tokens when skipping
- X the input between a failed IF and its matching ENDI or
- X ELSE
- X globals fraifskip the enable flag
- X*/
- X{
- X#undef yylex
- X
- X int rv;
- X
- X if(fraifskip)
- X {
- X for(;;)
- X {
- X
- X switch(rv = yylex())
- X
- X {
- X case 0:
- X case KOC_END:
- X case KOC_IF:
- X case KOC_ELSE:
- X case KOC_ENDI:
- X case EOL:
- X return rv;
- X default:
- X break;
- X }
- X }
- X }
- X else
- X return yylex();
- X#define yylex lexintercept
- X}
- X
- X
- X
- Xsetreserved()
- X{
- X
- X reservedsym("and", KEOP_AND, 0);
- X reservedsym("defined", KEOP_DEFINED,0);
- X reservedsym("eq", KEOP_EQ, 0);
- X reservedsym("ge", KEOP_GE, 0);
- X reservedsym("gt", KEOP_GT, 0);
- X reservedsym("high", KEOP_HIGH, 0);
- X reservedsym("le", KEOP_LE, 0);
- X reservedsym("low", KEOP_LOW, 0);
- X reservedsym("lt", KEOP_LT, 0);
- X reservedsym("mod", KEOP_MOD, 0);
- X reservedsym("ne", KEOP_NE, 0);
- X reservedsym("not", KEOP_NOT, 0);
- X reservedsym("or", KEOP_OR, 0);
- X reservedsym("shl", KEOP_SHL, 0);
- X reservedsym("shr", KEOP_SHR, 0);
- X reservedsym("xor", KEOP_XOR, 0);
- X reservedsym("AND", KEOP_AND, 0);
- X reservedsym("DEFINED", KEOP_DEFINED,0);
- X reservedsym("EQ", KEOP_EQ, 0);
- X reservedsym("GE", KEOP_GE, 0);
- X reservedsym("GT", KEOP_GT, 0);
- X reservedsym("HIGH", KEOP_HIGH, 0);
- X reservedsym("LE", KEOP_LE, 0);
- X reservedsym("LOW", KEOP_LOW, 0);
- X reservedsym("LT", KEOP_LT, 0);
- X reservedsym("MOD", KEOP_MOD, 0);
- X reservedsym("NE", KEOP_NE, 0);
- X reservedsym("NOT", KEOP_NOT, 0);
- X reservedsym("OR", KEOP_OR, 0);
- X reservedsym("SHL", KEOP_SHL, 0);
- X reservedsym("SHR", KEOP_SHR, 0);
- X reservedsym("XOR", KEOP_XOR, 0);
- X
- X /* machine specific token definitions */
- X reservedsym("RB0", RSELC, 0);
- X reservedsym("RB1", RSELC, 1);
- X reservedsym("MB0", MSELC, 2);
- X reservedsym("MB1", MSELC, 3);
- X reservedsym("I", INT, ISELI);
- X reservedsym("TCNTI", INT, ISELTCNTI);
- X reservedsym("A", AF, AFSELA);
- X reservedsym("C", AF, AFSELC);
- X reservedsym("F0", AF, AFSELF0);
- X reservedsym("F1", AF, AFSELF1);
- X reservedsym("R0", REG, 0);
- X reservedsym("R1", REG, 1);
- X reservedsym("R2", REG, 2);
- X reservedsym("R3", REG, 3);
- X reservedsym("R4", REG, 4);
- X reservedsym("R5", REG, 5);
- X reservedsym("R6", REG, 6);
- X reservedsym("R7", REG, 7);
- X reservedsym("BUS", P02, PSELBUS);
- X reservedsym("P1", P02, PSELP1);
- X reservedsym("P2", P02, PSELP2);
- X reservedsym("P4", P47, 0);
- X reservedsym("P5", P47, 1);
- X reservedsym("P6", P47, 2);
- X reservedsym("P7", P47, 3);
- X reservedsym("PSW", MREG, MSELPSW);
- X reservedsym("T", MREG, MSELT);
- X reservedsym("CNT", MREG, MSELCNT);
- X reservedsym("TCNT", MREG, MSELTCNT);
- X reservedsym("CLK", MREG, MSELCLK);
- X reservedsym("DMA", INT, ISELDMA);
- X reservedsym("FLAGS", INT, ISELFLAGS);
- X reservedsym("DBB", P02, PSELDBB);
- X reservedsym("STS", MREG, MSELSTS);
- X reservedsym("rb0", RSELC, 0);
- X reservedsym("rb1", RSELC, 1);
- X reservedsym("mb0", MSELC, 2);
- X reservedsym("mb1", MSELC, 3);
- X reservedsym("i", INT, ISELI);
- X reservedsym("tcnti", INT, ISELTCNTI);
- X reservedsym("a", AF, AFSELA);
- X reservedsym("c", AF, AFSELC);
- X reservedsym("f0", AF, AFSELF0);
- X reservedsym("f1", AF, AFSELF1);
- X reservedsym("r0", REG, 0);
- X reservedsym("r1", REG, 1);
- X reservedsym("r2", REG, 2);
- X reservedsym("r3", REG, 3);
- X reservedsym("r4", REG, 4);
- X reservedsym("r5", REG, 5);
- X reservedsym("r6", REG, 6);
- X reservedsym("r7", REG, 7);
- X reservedsym("bus", P02, PSELBUS);
- X reservedsym("p1", P02, PSELP1);
- X reservedsym("p2", P02, PSELP2);
- X reservedsym("p4", P47, 0);
- X reservedsym("p5", P47, 1);
- X reservedsym("p6", P47, 2);
- X reservedsym("p7", P47, 3);
- X reservedsym("psw", MREG, MSELPSW);
- X reservedsym("t", MREG, MSELT);
- X reservedsym("cnt", MREG, MSELCNT);
- X reservedsym("tcnt", MREG, MSELTCNT);
- X reservedsym("clk", MREG, MSELCLK);
- X reservedsym("dma", INT, ISELDMA);
- X reservedsym("flags", INT, ISELFLAGS);
- X reservedsym("dbb", P02, PSELDBB);
- X reservedsym("sts", MREG, MSELSTS);
- X
- X}
- X
- Xcpumatch(str)
- X char * str;
- X{
- X int msub;
- X
- X static struct
- X {
- X char * mtch;
- X int cpuv;
- X } matchtab[] =
- X {
- X {"C48", CPU80C48},
- X {"c48", CPU80C48},
- X {"C35", CPU80C48},
- X {"c35", CPU80C48},
- X {"C49", CPU80C49},
- X {"c49", CPU80C49},
- X {"C39", CPU80C49},
- X {"c39", CPU80C49},
- X {"C50", CPU80C50},
- X {"c50", CPU80C50},
- X {"C40", CPU80C50},
- X {"c40", CPU80C50},
- X {"48", CPU8048},
- X {"35", CPU8048},
- X {"49", CPU8049},
- X {"39", CPU8049},
- X {"50", CPU8050},
- X {"40", CPU8050},
- X {"41", CPU8041},
- X {"42", CPU8042},
- X { "" , 0 }
- X };
- X
- X for(msub = 0; matchtab[msub].mtch[0] != '\0'; msub++)
- X {
- X if(strcontains(str, matchtab[msub].mtch))
- X {
- X cpuselect = matchtab[msub].cpuv;
- X return TRUE;
- X }
- X }
- X
- X return FALSE;
- X}
- X
- X
- Xstrcontains(s1, sm)
- X char * s1, *sm;
- X{
- X int l1 = strlen(s1), lm = strlen(sm);
- X
- X for(; l1 >= lm; l1--, s1++)
- X {
- X if(strncmp(s1, sm, lm) == 0)
- X {
- X return TRUE;
- X }
- X }
- X return FALSE;
- X}
- X
- X/*
- X description Opcode and Instruction generation tables
- X usage Unix, framework crossassembler
- X history September 25, 1987
- X*/
- X
- X#define NUMOPCODE 91
- X#define NUMSYNBLK 94
- X#define NUMDIFFOP 116
- X
- Xint gnumopcode = NUMOPCODE;
- X
- Xint ophashlnk[NUMOPCODE];
- X
- Xstruct opsym optab[NUMOPCODE+1]
- X = {
- X {"invalid", KOC_opcode, 2, 0 },
- X {"ADD", KOC_opcode, 3, 2 },
- X {"ADDC", KOC_opcode, 3, 5 },
- X {"ANL", KOC_opcode, 4, 8 },
- X {"ANLD", KOC_opcode, 1, 12 },
- X {"BYTE", KOC_BDEF, 0, 0 },
- X {"CALL", KOC_opcode, 1, 13 },
- X {"CHARDEF", KOC_CHDEF, 0, 0 },
- X {"CHARSET", KOC_CHSET, 0, 0 },
- X {"CHARUSE", KOC_CHUSE, 0, 0 },
- X {"CHD", KOC_CHDEF, 0, 0 },
- X {"CLR", KOC_opcode, 1, 14 },
- X {"CPL", KOC_opcode, 1, 15 },
- X {"CPU", KOC_CPU, 0, 0 },
- X {"DA", KOC_opcode, 1, 16 },
- X {"DB", KOC_BDEF, 0, 0 },
- X {"DEC", KOC_opcode, 2, 17 },
- X {"DIS", KOC_misc, 1, 19 },
- X {"DJNZ", KOC_opcode, 1, 20 },
- X {"DW", KOC_WDEF, 0, 0 },
- X {"ELSE", KOC_ELSE, 0, 0 },
- X {"EN", KOC_misc, 1, 21 },
- X {"END", KOC_END, 0, 0 },
- X {"ENDI", KOC_ENDI, 0, 0 },
- X {"ENT0", KOC_misc, 1, 22 },
- X {"EQU", KOC_EQU, 0, 0 },
- X {"FCB", KOC_BDEF, 0, 0 },
- X {"FCC", KOC_SDEF, 0, 0 },
- X {"FDB", KOC_WDEF, 0, 0 },
- X {"HALT", KOC_misc, 1, 23 },
- X {"IDL", KOC_misc, 1, 24 },
- X {"IF", KOC_IF, 0, 0 },
- X {"IN", KOC_opcode, 1, 25 },
- X {"INC", KOC_opcode, 3, 26 },
- X {"INCL", KOC_INCLUDE, 0, 0 },
- X {"INCLUDE", KOC_INCLUDE, 0, 0 },
- X {"INS", KOC_opcode, 1, 29 },
- X {"JB0", KOC_opcode, 1, 30 },
- X {"JB1", KOC_opcode, 1, 31 },
- X {"JB2", KOC_opcode, 1, 32 },
- X {"JB3", KOC_opcode, 1, 33 },
- X {"JB4", KOC_opcode, 1, 34 },
- X {"JB5", KOC_opcode, 1, 35 },
- X {"JB6", KOC_opcode, 1, 36 },
- X {"JB7", KOC_opcode, 1, 37 },
- X {"JC", KOC_opcode, 1, 38 },
- X {"JF0", KOC_opcode, 1, 39 },
- X {"JF1", KOC_opcode, 1, 40 },
- X {"JMP", KOC_opcode, 1, 41 },
- X {"JMPP", KOC_opcode, 1, 42 },
- X {"JNC", KOC_opcode, 1, 43 },
- X {"JNI", KOC_opcode, 1, 44 },
- X {"JNIBF", KOC_opcode, 1, 45 },
- X {"JNT0", KOC_opcode, 1, 46 },
- X {"JNT1", KOC_opcode, 1, 47 },
- X {"JNZ", KOC_opcode, 1, 48 },
- X {"JOBF", KOC_opcode, 1, 49 },
- X {"JT0", KOC_opcode, 1, 50 },
- X {"JT1", KOC_opcode, 1, 51 },
- X {"JTF", KOC_opcode, 1, 52 },
- X {"JZ", KOC_opcode, 1, 53 },
- X {"MOV", KOC_mov, 9, 54 },
- X {"MOVD", KOC_opcode, 2, 63 },
- X {"MOVP3", KOC_mov, 1, 65 },
- X {"MOVP", KOC_mov, 1, 66 },
- X {"MOVX", KOC_mov, 2, 67 },
- X {"NOP", KOC_misc, 1, 69 },
- X {"ORG", KOC_ORG, 0, 0 },
- X {"ORL", KOC_opcode, 4, 70 },
- X {"ORLD", KOC_opcode, 1, 74 },
- X {"OUT", KOC_opcode, 1, 75 },
- X {"OUTL", KOC_opcode, 1, 76 },
- X {"REGISTER", KOC_REG, 0, 0 },
- X {"RESERVE", KOC_RESM, 0, 0 },
- X {"RET", KOC_misc, 1, 77 },
- X {"RETR", KOC_misc, 1, 78 },
- X {"RL", KOC_opcode, 1, 79 },
- X {"RLC", KOC_opcode, 1, 80 },
- X {"RMB", KOC_RESM, 0, 0 },
- X {"RR", KOC_opcode, 1, 81 },
- X {"RRC", KOC_opcode, 1, 82 },
- X {"SEL", KOC_misc, 2, 83 },
- X {"SET", KOC_SET, 0, 0 },
- X {"STOP", KOC_misc, 1, 85 },
- X {"STRING", KOC_SDEF, 0, 0 },
- X {"STRT", KOC_misc, 1, 86 },
- X {"SWAP", KOC_opcode, 1, 87 },
- X {"WORD", KOC_WDEF, 0, 0 },
- X {"XCH", KOC_opcode, 2, 88 },
- X {"XCHD", KOC_opcode, 1, 90 },
- X {"XRL", KOC_opcode, 3, 91 },
- X { "", 0, 0, 0 }};
- X
- Xstruct opsynt ostab[NUMSYNBLK+1]
- X = {
- X/* invalid 0 */ { 0, 1, 0 },
- X/* invalid 1 */ { 0xffff, 1, 1 },
- X/* ADD 2 */ { ST_AIMMED, 1, 2 },
- X/* ADD 3 */ { ST_AINDIRR, 1, 3 },
- X/* ADD 4 */ { ST_AR, 1, 4 },
- X/* ADDC 5 */ { ST_AIMMED, 1, 5 },
- X/* ADDC 6 */ { ST_AINDIRR, 1, 6 },
- X/* ADDC 7 */ { ST_AR, 1, 7 },
- X/* ANL 8 */ { ST_AIMMED, 1, 8 },
- X/* ANL 9 */ { ST_AINDIRR, 1, 9 },
- X/* ANL 10 */ { ST_AR, 1, 10 },
- X/* ANL 11 */ { ST_P2IMMED, 3, 11 },
- X/* ANLD 12 */ { ST_P4A, 1, 14 },
- X/* CALL 13 */ { ST_EXPR, 1, 15 },
- X/* CLR 14 */ { ST_AF, 4, 16 },
- X/* CPL 15 */ { ST_AF, 4, 20 },
- X/* DA 16 */ { ST_AF, 1, 24 },
- X/* DEC 17 */ { ST_AF, 1, 25 },
- X/* DEC 18 */ { ST_REG, 1, 26 },
- X/* DIS 19 */ { ST_INT, 2, 27 },
- X/* DJNZ 20 */ { ST_REGEXP, 1, 29 },
- X/* EN 21 */ { ST_INT, 4, 30 },
- X/* ENT0 22 */ { ST_MREG, 1, 34 },
- X/* HALT 23 */ { ST_INH, 1, 35 },
- X/* IDL 24 */ { ST_INH, 1, 36 },
- X/* IN 25 */ { ST_PA2, 3, 37 },
- X/* INC 26 */ { ST_AF, 1, 40 },
- X/* INC 27 */ { ST_INDIRR, 1, 41 },
- X/* INC 28 */ { ST_REG, 1, 42 },
- X/* INS 29 */ { ST_PA2, 1, 43 },
- X/* JB0 30 */ { ST_EXPR, 1, 44 },
- X/* JB1 31 */ { ST_EXPR, 1, 45 },
- X/* JB2 32 */ { ST_EXPR, 1, 46 },
- X/* JB3 33 */ { ST_EXPR, 1, 47 },
- X/* JB4 34 */ { ST_EXPR, 1, 48 },
- X/* JB5 35 */ { ST_EXPR, 1, 49 },
- X/* JB6 36 */ { ST_EXPR, 1, 50 },
- X/* JB7 37 */ { ST_EXPR, 1, 51 },
- X/* JC 38 */ { ST_EXPR, 1, 52 },
- X/* JF0 39 */ { ST_EXPR, 1, 53 },
- X/* JF1 40 */ { ST_EXPR, 1, 54 },
- X/* JMP 41 */ { ST_EXPR, 1, 55 },
- X/* JMPP 42 */ { ST_INDIRA, 1, 56 },
- X/* JNC 43 */ { ST_EXPR, 1, 57 },
- X/* JNI 44 */ { ST_EXPR, 1, 58 },
- X/* JNIBF 45 */ { ST_EXPR, 1, 59 },
- X/* JNT0 46 */ { ST_EXPR, 1, 60 },
- X/* JNT1 47 */ { ST_EXPR, 1, 61 },
- X/* JNZ 48 */ { ST_EXPR, 1, 62 },
- X/* JOBF 49 */ { ST_EXPR, 1, 63 },
- X/* JT0 50 */ { ST_EXPR, 1, 64 },
- X/* JT1 51 */ { ST_EXPR, 1, 65 },
- X/* JTF 52 */ { ST_EXPR, 1, 66 },
- X/* JZ 53 */ { ST_EXPR, 1, 67 },
- X/* MOV 54 */ { ST_MAIMMED, 1, 68 },
- X/* MOV 55 */ { ST_MAINDIRR, 1, 69 },
- X/* MOV 56 */ { ST_MAMR, 2, 70 },
- X/* MOV 57 */ { ST_MAR, 1, 72 },
- X/* MOV 58 */ { ST_MINDIRRA, 1, 73 },
- X/* MOV 59 */ { ST_MINDIRRIM, 1, 74 },
- X/* MOV 60 */ { ST_MMRA, 3, 75 },
- X/* MOV 61 */ { ST_MRA, 1, 78 },
- X/* MOV 62 */ { ST_MRIMMED, 1, 79 },
- X/* MOVD 63 */ { ST_P4A, 1, 80 },
- X/* MOVD 64 */ { ST_PA4, 1, 81 },
- X/* MOVP3 65 */ { ST_MAINDIRA, 1, 82 },
- X/* MOVP 66 */ { ST_MAINDIRA, 1, 83 },
- X/* MOVX 67 */ { ST_MAINDIRR, 1, 84 },
- X/* MOVX 68 */ { ST_MINDIRRA, 1, 85 },
- X/* NOP 69 */ { ST_INH, 1, 86 },
- X/* ORL 70 */ { ST_AIMMED, 1, 87 },
- X/* ORL 71 */ { ST_AINDIRR, 1, 88 },
- X/* ORL 72 */ { ST_AR, 1, 89 },
- X/* ORL 73 */ { ST_P2IMMED, 3, 90 },
- X/* ORLD 74 */ { ST_P4A, 1, 93 },
- X/* OUT 75 */ { ST_P2A, 1, 94 },
- X/* OUTL 76 */ { ST_P2A, 3, 95 },
- X/* RET 77 */ { ST_INH, 1, 98 },
- X/* RETR 78 */ { ST_INH, 1, 99 },
- X/* RL 79 */ { ST_AF, 1, 100 },
- X/* RLC 80 */ { ST_AF, 1, 101 },
- X/* RR 81 */ { ST_AF, 1, 102 },
- X/* RRC 82 */ { ST_AF, 1, 103 },
- X/* SEL 83 */ { ST_MSELC, 1, 104 },
- X/* SEL 84 */ { ST_RSELC, 1, 105 },
- X/* STOP 85 */ { ST_MREG, 1, 106 },
- X/* STRT 86 */ { ST_MREG, 2, 107 },
- X/* SWAP 87 */ { ST_AF, 1, 109 },
- X/* XCH 88 */ { ST_AINDIRR, 1, 110 },
- X/* XCH 89 */ { ST_AR, 1, 111 },
- X/* XCHD 90 */ { ST_AINDIRR, 1, 112 },
- X/* XRL 91 */ { ST_AIMMED, 1, 113 },
- X/* XRL 92 */ { ST_AINDIRR, 1, 114 },
- X/* XRL 93 */ { ST_AR, 1, 115 },
- X { 0, 0, 0 } };
- X
- Xstruct igel igtab[NUMDIFFOP+1]
- X = {
- X/* invalid 0 */ { 0 , 0,
- X "[Xnullentry" },
- X/* invalid 1 */ { 0 , 0,
- X "[Xinvalid opcode" },
- X/* ADD 2 */ { AFSELMASK , AFSELA,
- X "03;[1=];" },
- X/* ADD 3 */ { AFSELMASK , AFSELA,
- X "60.[1#]|;" },
- X/* ADD 4 */ { AFSELMASK , AFSELA,
- X "68.[1#]|;" },
- X/* ADDC 5 */ { AFSELMASK , AFSELA,
- X "13;[1=];" },
- X/* ADDC 6 */ { AFSELMASK , AFSELA,
- X "70.[1#]|;" },
- X/* ADDC 7 */ { AFSELMASK , AFSELA,
- X "78.[1#]|;" },
- X/* ANL 8 */ { AFSELMASK , AFSELA,
- X "53;[1=];" },
- X/* ANL 9 */ { AFSELMASK , AFSELA,
- X "50.[1#]|;" },
- X/* ANL 10 */ { AFSELMASK , AFSELA,
- X "58.[1#]|;" },
- X/* ANL 11 */ { INSTNOT41|PSELMASK , PSELBUS|INSTNOT41,
- X "98;[1=];" },
- X/* ANL 12 */ { PSELMASK , PSELP1,
- X "99;[1=];" },
- X/* ANL 13 */ { PSELMASK , PSELP2,
- X "9a;[1=];" },
- X/* ANLD 14 */ { AFSELMASK , AFSELA,
- X "9c.[1#]|;" },
- X/* CALL 15 */ { 0 , 0,
- X "[1=].P.f800&-.bI~.3}.e0&.14|;!.ff&;" },
- X/* CLR 16 */ { AFSELMASK , AFSELA,
- X "27;" },
- X/* CLR 17 */ { AFSELMASK , AFSELC,
- X "97;" },
- X/* CLR 18 */ { AFSELMASK , AFSELF0,
- X "85;" },
- X/* CLR 19 */ { AFSELMASK , AFSELF1,
- X "a5;" },
- X/* CPL 20 */ { AFSELMASK , AFSELA,
- X "37;" },
- X/* CPL 21 */ { AFSELMASK , AFSELC,
- X "a7;" },
- X/* CPL 22 */ { AFSELMASK , AFSELF0,
- X "95;" },
- X/* CPL 23 */ { AFSELMASK , AFSELF1,
- X "b5;" },
- X/* DA 24 */ { AFSELMASK , AFSELA,
- X "57;" },
- X/* DEC 25 */ { AFSELMASK , AFSELA,
- X "07;" },
- X/* DEC 26 */ { 0 , 0,
- X "c8.[1#]|;" },
- X/* DIS 27 */ { ISELMASK , ISELI,
- X "15;" },
- X/* DIS 28 */ { ISELMASK , ISELTCNTI,
- X "35;" },
- X/* DJNZ 29 */ { 0 , 0,
- X "e8.[1#]|;[2=].Q.ff00&-.8I;" },
- X/* EN 30 */ { ISELMASK , ISELI,
- X "05;" },
- X/* EN 31 */ { ISELMASK , ISELTCNTI,
- X "25;" },
- X/* EN 32 */ { INST41|ISELMASK , ISELDMA|INST41,
- X "e5;" },
- X/* EN 33 */ { INST41|ISELMASK , ISELFLAGS|INST41,
- X "f5;" },
- X/* ENT0 34 */ { INSTNOT41|MSELMASK , MSELCLK|INSTNOT41,
- X "75;" },
- X/* HALT 35 */ { INSTIDL , INSTIDL,
- X "01;" },
- X/* IDL 36 */ { INSTIDL , INSTIDL,
- X "01;" },
- X/* IN 37 */ { INST41|PSELMASK|AFSELMASK , PSELDBB|AFSELA|INST41,
- X "22;" },
- X/* IN 38 */ { PSELMASK|AFSELMASK , PSELP1|AFSELA,
- X "09;" },
- X/* IN 39 */ { PSELMASK|AFSELMASK , PSELP2|AFSELA,
- X "0a;" },
- X/* INC 40 */ { AFSELMASK , AFSELA,
- X "17;" },
- X/* INC 41 */ { 0 , 0,
- X "10.[1#]|;" },
- X/* INC 42 */ { 0 , 0,
- X "18.[1#]|;" },
- X/* INS 43 */ { INSTNOT41|PSELMASK|AFSELMASK , PSELBUS|AFSELA|INSTNOT41,
- X "08;" },
- X/* JB0 44 */ { 0 , 0,
- X "12;[1=].Q.ff00&-.8I;" },
- X/* JB1 45 */ { 0 , 0,
- X "32;[1=].Q.ff00&-.8I;" },
- X/* JB2 46 */ { 0 , 0,
- X "52;[1=].Q.ff00&-.8I;" },
- X/* JB3 47 */ { 0 , 0,
- X "72;[1=].Q.ff00&-.8I;" },
- X/* JB4 48 */ { 0 , 0,
- X "92;[1=].Q.ff00&-.8I;" },
- X/* JB5 49 */ { 0 , 0,
- X "b2;[1=].Q.ff00&-.8I;" },
- X/* JB6 50 */ { 0 , 0,
- X "d2;[1=].Q.ff00&-.8I;" },
- X/* JB7 51 */ { 0 , 0,
- X "f2;[1=].Q.ff00&-.8I;" },
- X/* JC 52 */ { 0 , 0,
- X "f6;[1=].Q.ff00&-.8I;" },
- X/* JF0 53 */ { 0 , 0,
- X "b6;[1=].Q.ff00&-.8I;" },
- X/* JF1 54 */ { 0 , 0,
- X "76;[1=].Q.ff00&-.8I;" },
- X/* JMP 55 */ { 0 , 0,
- X "[1=].P.f800&-.bI~.3}.e0&.04|;!.ff&;" },
- X/* JMPP 56 */ { AFSELMASK , AFSELA,
- X "b3;" },
- X/* JNC 57 */ { 0 , 0,
- X "e6;[1=].Q.ff00&-.8I;" },
- X/* JNI 58 */ { INSTNOT41 , INSTNOT41,
- X "86;[1=].Q.ff00&-.8I;" },
- X/* JNIBF 59 */ { INST41 , INST41,
- X "d6;[1=].Q.ff00&-.8I;" },
- X/* JNT0 60 */ { 0 , 0,
- X "26;[1=].Q.ff00&-.8I;" },
- X/* JNT1 61 */ { 0 , 0,
- X "46;[1=].Q.ff00&-.8I;" },
- X/* JNZ 62 */ { 0 , 0,
- X "96;[1=].Q.ff00&-.8I;" },
- X/* JOBF 63 */ { INST41 , INST41,
- X "86;[1=].Q.ff00&-.8I;" },
- X/* JT0 64 */ { 0 , 0,
- X "36;[1=].Q.ff00&-.8I;" },
- X/* JT1 65 */ { 0 , 0,
- X "56;[1=].Q.ff00&-.8I;" },
- X/* JTF 66 */ { 0 , 0,
- X "16;[1=].Q.ff00&-.8I;" },
- X/* JZ 67 */ { 0 , 0,
- X "c6;[1=].Q.ff00&-.8I;" },
- X/* MOV 68 */ { AFSELMASK , AFSELA,
- X "23;[1=];" },
- X/* MOV 69 */ { AFSELMASK , AFSELA,
- X "f0.[1#]|;" },
- X/* MOV 70 */ { AFSELMASK|MSELMASK , AFSELA|MSELPSW,
- X "c7;" },
- X/* MOV 71 */ { AFSELMASK|MSELMASK , AFSELA|MSELT,
- X "42;" },
- X/* MOV 72 */ { AFSELMASK , AFSELA,
- X "f8.[1#]|;" },
- X/* MOV 73 */ { AFSELMASK , AFSELA,
- X "a0.[1#]|;" },
- X/* MOV 74 */ { 0 , 0,
- X "b0.[1#]|;[2=];" },
- X/* MOV 75 */ { AFSELMASK|MSELMASK , AFSELA|MSELPSW,
- X "d7;" },
- X/* MOV 76 */ { INST41|AFSELMASK|MSELMASK , AFSELA|MSELSTS|INST41,
- X "50;" },
- X/* MOV 77 */ { AFSELMASK|MSELMASK , AFSELA|MSELT,
- X "62;" },
- X/* MOV 78 */ { AFSELMASK , AFSELA,
- X "a8.[1#]|;" },
- X/* MOV 79 */ { 0 , 0,
- X "b8.[1#]|;[2=];" },
- X/* MOVD 80 */ { AFSELMASK , AFSELA,
- X "3c.[1#]|;" },
- X/* MOVD 81 */ { AFSELMASK , AFSELA,
- X "0c.[1#]|;" },
- X/* MOVP3 82 */ { AFSELMASK , AFSELA,
- X "e3;" },
- X/* MOVP 83 */ { AFSELMASK , AFSELA,
- X "a3;" },
- X/* MOVX 84 */ { INSTNOT41|AFSELMASK , AFSELA|INSTNOT41,
- X "80.[1#]|;" },
- X/* MOVX 85 */ { INSTNOT41|AFSELMASK , AFSELA|INSTNOT41,
- X "90.[1#]|;" },
- X/* NOP 86 */ { 0 , 0,
- X "00;" },
- X/* ORL 87 */ { AFSELMASK , AFSELA,
- X "43;[1=];" },
- X/* ORL 88 */ { AFSELMASK , AFSELA,
- X "40.[1#]|;" },
- X/* ORL 89 */ { AFSELMASK , AFSELA,
- X "48.[1#]|;" },
- X/* ORL 90 */ { INSTNOT41|PSELMASK , PSELBUS|INSTNOT41,
- X "88;[1=];" },
- X/* ORL 91 */ { PSELMASK , PSELP1,
- X "89;[1=];" },
- X/* ORL 92 */ { PSELMASK , PSELP2,
- X "8a;[1=];" },
- X/* ORLD 93 */ { AFSELMASK , AFSELA,
- X "8c.[1#]|;" },
- X/* OUT 94 */ { INST41|AFSELMASK|PSELMASK , AFSELA|PSELDBB|INST41,
- X "02;" },
- X/* OUTL 95 */ { INSTNOT41|AFSELMASK|PSELMASK , AFSELA|PSELBUS|INSTNOT41,
- X "02;" },
- X/* OUTL 96 */ { AFSELMASK|PSELMASK , AFSELA|PSELP1,
- X "39;" },
- X/* OUTL 97 */ { AFSELMASK|PSELMASK , AFSELA|PSELP2,
- X "3a;" },
- X/* RET 98 */ { 0 , 0,
- X "83;" },
- X/* RETR 99 */ { 0 , 0,
- X "93;" },
- X/* RL 100 */ { AFSELMASK , AFSELA,
- X "e7;" },
- X/* RLC 101 */ { AFSELMASK , AFSELA,
- X "f7;" },
- X/* RR 102 */ { AFSELMASK , AFSELA,
- X "77;" },
- X/* RRC 103 */ { AFSELMASK , AFSELA,
- X "67;" },
- X/* SEL 104 */ { INSTNOT41 , INSTNOT41,
- X "c5.[1#]|;" },
- X/* SEL 105 */ { 0 , 0,
- X "c5.[1#]|;" },
- X/* STOP 106 */ { MSELMASK , MSELTCNT,
- X "65;" },
- X/* STRT 107 */ { MSELMASK , MSELCNT,
- X "45;" },
- X/* STRT 108 */ { MSELMASK , MSELT,
- X "55;" },
- X/* SWAP 109 */ { AFSELMASK , AFSELA,
- X "47;" },
- X/* XCH 110 */ { AFSELMASK , AFSELA,
- X "20.[1#]|;" },
- X/* XCH 111 */ { AFSELMASK , AFSELA,
- X "28.[1#]|;" },
- X/* XCHD 112 */ { AFSELMASK , AFSELA,
- X "30.[1#]|;" },
- X/* XRL 113 */ { AFSELMASK , AFSELA,
- X "d3;[1=];" },
- X/* XRL 114 */ { AFSELMASK , AFSELA,
- X "d0.[1#]|;" },
- X/* XRL 115 */ { AFSELMASK , AFSELA,
- X "d8.[1#]|;" },
- X { 0,0,""} };
- X/* end fraptabdef.c */
- SHAR_EOF
- true || echo 'restore of as8048.y failed'
- fi
- exit 0
-