亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cpu.c

?? 一個MIPS虛擬機的源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
#ifdef EXTERN
#undef EXTERN
#endif
#define EXTERN extern

#include "global.h"

static char reg_table[CPU_REGISTER_NUMBER][5]=
{
	"zero","at","v0","v1","a0",
	"a1","a2","a3","t0","t1",
	"t2","t3","t4","t5","t6",
	"t7","s0","s1","s2","s3",
	"s4","s5","s6","s7","t8",
	"t9","k0","k1","gp","sp",
	"s8","ra"
};

static void cpu_reset()
{

	PC = ROM_RESET_BASE_ADDR;
}

static void  disable_cacheline(UINT32 vaddr,UINT32 phyaddr,int operation_mode)
{
	UINT32  index,word_vaddr;
	word_vaddr = vaddr & 0xfffffffc;
	
	if (is_swc()==true)
		{
			if (operation_mode == DATA_STORE)
				{
					operation_mode = INSTRUCTION_STORE;
				}
			else if (operation_mode == INSTRUCTION_STORE)
				operation_mode = DATA_STORE;
		}
	
	if (operation_mode==DATA_STORE)
		{
			index = (phyaddr & DCACHE_MASK) ;
			if ( (is_isc()==true) || (  (dcache[index].tag == word_vaddr) && (dcache[index].flag & CACHE_VALID_MASK) ))
				{
					//hit
					 dcache[index].flag = ~CACHE_VALID_MASK;
					
				}
			
			
			
		}
	else if (operation_mode==INSTRUCTION_STORE)
		{
			index = phyaddr & ICACHE_MASK;
			if ((is_isc()==true)||( (icache[index].tag == word_vaddr) && (icache[index].flag & CACHE_VALID_MASK) ))
				{
					//hit
					 icache[index].flag = ~CACHE_VALID_MASK;
				}
			
			
		}

}
/*if exception has occured, return false,else return true*/
static boolean  store_halfword_into_memory(UINT32 phyaddr,UINT16  data)
{
	UINT32 offset;
	
	if (phyaddr<=RAM_UPPER_BOUND)
		{
			//RAM
			
			offset = phyaddr - RAM_LOWER_BOUND;
			//ram[offset] = data;
			halfword2bytes(data, &ram[offset] );
			return true;
		}
	else if ((phyaddr>=CONSOLE_LOWER_ADDR)&&(phyaddr<=CONSOLE_UPPER_ADDR))
		{
			console_store_byte(phyaddr,data);
		}
	else
		{
			//bad address exception
			exception(ADES,-1);
			return false;
		}
}


static boolean store_halfword(UINT32 vaddr,UINT32 phyaddr,boolean cache_able,int operation_mode,UINT16  data)
{
	if ((phyaddr % 2)!=0)
		{
			//exception
			//bad address
			exception(ADES,-1);
			return false;
		}
	// now we store a word into memory
	// and disable cache
	if (store_halfword_into_memory(phyaddr,data))
		{
		disable_cacheline(vaddr,phyaddr,operation_mode);
		return true;
		}
	else
		return false;

	
}



static boolean  store_word_into_memory(UINT32 phyaddr,UINT32  data)
{
	UINT32 offset;
	//printf("phyaddr  %x",phyaddr);
	if (phyaddr<=RAM_UPPER_BOUND)
		{
			//RAM
			offset = phyaddr - RAM_LOWER_BOUND;
			word2bytes(data, &ram[offset] );
			return true;
		}
	else if ((phyaddr>=CONSOLE_LOWER_ADDR)&&(phyaddr<=CONSOLE_UPPER_ADDR))
		{
			console_store_byte(phyaddr,data);
		}
	else
		{
			//bad address exception
			exception(ADES,-1);
			return false;
		}
}


