OpenCores
URL https://opencores.org/ocsvn/tms1000/tms1000/trunk

Subversion Repositories tms1000

[/] [tms1000/] [trunk/] [assembler/] [casmy.y] - Rev 2

Compare with Previous | Blame | View Log

/*
casm.y: grammar

CASM is an assembler for the TMS1000 processor.
*/

%{
#include <stdio.h>
#include "symtab.h"
#include "casm.h"
int bitreverse4[]={0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
int bitreverse2[]={0,2,1,3};
%}

%union {
    int integer;
    char *string;
  }


%token <integer> INTEGER
%token <string> IDENT

%token  BR 
%token  CALL
%token  CALLL
%token  CLO
%token  COMX
%token  LDP
%token  LDX 
%token  SBIT
%token  RBIT
%token  RETN
%token  RSTR
%token  SETR
%token  TDO 
%token  ALEC
%token  ALEM
%token  AMAAC
%token  A6AAC
%token  A8AAC
%token  A10AAC
%token  CLA
%token  CPAIZ
%token  DAN
%token  DMAN 
%token  DYN  
%token  IA   
%token  IMAC 
%token  IYC  
%token  KNEZ 
%token  MNEZ 
%token  SAMAN
%token  TAM  
%token  TAMIY
%token  TAMZA
%token  TAY  
%token  TBIT1
%token  TCY  
%token  TCMIY
%token  TKA  
%token  TMA  
%token  TMY  
%token  TYA  
%token  XMA  
%token  YNEA 
%token  YNEC
%token  BL
%token  ROM
%token  SYMTAB

%type <integer> expr

%%

line            :       label instruction
                |       label
                |       instruction
                |       pseudo_op
                |
                |       error
                ;

label:          IDENT ':'       { do_label ($1); }
                ;

expr            : INTEGER { $$ = $1; }
                | IDENT { if (pass == 1)
                            $$ = 0;
                          else if (! lookup_symbol (symtab, $1, &$$))
                            {
                              error ("undefined symbol '%s'\n", $1);
                              $$ = 0;
                            }
                        }
                ;
pseudo_op       : ps_rom
                | ps_symtab
                ;

ps_rom          : '.' ROM expr { /*$3 = range ($3, 0, MAXGROUP * MAXROM - 1);
                                 group = dsg = ($3 >> 3);
                                 rom = dsr = ($3 & 7); */
                                 rom = $3;
                                 pc = 0;
                                 last_instruction_type = OTHER_INST;
                                 printf (" %d", $3); }
                ;

ps_symtab       : '.' SYMTAB { symtab_flag = 1; }
                ;

instruction     : inst_br
                | inst_bl
                | inst_call
                | inst_calll
                | inst_clo
                | inst_comx
                | inst_ldp
                | inst_ldx
                | inst_sbit
                | inst_rbit
                | inst_retn
                | inst_rstr
                | inst_setr
                | inst_tdo
                | inst_alec
                | inst_alem
                | inst_amaac
                | inst_a6aac
                | inst_a8aac
                | inst_a10aac
                | inst_cla
                | inst_cpaiz
                | inst_dan
                | inst_dman
                | inst_dyn
                | inst_ia
                | inst_imac
                | inst_iyc
                | inst_knez
                | inst_mnez
                | inst_saman
                | inst_tam
                | inst_tamiy
                | inst_tamza
                | inst_tay
                | inst_tbit1
                | inst_tcy
                | inst_tcmiy
                | inst_tka
                | inst_tma
                | inst_tmy
                | inst_tya
                | inst_xma
                | inst_ynea
                | inst_ynec      
                ;

inst_br         : BR expr                   { emit (0x80 | ($2 & 0x3f)); } ;       
inst_bl         : BL expr                   { emit (0x10 | bitreverse4[(($2 & 0x3c0) >> 6)]);
                                              pc = ((pc != 31) && ((pc >> 4) != 0) && (((pc & 0xf) == 15) || ((pc >> 4) != 3))) ?  (pc << 1) : (pc << 1)+1;
                                              pc = pc & 0x3f;  
                                              emit (0x80 | ($2 & 0x3f)); } ;       
inst_call       : CALL expr                 { emit (0xc0 | ($2 & 0x3f)); } ;     
inst_calll      : CALLL expr                { emit (0x10 | bitreverse4[(($2 & 0x3c0) >> 6)]);
                                              pc = ((pc != 31) && ((pc >> 4) != 0) && (((pc & 0xf) == 15) || ((pc >> 4) != 3))) ?  (pc << 1) : (pc << 1)+1;
                                              pc = pc & 0x3f; 
                                              emit (0xc0 | ($2 & 0x3f)); } ;     
inst_clo        : CLO                       { emit (0x0b); } ;      
inst_comx       : COMX                      { emit (0x00); } ;     
inst_ldp        : LDP expr                  { emit (0x10 | bitreverse4[($2 & 0xf)]); } ;      
inst_ldx        : LDX expr                  { emit (0x3c | bitreverse2[($2 & 0x3)]); } ;      
inst_sbit       : SBIT expr                 { emit (0x30 | bitreverse2[($2 & 0x3)]); } ;     
inst_rbit       : RBIT expr                 { emit (0x34 | bitreverse2[($2 & 0x3)]); } ;     
inst_retn       : RETN                      { emit (0x0f); } ;     
inst_rstr       : RSTR                      { emit (0x0c); } ;     
inst_setr       : SETR                      { emit (0x0d); } ;     
inst_tdo        : TDO                       { emit (0x0a); } ;      
inst_alec       : ALEC expr                 { emit (0x70 | bitreverse4[($2 & 0xf)]); } ;     
inst_alem       : ALEM                      { emit (0x29); } ;     
inst_amaac      : AMAAC                     { emit (0x25); } ;    
inst_a6aac      : A6AAC                     { emit (0x06); } ;    
inst_a8aac      : A8AAC                     { emit (0x01); } ;    
inst_a10aac     : A10AAC                    { emit (0x05); } ;   
inst_cla        : CLA                       { emit (0x2f); } ;      
inst_cpaiz      : CPAIZ                     { emit (0x2d); } ;    
inst_dan        : DAN                       { emit (0x07); } ;      
inst_dman       : DMAN                      { emit (0x2a); } ;     
inst_dyn        : DYN                       { emit (0x2c); } ;      
inst_ia         : IA                        { emit (0x0e); } ;       
inst_imac       : IMAC                      { emit (0x28); } ;     
inst_iyc        : IYC                       { emit (0x2b); } ;      
inst_knez       : KNEZ                      { emit (0x09); } ;     
inst_mnez       : MNEZ                      { emit (0x26); } ;     
inst_saman      : SAMAN                     { emit (0x27); } ;    
inst_tam        : TAM                       { emit (0x03); } ;      
inst_tamiy      : TAMIY                     { emit (0x20); } ;    
inst_tamza      : TAMZA                     { emit (0x04); } ;    
inst_tay        : TAY                       { emit (0x24); } ;      
inst_tbit1      : TBIT1 expr                { emit (0x38 | bitreverse2[($2 & 0x3)]); } ;    
inst_tcy        : TCY   expr                { emit (0x40 | bitreverse4[($2 & 0xf)]); } ;      
inst_tcmiy      : TCMIY expr                { emit (0x60 | bitreverse4[($2 & 0xf)]); } ;    
inst_tka        : TKA                       { emit (0x08); } ;      
inst_tma        : TMA                       { emit (0x21); } ;      
inst_tmy        : TMY                       { emit (0x22); } ;      
inst_tya        : TYA                       { emit (0x23); } ;      
inst_xma        : XMA                       { emit (0x2e); } ;      
inst_ynea       : YNEA                      { emit (0x02); } ;     
inst_ynec       : YNEC  expr                { emit (0x50 | bitreverse4[($2 & 0xf)]); } ;     
%%

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.