📄 irqdlg.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 + -