cp0.c

来自「32cpu的代码」· C语言 代码 · 共 1,306 行 · 第 1/5 页

C
1,306 行
字号
			           	                CPR[14]=pc_address_wp - 4;
			           	       /*    if((Status&(0x00000004)) == 0){
			           	         	  //ERL == 0
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	            }else{
			           	                 //ERL == 1
			           	                ErrorEPC=pc_address_wp - 4;
			           	                CPR[30]=pc_address_wp - 4;
			           	            }*/

			                    }else{
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	           /*if((Status&(0x00000004)) == 0){
			           	         	    //ERL == 0
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	            }else{
			           	                   //ERL == 1
			           	                ErrorEPC=pc_address_wp;
			           	                CPR[30]=pc_address_wp;
			           	            }*/
			                  }
                   	             }

			             Status=Status|(0x00000002);
			             CPR[12]=Status;
			            Cause=(Cause&(0xffffff03))|(0x00000020);   //Exc Code  in Cause is 8
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4; 
                   	           break;
                   	  case 16 :  //BP   general exception
                   	            exception_flag=0;
                   	            exception_invalid_instr_flag=5;
                   	            if(((Status>>22)&(0x00000001)) == 1){
                   	            	//BEV in Status is one
                   	            	  pc_address_ip=0xbfc00380;
                   	             }else{
                   	               //BEV in Status is zero
                   	                  pc_address_ip=0x80000180;
                   	             }
                   	             if((Status&(0x00000002)) == 0){
			                   if(branch_flag_wp == 1){
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	        /*   if((Status&(0x00000004)) == 0){
			           	         	  //ERL == 0
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	            }else{
			           	                 //ERL == 1
			           	                ErrorEPC=pc_address_wp - 4;
			           	                CPR[30]=pc_address_wp - 4;
			           	            }*/

			                    }else{
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	     /*      if((Status&(0x00000004)) == 0){
			           	         	    //ERL == 0
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	            }else{
			           	                   //ERL == 1
			           	                ErrorEPC=pc_address_wp;
			           	                CPR[30]=pc_address_wp;
			           	            }*/
			                  }
                   	             }

			             Status=Status|(0x00000002);
			             CPR[12]=Status;
			            Cause=(Cause&(0xffffff03))|(0x00000024);   //Exc Code  in Cause is 9
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4; 
                   	           break;
                   	  case 17 :  //CPU   general exception
                   	            exception_flag=0;
                   	            exception_invalid_instr_flag=5;
                   	            if(((Status>>22)&(0x00000001)) == 1){
                   	            	//BEV in Status is one
                   	            	  pc_address_ip=0xbfc00380;
                   	             }else{
                   	               //BEV in Status is zero
                   	                  pc_address_ip=0x80000180;
                   	             }
                   	             if((Status&(0x00000002)) == 0){
			                   if(branch_flag_wp == 1){
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	          /* if((Status&(0x00000004)) == 0){
			           	         	  //ERL == 0
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	            }else{
			           	                 //ERL == 1
			           	                ErrorEPC=pc_address_wp - 4;
			           	                CPR[30]=pc_address_wp - 4;
			           	            }*/

			                    }else{
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	          /* if((Status&(0x00000004)) == 0){
			           	         	    //ERL == 0
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	            }else{
			           	                   //ERL == 1
			           	                ErrorEPC=pc_address_wp;
			           	                CPR[30]=pc_address_wp;
			           	            }*/
			                  }
                   	             }

			             Status=Status|(0x00000002);
			             CPR[12]=Status;
			            Cause=(Cause&(0xffffff03))|(0x0000002c);   //Exc Code  in Cause is 11
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4; 
                   	           break;
                   	  case 18 :  //RI   general exception
                   	            exception_flag=0;
                   	            exception_invalid_instr_flag=5;
                   	            if(((Status>>22)&(0x00000001)) == 1){
                   	            	//BEV in Status is one
                   	            	  pc_address_ip=0xbfc00380;
                   	             }else{
                   	               //BEV in Status is zero
                   	                  pc_address_ip=0x80000180;
                   	             }
                   	             if((Status&(0x00000002)) == 0){
			                   if(branch_flag_wp == 1){
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	         /*  if((Status&(0x00000004)) == 0){
			           	         	  //ERL == 0
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	            }else{
			           	                 //ERL == 1
			           	                ErrorEPC=pc_address_wp - 4;
			           	                CPR[30]=pc_address_wp - 4;
			           	            }*/

			                    }else{
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	         /*  if((Status&(0x00000004)) == 0){
			           	         	    //ERL == 0
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	            }else{
			           	                   //ERL == 1
			           	                ErrorEPC=pc_address_wp;
			           	                CPR[30]=pc_address_wp;
			           	            }*/
			                  }
                   	             }

			             Status=Status|(0x00000002);
			             CPR[12]=Status;
			            Cause=(Cause&(0xffffff03))|(0x00000028);   //Exc Code  in Cause is 10
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4; 
                   	           break;
                   	  case 19 :  //OV   general exception
                   	            exception_flag=0;
                   	            exception_invalid_instr_flag=5;
                   	            if(((Status>>22)&(0x00000001)) == 1){
                   	            	//BEV in Status is one
                   	            	  pc_address_ip=0xbfc00380;
                   	             }else{
                   	               //BEV in Status is zero
                   	                  pc_address_ip=0x80000180;
                   	             }
                   	             if((Status&(0x00000002)) == 0){
			                   if(branch_flag_wp == 1){
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	        /*   if((Status&(0x00000004)) == 0){
			           	         	  //ERL == 0
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	            }else{
			           	                 //ERL == 1
			           	                ErrorEPC=pc_address_wp - 4;
			           	                CPR[30]=pc_address_wp - 4;
			           	            }*/

			                    }else{
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	        /*   if((Status&(0x00000004)) == 0){
			           	         	    //ERL == 0
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	            }else{
			           	                   //ERL == 1
			           	                ErrorEPC=pc_address_wp;
			           	                CPR[30]=pc_address_wp;
			           	            }*/
			                  }
                   	             }

			             Status=Status|(0x00000002);
			             CPR[12]=Status;
			            Cause=(Cause&(0xffffff03))|(0x00000030);   //Exc Code  in Cause is 12
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4;  
                   	           break;
                   	  case 20 :  //TR   general exception
                   	            exception_flag=0;
                   	            exception_invalid_instr_flag=5;
                   	            if(((Status>>22)&(0x00000001)) == 1){
                   	            	//BEV in Status is one
                   	            	  pc_address_ip=0xbfc00380;
                   	             }else{
                   	               //BEV in Status is zero
                   	                  pc_address_ip=0x80000180;
                   	             }
                   	             if((Status&(0x00000002)) == 0){
			                   if(branch_flag_wp == 1){
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	          /* if((Status&(0x00000004)) == 0){
			           	         	  //ERL == 0
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	            }else{
			           	                 //ERL == 1
			           	                ErrorEPC=pc_address_wp - 4;
			           	                CPR[30]=pc_address_wp - 4;
			           	            }*/

			                    }else{
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	     /*      if((Status&(0x00000004)) == 0){
			           	         	    //ERL == 0
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	            }else{
			           	                   //ERL == 1
			           	                ErrorEPC=pc_address_wp;
			           	                CPR[30]=pc_address_wp;
			           	            }*/
			                  }
                   	             }
                                      printf("\nStatus=%08x\n",Status);
			             Status=Status|(0x00000002);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?