⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 amview.cpp

📁 本软件实现了模拟cpu的基本工作原理和工作过程
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	case 0://F->Q
		au.F_Q[0].shine=1;
		au.Q_N.shine=1;
		break;
	case 1://NOP
		break;
	case 2://F->B
	case 3://F->B
		au.F_REG[0].shine=1;
		au.REG_N.shine=1;
		break;
		//省略case 4:
	case 5://F/2->B
		au.F_REG[0].shine=1;
		au.REG_R.shine=1;
		break;
		//省略case 6:
	case 7://2*F->B
		au.F_REG[0].shine=1;
		au.REG_L.shine=1;
		break;
	default:
		MessageBox("Am2901(ALU)指令I5-3出错!");
	}
	//==========ALU结果送总线==========
	switch(MicroInst.m_i86){
	case 2://A->Y
		au.A_Y[0].shine=1;
		if(MicroInst.m_dc1==1 || (MicroInst.m_dc1==0 && MicroInst.m_mrw!=1 && MicroInst.m_mrw!=3)){
			au.RTOIB.shine=1;
			if(RA==0)m_bus=m_r0;
			else if(RA==1)m_bus=m_r1;
			else if(RA==2)m_bus=m_r2;
			else if(RA==3)m_bus=m_r3;
			else if(RA==4)m_bus=m_r4;
			else if(RA==5)m_bus=m_r5;
			else if(RA==6)m_bus=m_r6;
			else if(RA==7)m_bus=m_r7;
			else if(RA==8)m_bus=m_r8;
			else if(RA==9)m_bus=m_r9;
			else if(RA==10)m_bus=m_r10;
			else if(RA==11)m_bus=m_r11;
			else if(RA==12)m_bus=m_r12;
			else if(RA==13)m_bus=m_r13;
			else if(RA==14)m_bus=m_r14;
			else m_bus=m_r15;
		}
		break;
	case 0:
	case 1:
	case 3:
		//省略case 4:
	case 5:
		//省略case 6:
	case 7:
		au.F_Y.shine=1;
		if(MicroInst.m_dc1==1 || (MicroInst.m_dc1==0 && MicroInst.m_mrw!=1 && MicroInst.m_mrw!=3)){
			au.RTOIB.shine=1;
			short2CString(f,m_bus);
		}
		break;
	default:
		MessageBox("Am2901(ALU)指令I5-3出错!");
	}
	//==========/MIO-REQ-/WE控制 之 写==========
	if(MicroInst.m_mrw==0){
		memory[CString2short(m_addr)]=CString2short(m_bus);
		mem.WRITE.shine=1;
	}
	else if(MicroInst.m_mrw==2){
		m_ouput=m_bus;
		io.DISPLACE[0].shine=1;
	}
	//==========寄存器准备接收总线数据==========
	if(MicroInst.m_dc2==0) ;
	else if(MicroInst.m_dc2==1)cu.GIR.shine=1;
	else if(MicroInst.m_dc2==2)mem.GAR.shine=1;
	else MessageBox("寄存器准备接收总线数据控制(DC2)出错!");
	//==========CC非码的生成==========
	if(MicroInst.m_scc==0 && MicroInst.m_sc==0) cc=0;
	else if(MicroInst.m_scc==7 ){
		unsigned short kind=(instruction >> 8);
		kind = kind & 7;
		switch(kind){
		case 0:
			if(m_sta_c)cc=0;
			else cc=1;
			break;
		case 1:
			if(m_sta_z)cc=0;
			else cc=1;
			break;
		case 2:
			if(m_sta_v)cc=0;
			else cc=1;
			break;
		case 3:
			if(m_sta_s)cc=0;
			else cc=1;
			break;
		case 4:
			cc=m_sta_c;
			break;
		case 5:
			cc=m_sta_z;
			break;
		case 6:
			cc=m_sta_v;
			break;
		case 7:
			cc=m_sta_s;
			break;
		}
	}
	else MessageBox("cc非码生成控制出错!");
	
	//==========Am2910命令控制(控存下地址的生成)==========
	switch(MicroInst.m_ci){
	case 2:
		cu.MAPROM_D.shine=1;
		cu.D_MUX.shine=1;
		cu.IR_MAPROM.shine=1;
		m_mux=m_map;
		cu.INC_MPC.shine=1;
		cu.MUX_MPC[0].shine=1;
		cu.MUX_CM[0].shine=1;
		cu.CM_CMDR.shine=1;
		short2CString(CString2short(m_mux)+1,m_mpc);
		break;
	case 3:
		if(cc){
			cu.MPC_MUX.shine=1;
			m_mux=m_mpc;
			cu.INC_MPC.shine=1;
			cu.MUX_MPC[0].shine=1;
			cu.MUX_CM[0].shine=1;
			cu.CM_CMDR.shine=1;
			short2CString(1+CString2short(m_mpc),m_mpc);
		}
		else{
			cu.CMDR_D.shine=1;
			cu.D_MUX.shine=1;
			short2CString(MicroInst.m_naddr,m_mux);
			cu.INC_MPC.shine=1;
			cu.MUX_MPC[0].shine=1;
			cu.MUX_CM[0].shine=1;
			cu.CM_CMDR.shine=1;
			short2CString(1+CString2short(m_mpc),m_mpc);
		}
		break;
	case 14:
		cu.MPC_MUX.shine=1;
		m_mux=m_mpc;
		cu.INC_MPC.shine=1;
		cu.MUX_MPC[0].shine=1;
		cu.MUX_CM[0].shine=1;
		cu.CM_CMDR.shine=1;
		short2CString(1+CString2short(m_mpc),m_mpc);
		break;
	default:
		MessageBox("Am2910命令控制(控存下地址的生成)出错!");
	}
	UpdateData(false);
}
void CAMView::OnRunButton() 
{
	UpdateData(true);
	int mode=GetCheckedRadioButton(IDC_MICROSTEP_RADIO,IDC_CONTINUE_RADIO);
	if(mode==IDC_MACHINESTEP_RADIO || mode==IDC_CONTINUE_RADIO){
		SetTimer(2,2000,NULL);
		GetDlgItem(IDC_RUN_BUTTON)->EnableWindow(false);
	}


	Run();

}
void CAMView::OnStartButton() 
{
	startdlg.m_title="程序起始地址:";
	startdlg.DoModal();
	
	m_explain="新机器指令:";
	
	m_pc=m_r5=startdlg.m_startpoint;
	m_mpc="0019";
	m_mux="0018";
	
	/*	MicroInst.m_naddr=0;
	MicroInst.m_ci=0;
	MicroInst.m_scc=0;
	MicroInst.m_sc=0;*/
	MicroInst.m_sst=0;
	/*	MicroInst.m_mrw=0;*/
	MicroInst.m_i86=1;
	/*	MicroInst.m_i53=0;
	MicroInst.m_i20=0;
	
	  MicroInst.m_a=0;
	  MicroInst.m_b=0;
	  MicroInst.m_sci=0;
	  MicroInst.m_ssh=0;
	  MicroInst.m_sa=0;
	  MicroInst.m_dc1=0;
	MicroInst.m_sb=0;*/
	MicroInst.m_dc2=0;
	UpdateData(false);
	
	SetTimer(1,100,NULL);
	GetDlgItem(IDC_RUN_BUTTON)->EnableWindow(TRUE);
	GetDlgItem(IDC_STOP_BUTTON)->EnableWindow(TRUE);
	GetDlgItem(IDC_START_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_MICROSTEP_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_MACHINESTEP_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_CONTINUE_RADIO)->EnableWindow(FALSE);

	UpdateData(true);
	int mode=GetCheckedRadioButton(IDC_MICROSTEP_RADIO,IDC_CONTINUE_RADIO);
	if(mode==IDC_MACHINESTEP_RADIO || mode==IDC_CONTINUE_RADIO)
		SetTimer(2,2000,NULL);
	
	
	m_r1="0002";
	m_r2="0003";
	memory[0]=0x0412;
	memory[1]=0xFC00;
	UpdateData(false);
}


