📄 stackdlg.cpp
字号:
// StackDlg.cpp : implementation file
//
#include "stdafx.h"
#include "DFYSimulator.h"
#include "StackDlg.h"
#include "MainFrm.h"
#include "DFY\CPU.h"
#include "DFY\type.h"
#include "DFY\MemorySegment.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStackDlg dialog
CStackDlg::CStackDlg(CWnd* pParent /*=NULL*/)
: CDialog(CStackDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CStackDlg)
m_stackAddr = 0;
m_stackFirstAddr = _T("");
m_stackTopAddr = _T("");
m_uScrPos=0;
//}}AFX_DATA_INIT
}
void CStackDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CStackDlg)
DDX_Control(pDX, IDC_SCR_STACK, m_scrStack);
DDX_Control(pDX, IDC_LIST_DISPLAYSTACK, m_displayStack);
DDX_Text(pDX, IDC_EDIT_STACKADDR, m_stackAddr);
DDV_MinMaxLong(pDX, m_stackAddr, 0, 65534);
DDX_Text(pDX, IDC_EDIT_STACKFIRSTADDR, m_stackFirstAddr);
DDX_Text(pDX, IDC_EDIT_STACKTOPADDR, m_stackTopAddr);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CStackDlg, CDialog)
//{{AFX_MSG_MAP(CStackDlg)
ON_WM_MOVE()
ON_WM_PAINT()
ON_WM_CLOSE()
ON_WM_VSCROLL()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStackDlg message handlers
void CStackDlg::OnMove(int x, int y)
{
CDialog::OnMove(x, y);
GetParent()->SetActiveWindow();//set the mainFrame activity
}
void CStackDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
FlushStack();
// Do not call CDialog::OnPaint() for painting messages
}
void CStackDlg::OnOK()
{
UpdateData(TRUE);
CDFYSimulatorApp* pApp=(CDFYSimulatorApp*)AfxGetApp();
CPU* pCPU=pApp->GetSimulatorCPU();
if(pCPU)
{
UNSHORT wData=UNSHORT(pCPU->GetSP());
UNSHORT wData1=UNSHORT(wData+512);
if(m_stackAddr>wData1||m_stackAddr<wData)
{
CString str;
str.Format("the address of stack segment should in %d-%d",wData,wData1);
MessageBox(str);
return;
}
else
{
m_uScrPos=UNSHORT(m_stackAddr-wData);
}
FlushStack();
m_displayStack.SetCurSel(0);
}
}
void CStackDlg::OnCancel()
{
}
void CStackDlg::OnClose()
{
CMainFrame* pFrame=(CMainFrame*)GetParent();
pFrame->SetStackDlg(NULL);
DestroyWindow();
CDialog::OnClose();
}
void CStackDlg::FlushStack()
{
CDFYSimulatorApp* pApp=(CDFYSimulatorApp*)AfxGetApp();
CPU* pCPU=pApp->GetSimulatorCPU();
Memory* pMemory=pApp->GetSimulatorMemory();
if(pCPU)
{
WORD wData=0;
wData=pCPU->GetSP();
m_stackFirstAddr=ChangeToHexStr(UNSHORT(wData));
wData=pCPU->GetGR(4);
m_stackTopAddr=ChangeToHexStr(UNSHORT(wData));
m_displayStack.ResetContent();
UNSHORT uAddr=pCPU->GetSP()+m_uScrPos;
if(pMemory)
{
CString str;
CString str1;
CString str2;
for(int i=0;i<=8;i++)
{
if((uAddr+i)>=(pCPU->GetSP()+512))
break;
str=ChangeToHexStr(uAddr+i);
pMemory->ReadMemory(uAddr+i,wData);
str1=ChangeToHexStr(UNSHORT(wData));
str2.Format("%-10s%20s",str,str1);
m_displayStack.AddString(str2);
}
}
}
UpdateData(FALSE);
}
CString CStackDlg::ChangeToHexStr(UNSHORT wData)
{
CString strData;
if(wData<16)
strData.Format("000%xH",wData);
else if(wData>=16&&wData<256)
strData.Format("00%xH",wData);
else if(wData>=256&&wData<4096)
strData.Format("0%xH",wData);
else
strData.Format("%xH",wData);
strData.MakeUpper();
return strData;
}
BOOL CStackDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_scrStack.SetScrollRange(0,512);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CStackDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
m_uScrPos=pScrollBar->GetScrollPos();
switch(nSBCode)
{
case SB_LINEDOWN:
m_uScrPos+=1;
break;
case SB_LINEUP:
m_uScrPos-=1;
break;
case SB_PAGEDOWN:
m_uScrPos+=8;
break;
case SB_PAGEUP:
m_uScrPos-=8;
break;
case SB_THUMBPOSITION:
m_uScrPos=nPos;
break;
case SB_THUMBTRACK:
m_uScrPos=nPos;
break;
default:
break;
}
if(m_uScrPos>=512)
m_uScrPos=512;
if(m_uScrPos<0)
m_uScrPos=0;
pScrollBar->SetScrollPos(m_uScrPos);
FlushStack();
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -