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

📄 simconfigdlg.cpp

📁 mips处理器指令仿真器
💻 CPP
字号:
// SimConfigDlg.cpp : implementation file
//

#include "stdafx.h"
#include "pipeline.h"
#include "SimConfigDlg.h"
#include "MIPSSimulator.h"
#include "MemDlg.h"
#include "RegDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSimConfigDlg dialog

CSimConfigDlg::CSimConfigDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSimConfigDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSimulatorDlg)
	m_edit1 = _T("");
	m_edit2 = _T("");
	m_edit3 = _T("");
	//}}AFX_DATA_INIT
}

void CSimConfigDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSimConfigDlg)
	DDX_Control(pDX, ID_BTN_REG, m_btnReg);
	DDX_Control(pDX, ID_BTN_MEM, m_btnMem);
	DDX_Control(pDX, IDOK, m_btnOK);
	DDX_Control(pDX, IDCANCEL, m_btnCancel);
	DDX_Control(pDX, IDC_SLIDER3, m_SliderMem);
	DDX_Control(pDX, IDC_SLIDER2, m_SliderDiv);
	DDX_Control(pDX, IDC_SLIDER1, m_SliderMul);
	DDX_Text(pDX, IDC_EDIT1, m_edit1);
	DDX_Text(pDX, IDC_EDIT2, m_edit2);
	DDX_Text(pDX, IDC_EDIT3, m_edit3);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSimConfigDlg, CDialog)
	//{{AFX_MSG_MAP(CSimConfigDlg)
	ON_BN_CLICKED(IDC_RADIO_FREEZE, OnRadioFreeze)
	ON_BN_CLICKED(IDC_RADIO_PREDICT_TOKEN, OnRadioPredictToken)
	ON_BN_CLICKED(IDC_RADIO_PREDICT_NOT_TOKEN, OnRadioPredictNotToken)
	ON_BN_CLICKED(IDC_RADIO_DELAYED_BRANCH, OnRadioDelayedBranch)
	ON_BN_CLICKED(IDC_RADIO_FORWARDING, OnRadioForwarding)
	ON_BN_CLICKED(IDC_RADIO_NOT_FORWARDING, OnRadioNotForwarding)
	ON_WM_HSCROLL()
	ON_BN_CLICKED(ID_BTN_MEM, OnBtnMem)
	ON_BN_CLICKED(ID_BTN_REG, OnBtnReg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSimConfigDlg message handlers

BOOL CSimConfigDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	m_nBranchMethod = simulator.m_nBranchMethod;
	m_bForwardingEnable = simulator.m_bForwardingEnable;

	m_nMulDelay = simulator.m_nMulDelay;
	m_nDivDelay = simulator.m_nDivDelay;
	m_nDataSize = simulator.m_nDataSize;

	m_RadioFreeze.SubclassDlgItem(IDC_RADIO_FREEZE, this);
	m_RadioPredictToken.SubclassDlgItem(IDC_RADIO_PREDICT_TOKEN, this);
	m_RadioRredictNotToken.SubclassDlgItem(IDC_RADIO_PREDICT_NOT_TOKEN, this);
	m_RadioDelayedBranch.SubclassDlgItem(IDC_RADIO_DELAYED_BRANCH, this);

	m_RadioForwarding.SubclassDlgItem(IDC_RADIO_FORWARDING, this);
	m_RadioNotForwarding.SubclassDlgItem(IDC_RADIO_NOT_FORWARDING, this);

	SetRadioCheck();

	m_edit1.Format( "%d", m_nMulDelay );
	m_SliderMul.SetRange(1, 10, TRUE);
	m_SliderMul.SetPos( m_nMulDelay );

	m_edit2.Format( "%d", m_nDivDelay );
	m_SliderDiv.SetRange(1, 50, TRUE);
	m_SliderDiv.SetPos( m_nDivDelay );

	m_edit3.Format( "%d", m_nDataSize );
	m_SliderMem.SetRange(1, 16, TRUE);
	m_SliderMem.SetPos( m_nDataSize / 256 );

	UpdateData(FALSE);

	if( simulator.m_nState != CMIPSSimulator::kNone )
		m_SliderMem.EnableWindow(FALSE);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CSimConfigDlg::SetRadioCheck()
{
	m_RadioFreeze.SetCheck( m_nBranchMethod == CMIPSSimulator::kFreeze );
	m_RadioPredictToken.SetCheck( m_nBranchMethod == CMIPSSimulator::kPredictedTaken );
	m_RadioRredictNotToken.SetCheck( m_nBranchMethod == CMIPSSimulator::kPredictedNotTaken );
	m_RadioDelayedBranch.SetCheck( m_nBranchMethod == CMIPSSimulator::kDelayedBranch );

	m_RadioForwarding.SetCheck( m_bForwardingEnable );
	m_RadioNotForwarding.SetCheck( !m_bForwardingEnable );
}

void CSimConfigDlg::OnRadioFreeze() 
{
	m_nBranchMethod = CMIPSSimulator::kFreeze;
	SetRadioCheck();
}

void CSimConfigDlg::OnRadioPredictToken() 
{
	m_nBranchMethod = CMIPSSimulator::kPredictedTaken;
	SetRadioCheck();
}

void CSimConfigDlg::OnRadioPredictNotToken() 
{
	m_nBranchMethod = CMIPSSimulator::kPredictedNotTaken;
	SetRadioCheck();
}

void CSimConfigDlg::OnRadioDelayedBranch() 
{
	m_nBranchMethod = CMIPSSimulator::kDelayedBranch;
	SetRadioCheck();
}

void CSimConfigDlg::OnRadioForwarding() 
{
	m_bForwardingEnable = TRUE;
	SetRadioCheck();
}

void CSimConfigDlg::OnRadioNotForwarding() 
{
	m_bForwardingEnable = FALSE;
	SetRadioCheck();
}

void CSimConfigDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	UpdateSliderData();
	
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CSimConfigDlg::UpdateSliderData()
{
	m_nMulDelay = m_SliderMul.GetPos();
	m_nDivDelay = m_SliderDiv.GetPos();
	m_nDataSize = m_SliderMem.GetPos() * 256;

	m_edit1.Format( "%d", m_nMulDelay );
	m_edit2.Format( "%d", m_nDivDelay );
	m_edit3.Format( "%d", m_nDataSize );

	UpdateData(FALSE);
}

void CSimConfigDlg::OnOK() 
{
	simulator.m_nBranchMethod = m_nBranchMethod;
	simulator.m_bForwardingEnable = m_bForwardingEnable;

	simulator.m_nMulDelay = m_nMulDelay;
	simulator.m_nDivDelay = m_nDivDelay;
	simulator.m_nDataSize = m_nDataSize;
	simulator.CreateDataMem();

	if( simulator.m_pInsts ) {
		// update Simulator Dialog
		CPipelineApp* pApp = (CPipelineApp*)AfxGetApp();
		pApp->m_pSimulatorDlg->UpdateTextCtrl();
	}
	
	CDialog::OnOK();
}

void CSimConfigDlg::OnBtnMem() 
{
	if( m_nDataSize != simulator.m_nDataSize ) {
		if( AfxMessageBox("更新MIPS数据段大小?",
			MB_YESNO | MB_ICONQUESTION) == IDYES )
			simulator.m_nDataSize = m_nDataSize;
		else {
			m_nDataSize = simulator.m_nDataSize;
			m_edit3.Format( "%d", m_nDataSize );
			m_SliderMem.SetPos( m_nDataSize / 256 );
			UpdateData(FALSE);
		}
	}

	simulator.CreateDataMem();
	CMemDlg dlg;
	dlg.DoModal();
}

void CSimConfigDlg::OnBtnReg() 
{
	CRegDlg dlg;
	dlg.DoModal();
}

⌨️ 快捷键说明

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