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

📄 graphicview.cpp

📁 计算机体系结构中,关于DLXS的模拟程序.在vc6.0下编译通过.
💻 CPP
字号:
// GraphicView.cpp : implementation file
//

#include "stdafx.h"
#include "Architecture.h"

#include "Globals.h"
#include "DlxDoc.h"
#include "GraphicView.h"

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

const COLORREF CYAN=RGB(0,255,255);
const COLORREF RED=RGB(255,0,0);
const COLORREF GREEN=RGB(0,255,0);
const COLORREF BLUE=RGB(0,0,255);
const COLORREF WHITE=RGB(255,255,255);
const COLORREF PURPLE=RGB(255,0,255);
const COLORREF YELLOW=RGB(255,255,0);

CPoint Orign = CPoint(125,25);
CString State[MAXSTATE] = {"STALL","IF","ID","EXE","MEM","WB","HALT","IDLE"};
COLORREF Color[MAXSTATE] = {WHITE,CYAN,RED,BLUE,PURPLE,GREEN,YELLOW,WHITE};

void ShowBlock(CDC * pDC,int state,int i,int clock)
{
	if(state != _S_HALT)
	{
		CBrush * brush = new CBrush;
		CRect rect;
		rect.left = clock * BLOCKWIDTH + Orign.x;
		rect.right = rect.left + BLOCKWIDTH;
		rect.top = i * BLOCKLENGTH * 2 + Orign.y;
		rect.bottom = rect.top + BLOCKLENGTH;
		brush->CreateSolidBrush(Color[state]);
		pDC->Rectangle(rect);
		pDC->FillRect(rect,brush);
		pDC->SetTextAlign(TA_CENTER);   
		pDC->SetBkColor(Color[state]);
		pDC->TextOut((rect.left+rect.right)/2,(rect.top+rect.bottom)/2-BLOCKLENGTH/2,State[state]);
		pDC->MoveTo(rect.left,rect.top);
		pDC->LineTo(rect.left,rect.bottom);
		pDC->LineTo(rect.right,rect.bottom);
		pDC->LineTo(rect.right,rect.top);
		delete brush;
	}
}
/////////////////////////////////////////////////////////////////////////////
// CGraphicView

IMPLEMENT_DYNCREATE(CGraphicView, CScrollView)

CGraphicView::CGraphicView()
{
}

CGraphicView::~CGraphicView()
{
}


BEGIN_MESSAGE_MAP(CGraphicView, CScrollView)
	//{{AFX_MSG_MAP(CGraphicView)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGraphicView drawing

void CGraphicView::OnDraw(CDC* pDC)
{
	CDlxDoc* pDoc = (CDlxDoc*)GetDocument();
	ASSERT_VALID(pDoc);
	
	pDC->MoveTo(Orign.x,Orign.y-BLOCKLENGTH);
	pDC->LineTo(Orign.x,Orign.y+800);
	pDC->MoveTo(Orign);
	pDC->LineTo(Orign.x+MAXCLOCK*BLOCKWIDTH+800,Orign.y);
	pDC->TextOut(0,Orign.y-BLOCKLENGTH,"Instruction/Cycle");
	for(int i=0; i < MAXCLOCK; i++)
	{
		CString str;
		str.Format("%d",i+1);
		if(i<pDoc->m_Clock)
			pDC->SetTextColor(RED);		
		pDC->TextOut(Orign.x+i*BLOCKWIDTH+BLOCKWIDTH/2,Orign.y-BLOCKLENGTH,str);
		pDC->SetTextColor(RGB(0,0,0));
		pDC->MoveTo(Orign.x+i*BLOCKWIDTH+BLOCKWIDTH,Orign.y-BLOCKLENGTH/2);
		pDC->LineTo(Orign.x+i*BLOCKWIDTH+BLOCKWIDTH,Orign.y);
	}
	int indent = 0;
	int forward = pDoc->GetForwarding();
	for(i=0; i < pDoc->m_CurInstr; i++)
	{
		Instruction * pInstr = &pDoc->m_Instruction[i];	
		pDC->SetBkColor(WHITE);
		pDC->SetTextAlign(TA_LEFT);   
		pDC->TextOut(0,Orign.y+i*BLOCKLENGTH*2,pInstr->cmdString);
		for(int j=i; pInstr->states[j] == _S_STALL; j++);
		for(; j < pDoc->m_Clock; j++)
		{
			::ShowBlock(pDC,pInstr->states[j],i,j);
			for(int k=0; k < 2; k++)
				if(pInstr->states[j] > _S_STALL && pInstr->states[j] < _S_HALT)
					if(pInstr->forward[pInstr->states[j]-1][k] != CSize(0,0))
					{
						int left,top,right,bottom;
						if(pInstr->states[j]-1 == _S_IF &&
							pDoc->m_Instruction[pInstr->forward[_S_IF][k].cy].states[pInstr->forward[_S_IF][k].cx] == _S_WB)							
						{
							left = Orign.x+pInstr->forward[pInstr->states[j]-1][k].cx*BLOCKWIDTH+BLOCKWIDTH/2;
							right = left;							
						}
						else
						{
							left = Orign.x+pInstr->forward[pInstr->states[j]-1][k].cx*BLOCKWIDTH;
							right = Orign.x+j*BLOCKWIDTH+BLOCKWIDTH/2;
						}
						top = Orign.y+pInstr->forward[pInstr->states[j]-1][k].cy*BLOCKLENGTH*2+BLOCKLENGTH;
						bottom = Orign.y+i*BLOCKLENGTH*2;
						pDC->MoveTo(left,top);
						pDC->LineTo(right,bottom);						
					}
		}
	}
}

/////////////////////////////////////////////////////////////////////////////
// CGraphicView diagnostics

#ifdef _DEBUG
void CGraphicView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CGraphicView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CGraphicView message handlers




void CGraphicView::OnInitialUpdate() 
{
	SetScrollSizes(MM_TEXT,CSize(5000,2000));
}

⌨️ 快捷键说明

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