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

📄 stackdlg.cpp

📁 这个也是我们的毕业设计课题
💻 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 + -