RISCV模拟器中关于读写存储器部分的实现

#define BUFF_SIZE 1024*1024*8
#include "stdio.h"

static unsigned int ins_buff[BUFF_SIZE] ; 
static unsigned int len = 0 ;
static unsigned char  RAM_B0[BUFF_SIZE] ; 
static unsigned char RAM_B1[BUFF_SIZE] ; 
static unsigned char RAM_B2[BUFF_SIZE] ; 
static unsigned char RAM_B3[BUFF_SIZE] ;


static int file_2_ins_buff(char *fn){
	int r,i ;	FILE *fp ; 
	fp = fopen( fn , "rb" );	
	if (fp==NULL) printf("can not open file %s\n",fn);
	if (fp==NULL) exit(1);
	r = fread( ins_buff , 1, BUFF_SIZE ,fp );
	fclose (fp);
	len = r>>2;
	//printf("get file size is %d\n", len );
		for( i = 0 ;i<len ;++i ){
             if (debug())printf("%08x : %08x \n",i<<2, ins_buff[i] );
             }
	return r ;	
}

static int init_MEM_by_ins_buff(){
	int i ;
	for( i = 0 ;i<len ;++i ){
    if (debug())      printf("%08x :  ",ins_buff[i] );
	RAM_B0[i] = ins_buff[i] & 0xff ;
	RAM_B1[i] = ins_buff[i]>>8 & 0xff ;
	RAM_B2[i] = ins_buff[i]>>16 & 0xff ;
	RAM_B3[i] = ins_buff[i]>>24 & 0xff ; 
    if (debug())printf("%08x : %02x  %02x  %02x  %02x \n",i<<2,RAM_B3[i],RAM_B2[i],RAM_B1[i],RAM_B0[i]);	
	}
}

int load_prog(char *fn )  {
    file_2_ins_buff(fn) ; 
    init_MEM_by_ins_buff();
}
 
unsigned int get_ins(unsigned int PC){
unsigned int t;
unsigned char a[4] ; 
	t =PC >>2 ;
	a[3] = RAM_B3[t];
	a[2] = RAM_B2[t];
	a[1] = RAM_B1[t];
	a[0] = RAM_B0[t];
	t=a[3];t<<=8;
	t|=a[2];t<<=8;
	t|=a[1];t<<=8;
	t|=a[0];	
	return t;	
} 

unsigned int read_memory_8bit(unsigned int addr){
	unsigned  int addr32,idx;
	addr32  =  addr >>2 ;
	idx = addr % 4 ;
	if      (idx==0) return RAM_B0[addr32];
	else if (idx==1) return RAM_B1[addr32];
	else if (idx==2) return RAM_B2[addr32];
	else if (idx==3) return RAM_B3[addr32];
}

void write_memory_8bit (unsigned int val,unsigned int addr){
	unsigned char d8  ;
	unsigned  int addr32,idx;
	addr32  =  addr >> 2 ;
	idx = addr % 4 ;
	d8 = val &0xff ;
    if      (idx==0) { RAM_B0[addr32] = d8; } 
	else if (idx==1) { RAM_B1[addr32] = d8; }
	else if (idx==2) { RAM_B2[addr32] = d8; }
	else if (idx==3) { RAM_B3[addr32] = d8; }
//         printf("                                                 U8 IO WR: %08x ,%08x\n",addr,val);	
}



unsigned int read_memory_16bit(unsigned int addr){
	unsigned  int addr32,idx;
	unsigned char hi,lo;
	unsigned int r ; 
	addr32  =  addr >>2;
	idx = addr % 4 ;
	if      (idx==0) { hi = RAM_B1[addr32] ;lo =  RAM_B0[addr32]; }
	else if (idx==2) { hi = RAM_B3[addr32] ;lo =  RAM_B2[addr32] ; };
	r = hi ;	r<<=8;	r|=lo;
	return r ;
}

void write_memory_16bit (unsigned int val,unsigned int addr){
	unsigned  int addr32,idx;
	unsigned char hi,lo;
	unsigned int r ; 
	lo = val & 0xff;	val >>= 8 ;	hi = val& 0xff ;	addr32  =  addr >>2 ;	idx = addr % 4 ;
	if      (idx==0) { RAM_B1[addr32] = hi ; RAM_B0[addr32] = lo ;}
	else if (idx==2)  { RAM_B3[addr32] = hi ; RAM_B2[addr32] = lo ;}
      //   printf("                                                 U16 IO WR: %08x ,%08x\n",addr,val);
	return   ;
}




unsigned int read_memory_32bit(unsigned int addr){
	unsigned  int addr32,idx; 
	unsigned int r ; 
	addr32  =  addr >> 2; 
	r = RAM_B3[addr32];r<<=8;
	r |= RAM_B2[addr32];r<<=8;
	r |= RAM_B1[addr32];r<<=8;
	r |= RAM_B0[addr32]; 
if (debug())	printf("read memory[ %08x ]= %08x \n",addr,r);
	return r ;
}

void write_memory_32bit (unsigned int val,unsigned int addr){
	unsigned  int addr32,idx; 
	unsigned int t ; 
	if (addr <= (BUFF_SIZE >>2))
    {
	addr32  =  addr >> 2; 
	t = val ;
	RAM_B0[addr32] = t &0xff ; t>>=8;
	RAM_B1[addr32] = t &0xff ; t>>=8;
	RAM_B2[addr32] = t &0xff ; t>>=8;
    RAM_B3[addr32] = t &0xff ;
    }
    else 
    {
		 printf("%c",(char )(val&0xff)); 
    }
	return ;	
} 

其中处理器读写存储器部部分在之前文章有详细分析,现在相当于是C语言版本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值