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

📄 irqdlg.cpp

📁 这个也是我们的毕业设计课题
💻 CPP
字号:
// IRQDlg.cpp : implementation file
//

#include "stdafx.h"
#include "DFYSimulator.h"
#include "MainFrm.h"
#include "DFY/CPU.h"
#include "IRQDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CIRQDlg dialog


CIRQDlg::CIRQDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CIRQDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CIRQDlg)
	m_strIRQNum = _T("");
	m_strSender = _T("");
	m_irq8 = -1;
	m_irq7 = -1;
	m_irq6 = -1;
	m_irq5 = -1;
	m_irq4 = -1;
	m_irq3 = -1;
	m_irq2 = -1;
	m_irq1 = -1;
	m_bReqBit=0;
	_cpu=NULL;
	m_strHandleState = _T("");
	//}}AFX_DATA_INIT
}


void CIRQDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CIRQDlg)
	DDX_Control(pDX, IDC_LIST_IRQ, m_listIRQ);
	DDX_Text(pDX, IDC_IRQNUM, m_strIRQNum);
	DDX_Radio(pDX, IDC_IRQ8, m_irq8);
	DDX_Radio(pDX, IDC_IRQ7, m_irq7);
	DDX_Radio(pDX, IDC_IRQ6, m_irq6);
	DDX_Radio(pDX, IDC_IRQ5, m_irq5);
	DDX_Radio(pDX, IDC_IRQ4, m_irq4);
	DDX_Radio(pDX, IDC_IRQ3, m_irq3);
	DDX_Radio(pDX, IDC_IRQ2, m_irq2);
	DDX_Radio(pDX, IDC_IRQ1, m_irq1);
	DDX_Text(pDX, IDC_HANDLESTATE, m_strHandleState);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CIRQDlg, CDialog)
	//{{AFX_MSG_MAP(CIRQDlg)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_IRQ1, OnIrq1)
	ON_BN_CLICKED(IDC_IRQ2, OnIrq2)
	ON_BN_CLICKED(IDC_IRQ3, OnIrq3)
	ON_BN_CLICKED(IDC_IRQ4, OnIrq4)
	ON_BN_CLICKED(IDC_IRQ5, OnIrq5)
	ON_BN_CLICKED(IDC_IRQ6, OnIrq6)
	ON_BN_CLICKED(IDC_IRQ7, OnIrq7)
	ON_BN_CLICKED(IDC_IRQ8, OnIrq8)
	ON_BN_CLICKED(ID_REQUEST, OnRequest)
	ON_BN_CLICKED(IDC_ATTACH, OnAttach)
	ON_BN_CLICKED(IDC_DETACH, OnDetach)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CIRQDlg message handlers

void CIRQDlg::OnClose() 
{
	CMainFrame* pFrame=(CMainFrame*)GetParent();
	pFrame->SetIRQDlg(NULL);
	DestroyWindow();
	//reset the IRQ state
	CDFYSimulatorApp* pApp=(CDFYSimulatorApp*)AfxGetApp();
	CPU* pCPU=pApp->GetSimulatorCPU();
	if(pCPU)
	{
		pCPU->ResetIRQ();
	}
	CDialog::OnClose();
}

void CIRQDlg::Determine()
{
	//get mask register value
	BYTE bMask=_cpu->GetIRQMask();
	for(int i=0;i<8;i++)
	{
		if((((m_bReqBit&(~bMask))>>i)&0x01)==1)
		{
			m_uCurIRQNum = i+1;
			CString str;
			str.Format("IRQ%d",i+1);
			m_strIRQNum=str;
			UpdateData(FALSE);
			break;
		}
	}
}

void CIRQDlg::AttachToCPU(CPU *pCPU)
{
	_cpu=pCPU;
	if(pCPU)
	{
		_cpu->SetIntCtrl(this);
		m_strHandleState="Attach to _cpu succeed";
		UpdateData(FALSE);
	}
}

void CIRQDlg::DetachFromCPU()
{
	if(_cpu)
	{
		_cpu->SetIntCtrl(NULL);
		_cpu=NULL;
	}
	m_strHandleState="Detach to _cpu succeed";
	UpdateData(FALSE);
}