static boolean  store_word(UINT32 vaddr,UINT32 phyaddr,boolean cache_able,int operation_mode,UINT32  data)
{
	if ((phyaddr % 4)!=0)
		{
			//exception
			//bad address
			exception(ADES,-1);
			return  false;
		}
	// now we store a word into memory
	// and disable cache
	
	if (store_word_into_memory(phyaddr,data))
		{
			disable_cacheline(vaddr,phyaddr,operation_mode);
			return true;
		}
	else
		return false;
	
		
}

static boolean  store_byte_into_memory(UINT32 phyaddr,UINT8  data)
{
	UINT32 offset;
	
	if (phyaddr<=RAM_UPPER_BOUND)
		{
			//RAM
			offset = phyaddr - RAM_LOWER_BOUND;
			ram[offset] = data;
			return true;
			
		}
	else if ((phyaddr>=CONSOLE_LOWER_ADDR)&&(phyaddr<=CONSOLE_UPPER_ADDR))
		{
			console_store_byte(phyaddr,data);
		}
	else
		{
			//bad address exception
			exception(ADES,-1);
			return false;
		}
}




static boolean store_byte(UINT32 vaddr,UINT32 phyaddr,boolean cache_able,int operation_mode,UINT8  data)
{
	
	// now we store a byte into memory
	// and disable cache
	UINT32 word_vaddr;

	if (store_byte_into_memory(phyaddr,data))
		{
			disable_cacheline(vaddr,phyaddr,operation_mode);
			return true;
		}
	else 
		return false;
	

}





/* load a word from memory. Memory includes RAM and ROM. 
If exception occurs,return false, else return true*/
static boolean  load_word_from_memory(UINT32 phyaddr,UINT32 * data)
{
	UINT32 offset;
	//fprintf(stderr,"start load_word_from_memory\n");
	if (phyaddr<=RAM_UPPER_BOUND)
		{
			//RAM
			//fprintf(stderr,"RAM\n");
			offset = phyaddr - RAM_LOWER_BOUND;
			*data = bytes2word(&ram[offset]);
			return true;
			
		}
	else if ((phyaddr>=ROM_LOWER_BOUND) && ( phyaddr<=ROM_UPPER_BOUND))
		{
			//ROM
			//fprintf(stderr,"ROM\n");
			offset = phyaddr - ROM_LOWER_BOUND;
			//fprintf(stderr,"offset= %d\n",offset);
			*data = bytes2word(&rom[offset]);
			//fprintf(stderr,"*data = %x\n",*data );
			return true;
		}
	else if ((phyaddr>=CONSOLE_LOWER_ADDR)&&(phyaddr<=CONSOLE_UPPER_ADDR))
		{
			*data = console_load_word(phyaddr);
		}
	else
		{
			//bad address exception
			exception(ADEL,-1);
			return false;
		
		}
		
}


/*  if hit ,return true, else return false*/
static boolean load_word_from_cache(UINT32 vaddr,UINT32 phyaddr,int operation_mode,UINT32 * data)
{
	UINT32  index;
	
	if (true==is_swc())
		{
			if (DATA_LOAD ==operation_mode  )
				{
					operation_mode = INSTRUCTION_LOAD;
				}
			else if (operation_mode == INSTRUCTION_LOAD)
				operation_mode = DATA_LOAD;
		}
	
	if (DATA_LOAD == operation_mode)
		{
			index = (phyaddr & DCACHE_MASK) ;
			if ( (true ==is_isc()) || (  (dcache[index].tag == vaddr) && (dcache[index].flag & CACHE_VALID_MASK) ))
				{
					//hit
					*data = dcache[index].cache_line;
					return true;
				}
			else
				{
					//miss
					return false;
				}
		}
	else if (INSTRUCTION_LOAD==operation_mode)
		{
			index = phyaddr & ICACHE_MASK;
			if ((true ==is_isc())||( (icache[index].tag == vaddr) && (icache[index].flag & CACHE_VALID_MASK) ))
				{
					//hit
					*data = icache[index].cache_line;
					return true;
				}
			else
				{
					return false;
					
				}
		}

	
	
	
}
/*When we load a word, if cache miss ,then we must load the word form ram and set to cache*/
static void set_word_to_cache(UINT32 vaddr,UINT32 phyaddr,int operation_mode,UINT32  data)
{
	UINT32  index;
	
	if (true ==is_isc())
		{
			if (DATA_LOAD == operation_mode  )
				{
					operation_mode = INSTRUCTION_LOAD;
				}
			else if (INSTRUCTION_LOAD == operation_mode  )
				operation_mode = DATA_LOAD;
		}
	
	if (DATA_LOAD == operation_mode)
		{
			index = (phyaddr & DCACHE_MASK) ;
			dcache[index].cache_line = data;
			dcache[index].tag = vaddr;
			dcache[index].flag =CACHE_VALID_MASK;
			
		}
	else if (INSTRUCTION_LOAD ==operation_mode)
		{
			index = (phyaddr & ICACHE_MASK) ;
			icache[index].cache_line = data;
			icache[index].tag = vaddr;
			icache[index].flag =ICACHE_MASK;
		}
}

