181 lines
3.7 KiB
C
181 lines
3.7 KiB
C
#define RCSID4 "$Header$"
|
|
|
|
/*
|
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* Mostek 6500 parsing tables.
|
|
*/
|
|
|
|
|
|
/* From the READ_ME file - translation by Albert Koelmans:
|
|
* ________________
|
|
*
|
|
* De .h en .l extensions van expressies zijn hard nodig.
|
|
* Ze zorgen er echter ook voor dat er geen relocatable code geproduceerd
|
|
* kan worden. Beschouw het volgende voorbeeld:
|
|
*
|
|
* The .h and .l extensions of expressions are vital. However, they prevent
|
|
* relocatable code from being generated. Consider the following example:
|
|
*
|
|
* (file 1)
|
|
* .sect .text ! 1
|
|
* lda #[endbss].l ! 2
|
|
* ldx #[endbss].h ! 3
|
|
*
|
|
* (file 2)
|
|
* .sect .bss ! 4
|
|
* endbss: ! 5
|
|
*
|
|
* Wat voor relocation struct moet er nu voor de instructie in regel 3
|
|
* worden geproduceerd?
|
|
*
|
|
* What kind of relocation structure needs to be generated for the instruction
|
|
* in line 3?
|
|
*/
|
|
|
|
expr
|
|
: expr EXTENSION
|
|
{ $$.val = ($1.val >> $2) & 0xFF;
|
|
#ifdef RELOCATION
|
|
$$.typ = combine($1.typ, S_ABS, '&');
|
|
/* This will generate an 'invalid operator' */
|
|
/* error if $1.typ is not absolute after pass 1. */
|
|
#else
|
|
$$.typ = $1.typ; /* Even if $1.typ is relocatable, it should be */
|
|
/* absolute by the final pass. */
|
|
#endif /* RELOCATION */
|
|
}
|
|
;
|
|
operation
|
|
: NOPOP
|
|
{ emit1($1); }
|
|
| BITOP expr
|
|
{ code($2,$1,$1+8); }
|
|
| JMPOP expr
|
|
{ emit1($1);
|
|
#ifdef RELOCATION
|
|
newrelo($2.typ, RELO2);
|
|
#endif
|
|
emit2($2.val);
|
|
}
|
|
| JMPOP '(' expr ')'
|
|
{ emit1($1+0x20);
|
|
#ifdef RELOCATION
|
|
newrelo($3.typ, RELO2);
|
|
#endif
|
|
emit2($3.val);
|
|
}
|
|
| JSROP expr
|
|
{ emit1($1);
|
|
#ifdef RELOCATION
|
|
newrelo($2.typ, RELO2);
|
|
#endif
|
|
emit2($2.val);
|
|
}
|
|
| LDXOP '#' expr
|
|
{ emit1(0xA2);
|
|
#ifdef RELOCATION
|
|
newrelo($3.typ, RELO1);
|
|
#endif
|
|
emit1($3.val);
|
|
}
|
|
| LDXOP expr
|
|
{ code($2,0xA6,0xAE); }
|
|
| LDXOP expr ',' Y
|
|
{ code($2,0xB6,0xBE); }
|
|
| LDYOP '#' expr
|
|
{ emit1(0xA0);
|
|
#ifdef RELOCATION
|
|
newrelo($3.typ, RELO1);
|
|
#endif
|
|
emit1($3.val);
|
|
}
|
|
| LDYOP expr
|
|
{ code($2,0xA4,0xAC); }
|
|
| LDYOP expr ',' X
|
|
{ code($2,0xB4,0xBC); }
|
|
| STXOP expr
|
|
{ code($2,$1+0x06,$1+0x0E); }
|
|
| STXOP expr ',' Y
|
|
{ emit1($1+0x16);
|
|
#ifdef RELOCATION
|
|
newrelo($2.typ, RELO1);
|
|
#endif
|
|
emit1(lowb($2.val));
|
|
}
|
|
| STYOP expr
|
|
{ code($2,$1+0x04,$1+0x0C); }
|
|
| STYOP expr ',' X
|
|
{ emit1($1+0x14);
|
|
#ifdef RELOCATION
|
|
newrelo($2.typ, RELO1);
|
|
#endif
|
|
emit1(lowb($2.val));
|
|
}
|
|
| addop '#' expr
|
|
{ if ($1==0x80) serror("no store immediate");
|
|
emit1($1+0x09);
|
|
#ifdef RELOCATION
|
|
newrelo($3.typ, RELO1);
|
|
#endif
|
|
emit1($3.val);
|
|
}
|
|
| addop expr
|
|
{ code($2,$1+0x05,$1+0x0D); }
|
|
| addop expr ',' X
|
|
{ code($2,$1+0x15,$1+0x1D); }
|
|
| addop expr ',' Y
|
|
{ emit1($1+0x19);
|
|
#ifdef RELOCATION
|
|
newrelo($2.typ, RELO2);
|
|
#endif
|
|
emit2($2.val);
|
|
}
|
|
| addop '(' expr ',' X ')'
|
|
{ emit1($1+0x01);
|
|
#ifdef RELOCATION
|
|
newrelo($3.typ, RELO1);
|
|
#endif
|
|
emit1(lowb($3.val));
|
|
}
|
|
| addop '(' expr ')' ',' Y
|
|
{ emit1($1+0x11);
|
|
#ifdef RELOCATION
|
|
newrelo($3.typ, RELO1);
|
|
#endif
|
|
emit1(lowb($3.val));
|
|
}
|
|
| ROLOP /* Default is A. */
|
|
{ emit1($1+0x0A); }
|
|
| ROLOP A
|
|
{ emit1($1+0x0A); }
|
|
| ROLOP expr
|
|
{ code($2,$1+0x06,$1+0x0E); }
|
|
| ROLOP expr ',' X
|
|
{ code($2,$1+0x16,$1+0x1E); }
|
|
| BRAOP expr
|
|
{ branch($1,$2); }
|
|
| CPXOP '#' expr
|
|
{ emit1($1+0x00);
|
|
#ifdef RELOCATION
|
|
newrelo($3.typ, RELO1);
|
|
#endif
|
|
emit1($3.val);
|
|
}
|
|
| CPXOP expr
|
|
{ code($2,$1+0x04,$1+0x0C); }
|
|
| INCOP expr
|
|
{ code($2,$1+0x06,$1+0x0E); }
|
|
| INCOP expr ',' X
|
|
{ code($2,$1+0x16,$1+0x1E); }
|
|
;
|
|
addop
|
|
: ADDOP
|
|
| PSEU
|
|
{ emit1($1>>8); $$ = $1 & 0xFF; }
|
|
;
|