BOOL CIRQDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

BOOL CIRQDlg::DestroyWindow() 
{
	DetachFromCPU();
	return CDialog::DestroyWindow();
}

void CIRQDlg::OnCancel()
{

}

void CIRQDlg::OnIrq1() 
{
	if(m_irq1==0)
	{
		m_irq1=-1;
	}
	else
		m_irq1=0;
	UpdateData(FALSE);
}

void CIRQDlg::OnIrq2() 
{
	if(m_irq2==0)
		m_irq2=-1;
	else
		m_irq2=0;
	UpdateData(FALSE);
	
}

void CIRQDlg::OnIrq3() 
{

	if(m_irq3==0)
		m_irq3=-1;
	else
		m_irq3=0;
	UpdateData(FALSE);	
}

void CIRQDlg::OnIrq4() 
{
	if(m_irq4==0)
		m_irq4=-1;
	else
		m_irq4=0;
	UpdateData(FALSE);
	
}

void CIRQDlg::OnIrq5() 
{

	if(m_irq5==0)
		m_irq5=-1;
	else
		m_irq5=0;
	UpdateData(FALSE);	
}

void CIRQDlg::OnIrq6() 
{
	if(m_irq6==0)
		m_irq6=-1;
	else
		m_irq6=0;
	UpdateData(FALSE);
	
}

void CIRQDlg::OnIrq7() 
{
	
	if(m_irq7==0)
		m_irq7=-1;
	else
		m_irq7=0;
	UpdateData(FALSE);
}

void CIRQDlg::OnIrq8() 
{
	if(m_irq8==0)
		m_irq8=-1;
	else
		m_irq8=0;
	UpdateData(FALSE);	
}

void CIRQDlg::OnRequest() 
{
	UpdateData(TRUE);
	if(m_irq1==0)
		m_bReqBit=m_bReqBit|0x01;
	if(m_irq2==0)
		m_bReqBit=m_bReqBit|0x02;
	if(m_irq3==0)
		m_bReqBit=m_bReqBit|0x04;
	if(m_irq4==0)
		m_bReqBit=m_bReqBit|0x08;
	if(m_irq5==0)
		m_bReqBit=m_bReqBit|0x10;
	if(m_irq6==0)
		m_bReqBit=m_bReqBit|0x20;
	if(m_irq7==0)
		m_bReqBit=m_bReqBit|0x40;
	if(m_irq8==0)
		m_bReqBit=m_bReqBit|0x80;
	CString str;
	int index=0;
	//add the IRQ number to the list
	for(int i=0;i<8;i++)
	{
		if(((m_bReqBit>>i)&0x01)==1)
		{
			str.Format("IRQ%d",i+1);
			index=m_listIRQ.FindString(0,str);
			if(index==LB_ERR)
				m_listIRQ.AddString(str);
		}
	}
	if(!_cpu)
	{
		MessageBox("the 8259 not attach to _cpu,attach it to _cpu first");
		return;
	}
}
void CIRQDlg::ReportHandleState(CString strState)
{
	m_strHandleState=strState;
	UpdateData(FALSE);
}

UINT CIRQDlg::GetCurIRQNum()
{
	return m_uCurIRQNum;
}

void CIRQDlg::SetReqBit(BYTE bReqBit)
{
	m_bReqBit=bReqBit;
}

void CIRQDlg::DeleteStr(CString str)
{
	int index=m_listIRQ.FindString(0,str);
	if(index!=LB_ERR)
	{
		m_listIRQ.DeleteString(index);
	}
}

BOOL CIRQDlg::GetIRQState()
{
	return m_bReqBit;
}

void CIRQDlg::OnAttach() 
{
	CDFYSimulatorApp *pApp=(CDFYSimulatorApp*)AfxGetApp();
	CPU* pCPU=pApp->GetSimulatorCPU();
	AttachToCPU(pCPU);		
}

void CIRQDlg::OnDetach() 
{
	DetachFromCPU();	
}

BYTE CIRQDlg::GetReqBit()
{
	return m_bReqBit;
}

⌨️ 快捷键说明

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