logo
мой курсач

Приложение в руководство пользователя

Для запуска программы-эмулятора работы микроЭВМ необходимо запустить файл mp80386.exe.

В появившемся окне будет изображена схема разработанной микроЭВМ, включающая в себя ОЗУ, структурную схему гипотетического микропроцессора и шинный интерфейс.

В правой части окна находится панель управления работой программы. Для начала выполнения команд необходимо нажать кнопку “Следующий шаг” (для пошагового выполнения программы) или “Авто”(для автоматической работы программы).

Чтобы начать выполнение программы заново с самого начала, необходимо нажать кнопку “Сброс”.

При нажатии кнопки “О программе” появляется окно с информацией о назначении данного ПП.

Для выхода из программы нужно нажать кнопку “Выход”, либо закрыть окно стандартным способом (нажатием кнопки закрытия в правом верхнем углу окна).

Приложение Г

ЭКРАННЫЕ ФОРМЫ

Рисунок Г.1 – Иллюстрация работы программы

Приложение Д

ЛИСТИНГ ПРОГРАММЫ

// MP80386Dlg.cpp : implementation file

#include "stdafx.h"

#include "MP80386.h"

#include "MP80386Dlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

int i=0;

//////////////////////////////////////////////////////////////////

CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{ //{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{ CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CMP80386Dlg dialog

CMP80386Dlg::CMP80386Dlg(CWnd* pParent /*=NULL*/)

: CDialog(CMP80386Dlg::IDD, pParent)

{ //{{AFX_DATA_INIT(CMP80386Dlg)

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CMP80386Dlg::DoDataExchange(CDataExchange* pDX)

{ CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CMP80386Dlg)

DDX_Control(pDX, IDC_NEXT, m_Next);

DDX_Control(pDX, IDC_AUTO, m_Auto);

DDX_Control(pDX, IDC_RR, m_RR);

DDX_Control(pDX, IDC_RO, m_RO);

DDX_Control(pDX, IDC_RK, m_RK);

DDX_Control(pDX, IDC_OF, m_OF);

DDX_Control(pDX, IDC_EIP, m_EIP);

DDX_Control(pDX, IDC_EBX, m_EBX);

DDX_Control(pDX, IDC_EAX, m_EAX);

DDX_Control(pDX, IDC_DS, m_DS);

DDX_Control(pDX, IDC_CS, m_CS);

DDX_Control(pDX, IDC_CF, m_CF);

DDX_Control(pDX, IDC_BR2, m_BR2);

DDX_Control(pDX, IDC_BR1, m_BR1);

DDX_Control(pDX, IDC_BAD, m_BAD);

DDX_Control(pDX, IDC_TABLE_CS, m_TABLE_CS);

//}}AFX_DATA_MAP}

BEGIN_MESSAGE_MAP(CMP80386Dlg, CDialog)

//{{AFX_MSG_MAP(CMP80386Dlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_RESET, OnReset)

ON_BN_CLICKED(IDCLOSE, OnClose)

ON_BN_CLICKED(IDC_INFO, OnInfo)

ON_BN_CLICKED(IDC_NEXT, OnNext)

ON_BN_CLICKED(IDC_AUTO, OnAuto)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

////////////////////////////////////////////////////////

// CMP80386Dlg message handlers

BOOL CMP80386Dlg::OnInitDialog()

{ CDialog::OnInitDialog();

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{ CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{ pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}}

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

return TRUE; // return TRUE unless you set the focus to a control

}

void CMP80386Dlg::OnSysCommand(UINT nID, LPARAM lParam)

{ if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{ CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

CDialog::OnSysCommand(nID, lParam);

UpdateData(FALSE);

}

void CMP80386Dlg::OnPaint()

{ if (IsIconic())

{ CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{ OnReset();

CDialog::OnPaint();

}}

HCURSOR CMP80386Dlg::OnQueryDragIcon()

{ return (HCURSOR) m_hIcon;

}

void CMP80386Dlg::OnReset()

{ int l;

int j=0;

CString str = "";

i=1;

for(l=1;l<8;l++)

DrawLine(l, false, 2);

for(l=8;l<29;l++)

DrawLine(l, false, 1);

m_TABLE_CS.DeleteAllItems();

m_TABLE_CS.DeleteColumn(0);

m_TABLE_CS.DeleteColumn(0);

m_TABLE_CS.DeleteColumn(0);

m_TABLE_CS.SetExtendedStyle(m_TABLE_CS.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

m_TABLE_CS.InsertColumn(0,"addr",LVCFMT_LEFT,40);

m_TABLE_CS.InsertColumn(1,"data",LVCFMT_LEFT,60);

m_TABLE_CS.InsertColumn(2,"value",LVCFMT_LEFT,70);

m_TABLE_CS.InsertItem(0,"1000");

m_TABLE_CS.SetItem(0,1,LVIF_TEXT,"82C0",0,0,0,0);

m_TABLE_CS.SetItem(0,2,LVIF_TEXT,"ADD AL,8D",0,0,0,0);

m_TABLE_CS.InsertItem(1,"1000");

m_TABLE_CS.SetItem(1,1,LVIF_TEXT,"",0,0,0,0);

m_TABLE_CS.SetItem(1,2,LVIF_TEXT,"label:",0,0,0,0);

m_TABLE_CS.InsertItem(2,"1002");

m_TABLE_CS.SetItem(2,1,LVIF_TEXT,"88C1",0,0,0,0);

m_TABLE_CS.SetItem(2,2,LVIF_TEXT,"MOV AL,BL",0,0,0,0);

m_TABLE_CS.InsertItem(3,"1004");

m_TABLE_CS.SetItem(3,1,LVIF_TEXT,"EBFFFC",0,0,0,0);

m_TABLE_CS.SetItem(3,2,LVIF_TEXT,"JMP label",0,0,0,0);

for (l=0x1007;l<0x1012;l++)

{ j++;

str.Format("%X",l);

m_TABLE_CS.InsertItem(3+j,str);

m_TABLE_CS.SetItem(3+j,1,LVIF_TEXT,"90",0,0,0,0);

m_TABLE_CS.SetItem(3+j,2,LVIF_TEXT,"NOP",0,0,0,0);

}

m_BR1.ResetContent();

m_BR2.ResetContent();

m_RR.ResetContent();

m_BAD.ResetContent();

m_RO.ResetContent();

m_OF.ResetContent();

m_OF.InsertString(0,"0");

m_CF.ResetContent();

m_CF.InsertString(0,"0");

m_EAX.ResetContent();

m_EAX.InsertString(0,"F018");

m_EBX.ResetContent();

m_EBX.InsertString(0,"18B2");

m_EIP.ResetContent();

m_EIP.InsertString(0,"0000");

m_CS.ResetContent();

m_CS.InsertString(0,"0100");

m_DS.ResetContent();

m_DS.InsertString(0,"0900");

m_RK.ResetContent();

m_RK.InsertString(0,"ADD AL,8D");

}

void CMP80386Dlg::Triang(int left,int top,int trend,bool On)

{ POINT p[]={{left-7,top-3},{left,top},{left-7,top+3}};//влево

POINT p2[]={{left,top},{left+7,top-3},{left+7,top+3}};//вправо

POINT p3[]={{left,top},{left+3,top+7},{left-3,top+7}};//вверх

POINT p4[]={{left,top},{left+3,top-7},{left-3,top-7}};//вниз

CClientDC dc(this);

CPen Pen;

CBrush Brush;

CBrush* oldbrush;

CPen* oldpen;

if (On)

{ Pen.CreatePen(PS_SOLID, 1, RGB(200,0,0));

Brush.CreateSolidBrush(RGB(200,0,0));

}

else

{ Pen.CreatePen(PS_SOLID, 1, RGB(0,0,0));

Brush.CreateSolidBrush(RGB(0,0,0));

}

oldpen=dc.SelectObject(&Pen);

oldbrush=dc.SelectObject(&Brush);

dc.SetBkMode(TRANSPARENT);

switch (trend)

{ case 1:dc.Polygon (p,3);

break;

case 2:dc.Polygon (p2,3);

break;

case 3:dc.Polygon (p3,3);

break;

case 4:dc.Polygon (p4,3);

break;

}

dc.SelectObject(oldpen);

Pen.DeleteObject();

dc.SelectObject(oldbrush);

Brush.DeleteObject();

}

void CMP80386Dlg::DrawLine(int name, bool status, int thickness)

{ POINT ps1[]={{30,360},{493,360}};// Шина А

POINT ps2[]={{30,140},{493,140}};// Шина С

POINT ps3[]={{30,30},{580,30}};// ША

POINT ps4[]={{30,50},{580,50}};// ШУ

POINT ps5[]={{30,70},{580,70}};// ШД

POINT ps6[]={{515,85},{525,70},{535,85},{530,85},{530,100}, {535,100},{525,113},{515,100},{520,100},{520,85},{516,85}};//Ш-УУ

POINT ps7[]={{60,70},{60,88}};//Ш-БАД

POINT py1[]={{432,500},{495,500}};// МУУ-УУ

POINT py2[]={{352,500},{265,500},{265,476}};//АЛУ-МУУ

POINT py3[]={{420,486},{420,466}};//МУУ-РФ

POINT py4[]={{380,486},{380,360}};//шинаА-МУУ

POINT py5[]={{215,475},{215,500}};//АЛУ-РР

POINT py6[]={{200,425},{200,443}};//BR1-АЛУ

POINT py7[]={{270,425},{270,443}};//BR2-АЛУ

POINT py8[]={{200,360},{200,405}};//шинаА-BR1

POINT py9[]={{275,360},{275,405}};//шинаА-BR2

POINT py10[]={{215,520},{215,530},{150,530},{150,360}};//РР-шинаА

POINT py11[]={{50,360},{50,405}};//шинаА-Регистры

POINT py12[]={{50,358},{50,326}};//шинаА-РО

POINT py13[]={{270,358},{270,326}};//шинаА-РК

POINT py14[]={{400,358},{400,140}};//шинаА-шинаС

POINT py15[]={{270,305},{270,140}};//шинаС-РК

POINT py16[]={{50,276},{50,307}};//сегменты-РО

POINT py17[]={{50,193},{50,210}};//СФА-сегменты

POINT py18[]={{90,193},{90,210}};//СФА-сегменты(2)

POINT py19[]={{90,202},{190,202},{190,140}};//СФА-сегменты-шинаС

POINT py20[]={{60,138},{60,110}};//шинаС-БАД

POINT py21[]={{60,163},{60,140}};//СФА-шинаС

CPen Pen;

CBrush Brush;

CPen* oldpen;

CBrush* oldbrush;

CClientDC dc(this);

if (status)

{ Pen.CreatePen(PS_SOLID, thickness, RGB(200,0,0));

Brush.CreateSolidBrush(RGB(200,0,0));

}

else

{ Pen.CreatePen(PS_SOLID, thickness, RGB(0,0,0));

Brush.CreateSolidBrush(RGB(0,0,0));

}

oldpen=dc.SelectObject(&Pen);

oldbrush=dc.SelectObject(&Brush);

if (name == 1)

dc.Polyline(ps1,2);//шинаА

if (name == 2)

dc.Polyline(ps2,2);//шинаС

if (name == 3)

dc.Polyline(ps3,2); //ША

if (name == 4)

dc.Polyline(ps4,2); //ШУ

if (name == 5)

dc.Polyline(ps5,2); //ШД

if (name == 6)

dc.Polyline(ps6,11); //УУ-Ш

if (name == 7)

{ dc.Polyline(ps7,2); //БАД-Ш

Triang(60,70, 3, status);

Triang(60, 88, 4, status);

}

if (name == 8)

{ dc.Polyline(py1,2); // МУУ-УУ

Triang(432,500, 2, status);

Triang(495, 500, 1, status);

}

if (name == 9)

{ dc.Polyline(py2,3); //АЛУ-МУУ

Triang(352, 500, 1, status);

Triang(265, 476, 3, status);

}

if (name == 10)

{ dc.Polyline(py3,2); //МУУ-РФ

Triang(420,486, 4, status);

Triang(420, 466, 3, status);

}

if (name == 11)

{ dc.Polyline(py4,2);//шинаА-МУУ

Triang(380,360, 3, status);

Triang(380, 486, 4, status);

}

if (name == 12)

{ dc.Polyline(py5,2);//АЛУ-РР

Triang(215,500, 4, status);

}

if (name == 13)

{ dc.Polyline(py6,2); //BR1-АЛУ

Triang(200,443, 4, status);

}

if (name == 14)

{ dc.Polyline(py7,2); //BR1-АЛУ

Triang(270,443, 4, status);

}

if (name == 15)

{ dc.Polyline(py8,2);//шинаА-BR1

Triang(200,405, 4, status);

}

if (name == 16)

{ dc.Polyline(py9,2);//шинаА-BR2

Triang(275,405, 4, status);

}

if (name == 17)

{ dc.Polyline(py10,4);//РР-шинаА

Triang(150,360, 3, status);

}

if (name == 18)

{ dc.Polyline(py11,2);//шинаА-Регистры

Triang(50,360, 3, status);

Triang(50,405, 4, status);

}

if (name == 19)

{ dc.Polyline(py12,2);//шинаА-РО

Triang(50,326, 3, status);

Triang(50,358, 4, status);

}

if (name == 20)

{ dc.Polyline(py13,2);//шинаА-РК

Triang(270,358, 4, status);

}

if (name == 21)

{ dc.Polyline(py14,2);//шинаА-шинаС

Triang(400,140, 3, status);

Triang(400,358, 4, status);

}

if (name == 22)

{ dc.Polyline(py15,2);//шинаС-РК

Triang(270,305, 4, status);

}

if (name == 23)

{ dc.Polyline(py16,2);//сегменты-РО

Triang(50,307, 4, status);

Triang(50,276, 3, status);

}

if (name == 24)

{ dc.Polyline(py17,2);//СФА-сегменты

Triang(50,192, 3, status);

}

if (name == 25)

{ dc.Polyline(py18,2);//СФА-сегменты(2)

Triang(90,192, 3, status);

Triang(90,212, 4, status);

}

if (name == 26)

dc.Polyline(py19,3);//СФА-сегменты-шинаС

if (name == 27)

{ dc.Polyline(py20,2);//шинаС-БАД

Triang(60,110, 3, status);

Triang(60,138, 4, status);

}

if (name == 28)

{ dc.Polyline(py21,2);//СФА-шинаС

Triang(60,140, 3, status);

}

dc.SelectObject(oldpen);

Pen.DeleteObject();

dc.SelectObject(oldbrush);

Brush.DeleteObject();

}

void CMP80386Dlg::Msg(LPCTSTR txt)

{ CPen Pen(PS_SOLID, 1, RGB(212,208,200));

CBrush Brush(RGB(212,208,200));

CClientDC dc(this);

dc.SelectObject(Pen);

dc.SelectObject(Brush);

dc.SetBkColor(RGB(212,208,200));

dc.Rectangle(20,560,750,580);

dc.TextOut(20, 560, txt);

}

void CMP80386Dlg::MicroOperations(int step)

{ CString str,str2;

switch(step)

{ //ADD AL,

case 1:

{ Msg("В УУ подается сигнал о выполнении команды");

DrawLine(20,true,1);

DrawLine(1,true,2);

break;}

case 2:

{ DrawLine(20,false,1);

Msg("УУ подает сигнал чтения из регистра EAX");

DrawLine(18,true,1);

break;}

case 3:

{ DrawLine(18,false,1);

Msg("Считывание регистра AL и запись его в буферный регистр BR1");

m_EAX.GetText(0, str.GetBuffer(5));

m_BR1.ResetContent();

str.ReleaseBuffer();

m_BR1.InsertString(0,str.Right(2));

DrawLine(15,true,1);

break;}

case 4:

{ DrawLine(15,false,1);

Msg("Считывание непосредственного операнда из РК и запись его в буферный регистр BR2");

m_BR2.ResetContent();

m_BR2.InsertString(0,"8D");

DrawLine(16,true,1);

break;}

case 5:

{ DrawLine(1,false,2);

DrawLine(16,false,1);

Msg("УУ передает управление МУУ");

DrawLine(8,true,1);

break;}

case 6:

{ DrawLine(8,false,1);

Msg("МУУ подает сигнал АЛУ на выполнение операции. Выполнение операции");

DrawLine(9,true,1);

DrawLine(13,true,1);

DrawLine(14,true,1);

break;}

case 7:

{ DrawLine(13,false,1);

DrawLine(14,false,1);

Msg("АЛУ подает сигнал МУУ установить флаги. МУУ устанавливает флаги");

DrawLine(10,true,1);

break;}

case 8:

{ DrawLine(9,false,1);

DrawLine(13,false,1);

DrawLine(14,false,1);

DrawLine(10,false,1);

Msg("Запись результата в РР и выдача его на шину А");

m_RR.ResetContent();

m_RR.InsertString(0,"00A5");

DrawLine(12,true,1);

DrawLine(17,true,1);

DrawLine(1,true,2);

break;}

case 9:

{ DrawLine(12,false,1);

DrawLine(17,false,1);

Msg("Запись результата из РР в AL");

m_RR.GetText(0, str.GetBuffer(5));

str.ReleaseBuffer();

m_EAX.GetText(0, str2.GetBuffer(5));

str2.ReleaseBuffer();

m_EAX.ResetContent();

m_EAX.InsertString(0,str2.Left(2)+str.Right(2));

DrawLine(18,true,1);

break;}

//Наращивание EIP

case 10:

{ DrawLine(1,false,2);

DrawLine(18,false,1);

Msg("Выдача EIP в регистр обмена(РО)");

m_EIP.GetText(0, str.GetBuffer(5));

m_RO.ResetContent();

str.ReleaseBuffer();

m_RO.InsertString(0,str);

DrawLine(23,true,1);

break;}

case 11:

{ DrawLine(23,false,1);

Msg("Выдача регистра обмена(РО) через шину А в BR1");

m_RO.GetText(0, str.GetBuffer(5));

m_BR1.ResetContent();

str.ReleaseBuffer();

m_BR1.InsertString(0,str);

DrawLine(1,true,2);

DrawLine(19,true,1);

DrawLine(15,true,1);

break;}

case 12:

{ DrawLine(19,false,1);

DrawLine(15,false,1);

Msg("УУ посылает значение в BR2 (размер команды)");

m_BR2.ResetContent();

m_BR2.InsertString(0,"0002");

DrawLine(16,true,1);

break;}

case 13:

{ DrawLine(19,false,1);

DrawLine(15,false,1);

DrawLine(1,false,2);

DrawLine(16,false,1);

Msg("УУ передает управление МУУ");

DrawLine(8,true,1);

break;}

case 14:

{ DrawLine(8,false,1);

DrawLine(1,false,2);

Msg("МУУ подает сигнал АЛУ на выполнение сложения. АЛУ работает и помещает результат в РР");

m_RR.ResetContent();

m_RR.InsertString(0,"0002");

DrawLine(12,true,1);

break;}

case 15:

{ DrawLine(12,false,1);

Msg("Запись результата из РР В EIP через шину А и РО");

m_RR.GetText(0, str.GetBuffer(5));

m_RO.ResetContent();

m_EIP.ResetContent();

str.ReleaseBuffer();

m_RO.InsertString(0,str);

m_EIP.InsertString(0,str);

DrawLine(1,true,2);

DrawLine(17,true,1);

DrawLine(19,true,1);

DrawLine(23,true,1);

break;}

//Выбор следующей команды

case 16:

{ DrawLine(1,false,2);

DrawLine(17,false,1);

DrawLine(19,false,1);

DrawLine(23,false,1);

Msg("CS и EIP подаются СФА для формирования физического адреса команды");

DrawLine(24,true,1);

DrawLine(25,true,1);

break;}

case 17:

{ DrawLine(17,false,1);

DrawLine(19,false,1);

DrawLine(23,false,1);

DrawLine(24,false,1);

DrawLine(25,false,1);

Msg("Сформированный адрес подается в БАД (буфер адреса данных)");

m_BAD.ResetContent();

m_BAD.InsertString(0,"1002");

DrawLine(2,true,2);

DrawLine(27,true,1);

break;}

case 18:

{ DrawLine(2,false,2);

DrawLine(27,false,1);

Msg("Выдача полученного адреса на шину адреса");

DrawLine(7,true,2);

DrawLine(3,true,2);

break;}

case 19:

{ DrawLine(7,false,2);

DrawLine(3,false,2);

Msg("УУ посылает сигнал чтения на шину управления");

DrawLine(6,true,2);

DrawLine(4,true,2);

break;}

case 20:

{ DrawLine(6,false,2);

DrawLine(4,false,2);

Msg("Чтение данных из оперативной памяти");

// m_TABLE_CS.SetSelectedColumn(2);

break;}

case 21:

{ m_TABLE_CS.Update(2);

Msg("На УУ посылается сигнал завершения работы ОП, выдача данных через шину данных и шину С в РК");

m_RK.ResetContent();

m_RK.InsertString(0,m_TABLE_CS.GetItemText(2,2));

DrawLine(6,true,2);

DrawLine(5,true,2);

DrawLine(2,true,2);

DrawLine(22,true,1);

break;}

//Выполнение MOV AL,BL

case 22:

{ DrawLine(6,false,2);

DrawLine(5,false,2);

DrawLine(2,false,2);

DrawLine(22,false,1);

Msg("В УУ подается сигнал о выполнении команды");

DrawLine(20,true,1);

DrawLine(1,true,2);

break;}

case 23:

{ DrawLine(20,false,1);

Msg("УУ подает сигнал чтения из регистра EBX");

DrawLine(18,true,1);

break;}

case 24:

{ Msg("Считывание регистра EBX(BL) и УУ подает сигнал записи его в регистр EAX(AL)");

m_EBX.GetText(0, str.GetBuffer(5));

str.ReleaseBuffer();

m_EAX.GetText(0, str2.GetBuffer(5));

str2.ReleaseBuffer();

m_EAX.ResetContent();

m_EAX.InsertString(0,str2.Left(2)+str.Right(2));

break;}

//Наращивание EIP

case 25:

{ DrawLine(1,false,2);

DrawLine(18,false,1);

Msg("Выдача EIP в регистр обмена(РО)");

m_EIP.GetText(0, str.GetBuffer(5));

m_RO.ResetContent();

str.ReleaseBuffer();

m_RO.InsertString(0,str);

DrawLine(23,true,1);

break;}

case 26:

{ DrawLine(23,false,1);

Msg("Выдача регистра обмена(РО) через шину А в BR1");

m_RO.GetText(0, str.GetBuffer(5));

m_BR1.ResetContent();

str.ReleaseBuffer();

m_BR1.InsertString(0,str);

DrawLine(1,true,2);

DrawLine(19,true,1);

DrawLine(15,true,1);

break;}

case 27:

{ DrawLine(19,false,1);

DrawLine(15,false,1);

Msg("УУ посылает значение в BR2 (размер команды)");

m_BR2.ResetContent();

m_BR2.InsertString(0,"0002");

DrawLine(16,true,1);

break;}

case 28:

{ DrawLine(19,false,1);

DrawLine(15,false,1);

DrawLine(1,false,2);

DrawLine(16,false,1);

Msg("УУ передает управление МУУ");

DrawLine(8,true,1);

break;}

case 29:

{ DrawLine(8,false,1);

DrawLine(1,false,2);

Msg("МУУ подает сигнал АЛУ на выполнение сложения. АЛУ работает и помещает результат в РР");

m_RR.ResetContent();

m_RR.InsertString(0,"0004");

DrawLine(12,true,1);

break;}

case 30:

{ DrawLine(12,false,1);

Msg("Запись результата из РР В EIP через шину А и РО");

m_RR.GetText(0, str.GetBuffer(5));

m_RO.ResetContent();

m_EIP.ResetContent();

str.ReleaseBuffer();

m_RO.InsertString(0,str);

m_EIP.InsertString(0,str);

DrawLine(1,true,2);

DrawLine(17,true,1);

DrawLine(19,true,1);

DrawLine(23,true,1);

break;}

//Выбор следующей команды

case 31:

{ DrawLine(1,false,2);

DrawLine(17,false,1);

DrawLine(19,false,1);

DrawLine(23,false,1);

Msg("CS и EIP подаются СФА для формирования физического адреса команды");

DrawLine(24,true,1);

DrawLine(25,true,1);

break;}

case 32:

{ DrawLine(17,false,1);

DrawLine(19,false,1);

DrawLine(23,false,1);

DrawLine(24,false,1);

DrawLine(25,false,1);

Msg("Сформированный адрес подается в БАД (буфер адреса данных)");

m_BAD.ResetContent();

m_BAD.InsertString(0,"1004");

DrawLine(2,true,2);

DrawLine(27,true,1);

break;}

case 33:

{ DrawLine(2,false,2);

DrawLine(27,false,1);

Msg("Выдача полученного адреса на шину адреса");

DrawLine(7,true,2);

DrawLine(3,true,2);

break;}

case 34:

{ DrawLine(7,false,2);

DrawLine(3,false,2);

Msg("УУ посылает сигнал чтения на шину управления");

DrawLine(6,true,2);

DrawLine(4,true,2);

break;}

case 35:

{ DrawLine(6,false,2);

DrawLine(4,false,2);

Msg("Чтение данных из оперативной памяти");

break;}

case 36:

{ Msg("На УУ посылается сигнал завершения работы ОП, выдача данных через шину данных и шину С в РК");

m_RK.ResetContent();

m_RK.InsertString(0,m_TABLE_CS.GetItemText(3,2));

DrawLine(6,true,2);

DrawLine(5,true,2);

DrawLine(2,true,2);

DrawLine(22,true,1);

break;}

//Выполнение JMP label

case 37:

{ DrawLine(6,false,2);

DrawLine(5,false,2);

DrawLine(2,false,2);

DrawLine(22,false,1);

Msg("В УУ подается сигнал о выполнении команды");

DrawLine(20,true,1);

DrawLine(1,true,2);

break;}

case 38:

{ DrawLine(1,false,2);

DrawLine(20,false,1);

Msg("Выдача EIP в регистр обмена(РО)");

m_EIP.GetText(0, str.GetBuffer(5));

m_RO.ResetContent();

str.ReleaseBuffer();

m_RO.InsertString(0,str);

DrawLine(23,true,1);

break;}

case 39:

{ DrawLine(23,false,1);

Msg("Выдача регистра обмена(РО) через шину А в BR1");

m_RO.GetText(0, str.GetBuffer(5));

m_BR1.ResetContent();

str.ReleaseBuffer();

m_BR1.InsertString(0,str);

DrawLine(1,true,2);

DrawLine(19,true,1);

DrawLine(15,true,1);

break;}

case 40:

{ DrawLine(19,false,1);

DrawLine(15,false,1);

Msg("Пересылка размера перехода из РК в BR2");

m_BR2.ResetContent();

m_BR2.InsertString(0,"FFFC");

DrawLine(20,true,1);

DrawLine(16,true,1);

break;}

case 41:

{ DrawLine(19,false,1);

DrawLine(15,false,1);

DrawLine(1,false,2);

DrawLine(16,false,1);

DrawLine(20,false,1);

Msg("УУ передает управление МУУ");

DrawLine(8,true,1);

break;}

case 42:

{ DrawLine(8,false,1);

DrawLine(1,false,2);

Msg("МУУ подает сигнал АЛУ на выполнение сложения. АЛУ работает и помещает результат в РР");

m_RR.ResetContent();

m_RR.InsertString(0,"0000");

DrawLine(12,true,1);

break;}

case 43:

{ DrawLine(12,false,1);

Msg("Запись результата из РР В EIP через шину А и РО");

m_RR.GetText(0, str.GetBuffer(5));

m_RO.ResetContent();

m_EIP.ResetContent();

str.ReleaseBuffer();

m_RO.InsertString(0,str);

m_EIP.InsertString(0,str);

DrawLine(1,true,2);

DrawLine(17,true,1);

DrawLine(19,true,1);

DrawLine(23,true,1);

break;}

case 44:

{ DrawLine(1,false,2);

DrawLine(17,false,1);

DrawLine(19,false,1);

DrawLine(23,false,1);

Msg("Дальнейшая работа...");

}}

}

void CMP80386Dlg::OnClose()

{ OnOK();}

void CMP80386Dlg::OnInfo()

{ CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

void CMP80386Dlg::OnNext()

{

MicroOperations(i);

if(i<45) i++;

}

void CMP80386Dlg::OnAuto()

{

int j;

m_Next.EnableWindow(FALSE);

m_Auto.EnableWindow(FALSE);

for (j=i;j<45;j++)

{ MicroOperations(j);

Sleep(800);

}

m_Next.EnableWindow(TRUE);

m_Auto.EnableWindow(TRUE);

i=44;

}