void CAMView::OnStopButton() 
{
	//==========ALU结果写回==========
	switch(MicroInst.m_i86){
	case 0://F->Q
		//if(au.Q_N.shine)
		m_q=m_alu;
		break;
	case 1://NOP
		break;
	case 2://F->B
	case 3://F->B
		//if(au.REG_N.shine)
		RegWrite(RB,CString2short(m_alu));
		break;
		//省略case 4:
	case 5://F/2->B
		//if(au.REG_R.shine)
		{
			unsigned short num;
			num=CString2short(m_alu)/2;
			//向右移位时最高位的补位MAM3
			if(MicroInst.m_ssh==0 || (MicroInst.m_ssh==3 && m_sta_c==0))num=num & 32767;
			else if(MicroInst.m_ssh==1 || (MicroInst.m_ssh==3 && m_sta_c==1))num=num | 32768;
			else MessageBox("上一条指令的移位控制位SSH出错!");
			RegWrite(RB,num);
		}
		break;
		//省略case 6:
	case 7://2*F->B
		//if(au.REG_L.shine)
		{
			unsigned short num;
			num=CString2short(m_alu)*2;
			//向左移位时最低位的补位MAM0
			if(MicroInst.m_ssh==0 || (MicroInst.m_ssh==3 && m_sta_c==0))    ;
			else if(MicroInst.m_ssh==1 || (MicroInst.m_ssh==3 && m_sta_c==1))num=num | 1;
			else MessageBox("上一条指令的移位控制位SSH出错!");
			RegWrite(RB,num);
		}
		break;
	}
	//==========状态标志位写回==========
	unsigned short BusNum=CString2short(m_bus);
	switch(MicroInst.m_sst){
	case 0:
		break;
	case 1:
		m_sta_c=m_cy;
		m_sta_z=m_zr;
		m_sta_v=m_ov;
		m_sta_s=m_f3;
		break;
	case 2://INNER BUS 7~4->STATE REGISTER
		m_sta_c=((BusNum & 0x0080)? 1:0);
		m_sta_z=((BusNum & 0x0040)? 1:0);
		m_sta_c=((BusNum & 0x0020)? 1:0);
		m_sta_c=((BusNum & 0x0010)? 1:0);
		break;
	case 3:
		m_sta_c=0;
		break;
	case 4:
		m_sta_c=1;
		break;
	case 5:
		m_sta_c=((CString2short(m_alu) & 1) ? 1:0);
		break;
	case 6:
		m_sta_c=((CString2short(m_alu) & 0x8000) ? 1:0);
		//省略case 7:
	default:
		MessageBox("状态位的产生控制出错!");
		
	}
	//==========寄存器接收总线数据==========
	if(MicroInst.m_dc2==0) ;
	else if(MicroInst.m_dc2==1){
		m_instruction=m_bus;
		m_map=maprom[(CString2short(m_instruction))>>10];
	}
	else if(MicroInst.m_dc2==2)m_addr=m_bus;
	else MessageBox("寄存器接收总线数据控制(DC2)出错!");
	//==========搽除上一次的闪烁控制==========
	au.REG_A.shine=0;
	au.REG_B.shine=0;
	au.R_ALU.shine=0;
	au.S_ALU.shine=0;
	au.IBTOF.shine=0;
	
	au.RTOIB.shine=0;
	au.FTOIB.shine=0;
	au.F_Y.shine=0;
	au.A_R.shine=0;
	au.B_S.shine=0;
	au.REG_L.shine=0;
	au.REG_N.shine=0;
	au.REG_R.shine=0;
	au.Q_L.shine=0;
	au.Q_N.shine=0;
	au.Q_R.shine=0;
	
	au.A_Y[0].shine=0;
	au.A_S[0].shine=0;
	au.Q_S[0].shine=0;
	au.D_R[0].shine=0;
	au.F_REG[0].shine=0;
	au.F_Q[0].shine=0;
	au.Q_Q[0].shine=0;
	
	cu.GIR.shine=0;
	cu.ITOIB.shine=0;
	cu.INC_MPC.shine=0;
	cu.MAPROM_D.shine=0;
	cu.CMDR_D.shine=0;
	cu.MPC_MUX.shine=0;
	cu.D_MUX.shine=0;
	
	mem.GAR.shine=0;
	mem.WRITE.shine=0;
	mem.READ.shine=0;
	
	io.WRITE[0].shine=0;
	io.DISPLACE[0].shine=0;
	
	au.REG_A.shine=0;
	au.REG_B.shine=0;
	au.R_ALU.shine=0;
	au.S_ALU.shine=0;
	au.IBTOF.shine=0;
	cu.IR_MAPROM.shine=0;
	cu.MUX_CM[0].shine=0;
	cu.MUX_MPC[0].shine=0;
	cu.CM_CMDR.shine=0;
	
	OnPaint();
	//==========加载==========
	m_explain+="\r\n用户中止程序!";
	MessageBox("用户中止程序!");
	UpdateData(false);
	GetDlgItem(IDC_RUN_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_STOP_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_START_BUTTON)->EnableWindow(TRUE);
	GetDlgItem(IDC_MICROSTEP_RADIO)->EnableWindow(TRUE);
	GetDlgItem(IDC_MACHINESTEP_RADIO)->EnableWindow(TRUE);
	GetDlgItem(IDC_CONTINUE_RADIO)->EnableWindow(TRUE);
	KillTimer(1);
	UpdateData(false);
	int mode=GetCheckedRadioButton(IDC_MICROSTEP_RADIO,IDC_CONTINUE_RADIO);
	if(mode==IDC_MACHINESTEP_RADIO||mode==IDC_CONTINUE_RADIO) 
		KillTimer(2);
	
}
void CAMView::OnTimer(UINT nIDEvent) 
{
	count++;
	int i;
	if(nIDEvent==1){
		
		if(count%2){
			//运算器可闪布线
			
			if(au.REG_A.shine)	Draw(au.REG_A,BusBrush);
			if(au.REG_B.shine)	Draw(au.REG_B,BusBrush);
			if(au.R_ALU.shine)	Draw(au.R_ALU,BusBrush);
			if(au.S_ALU.shine)	Draw(au.S_ALU,BusBrush);
			
			if(au.RTOIB.shine)	Draw(au.RTOIB,BusBrush);
			if(au.FTOIB.shine)	Draw(au.FTOIB,BusBrush);
			if(au.IBTOF.shine)	Draw(au.IBTOF,BusBrush);
			if(au.F_Y.shine)	Draw(au.F_Y,BusBrush);
			if(au.A_R.shine)	Draw(au.A_R,BusBrush);
			if(au.B_S.shine)	Draw(au.B_S,BusBrush);
			if(au.REG_L.shine)	Draw(au.REG_L,BusBrush);
			if(au.REG_N.shine)	Draw(au.REG_N,BusBrush);
			if(au.REG_R.shine)	Draw(au.REG_R,BusBrush);
			if(au.Q_L.shine)	Draw(au.Q_L,BusBrush);
			if(au.Q_N.shine)	Draw(au.Q_N,BusBrush);
			if(au.Q_R.shine)	Draw(au.Q_R,BusBrush);
			
			if(au.A_Y[0].shine)		for(i=0;i<5;i++)Draw(au.A_Y[i],BusBrush);
			if(au.A_S[0].shine)		for(i=0;i<3;i++)Draw(au.A_S[i],BusBrush);
			if(au.Q_S[0].shine)		for(i=0;i<3;i++)Draw(au.Q_S[i],BusBrush);
			if(au.D_R[0].shine)		for(i=0;i<3;i++)Draw(au.D_R[i],BusBrush);
			if(au.F_REG[0].shine)	for(i=0;i<5;i++)Draw(au.F_REG[i],BusBrush);
			if(au.F_Q[0].shine)		for(i=0;i<5;i++)Draw(au.F_Q[i],BusBrush);
			if(au.Q_Q[0].shine)		for(i=0;i<5;i++)Draw(au.Q_Q[i],BusBrush);
			//控制器可闪布线
			if(cu.GIR.shine)		Draw(cu.GIR,BusBrush);
			if(cu.ITOIB.shine)		Draw(cu.ITOIB,BusBrush);
			if(cu.INC_MPC.shine)	Draw(cu.INC_MPC,BusBrush);
			if(cu.MAPROM_D.shine)	Draw(cu.MAPROM_D,BusBrush);
			if(cu.CMDR_D.shine)		Draw(cu.CMDR_D,BusBrush);
			if(cu.MPC_MUX.shine)	Draw(cu.MPC_MUX,BusBrush);
			if(cu.D_MUX.shine)		Draw(cu.D_MUX,BusBrush);
			if(cu.IR_MAPROM.shine)	Draw(cu.IR_MAPROM,BusBrush);
			if(cu.MUX_CM[0].shine)	for(i=0;i<3;i++)Draw(cu.MUX_CM[i],BusBrush);
			if(cu.MUX_MPC[0].shine)	for(i=0;i<5;i++)Draw(cu.MUX_MPC[i],BusBrush);
			if(cu.CM_CMDR.shine)	Draw(cu.CM_CMDR,BusBrush);
			
			//存储器可闪布线
			if(mem.GAR.shine)	Draw(mem.GAR,BusBrush);
			if(mem.WRITE.shine)	Draw(mem.WRITE,BusBrush);
			if(mem.READ.shine)	Draw(mem.READ,BusBrush);
			//IO设备可闪布线
			if(io.WRITE[0].shine)		for(i=0;i<2;i++)Draw(io.WRITE[i],BusBrush);
			if(io.DISPLACE[0].shine)	for(i=0;i<2;i++)Draw(io.DISPLACE[i],BusBrush);
		}
		else{
			//运算器可闪布线
			if(au.REG_A.shine)	Draw(au.REG_A,ShineBrush);
			if(au.REG_B.shine)	Draw(au.REG_B,ShineBrush);
			if(au.R_ALU.shine)	Draw(au.R_ALU,ShineBrush);
			if(au.S_ALU.shine)	Draw(au.S_ALU,ShineBrush);
			
			
			if(au.RTOIB.shine)	Draw(au.RTOIB,ShineBrush);
			if(au.FTOIB.shine)	Draw(au.FTOIB,ShineBrush);
			if(au.IBTOF.shine)	Draw(au.IBTOF,ShineBrush);
			if(au.F_Y.shine)	Draw(au.F_Y,ShineBrush);
			if(au.A_R.shine)	Draw(au.A_R,ShineBrush);
			if(au.B_S.shine)	Draw(au.B_S,ShineBrush);
			if(au.REG_L.shine)	Draw(au.REG_L,ShineBrush);
			if(au.REG_N.shine)	Draw(au.REG_N,ShineBrush);
			if(au.REG_R.shine)	Draw(au.REG_R,ShineBrush);
			if(au.Q_L.shine)	Draw(au.Q_L,ShineBrush);
			if(au.Q_N.shine)	Draw(au.Q_N,ShineBrush);
			if(au.Q_R.shine)	Draw(au.Q_R,ShineBrush);
			
			if(au.A_Y[0].shine)	for(i=0;i<5;i++)Draw(au.A_Y[i],ShineBrush);
			if(au.A_S[0].shine)	for(i=0;i<3;i++)Draw(au.A_S[i],ShineBrush);
			if(au.Q_S[0].shine)	for(i=0;i<3;i++)Draw(au.Q_S[i],ShineBrush);
			if(au.D_R[0].shine)	for(i=0;i<3;i++)Draw(au.D_R[i],ShineBrush);
			if(au.F_REG[0].shine)	for(i=0;i<5;i++)Draw(au.F_REG[i],ShineBrush);
			if(au.F_Q[0].shine)	for(i=0;i<5;i++)Draw(au.F_Q[i],ShineBrush);
			if(au.Q_Q[0].shine)	for(i=0;i<5;i++)Draw(au.Q_Q[i],ShineBrush);
			
			//控制器可闪布线
			
			if(cu.GIR.shine)		Draw(cu.GIR,ShineBrush);
			if(cu.ITOIB.shine)		Draw(cu.ITOIB,ShineBrush);
			if(cu.INC_MPC.shine)	Draw(cu.INC_MPC,ShineBrush);
			if(cu.MAPROM_D.shine)	Draw(cu.MAPROM_D,ShineBrush);
			if(cu.CMDR_D.shine)		Draw(cu.CMDR_D,ShineBrush);
			if(cu.MPC_MUX.shine)	Draw(cu.MPC_MUX,ShineBrush);
			if(cu.D_MUX.shine)		Draw(cu.D_MUX,ShineBrush);
			
			if(cu.IR_MAPROM.shine)	Draw(cu.IR_MAPROM,ShineBrush);
			if(cu.MUX_CM[0].shine)	for(i=0;i<3;i++)Draw(cu.MUX_CM[i],ShineBrush);
			if(cu.MUX_MPC[0].shine)	for(i=0;i<5;i++)Draw(cu.MUX_MPC[i],ShineBrush);
			if(cu.CM_CMDR.shine)	Draw(cu.CM_CMDR,ShineBrush);
			
			//存储器可闪布线
			if(mem.GAR.shine)	Draw(mem.GAR,ShineBrush);
			if(mem.WRITE.shine)	Draw(mem.WRITE,ShineBrush);
			if(mem.READ.shine)	Draw(mem.READ,ShineBrush);
			//IO设备可闪布线
			if(io.WRITE[0].shine)		for(i=0;i<2;i++)Draw(io.WRITE[i],ShineBrush);
			if(io.DISPLACE[0].shine)	for(i=0;i<2;i++)Draw(io.DISPLACE[i],ShineBrush);
		}
	}
	else if(nIDEvent==2){
		int mode=GetCheckedRadioButton(IDC_MICROSTEP_RADIO,IDC_CONTINUE_RADIO);
		if(mode==IDC_MACHINESTEP_RADIO||mode==IDC_CONTINUE_RADIO)Run();

	}
	
	
	
	
	CFormView::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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