/******************************************************************
|
/******************************************************************
|
* *
|
* *
|
* Author: Liwei *
|
* Author: Liwei *
|
* *
|
* *
|
* This file is part of the "ClaiRISC" project, *
|
* This file is part of the "ClaiRISC" project, *
|
* The folder in CVS is named as "lwrisc" *
|
* The folder in CVS is named as "lwrisc" *
|
* Downloaded from: *
|
* Downloaded from: *
|
* http://www.opencores.org/pdownloads.cgi/list/lwrisc *
|
* http://www.opencores.org/pdownloads.cgi/list/lwrisc *
|
* *
|
* *
|
* If you encountered any problem, please contact me via *
|
* If you encountered any problem, please contact me via *
|
* Email:mcupro@opencores.org or mcupro@163.com *
|
* Email:mcupro@opencores.org or mcupro@163.com *
|
* *
|
* *
|
******************************************************************/
|
******************************************************************/
|
|
|
|
|
#include "stdlib.h"
|
#include "stdlib.h"
|
#include "stdio.h"
|
#include "stdio.h"
|
#include "string.h"
|
#include "string.h"
|
void add_ins(char *ins);
|
void add_ins(char *ins);
|
int func1(int in)
|
int func1(int in)
|
{
|
{
|
const int table[]={1,2,4,8,16,32,64,128,256,512,1024,2048};
|
const int table[]={1,2,4,8,16,32,64,128,256,512,1024,2048};
|
int i =0;
|
int i =0;
|
if (in>=2048)return -1;
|
if (in>=2048)return -1;
|
for(;;i++)
|
for(;;i++)
|
if ((in>table[i])&&(in<table[i+1])){
|
if ((in>table[i])&&(in<table[i+1])){
|
return i+1;
|
return i+1;
|
}
|
}
|
}
|
}
|
|
|
|
|
int getbit(unsigned int data,unsigned int index)
|
int getbit(unsigned int data,unsigned int index)
|
{
|
{
|
unsigned int temp=1<<index ;
|
unsigned int temp=1<<index ;
|
if(data&temp)
|
if(data&temp)
|
return 1 ;
|
return 1 ;
|
else
|
else
|
return 0 ;
|
return 0 ;
|
}
|
}
|
|
|
char temp[100];
|
char temp[100];
|
char*ins12tostr(unsigned int ins)
|
char*ins12tostr(unsigned int ins)
|
{
|
{
|
unsigned int i ;
|
unsigned int i ;
|
for(i=0;i<100;++i)temp[i]=0 ;
|
for(i=0;i<100;++i)temp[i]=0 ;
|
for(i=0;i<=11;++i)
|
for(i=0;i<=11;++i)
|
temp[i]=getbit(ins,11-i)+'0' ;
|
temp[i]=getbit(ins,11-i)+'0' ;
|
return temp ;
|
return temp ;
|
}
|
}
|
/*static volatile unsigned char WB_ADDR @ 0x01;
|
/*static volatile unsigned char WB_ADDR @ 0x01;
|
//static volatile unsigned char PCL @ 0x02;
|
//static volatile unsigned char PCL @ 0x02;
|
static volatile unsigned char STATUS @ 0x03;
|
static volatile unsigned char STATUS @ 0x03;
|
static unsigned char FSR @ 0x04;
|
static unsigned char FSR @ 0x04;
|
static volatile unsigned char WB_DATA @ 0x05;
|
static volatile unsigned char WB_DATA @ 0x05;
|
static volatile unsigned char WB_CTL @ 0x06;*/
|
static volatile unsigned char WB_CTL @ 0x06;*/
|
static char reg_name[30];
|
static char reg_name[30];
|
char*find_reg(unsigned int t)
|
char*find_reg(unsigned int t)
|
{/*
|
{/*
|
//puts(&ins[7]);
|
//puts(&ins[7]);
|
if(t==0)
|
if(t==0)
|
{
|
{
|
// printf("t=%d",t);
|
// printf("t=%d",t);
|
strcpy(reg_name,"WB_ADDR");
|
strcpy(reg_name,"WB_ADDR");
|
return reg_name ;
|
return reg_name ;
|
}
|
}
|
// if(reg_no==0)strcpy(reg_name,"WB_CTL");
|
// if(reg_no==0)strcpy(reg_name,"WB_CTL");
|
else if(t==1)
|
else if(t==1)
|
{
|
{
|
strcpy(reg_name,"TMR");
|
strcpy(reg_name,"TMR");
|
return reg_name ;
|
return reg_name ;
|
}
|
}
|
// else if(reg_no==1)strcpy(reg_name,"WB_ADDR");
|
// else if(reg_no==1)strcpy(reg_name,"WB_ADDR");
|
else if(t==2)
|
else if(t==2)
|
{
|
{
|
strcpy(reg_name,"PCL");
|
strcpy(reg_name,"PCL");
|
return reg_name ;
|
return reg_name ;
|
}
|
}
|
|
|
else
|
else
|
*/ if(t-3==0)
|
*/ if(t-3==0)
|
{
|
{
|
strcpy(reg_name,"STATUS");
|
strcpy(reg_name,"STATUS");
|
return reg_name ;
|
return reg_name ;
|
}/*
|
}/*
|
else if(t==0+4)
|
else if(t==0+4)
|
{
|
{
|
strcpy(reg_name,"FSR");
|
strcpy(reg_name,"FSR");
|
return reg_name ;
|
return reg_name ;
|
}
|
}
|
else if(t==5+0)
|
else if(t==5+0)
|
{
|
{
|
strcpy(reg_name,"WB_DATA");
|
strcpy(reg_name,"WB_DATA");
|
return reg_name ;
|
return reg_name ;
|
}
|
}
|
//else if(reg_no==5)strcpy(reg_name,"WB_WR_DATA");
|
//else if(reg_no==5)strcpy(reg_name,"WB_WR_DATA");
|
else if(t==6+0)
|
else if(t==6+0)
|
{
|
{
|
strcpy(reg_name,"WB_CTL");
|
strcpy(reg_name,"WB_CTL");
|
return reg_name ;
|
return reg_name ;
|
}
|
}
|
//else if(reg_no==6)strcpy(reg_name,"WB_RD_DATA");
|
//else if(reg_no==6)strcpy(reg_name,"WB_RD_DATA");
|
else if(t==0+1+6)
|
else if(t==0+1+6)
|
{
|
{
|
strcpy(reg_name,"PORTC");
|
strcpy(reg_name,"PORTC");
|
return reg_name ;
|
return reg_name ;
|
}
|
}
|
*/
|
*/
|
return NULL ;
|
return NULL ;
|
}
|
}
|
|
|
char hex[]=
|
char hex[]=
|
{
|
{
|
"0123456789abcdef"
|
"0123456789abcdef"
|
}
|
}
|
;
|
;
|
char*p,__hex[20]=
|
char*p,__hex[20]=
|
{
|
{
|
0
|
0
|
}
|
}
|
;
|
;
|
unsigned char*bs2hs(char*bs)
|
unsigned char*bs2hs(char*bs)
|
{
|
{
|
unsigned int t=0,i=0 ;
|
unsigned int t=0,i=0 ;
|
for(i=0;;++i)
|
for(i=0;;++i)
|
{
|
{
|
if(bs[i]==0)break ;
|
if(bs[i]==0)break ;
|
t=t*2+bs[i]-'0' ;
|
t=t*2+bs[i]-'0' ;
|
}
|
}
|
//printf("now t==%d",t);
|
//printf("now t==%d",t);
|
p=find_reg(t);
|
p=find_reg(t);
|
//if (t>=8) goto else
|
//if (t>=8) goto else
|
if(p!=NULL)
|
if(p!=NULL)
|
strcpy(__hex,p);
|
strcpy(__hex,p);
|
else
|
else
|
{
|
{
|
__hex[0]='0' ;
|
__hex[0]='0' ;
|
__hex[1]='x' ;
|
__hex[1]='x' ;
|
__hex[2]=hex[t/16];
|
__hex[2]=hex[t/16];
|
__hex[3]=hex[t%16];
|
__hex[3]=hex[t%16];
|
__hex[4]=0 ;
|
__hex[4]=0 ;
|
}
|
}
|
return __hex ;
|
return __hex ;
|
}
|
}
|
|
|
char _temp[100];
|
char _temp[100];
|
//get file reg adderss from instruction!
|
//get file reg adderss from instruction!
|
char*gen_ins_fa(char*ins)
|
char*gen_ins_fa(char*ins)
|
{//gen_ins_in(
|
{//gen_ins_in(
|
strcpy(_temp,ins);
|
strcpy(_temp,ins);
|
return bs2hs(&_temp[7]);
|
return bs2hs(&_temp[7]);
|
}
|
}
|
|
|
//get bit data from instruction!
|
//get bit data from instruction!
|
unsigned int gen_ins_bd(char*ins)
|
unsigned int gen_ins_bd(char*ins)
|
{
|
{
|
//1111_1111_1111
|
//1111_1111_1111
|
unsigned int t=0 ;
|
unsigned int t=0 ;
|
if(ins[5+1]=='1')t+=1 ;
|
if(ins[5+1]=='1')t+=1 ;
|
if(ins[4+1]=='1')t+=2 ;
|
if(ins[4+1]=='1')t+=2 ;
|
if(ins[3+1]=='1')t+=4 ;
|
if(ins[3+1]=='1')t+=4 ;
|
return t ;
|
return t ;
|
}
|
}
|
|
|
//get goto(and call) address data from instruction!
|
//get goto(and call) address data from instruction!
|
unsigned int gen_ins_goto(char*ins)
|
unsigned int gen_ins_goto(char*ins)
|
{
|
{
|
//000_111111001
|
//000_111111001
|
unsigned int t=0 ;
|
unsigned int t=0 ;
|
if(ins[11-0]=='1')t+=1;
|
if(ins[11-0]=='1')t+=1;
|
if(ins[11-1]=='1')t+=2 ;
|
if(ins[11-1]=='1')t+=2 ;
|
if(ins[11-2]=='1')t+=4;
|
if(ins[11-2]=='1')t+=4;
|
if(ins[11-3]=='1')t+=8 ;
|
if(ins[11-3]=='1')t+=8 ;
|
if(ins[11-4]=='1')t+=16;//1<<4 ;
|
if(ins[11-4]=='1')t+=16;//1<<4 ;
|
if(ins[11-5]=='1')t+=32;//1<<5 ;
|
if(ins[11-5]=='1')t+=32;//1<<5 ;
|
if(ins[11-6]=='1')t+=64;//1<<6 ;
|
if(ins[11-6]=='1')t+=64;//1<<6 ;
|
if(ins[11-7]=='1')t+=128;//1<<7 ;
|
if(ins[11-7]=='1')t+=128;//1<<7 ;
|
// if(ins[11-8]=='1')t+=256;//1<<8 ;
|
// if(ins[11-8]=='1')t+=256;//1<<8 ;
|
return t ;
|
return t ;
|
}
|
}
|
|
|
//get instant data from instruction!
|
//get instant data from instruction!
|
unsigned int gen_ins_in(char*ins)
|
unsigned int gen_ins_in(char*ins)
|
{
|
{
|
unsigned int t=0 ;
|
unsigned int t=0 ;
|
if(ins[11-0]=='1')t+=1;
|
if(ins[11-0]=='1')t+=1;
|
if(ins[11-1]=='1')t+=2 ;
|
if(ins[11-1]=='1')t+=2 ;
|
if(ins[11-2]=='1')t+=4;//1<<3 ;
|
if(ins[11-2]=='1')t+=4;//1<<3 ;
|
if(ins[11-3]=='1')t+=8;//1<<4 ;
|
if(ins[11-3]=='1')t+=8;//1<<4 ;
|
if(ins[11-4]=='1')t+=16;//1<<4 ;
|
if(ins[11-4]=='1')t+=16;//1<<4 ;
|
if(ins[11-5]=='1')t+=32;//1<<5 ;
|
if(ins[11-5]=='1')t+=32;//1<<5 ;
|
if(ins[11-6]=='1')t+=64;//1<<6 ;
|
if(ins[11-6]=='1')t+=64;//1<<6 ;
|
if(ins[11-7]=='1')t+=128;//1<<7 ;
|
if(ins[11-7]=='1')t+=128;//1<<7 ;
|
// if(ins[11-8]=='1')t+=1<<8 ;
|
// if(ins[11-8]=='1')t+=1<<8 ;
|
return t ;
|
return t ;
|
}
|
}
|
|
|
|
|
unsigned int inscmp(char*src,char*dst)
|
unsigned int inscmp(char*src,char*dst)
|
{
|
{
|
unsigned int i ;
|
unsigned int i ;
|
for(i=0;i<=9;i++)
|
for(i=0;i<=9;i++)
|
{
|
{
|
if(src[i]=='X')continue ;
|
if(src[i]=='X')continue ;
|
else if(src[i]!=dst[i])return 0 ;
|
else if(src[i]!=dst[i])return 0 ;
|
}
|
}
|
return 1 ;
|
return 1 ;
|
}
|
}
|
|
|
|
|
unsigned int str2u12(char*str)
|
unsigned int str2u12(char*str)
|
{
|
{
|
unsigned int ret=0 ;
|
unsigned int ret=0 ;
|
unsigned int i ;
|
unsigned int i ;
|
for(i=0;i<=11;++i)
|
for(i=0;i<=11;++i)
|
{
|
{
|
if(str[i]==0)return ret ;
|
if(str[i]==0)return ret ;
|
ret=ret*10+str[i]-'0' ;
|
ret=ret*10+str[i]-'0' ;
|
}
|
}
|
return ret ;
|
return ret ;
|
}
|
}
|
/*
|
/*
|
unsigned int getfno(char *ins,unsigned char start,
|
unsigned int getfno(char *ins,unsigned char start,
|
unsigned char len)
|
unsigned char len)
|
{
|
{
|
unsigned int data = str2u12(ins);
|
unsigned int data = str2u12(ins);
|
unsigned int tmp1=0xffff<<len ;
|
unsigned int tmp1=0xffff<<len ;
|
unsigned int tmp2=data>>start ;
|
unsigned int tmp2=data>>start ;
|
unsigned int ret ;
|
unsigned int ret ;
|
tmp1=~tmp1 ;
|
tmp1=~tmp1 ;
|
ret=tmp1&tmp2 ;
|
ret=tmp1&tmp2 ;
|
ret=ret&0xffff ;
|
ret=ret&0xffff ;
|
return ret ;
|
return ret ;
|
|
|
unsigned int i,ret=0;
|
unsigned int i,ret=0;
|
for(i=11-start;i<len;++i)
|
for(i=11-start;i<len;++i)
|
ret=ret+(ins[i]-'0')*2;
|
ret=ret+(ins[i]-'0')*2;
|
return ret;
|
return ret;
|
}*/
|
}*/
|
/*
|
/*
|
void test_main(void)
|
void test_main(void)
|
{
|
{
|
printf("%d",getno(str2u12("0xff"),0,1));
|
printf("%d",getno(str2u12("0xff"),0,1));
|
getchar();
|
getchar();
|
}*/
|
}*/
|
|
|
|
|
|
|
char tmp_str[100]=
|
char tmp_str[100]=
|
{
|
{
|
0
|
0
|
}
|
}
|
;
|
;
|
void init_temp_str(void)
|
void init_temp_str(void)
|
{
|
{
|
int i ;
|
int i ;
|
for(i=0;i<100;++i)
|
for(i=0;i<100;++i)
|
tmp_str[i]=0 ;
|
tmp_str[i]=0 ;
|
}
|
}
|
|
|
char*op_ins_NOP(char*ins)
|
char*op_ins_NOP(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
sprintf(tmp_str,"NOP");
|
sprintf(tmp_str,"NOP");
|
add_ins("NOP");
|
add_ins("NOP");
|
//ok
|
//ok
|
return tmp_str ;
|
return tmp_str ;
|
|
|
}
|
}
|
char*op_ins_MOVWF(char*ins)
|
char*op_ins_MOVWF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
sprintf(tmp_str,"MOVWF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"MOVWF %s",gen_ins_fa(ins));
|
add_ins("MOVWF");
|
add_ins("MOVWF");
|
//ok
|
//ok
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_CLRW(char*ins)
|
char*op_ins_CLRW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
sprintf(tmp_str,"CLRW");
|
sprintf(tmp_str,"CLRW");
|
add_ins("CLRW");
|
add_ins("CLRW");
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_CLRF(char*ins)
|
char*op_ins_CLRF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
sprintf(tmp_str,"CLRF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"CLRF %s",gen_ins_fa(ins));
|
add_ins("CLRF");
|
add_ins("CLRF");
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_SUBWFW(char*ins)
|
char*op_ins_SUBWFW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
sprintf(tmp_str,"SUBWFW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"SUBWFW %s",gen_ins_fa(ins));
|
add_ins("SUBWFW");
|
add_ins("SUBWFW");
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_SUBWFF(char*ins)
|
char*op_ins_SUBWFF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
sprintf(tmp_str,"SUBWFF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"SUBWFF %s",gen_ins_fa(ins));
|
add_ins("WUBWFF");
|
add_ins("WUBWFF");
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_DECFW(char*ins)
|
char*op_ins_DECFW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
sprintf(tmp_str,"DECFW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"DECFW %s",gen_ins_fa(ins));
|
add_ins("DECFW");
|
add_ins("DECFW");
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_DECFF(char*ins)
|
char*op_ins_DECFF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
sprintf(tmp_str,"DECFF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"DECFF %s",gen_ins_fa(ins));
|
add_ins("DECFF");
|
add_ins("DECFF");
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_IORWFW(char*ins)
|
char*op_ins_IORWFW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
sprintf(tmp_str,"IORWFW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"IORWFW %s",gen_ins_fa(ins));
|
add_ins("IORWFW");
|
add_ins("IORWFW");
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_IORWFF(char*ins)
|
char*op_ins_IORWFF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
sprintf(tmp_str,"IORWFF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"IORWFF %s",gen_ins_fa(ins));
|
add_ins("IORWFF");
|
add_ins("IORWFF");
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_ANDWFW(char*ins)
|
char*op_ins_ANDWFW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
sprintf(tmp_str,"ANDWFW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"ANDWFW %s",gen_ins_fa(ins));
|
add_ins("ANDWFW");
|
add_ins("ANDWFW");
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_ANDWFF(char*ins)
|
char*op_ins_ANDWFF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("ANDWFF");
|
add_ins("ANDWFF");
|
sprintf(tmp_str,"ANDWFF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"ANDWFF %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_XORWFW(char*ins)
|
char*op_ins_XORWFW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("XORWFW");
|
add_ins("XORWFW");
|
sprintf(tmp_str,"XORWFW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"XORWFW %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_XORWFF(char*ins)
|
char*op_ins_XORWFF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("XORWFF");
|
add_ins("XORWFF");
|
sprintf(tmp_str,"XORWFF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"XORWFF %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_ADDWFW(char*ins)
|
char*op_ins_ADDWFW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("ADDWFW");
|
add_ins("ADDWFW");
|
sprintf(tmp_str,"ADDWFW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"ADDWFW %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_ADDWFF(char*ins)
|
char*op_ins_ADDWFF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("ADDWFF");
|
add_ins("ADDWFF");
|
sprintf(tmp_str,"ADDWFF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"ADDWFF %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_MOVFW(char*ins)
|
char*op_ins_MOVFW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("MOVFW");
|
add_ins("MOVFW");
|
sprintf(tmp_str,"MOVFW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"MOVFW %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
|
|
|
|
}
|
}
|
char*op_ins_MOVFF(char*ins)
|
char*op_ins_MOVFF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("MOVFF");
|
add_ins("MOVFF");
|
sprintf(tmp_str,"MOVFF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"MOVFF %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_COMFW(char*ins)
|
char*op_ins_COMFW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("COMFW");
|
add_ins("COMFW");
|
sprintf(tmp_str,"COMFW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"COMFW %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_COMFF(char*ins)
|
char*op_ins_COMFF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("COMFF");
|
add_ins("COMFF");
|
sprintf(tmp_str,"COMFF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"COMFF %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_INCFW(char*ins)
|
char*op_ins_INCFW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("INCFW");
|
add_ins("INCFW");
|
sprintf(tmp_str,"INCFW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"INCFW %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_INCFF(char*ins)
|
char*op_ins_INCFF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("INCFF");
|
add_ins("INCFF");
|
sprintf(tmp_str,"INCFF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"INCFF %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_DECFSZW(char*ins)
|
char*op_ins_DECFSZW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("DECFSZW");
|
add_ins("DECFSZW");
|
sprintf(tmp_str,"DECFSZW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"DECFSZW %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_DECFSZF(char*ins)
|
char*op_ins_DECFSZF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("DECFSZF");
|
add_ins("DECFSZF");
|
sprintf(tmp_str,"DECFSZF %s [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
|
sprintf(tmp_str,"DECFSZF %s [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_RRFW(char*ins)
|
char*op_ins_RRFW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("RRFW");
|
add_ins("RRFW");
|
sprintf(tmp_str,"RRFW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"RRFW %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_RRFF(char*ins)
|
char*op_ins_RRFF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("RRFF");
|
add_ins("RRFF");
|
sprintf(tmp_str,"RRFF%s",gen_ins_fa(ins));
|
sprintf(tmp_str,"RRFF%s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_RLFW(char*ins)
|
char*op_ins_RLFW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("RRFW");
|
add_ins("RRFW");
|
sprintf(tmp_str,"RLFW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"RLFW %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_RLFF(char*ins)
|
char*op_ins_RLFF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("RLFF");
|
add_ins("RLFF");
|
sprintf(tmp_str,"RLFF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"RLFF %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_SWAPFW(char*ins)
|
char*op_ins_SWAPFW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("SWAPFW");
|
add_ins("SWAPFW");
|
sprintf(tmp_str,"SWAPFW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"SWAPFW %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_SWAPFF(char*ins)
|
char*op_ins_SWAPFF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("SWAPFF");
|
add_ins("SWAPFF");
|
sprintf(tmp_str,"SWAPFF %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"SWAPFF %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_INCFSZW(char*ins)
|
char*op_ins_INCFSZW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("INCFZW");
|
add_ins("INCFZW");
|
sprintf(tmp_str,"INCFSZW %s",gen_ins_fa(ins));
|
sprintf(tmp_str,"INCFSZW %s",gen_ins_fa(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_INCFSZF(char*ins)
|
char*op_ins_INCFSZF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("INCFSZF");
|
add_ins("INCFSZF");
|
sprintf(tmp_str,"INCFSZF %s [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
|
sprintf(tmp_str,"INCFSZF %s [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_BCF(char*ins)
|
char*op_ins_BCF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("BCF");
|
add_ins("BCF");
|
sprintf(tmp_str,"BCF %s [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
|
sprintf(tmp_str,"BCF %s [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_BSF(char*ins)
|
char*op_ins_BSF(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("BSF");
|
add_ins("BSF");
|
sprintf(tmp_str,"BSF %s [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
|
sprintf(tmp_str,"BSF %s [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_BTFSC(char*ins)
|
char*op_ins_BTFSC(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("BTFSC");
|
add_ins("BTFSC");
|
sprintf(tmp_str,"BTFSC %s [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
|
sprintf(tmp_str,"BTFSC %s [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_BTFSS(char*ins)
|
char*op_ins_BTFSS(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("BTFSS");
|
add_ins("BTFSS");
|
sprintf(tmp_str,"BTFSS %s [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
|
sprintf(tmp_str,"BTFSS %s [%d]",gen_ins_fa(ins),gen_ins_bd(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_RETLW(char*ins)
|
char*op_ins_RETLW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("RETLW");
|
add_ins("RETLW");
|
sprintf(tmp_str,"RETLW %d",gen_ins_in(ins));
|
sprintf(tmp_str,"RETLW %d",gen_ins_in(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_CALL(char*ins)
|
char*op_ins_CALL(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("CALL");
|
add_ins("CALL");
|
sprintf(tmp_str,"CALL %d",gen_ins_goto(ins));
|
sprintf(tmp_str,"CALL %d",gen_ins_goto(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_GOTO(char*ins)
|
char*op_ins_GOTO(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("GOTO");
|
add_ins("GOTO");
|
sprintf(tmp_str,"GOTO %d",gen_ins_goto(ins));
|
sprintf(tmp_str,"GOTO %d",gen_ins_goto(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_MOVLW(char*ins)
|
char*op_ins_MOVLW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("MOVLW");
|
add_ins("MOVLW");
|
sprintf(tmp_str,"MOVLW %d",gen_ins_in(ins));
|
sprintf(tmp_str,"MOVLW %d",gen_ins_in(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_IORLW(char*ins)
|
char*op_ins_IORLW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("IORLW");
|
add_ins("IORLW");
|
sprintf(tmp_str,"IORLW %d",gen_ins_in(ins));
|
sprintf(tmp_str,"IORLW %d",gen_ins_in(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_ANDLW(char*ins)
|
char*op_ins_ANDLW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("ANDLW");
|
add_ins("ANDLW");
|
sprintf(tmp_str,"ANDLW %d",gen_ins_in(ins));
|
sprintf(tmp_str,"ANDLW %d",gen_ins_in(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
char*op_ins_XORLW(char*ins)
|
char*op_ins_XORLW(char*ins)
|
{
|
{
|
init_temp_str();
|
init_temp_str();
|
add_ins("XORLW");
|
add_ins("XORLW");
|
sprintf(tmp_str,"XORLW %d",gen_ins_in(ins));
|
sprintf(tmp_str,"XORLW %d",gen_ins_in(ins));
|
return tmp_str ;
|
return tmp_str ;
|
}
|
}
|
|
|
|
|
char*branch_ins(char*ins)
|
char*branch_ins(char*ins)
|
{
|
{
|
if(inscmp("000000000000",ins)==1)
|
if(inscmp("000000000000",ins)==1)
|
return op_ins_NOP(ins);
|
return op_ins_NOP(ins);
|
// char * op_ins_NOP (char *ins){}
|
// char * op_ins_NOP (char *ins){}
|
else if(inscmp("0000001XXXXX",ins)==1)
|
else if(inscmp("0000001XXXXX",ins)==1)
|
return op_ins_MOVWF(ins);
|
return op_ins_MOVWF(ins);
|
// char * op_ins_MOVWF (char *ins){}
|
// char * op_ins_MOVWF (char *ins){}
|
else if(inscmp("000001000000",ins)==1)
|
else if(inscmp("000001000000",ins)==1)
|
return op_ins_CLRW(ins);
|
return op_ins_CLRW(ins);
|
// char * op_ins_CLRW (char *ins){}
|
// char * op_ins_CLRW (char *ins){}
|
else if(inscmp("0000011XXXXX",ins)==1)
|
else if(inscmp("0000011XXXXX",ins)==1)
|
return op_ins_CLRF(ins);
|
return op_ins_CLRF(ins);
|
// char * op_ins_CLRF (char *ins){}
|
// char * op_ins_CLRF (char *ins){}
|
else if(inscmp("0000100XXXXX",ins)==1)
|
else if(inscmp("0000100XXXXX",ins)==1)
|
return op_ins_SUBWFW(ins);
|
return op_ins_SUBWFW(ins);
|
// char * op_ins_SUBWFW (char *ins){}
|
// char * op_ins_SUBWFW (char *ins){}
|
else if(inscmp("0000101XXXXX",ins)==1)
|
else if(inscmp("0000101XXXXX",ins)==1)
|
return op_ins_SUBWFF(ins);
|
return op_ins_SUBWFF(ins);
|
// char * op_ins_SUBWFF (char *ins){}
|
// char * op_ins_SUBWFF (char *ins){}
|
else if(inscmp("0000110XXXXX",ins)==1)
|
else if(inscmp("0000110XXXXX",ins)==1)
|
return op_ins_DECFW(ins);
|
return op_ins_DECFW(ins);
|
// char * op_ins_DECFW (char *ins){}
|
// char * op_ins_DECFW (char *ins){}
|
else if(inscmp("0000111XXXXX",ins)==1)
|
else if(inscmp("0000111XXXXX",ins)==1)
|
return op_ins_DECFF(ins);
|
return op_ins_DECFF(ins);
|
// char *op_ins_DECFF (char *ins){}
|
// char *op_ins_DECFF (char *ins){}
|
else if(inscmp("0001000XXXXX",ins)==1)
|
else if(inscmp("0001000XXXXX",ins)==1)
|
return op_ins_IORWFW(ins);
|
return op_ins_IORWFW(ins);
|
// char * op_ins_IORWFW (char *ins){}
|
// char * op_ins_IORWFW (char *ins){}
|
else if(inscmp("0001001XXXXX",ins)==1)
|
else if(inscmp("0001001XXXXX",ins)==1)
|
return op_ins_IORWFF(ins);
|
return op_ins_IORWFF(ins);
|
// char * op_ins_IORWFF (char *ins){}
|
// char * op_ins_IORWFF (char *ins){}
|
else if(inscmp("0001010XXXXX",ins)==1)
|
else if(inscmp("0001010XXXXX",ins)==1)
|
return op_ins_ANDWFW(ins);
|
return op_ins_ANDWFW(ins);
|
// char * op_ins_ANDWFW (char *ins){}
|
// char * op_ins_ANDWFW (char *ins){}
|
else if(inscmp("0001011XXXXX",ins)==1)
|
else if(inscmp("0001011XXXXX",ins)==1)
|
return op_ins_ANDWFF(ins);
|
return op_ins_ANDWFF(ins);
|
// char * op_ins_ANDWFF(char *ins){}
|
// char * op_ins_ANDWFF(char *ins){}
|
else if(inscmp("0001100XXXXX",ins)==1)
|
else if(inscmp("0001100XXXXX",ins)==1)
|
return op_ins_XORWFW(ins);
|
return op_ins_XORWFW(ins);
|
// char * op_ins_XORWFW (char *ins){}
|
// char * op_ins_XORWFW (char *ins){}
|
else if(inscmp("0001101XXXXX",ins)==1)
|
else if(inscmp("0001101XXXXX",ins)==1)
|
return op_ins_XORWFF(ins);
|
return op_ins_XORWFF(ins);
|
// char * op_ins_XORWFF(char *ins){}
|
// char * op_ins_XORWFF(char *ins){}
|
else if(inscmp("0001110XXXXX",ins)==1)
|
else if(inscmp("0001110XXXXX",ins)==1)
|
return op_ins_ADDWFW(ins);
|
return op_ins_ADDWFW(ins);
|
// char * op_ins_ADDWFW(char *ins){}
|
// char * op_ins_ADDWFW(char *ins){}
|
else if(inscmp("0001111XXXXX",ins)==1)
|
else if(inscmp("0001111XXXXX",ins)==1)
|
return op_ins_ADDWFF(ins);
|
return op_ins_ADDWFF(ins);
|
// char * op_ins_ADDWFF(char *ins){}
|
// char * op_ins_ADDWFF(char *ins){}
|
else if(inscmp("0010000XXXXX",ins)==1)
|
else if(inscmp("0010000XXXXX",ins)==1)
|
return op_ins_MOVFW(ins);
|
return op_ins_MOVFW(ins);
|
// char * op_ins_MOVFW (char *ins){}
|
// char * op_ins_MOVFW (char *ins){}
|
else if(inscmp("0010001XXXXX",ins)==1)
|
else if(inscmp("0010001XXXXX",ins)==1)
|
return op_ins_MOVFF(ins);
|
return op_ins_MOVFF(ins);
|
// char * op_ins_MOVFF(char *ins){}
|
// char * op_ins_MOVFF(char *ins){}
|
else if(inscmp("0010010XXXXX",ins)==1)
|
else if(inscmp("0010010XXXXX",ins)==1)
|
return op_ins_COMFW(ins);
|
return op_ins_COMFW(ins);
|
// char * op_ins_COMFW (char *ins){}
|
// char * op_ins_COMFW (char *ins){}
|
else if(inscmp("0010011XXXXX",ins)==1)
|
else if(inscmp("0010011XXXXX",ins)==1)
|
return op_ins_COMFF(ins);
|
return op_ins_COMFF(ins);
|
// char * op_ins_COMFF(char *ins){}
|
// char * op_ins_COMFF(char *ins){}
|
else if(inscmp("0010100XXXXX",ins)==1)
|
else if(inscmp("0010100XXXXX",ins)==1)
|
return op_ins_INCFW(ins);
|
return op_ins_INCFW(ins);
|
// char * op_ins_INCFW(char *ins){}
|
// char * op_ins_INCFW(char *ins){}
|
else if(inscmp("0010101XXXXX",ins)==1)
|
else if(inscmp("0010101XXXXX",ins)==1)
|
return op_ins_INCFF(ins);
|
return op_ins_INCFF(ins);
|
// char * op_ins_INCFF(char *ins){}
|
// char * op_ins_INCFF(char *ins){}
|
else if(inscmp("0010110XXXXX",ins)==1)
|
else if(inscmp("0010110XXXXX",ins)==1)
|
return op_ins_DECFSZW(ins);
|
return op_ins_DECFSZW(ins);
|
// char *op_ins_DECFSZW (char *ins){}
|
// char *op_ins_DECFSZW (char *ins){}
|
else if(inscmp("0010111XXXXX",ins)==1)
|
else if(inscmp("0010111XXXXX",ins)==1)
|
return op_ins_DECFSZF(ins);
|
return op_ins_DECFSZF(ins);
|
// char * op_ins_DECFSZF(char *ins){}
|
// char * op_ins_DECFSZF(char *ins){}
|
else if(inscmp("0011000XXXXX",ins)==1)
|
else if(inscmp("0011000XXXXX",ins)==1)
|
return op_ins_RRFW(ins);
|
return op_ins_RRFW(ins);
|
// char * op_ins_RRFW (char *ins){}
|
// char * op_ins_RRFW (char *ins){}
|
else if(inscmp("0011001XXXXX",ins)==1)
|
else if(inscmp("0011001XXXXX",ins)==1)
|
return op_ins_RRFF(ins);
|
return op_ins_RRFF(ins);
|
// char * op_ins_RRFF (char *ins){}
|
// char * op_ins_RRFF (char *ins){}
|
else if(inscmp("0011010XXXXX",ins)==1)
|
else if(inscmp("0011010XXXXX",ins)==1)
|
return op_ins_RLFW(ins);
|
return op_ins_RLFW(ins);
|
// char * op_ins_RLFW(char *ins){}
|
// char * op_ins_RLFW(char *ins){}
|
else if(inscmp("0011011XXXXX",ins)==1)
|
else if(inscmp("0011011XXXXX",ins)==1)
|
return op_ins_RLFF(ins);
|
return op_ins_RLFF(ins);
|
// char * op_ins_RLFF(char *ins){}
|
// char * op_ins_RLFF(char *ins){}
|
else if(inscmp("0011100XXXXX",ins)==1)
|
else if(inscmp("0011100XXXXX",ins)==1)
|
return op_ins_SWAPFW(ins);
|
return op_ins_SWAPFW(ins);
|
// char * op_ins_SWAPFW (char *ins){}
|
// char * op_ins_SWAPFW (char *ins){}
|
else if(inscmp("0011101XXXXX",ins)==1)
|
else if(inscmp("0011101XXXXX",ins)==1)
|
return op_ins_SWAPFF(ins);
|
return op_ins_SWAPFF(ins);
|
// char * op_ins_SWAPFF(char *ins){}
|
// char * op_ins_SWAPFF(char *ins){}
|
else if(inscmp("0011110XXXXX",ins)==1)
|
else if(inscmp("0011110XXXXX",ins)==1)
|
return op_ins_INCFSZW(ins);
|
return op_ins_INCFSZW(ins);
|
// char *op_ins_INCFSZW (char *ins){}
|
// char *op_ins_INCFSZW (char *ins){}
|
else if(inscmp("0011111XXXXX",ins)==1)
|
else if(inscmp("0011111XXXXX",ins)==1)
|
return op_ins_INCFSZF(ins);
|
return op_ins_INCFSZF(ins);
|
// char * op_ins_INCFSZF (char *ins){}
|
// char * op_ins_INCFSZF (char *ins){}
|
else if(inscmp("0100XXXXXXXX",ins)==1)
|
else if(inscmp("0100XXXXXXXX",ins)==1)
|
return op_ins_BCF(ins);
|
return op_ins_BCF(ins);
|
// char * op_ins_BCF (char *ins){}
|
// char * op_ins_BCF (char *ins){}
|
else if(inscmp("0101XXXXXXXX",ins)==1)
|
else if(inscmp("0101XXXXXXXX",ins)==1)
|
return op_ins_BSF(ins);
|
return op_ins_BSF(ins);
|
// char * op_ins_BSF(char *ins){}
|
// char * op_ins_BSF(char *ins){}
|
else if(inscmp("0110XXXXXXXX",ins)==1)
|
else if(inscmp("0110XXXXXXXX",ins)==1)
|
return op_ins_BTFSC(ins);
|
return op_ins_BTFSC(ins);
|
// char * op_ins_BTFSC(char *ins){}
|
// char * op_ins_BTFSC(char *ins){}
|
else if(inscmp("0111XXXXXXXX",ins)==1)
|
else if(inscmp("0111XXXXXXXX",ins)==1)
|
return op_ins_BTFSS(ins);
|
return op_ins_BTFSS(ins);
|
// char * op_ins_BTFSS (char *ins){}
|
// char * op_ins_BTFSS (char *ins){}
|
else if(inscmp("1000XXXXXXXX",ins)==1)
|
else if(inscmp("1000XXXXXXXX",ins)==1)
|
return op_ins_RETLW(ins);
|
return op_ins_RETLW(ins);
|
// char * op_ins_RETLW(char *ins){}
|
// char * op_ins_RETLW(char *ins){}
|
else if(inscmp("1001XXXXXXXX",ins)==1)
|
else if(inscmp("1001XXXXXXXX",ins)==1)
|
return op_ins_CALL(ins);
|
return op_ins_CALL(ins);
|
// char * op_ins_CALL (char *ins){}
|
// char * op_ins_CALL (char *ins){}
|
else if(inscmp("101XXXXXXXXX",ins)==1)
|
else if(inscmp("101XXXXXXXXX",ins)==1)
|
return op_ins_GOTO(ins);
|
return op_ins_GOTO(ins);
|
// char * op_ins_GOTO( (char *ins){}
|
// char * op_ins_GOTO( (char *ins){}
|
else if(inscmp("1100XXXXXXXX",ins)==1)
|
else if(inscmp("1100XXXXXXXX",ins)==1)
|
return op_ins_MOVLW(ins);
|
return op_ins_MOVLW(ins);
|
// char * op_ins_MOVLW (char *ins){}
|
// char * op_ins_MOVLW (char *ins){}
|
else if(inscmp("1101XXXXXXXX",ins)==1)
|
else if(inscmp("1101XXXXXXXX",ins)==1)
|
return op_ins_IORLW(ins);
|
return op_ins_IORLW(ins);
|
// char * op_ins_IORLW(char *ins){}
|
// char * op_ins_IORLW(char *ins){}
|
else if(inscmp("1110XXXXXXXX",ins)==1)
|
else if(inscmp("1110XXXXXXXX",ins)==1)
|
return op_ins_ANDLW(ins);
|
return op_ins_ANDLW(ins);
|
// char * op_ins_ANDLW (char *ins){}
|
// char * op_ins_ANDLW (char *ins){}
|
else if(inscmp("1111XXXXXXXX",ins)==1)
|
else if(inscmp("1111XXXXXXXX",ins)==1)
|
return op_ins_XORLW(ins);
|
return op_ins_XORLW(ins);
|
// char * op_ins_XORLW(char *ins){}
|
// char * op_ins_XORLW(char *ins){}
|
return NULL ;
|
return NULL ;
|
}
|
}
|
|
|
/* Input and Output file streams. */
|
/* Input and Output file streams. */
|
FILE*fpi ;
|
FILE*fpi ;
|
|
|
/* Well.. Let's read stuff in completely before outputting.. Programs */
|
/* Well.. Let's read stuff in completely before outputting.. Programs */
|
/* should be pretty small.. */
|
/* should be pretty small.. */
|
/* */
|
/* */
|
#define MAX_MEMORY_SIZE 4096
|
#define MAX_MEMORY_SIZE 4096
|
struct
|
struct
|
{
|
{
|
int nAddress ;
|
int nAddress ;
|
int byData ;
|
int byData ;
|
char ins[30];
|
char ins[30];
|
char dasm[30];
|
char dasm[30];
|
}
|
}
|
|
|
|
|
Memory[MAX_MEMORY_SIZE];
|
Memory[MAX_MEMORY_SIZE];
|
|
|
char szLine[80];
|
char szLine[80];
|
unsigned int start_address,address,ndata_bytes,ndata_words ;
|
unsigned int start_address,address,ndata_bytes,ndata_words ;
|
unsigned int data ;
|
unsigned int data ;
|
unsigned int nMemoryCount ;
|
unsigned int nMemoryCount ;
|
char mif_fn[20]=
|
char mif_fn[20]=
|
{
|
{
|
0
|
0
|
}
|
}
|
;
|
;
|
char fin[20]=
|
char fin[20]=
|
{
|
{
|
0
|
0
|
}
|
}
|
;
|
;
|
|
|
char ins_tsted[100][10];
|
char ins_tsted[100][10];
|
int index=0;
|
int index=0;
|
void init1(void){
|
void init1(void){
|
int i,j;
|
int i,j;
|
for(i=0;i<100;++i)
|
for(i=0;i<100;++i)
|
for(j=0;j<10;++j)
|
for(j=0;j<10;++j)
|
ins_tsted[i][j]=0;
|
ins_tsted[i][j]=0;
|
index=0;
|
index=0;
|
}
|
}
|
|
|
void add_ins(char *ins){
|
void add_ins(char *ins){
|
int i;
|
int i;
|
for(i=0;i<=index;++i)
|
for(i=0;i<=index;++i)
|
if (strcmp(ins_tsted[i],ins)==0) return ;
|
if (strcmp(ins_tsted[i],ins)==0) return ;
|
++index;
|
++index;
|
//printf("add string >%s<\n",ins);getchar();
|
//printf("add string >%s<\n",ins);getchar();
|
strcpy(ins_tsted[index],ins);
|
strcpy(ins_tsted[index],ins);
|
}
|
}
|
|
|
int main(int argc,char*argv[])
|
int main(int argc,char*argv[])
|
{
|
{
|
|
|
|
|
int i ;
|
int i ;
|
int addr_wdt,wd_no;
|
int addr_wdt,wd_no;
|
int max=0;
|
int max=0;
|
init1();
|
init1();
|
|
|
if(argc==2)strcpy(fin,argv[1]);
|
if(argc==2)strcpy(fin,argv[1]);
|
else
|
else
|
{
|
{
|
// printf("\nThe Synthetic PIC --- Intel HEX File to Altera memory file");
|
// printf("\nThe Synthetic PIC --- Intel HEX File to Altera memory file");
|
// printf("\nUsage: hex2mif <infile>");
|
// printf("\nUsage: hex2mif <infile>");
|
// printf("\n");
|
// printf("\n");
|
getchar();
|
getchar();
|
return 0 ;
|
return 0 ;
|
printf("Input Hex file name:");
|
printf("Input Hex file name:");
|
scanf("%s",fin);
|
scanf("%s",fin);
|
printf("Input Mif file name:");
|
printf("Input Mif file name:");
|
scanf("%s",mif_fn);
|
scanf("%s",mif_fn);
|
}
|
}
|
|
|
|
|
|
|
/* Open input HEX file */
|
/* Open input HEX file */
|
fpi=fopen(argv[1],"r");
|
fpi=fopen(argv[1],"r");
|
if(!fpi)
|
if(!fpi)
|
{
|
{
|
printf("\nCan't open input file %s.\n",argv[1]);
|
printf("\nCan't open input file %s.\n",argv[1]);
|
return 1 ;
|
return 1 ;
|
}
|
}
|
|
|
/* Read in the HEX file */
|
/* Read in the HEX file */
|
/* */
|
/* */
|
/* !! Note, that things are a little strange for us, because the PIC is */
|
/* !! Note, that things are a little strange for us, because the PIC is */
|
/* a 12-bit instruction, addresses are 16-bit, and the hex format is */
|
/* a 12-bit instruction, addresses are 16-bit, and the hex format is */
|
/* 8-bit oriented!! */
|
/* 8-bit oriented!! */
|
/* */
|
/* */
|
nMemoryCount=0 ;
|
nMemoryCount=0 ;
|
while(!feof(fpi))
|
while(!feof(fpi))
|
{
|
{
|
/* Get one Intel HEX line */
|
/* Get one Intel HEX line */
|
fgets(szLine,80,fpi);
|
fgets(szLine,80,fpi);
|
if(strlen(szLine)>=10)
|
if(strlen(szLine)>=10)
|
{
|
{
|
/* This is the PIC, with its 12-bit "words". We're interested in these */
|
/* This is the PIC, with its 12-bit "words". We're interested in these */
|
/* words and not the bytes. Read 4 hex digits at a time for each */
|
/* words and not the bytes. Read 4 hex digits at a time for each */
|
/* address. */
|
/* address. */
|
/* */
|
/* */
|
sscanf(&szLine[1],"%2x%4x",&ndata_bytes,&start_address);
|
sscanf(&szLine[1],"%2x%4x",&ndata_bytes,&start_address);
|
if(start_address>=0&&start_address<=20000&&ndata_bytes>0)
|
if(start_address>=0&&start_address<=20000&&ndata_bytes>0)
|
{
|
{
|
/* Suck up data bytes starting at 9th byte. */
|
/* Suck up data bytes starting at 9th byte. */
|
i=9 ;
|
i=9 ;
|
|
|
/* Words.. not bytes.. */
|
/* Words.. not bytes.. */
|
ndata_words=ndata_bytes/2 ;
|
ndata_words=ndata_bytes/2 ;
|
start_address=start_address/2 ;
|
start_address=start_address/2 ;
|
|
|
/* Spit out all the data that is supposed to be on this line. */
|
/* Spit out all the data that is supposed to be on this line. */
|
for(address=start_address;address<start_address+ndata_words;address++)
|
for(address=start_address;address<start_address+ndata_words;address++)
|
{
|
{
|
/* Scan out 4 hex digits for a word. This will be one address. */
|
/* Scan out 4 hex digits for a word. This will be one address. */
|
sscanf(&szLine[i],"%04x",&data);
|
sscanf(&szLine[i],"%04x",&data);
|
|
|
/* Need to swap bytes... */
|
/* Need to swap bytes... */
|
data=((data>>8)&0x00ff)|((data<<8)&0xff00);
|
data=((data>>8)&0x00ff)|((data<<8)&0xff00);
|
i+=4 ;
|
i+=4 ;
|
|
|
/* Store in our memory buffer */
|
/* Store in our memory buffer */
|
Memory[nMemoryCount].nAddress=address ;
|
Memory[nMemoryCount].nAddress=address ;
|
Memory[nMemoryCount].byData=data ;
|
Memory[nMemoryCount].byData=data ;
|
nMemoryCount++;
|
nMemoryCount++;
|
}
|
}
|
}
|
}
|
}
|
}
|
}
|
}
|
fclose(fpi);
|
fclose(fpi);
|
|
|
/*
|
/*
|
for(i=0;;++i)
|
for(i=0;;++i)
|
{
|
{
|
mif_fn[i]=fin[i];
|
mif_fn[i]=fin[i];
|
if(mif_fn[i]=='.')
|
if(mif_fn[i]=='.')
|
{
|
{
|
mif_fn[i+1]='m' ;
|
mif_fn[i+1]='m' ;
|
mif_fn[i+2]='i' ;
|
mif_fn[i+2]='i' ;
|
mif_fn[3+i]='f' ;
|
mif_fn[3+i]='f' ;
|
mif_fn[4+i]=0 ;
|
mif_fn[4+i]=0 ;
|
break ;
|
break ;
|
}
|
}
|
}
|
}
|
*/
|
*/
|
|
|
strcpy(mif_fn,"init_file.mif");
|
strcpy(mif_fn,"init_file.mif");
|
|
|
fpi=fopen(mif_fn,"w");
|
fpi=fopen(mif_fn,"w");
|
if(NULL==fpi)return ;
|
if(NULL==fpi)return ;
|
/* Now output the Verilog $readmemh format! */
|
/* Now output the Verilog $readmemh format! */
|
/* */
|
/* */
|
|
|
/* Now output the Verilog $readmemh format! */
|
/* Now output the Verilog $readmemh format! */
|
/* */
|
/* */
|
fprintf(fpi,"WIDTH=12;\nDEPTH=2048;\n\nADDRESS_RADIX=HEX;\nDATA_RADIX=HEX;\n\nCONTENT BEGIN\n");
|
fprintf(fpi,"WIDTH=12;\nDEPTH=2048;\n\nADDRESS_RADIX=HEX;\nDATA_RADIX=HEX;\n\nCONTENT BEGIN\n");
|
printf("WIDTH=8;\nDEPTH=256;\n\nADDRESS_RADIX=HEX;\nDATA_RADIX=HEX;\n\nCONTENT BEGIN\n");
|
printf("WIDTH=8;\nDEPTH=256;\n\nADDRESS_RADIX=HEX;\nDATA_RADIX=HEX;\n\nCONTENT BEGIN\n");
|
printf("Email:McuPro@163.com\n");
|
printf("Email:McuPro@163.com\n");
|
|
|
for(i=0;i<nMemoryCount;i++)
|
for(i=0;i<nMemoryCount;i++)
|
{
|
{
|
// printf("%X : %X;\n",Memory[i].nAddress,Memory[i].byData);
|
// printf("%X : %X;\n",Memory[i].nAddress,Memory[i].byData);
|
fprintf(fpi,"%4X : %4X;\n",Memory[i].nAddress,Memory[i].byData);
|
fprintf(fpi,"%4X : %4X;\n",Memory[i].nAddress,Memory[i].byData);
|
}
|
}
|
|
|
fprintf(fpi,"\nEND;\n");
|
fprintf(fpi,"\nEND;\n");
|
printf("\END;\n");
|
printf("\END;\n");
|
close(fpi);
|
close(fpi);
|
/*output simulate verilog code */
|
/*output simulate verilog code */
|
/*
|
/*
|
for(i=0;;++i)
|
for(i=0;;++i)
|
{
|
{
|
mif_fn[i]=fin[i];
|
mif_fn[i]=fin[i];
|
if(mif_fn[i]=='.')
|
if(mif_fn[i]=='.')
|
{
|
{
|
mif_fn[i+1]='v' ;
|
mif_fn[i+1]='v' ;
|
mif_fn[i+2]=0 ;
|
mif_fn[i+2]=0 ;
|
break ;
|
break ;
|
}
|
}
|
}
|
}
|
*/
|
*/
|
|
|
strcpy(mif_fn,"sim_rom.v");
|
strcpy(mif_fn,"sim_rom.v");
|
|
|
fpi=fopen(mif_fn,"w");
|
fpi=fopen(mif_fn,"w");
|
if(NULL==fpi)return ;
|
if(NULL==fpi)return ;
|
fprintf(fpi,"//This file was created by a tool wrietten with C.\n");
|
fprintf(fpi,"//This file was created by a tool wrietten with C.\n");
|
fprintf(fpi,"module sim_rom (\n");
|
fprintf(fpi,"module sim_rom (\n");
|
fprintf(fpi," address,\n");
|
fprintf(fpi," address,\n");
|
fprintf(fpi," clock,\n");
|
fprintf(fpi," clock,\n");
|
fprintf(fpi," q);\n");
|
fprintf(fpi," q);\n");
|
fprintf(fpi," input [10:0] address;\n");
|
fprintf(fpi," input [10:0] address;\n");
|
fprintf(fpi," input clock;\n");
|
fprintf(fpi," input clock;\n");
|
fprintf(fpi," output [11:0] q;\n");
|
fprintf(fpi," output [11:0] q;\n");
|
fprintf(fpi," \n");
|
fprintf(fpi," \n");
|
fprintf(fpi,"reg [10:0] address_latched;\n");
|
fprintf(fpi,"reg [10:0] address_latched;\n");
|
fprintf(fpi,"// Instantiate the memory array itself.\n");
|
fprintf(fpi,"// Instantiate the memory array itself.\n");
|
fprintf(fpi,"reg [11:0] mem[0:2048-1];\n");
|
fprintf(fpi,"reg [11:0] mem[0:2048-1];\n");
|
fprintf(fpi,"initial begin \n");
|
fprintf(fpi,"initial begin \n");
|
for(i=0;i<nMemoryCount;i++)
|
for(i=0;i<nMemoryCount;i++)
|
{
|
{
|
// printf("mem[%05d] = s;\n",Memory[i].nAddress,Memory[i].ins);
|
// printf("mem[%05d] = s;\n",Memory[i].nAddress,Memory[i].ins);
|
fprintf(fpi,"mem[%04d] = 12'b%s;\n",Memory[i].nAddress,ins12tostr(Memory[i].byData));
|
fprintf(fpi,"mem[%04d] = 12'b%s;\n",Memory[i].nAddress,ins12tostr(Memory[i].byData));
|
}
|
}
|
fprintf(fpi,"end\n");
|
fprintf(fpi,"end\n");
|
fprintf(fpi,"// Latch address\n");
|
fprintf(fpi,"// Latch address\n");
|
fprintf(fpi,"always @(posedge clock)\n");
|
fprintf(fpi,"always @(posedge clock)\n");
|
fprintf(fpi," address_latched <= address;\n");
|
fprintf(fpi," address_latched <= address;\n");
|
fprintf(fpi," \n");
|
fprintf(fpi," \n");
|
fprintf(fpi,"// READ\n");
|
fprintf(fpi,"// READ\n");
|
fprintf(fpi,"assign q = mem[address_latched];\n");
|
fprintf(fpi,"assign q = mem[address_latched];\n");
|
fprintf(fpi,"\n");
|
fprintf(fpi,"\n");
|
fprintf(fpi,"endmodule\n");
|
fprintf(fpi,"endmodule\n");
|
fprintf(fpi,"\n");
|
fprintf(fpi,"\n");
|
fprintf(fpi,"/*\n");
|
fprintf(fpi,"/*\n");
|
for(i=0;i<nMemoryCount;i++)
|
for(i=0;i<nMemoryCount;i++)
|
{
|
{
|
// printf("%04d:%s\n",Memory[i].nAddress,ins12tostr(Memory[i].byData));
|
// printf("%04d:%s\n",Memory[i].nAddress,ins12tostr(Memory[i].byData));
|
// sprintf(Memory[i].ins,"%s",ins12tostr(Memory[i].byData));
|
// sprintf(Memory[i].ins,"%s",ins12tostr(Memory[i].byData));
|
fprintf(fpi,"%04d: %s\n",Memory[i].nAddress,branch_ins(ins12tostr(Memory[i].byData)));
|
fprintf(fpi,"%04d: %s\n",Memory[i].nAddress,branch_ins(ins12tostr(Memory[i].byData)));
|
// fprintf(fpi,"mem[%d] = %d;\n",Memory[i].nAddress,Memory[i].byData);
|
// fprintf(fpi,"mem[%d] = %d;\n",Memory[i].nAddress,Memory[i].byData);
|
}
|
}
|
fprintf(fpi,"*/\n/*\ncovered instructions:\n");
|
fprintf(fpi,"*/\n/*\ncovered instructions:\n");
|
|
|
for(i=0;i<=index;++i)
|
for(i=0;i<=index;++i)
|
{
|
{
|
fprintf(fpi,"%s\n",ins_tsted[i]);
|
fprintf(fpi,"%s\n",ins_tsted[i]);
|
}
|
}
|
fprintf(fpi,"*/\n");
|
fprintf(fpi,"*/\n");
|
close(fpi);
|
close(fpi);
|
|
|
|
|
strcpy(mif_fn,"tested_instructions.txt");
|
strcpy(mif_fn,"tested_instructions.txt");
|
fpi=fopen(mif_fn,"w");
|
fpi=fopen(mif_fn,"w");
|
for(i=0;i<=index;++i)
|
for(i=0;i<=index;++i)
|
{
|
{
|
fprintf(fpi,"%s\n",ins_tsted[i]);
|
fprintf(fpi,"%s\n",ins_tsted[i]);
|
}
|
}
|
close(fpi);
|
close(fpi);
|
|
|
fpi=fopen(mif_fn,"w");
|
fpi=fopen(mif_fn,"w");
|
|
|
/*output deasm filr*/
|
/*output deasm filr*/
|
strcpy(mif_fn,"Dasm.txt");
|
strcpy(mif_fn,"Dasm.txt");
|
fpi=fopen(mif_fn,"w");
|
fpi=fopen(mif_fn,"w");
|
for(i=0;i<nMemoryCount;i++)
|
for(i=0;i<nMemoryCount;i++)
|
{
|
{
|
// fprintf(fpi,"%04d:%s\n",Memory[i].nAddress,ins12tostr(Memory[i].byData));
|
// fprintf(fpi,"%04d:%s\n",Memory[i].nAddress,ins12tostr(Memory[i].byData));
|
// sprintf(Memory[i].ins,"%s",ins12tostr(Memory[i].byData));
|
// sprintf(Memory[i].ins,"%s",ins12tostr(Memory[i].byData));
|
fprintf(fpi,"%04d : %s\n",Memory[i].nAddress,branch_ins(ins12tostr(Memory[i].byData)));
|
fprintf(fpi,"%04d : %s\n",Memory[i].nAddress,branch_ins(ins12tostr(Memory[i].byData)));
|
// fprintf(fpi,"mem[%d] = %d;\n",Memory[i].nAddress,Memory[i].byData);
|
// fprintf(fpi,"mem[%d] = %d;\n",Memory[i].nAddress,Memory[i].byData);
|
}
|
}
|
close(fpi);
|
close(fpi);
|
// getchar();
|
// getchar();
|
|
|
|
|
// strcpy(mif_fn,"rom_set.h");
|
// strcpy(mif_fn,"rom_set.h");
|
|
|
// fpi=fopen(mif_fn,"w");
|
// fpi=fopen(mif_fn,"w");
|
for(i=0;i<nMemoryCount;i++)
|
for(i=0;i<nMemoryCount;i++)
|
{
|
{
|
if ((Memory[i].nAddress==2047)&&(Memory[i-1].nAddress!=2046))continue;
|
if ((Memory[i].nAddress==2047)&&(Memory[i-1].nAddress!=2046))continue;
|
if ((Memory[i].nAddress==1023)&&(Memory[i-1].nAddress!=1022))continue;
|
if ((Memory[i].nAddress==1023)&&(Memory[i-1].nAddress!=1022))continue;
|
if (Memory[i].nAddress>max) max=Memory[i].nAddress;
|
if (Memory[i].nAddress>max) max=Memory[i].nAddress;
|
// Memory[i].nAddressfprintf(fpi,"%04d:%s\n",Memory[i].nAddress,ins12tostr(Memory[i].byData));
|
// Memory[i].nAddressfprintf(fpi,"%04d:%s\n",Memory[i].nAddress,ins12tostr(Memory[i].byData));
|
// sprintf(Memory[i].ins,"%s",ins12tostr(Memory[i].byData));
|
// sprintf(Memory[i].ins,"%s",ins12tostr(Memory[i].byData));
|
//fprintf(fpi,"%04d : %s\n",Memory[i].nAddress,branch_ins(ins12tostr(Memory[i].byData)));
|
//fprintf(fpi,"%04d : %s\n",Memory[i].nAddress,branch_ins(ins12tostr(Memory[i].byData)));
|
// fprintf(fpi,"mem[%d] = %d;\n",Memory[i].nAddress,Memory[i].byData);
|
// fprintf(fpi,"mem[%d] = %d;\n",Memory[i].nAddress,Memory[i].byData);
|
// fprintf(fpi,"mem[%d] = %d;\n",
|
// fprintf(fpi,"mem[%d] = %d;\n",
|
}
|
}
|
addr_wdt = func1(max);
|
addr_wdt = func1(max);
|
// fprintf(fpi,"`define ALT_MEM_WIDTHAD %d\n",addr_wdt);
|
// fprintf(fpi,"`define ALT_MEM_WIDTHAD %d\n",addr_wdt);
|
// fprintf(fpi,"`define ALT_MEM_NUMWORDS %d\n",1<<addr_wdt);
|
// fprintf(fpi,"`define ALT_MEM_NUMWORDS %d\n",1<<addr_wdt);
|
// `define MIF_NAME %s\n\n","init_file.mif");
|
// `define MIF_NAME %s\n\n","init_file.mif");
|
// fprintf(fpi,"`define ROM_TYPE rom%dx12\n\n",1<<func1(max));
|
// fprintf(fpi,"`define ROM_TYPE rom%dx12\n\n",1<<func1(max));
|
|
|
// close(fpi);
|
// close(fpi);
|
// getchar();
|
// getchar();
|
}
|
}
|
|
|
|
|