/*load a word from phyaddr..*/
static boolean load_word(UINT32 vaddr,UINT32 phyaddr,boolean cache_able,int operation_mode,UINT32 * data)
{
	if ((phyaddr % 4)!=0)
		{
			//exception
			//bad address
			exception(ADEL,-1);
			return  false;
		}
	if (true  == cache_able)
		{
			//load a word from cache.
			if (load_word_from_cache(vaddr, phyaddr,operation_mode, data))
				return true;
		}

		/*now, cache miss or cache_able=false ,load from ram*/
		
			//load a word from ram
		if (load_word_from_memory(phyaddr, data))
			{
				//printf("*data %x \n",*data);
				// set the word to cache.
				// Now we only set the cache line if and only if we load a word.
				// That means when loading a hb or byte, we do not set the cache line.
				if (cache_able==true )
					set_word_to_cache(vaddr,phyaddr,operation_mode,*data);
				return true;
			}
		
	
			
		
	
}
static boolean  load_byte_from_memory(UINT32 phyaddr,UINT8 * data)
{
	UINT32 offset;
	//UINT8 byte_offset;  
	
	//byte_offset = phyaddr & 0x00000003;
	//phyaddr = phyaddr & 0xfffffffc;

	if (phyaddr<=RAM_UPPER_BOUND)
		{
			//RAM
			offset = phyaddr - RAM_LOWER_BOUND;
			*data  = ram[offset];
					
		}
	else if ((phyaddr>=CONSOLE_LOWER_ADDR)&&(phyaddr<=CONSOLE_UPPER_ADDR))
		{
			*data =console_load_byte();
		}
	else if ((phyaddr>=ROM_LOWER_BOUND) && ( phyaddr<=ROM_UPPER_BOUND))
		{
			//ROM
			offset = phyaddr - ROM_LOWER_BOUND;
			*data  =  rom[offset];
			
		}
	else
		{
			//bad address exception
			exception(ADEL,-1);
			return false;
		}
}
static boolean load_byte_from_cache(UINT32 vaddr,UINT32 phyaddr,int operation_mode,UINT8 * data)
{
	UINT32  index,word_vaddr;
	/*because we just fetch byte form cache. So we must get the offset of cache line.*/
	UINT8 cache_line_offset;  
	
	
	cache_line_offset = vaddr & 0x00000003;
	/*set the  last 2 bits to zero*/
	word_vaddr = vaddr & 0xfffffffc;
	//vaddr = vaddr & 0xfffffffc;
	
	if (true==is_swc())
		{
			if (DATA_LOAD==operation_mode  )
				{
					operation_mode = INSTRUCTION_LOAD;
				}
			else if (INSTRUCTION_LOAD == operation_mode  )
				operation_mode = DATA_LOAD;
		}
	
	if (DATA_LOAD==operation_mode)
		{
			index = (phyaddr & DCACHE_MASK) ;
			if ( (true==is_isc()) || (  (dcache[index].tag == word_vaddr) && (dcache[index].flag & CACHE_VALID_MASK) ))
				{
					//hit
					*data = get_byte_from_word(dcache[index].cache_line,cache_line_offset);
					return true;
				}
			else
				{
					//miss
				
					return false;
				}
		}
	else if (INSTRUCTION_LOAD==operation_mode)
		{
			index = phyaddr & ICACHE_MASK;
			if ((true==is_isc())||( (icache[index].tag == word_vaddr) && (icache[index].flag & CACHE_VALID_MASK) ))
				{
					//hit
					*data = get_byte_from_word(icache[index].cache_line,cache_line_offset);
					return true;
				}
			else
				{
					return false;
					
				}
		}

}
static boolean load_byte(UINT32 vaddr,UINT32 phyaddr,boolean cache_able,int operation_mode,UINT8 * data)
{
	if (true == cache_able )
		{
			//load a byte from cache.
			if (load_byte_from_cache(vaddr, phyaddr,operation_mode, data))
				return true;
		}
		/*now, cache miss or cache_able=false ,load from ram*/
		{
			//load a byte from ram

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品免费av| 婷婷成人激情在线网| 欧美一级欧美三级| 在线免费不卡视频| 色综合天天综合| 成人av资源站| aa级大片欧美| 91视频com| 色婷婷激情综合| 欧美性猛片xxxx免费看久爱| 91免费视频大全| 91美女片黄在线观看| 99久久精品久久久久久清纯| 99久久久久久99| 一本色道综合亚洲| 欧美视频在线一区二区三区| 久久久综合视频| 欧美一区二区三区视频在线| 欧美成人猛片aaaaaaa| 日韩欧美中文字幕制服| 久久久久久久av麻豆果冻| 国产亚洲成av人在线观看导航| 精品久久一区二区| 欧美经典一区二区| 亚洲精品视频在线| 亚洲成a人片在线不卡一二三区 | 天堂蜜桃91精品| 午夜日韩在线电影| 国产一区二区视频在线| 成人app在线观看| 欧美性大战xxxxx久久久| 欧美一区国产二区| 国产午夜精品一区二区三区视频| 欧美激情一区不卡| 亚洲成人在线观看视频| 久久99精品国产麻豆婷婷洗澡| 国产经典欧美精品| 色天天综合久久久久综合片| 欧美一区二区三区成人| 国产日韩欧美a| 亚洲成a人v欧美综合天堂下载| 伦理电影国产精品| 91影院在线观看| 日韩一区国产二区欧美三区| 国产婷婷精品av在线| 亚洲一区二区在线免费观看视频| 精品一区二区免费看| 91麻豆精品国产91| 国产性色一区二区| 午夜视黄欧洲亚洲| 99久久精品国产一区| 欧美大片一区二区| 亚洲精品成人天堂一二三| 精品影院一区二区久久久| 99re热这里只有精品视频| 欧美一区二区成人| 亚洲精品欧美专区| 成人手机在线视频| 日韩免费高清av| 亚洲va欧美va人人爽| av电影天堂一区二区在线| 精品伦理精品一区| 天涯成人国产亚洲精品一区av| gogo大胆日本视频一区| 欧美精品一区二区在线观看| 午夜免费欧美电影| 在线免费一区三区| 亚洲青青青在线视频| 国产成人啪免费观看软件| 欧美美女一区二区在线观看| 亚洲人成7777| 成人av高清在线| 久久久777精品电影网影网| 美国精品在线观看| 欧美一级高清大全免费观看| 天天av天天翘天天综合网色鬼国产 | 极品少妇一区二区| 日韩一区二区精品在线观看| 亚洲成av人片在www色猫咪| 欧美性大战久久久| 亚洲线精品一区二区三区八戒| 91在线精品一区二区三区| 中文字幕成人在线观看| 丰满少妇在线播放bd日韩电影| 日韩免费观看高清完整版| 美国毛片一区二区| 精品1区2区在线观看| 国产乱人伦偷精品视频不卡 | 日韩精品专区在线影院观看| 老鸭窝一区二区久久精品| 日韩一区二区免费电影| 狠狠色狠狠色综合系列| 久久女同性恋中文字幕| 丁香激情综合五月| 亚洲图片欧美激情| 欧美日韩中文另类| 美女视频一区二区| 国产女人水真多18毛片18精品视频 | 一区二区三区免费| 欧美日韩美女一区二区| 日本va欧美va瓶| 26uuu亚洲综合色| 不卡一区二区三区四区| 亚洲免费观看在线视频| 欧美狂野另类xxxxoooo| 韩国女主播一区二区三区| 亚洲国产精品激情在线观看| 色又黄又爽网站www久久| 亚洲r级在线视频| 欧美电影免费提供在线观看| 国产精品白丝av| 一区二区三区欧美在线观看| 91精品国产乱码| 成熟亚洲日本毛茸茸凸凹| 亚洲最新在线观看| 亚洲精品一区二区三区影院| 97久久超碰国产精品电影| 日韩国产欧美在线播放| 欧美激情一区二区三区| 精品污污网站免费看| 国产不卡视频在线播放| 丝袜美腿高跟呻吟高潮一区| 欧美—级在线免费片| 欧美日韩一区视频| 国产精品白丝jk黑袜喷水| 亚洲.国产.中文慕字在线| 亚洲国产成人自拍| 欧美一二三四区在线| av午夜一区麻豆| 久久99久久99小草精品免视看| 亚洲欧美日韩一区二区 | 国产一区二区三区日韩| 亚洲一区二区视频在线| 日本一区免费视频| 欧美肥妇bbw| 色呦呦日韩精品| 国产69精品久久久久毛片| 日韩av网站在线观看| 一区二区三区中文字幕| 欧美国产欧美综合| 日韩欧美资源站| 69堂成人精品免费视频| 色综合一个色综合| av在线综合网| 国产成人在线视频播放| 加勒比av一区二区| 美女视频黄频大全不卡视频在线播放 | 欧美日韩亚洲丝袜制服| 91蝌蚪porny成人天涯| 成人黄色网址在线观看| 丰满亚洲少妇av| 国产成人99久久亚洲综合精品| 寂寞少妇一区二区三区| 久久99国产精品麻豆| 日本vs亚洲vs韩国一区三区| 天堂av在线一区| 天天操天天干天天综合网| 亚洲成av人在线观看| 午夜精品成人在线| 亚洲成人av一区| 婷婷国产v国产偷v亚洲高清| 图片区小说区区亚洲影院| 午夜成人免费电影| 日本视频一区二区| 麻豆国产精品一区二区三区| 蜜臂av日日欢夜夜爽一区| 蜜桃视频一区二区| 激情小说亚洲一区| 国产91精品在线观看| 国产成人精品免费一区二区| 国产成人精品1024| eeuss鲁片一区二区三区在线观看| 成人黄色免费短视频| 91福利视频久久久久| 欧美日韩在线播放三区| 欧美一区日韩一区| 久久综合久色欧美综合狠狠| 国产清纯美女被跳蛋高潮一区二区久久w| 久久综合久久综合久久综合| 欧美韩国日本综合| 亚洲在线一区二区三区| 午夜视黄欧洲亚洲| 国产一区二区三区观看| jizz一区二区| 欧美精品久久久久久久多人混战 | 日韩国产一二三区| 国产精品资源在线| 91婷婷韩国欧美一区二区| 欧美日韩在线三级| 日韩免费看网站| 中文字幕一区在线观看视频| 午夜av区久久| 成人免费毛片a| 777色狠狠一区二区三区| 精品国产髙清在线看国产毛片 | 不卡视频在线看| 欧美高清精品3d| 国产精品短视频| 蜜臀va亚洲va欧美va天堂| 9i看片成人免费高清|