#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语言版本。