Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КП_2007.doc
Скачиваний:
3
Добавлен:
16.09.2019
Размер:
1.02 Mб
Скачать

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

Для запуска программы эмуляции выполнения гипотетическим микропроцессором команд INC, MOV, JMP необходимо скопировать файл Emulator.exe в любой каталог на жестком диске и запустить данный файл. Будет проведена распаковка файла Emulator.exe. Далее следует запустить файл Emulator.exe на выполнение.

В программе эмуляции предусмотрены режимы непрерывного и пошагового выполнения

Для запуска демонстрации в непрерывном режиме, нажмите радио-кнопку «Авто». Для остановки процесса надо нажать «По шагам». И далее выполнять программу по действиям, используя «Далее». Для пошагового просмотра выполнения команд используется кнопка «По шагам».

При каждом шаге на элементах, которые участвуют в шаге, отображается значок, при наведении на него всплывает подсказка, что в данный момент происходит с элементом.

Приложение г

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

Рисунок Г.1 – Программа после запуска

Рисунок Г.2 - Программа в стадии выполнения

Приложение Д

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

unit Main;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, RXCtrls, ExtCtrls, jpeg, ComCtrls, Buttons, ImgList;

type

TMainForm = class(TForm)

Image1: TImage;

busA: TShape;

crd_busA2UO: TShape;

RxLabel1: TRxLabel;

RxLabel2: TRxLabel;

BH: TEdit;

BL: TEdit;

RxLabel20: TRxLabel;

CH: TEdit;

CL: TEdit;

DH: TEdit;

DL: TEdit;

RxLabel21: TRxLabel;

RxLabel22: TRxLabel;

AH: TEdit;

AL: TEdit;

UUSShape: TShape;

UUS: TRxLabel;

RxLabel24: TRxLabel;

CS: TEdit;

RxLabel25: TRxLabel;

DS: TEdit;

RxLabel26: TRxLabel;

IP: TEdit;

Image3: TImage;

RxLabel27: TRxLabel;

PO: TEdit;

SFA: TRxLabel;

crd_busA2PO: TShape;

crd_PO2US: TShape;

BADShape: TShape;

BAD: TRxLabel;

crd_US2SFA2: TShape;

crd_US2SFA1: TShape;

crd_SFA2busC: TShape;

crd_BAD2BUS: TShape;

crd_busC2BAD: TShape;

busC: TShape;

busAddress: TShape;

busData: TShape;

busControl: TShape;

crd_UUS2BUS: TShape;

crd_busA2busC: TShape;

crd_busC2PK: TShape;

PK: TEdit;

RxLabel4: TRxLabel;

crd_PK2busA: TShape;

Image2: TImage;

BR1: TEdit;

RxLabel5: TRxLabel;

RxLabel6: TRxLabel;

BR2: TEdit;

ALUImg: TImage;

ALU: TRxLabel;

crd_BR12ALU: TShape;

crd_BR22ALU: TShape;

BRR: TEdit;

RxLabel8: TRxLabel;

crd_ALU2BRR: TShape;

crd_BRR2busA1: TShape;

crd_fastSFA1: TShape;

crd_fastSFA2: TShape;

crd_BRR2busA2: TShape;

crd_busA2BR1: TShape;

crd_busA2BR2: TShape;

MUUShape: TShape;

MUU: TRxLabel;

crd_UUS2MUU: TShape;

crd_MUU2ALU: TShape;

RxLabel10: TRxLabel;

RxLabel11: TRxLabel;

RxLabel12: TRxLabel;

RxLabel13: TRxLabel;

RxLabel14: TRxLabel;

DataSeg: TListView;

RxLabel15: TRxLabel;

RxLabel16: TRxLabel;

CodeSeg: TListView;

RxLabel17: TRxLabel;

RxLabel18: TRxLabel;

Bevel1: TBevel;

RxLabel19: TRxLabel;

AutoButton: TSpeedButton;

SteppingButton: TSpeedButton;

Bevel2: TBevel;

RxLabel29: TRxLabel;

Bevel3: TBevel;

ScrollBar: TScrollBar;

RxLabel30: TRxLabel;

RxLabel31: TRxLabel;

CLK: TTimer;

PA: TEdit;

RxLabel32: TRxLabel;

RxLabel33: TRxLabel;

PD: TEdit;

crd_BUS2PA: TShape;

crd_BUS2PD: TShape;

crd_CLK: TShape;

RxLabel34: TRxLabel;

RxLabel35: TRxLabel;

crd_BE0: TShape;

Image6: TImage;

Image7: TImage;

RxLabel36: TRxLabel;

crd_BE1: TShape;

RxLabel37: TRxLabel;

crd_WR: TShape;

RxLabel38: TRxLabel;

crd_MIO: TShape;

RxLabel39: TRxLabel;

crd_TEST: TShape;

RxLabel40: TRxLabel;

_CF: TEdit;

RxLabel41: TRxLabel;

_OF: TEdit;

TraceButton: TBitBtn;

ImageList: TImageList;

SFAImg: TImage;

SFATip: TImage;

BADTip: TImage;

ALUTip: TImage;

MUUTip: TImage;

UUSTip: TImage;

MUUOZUShape: TShape;

MUUOZU: TRxLabel;

MUUOZUTip: TImage;

crd_PA2MUUOZU: TShape;

crd_PD2MUUOZU: TShape;

crd_MUUOZU2CS: TShape;

crd_MUUOZU2DS: TShape;

crd_BUS2MUUOZU: TShape;

procedure ModeClick(Sender: TObject);

procedure ROM(Sender: TObject);

function ForGetCommand(): Boolean;

function ForMovTimer(): Boolean;

function ForIncTimer(): Boolean;

function ForJmpTimer(): Boolean;

procedure ScrollBarChange(Sender: TObject);

procedure CLKTimer(Sender: TObject);

procedure OffInternalSignals;

procedure OnSignal(crd: TShape);

procedure OffSignal(crd: TShape);

procedure OnRegister(reg: TEdit);

procedure OffRegister(reg: TEdit);

procedure OnSpecBlock(block: TRxLabel; hint: String);

procedure OffSpecBlock(block: TRxLabel);

procedure TraceButtonClick(Sender: TObject);

function GetCommand(Step: Integer): Boolean;

function Mov(Step: Integer): Boolean;

function Inc(Step: Integer): Boolean;

function Jmp(Step: Integer): Boolean;

private

{ Private declarations }

public

{ Public declarations }

end;

var

MainForm: TMainForm;

implementation

{$R *.DFM}

type

TCommand = (cmdNull, cmdMov, cmdInc, cmdJmp);

var

Command: TCommand;

Step: Integer;

TestMode: Boolean;

Done: Boolean;

function HexToInt(AHex: String): Integer;

const

Digits = ['A'..'F', 'a'..'f', '0'..'9'];

BigLetters = ['A'..'F'];

SmallLetters = ['a'..'f'];

Decimal = ['0'..'9'];

var

Value, Power: Longint;

i: Integer;

begin

Value := 0;

Power := 1;

for i := Length(AHex) downto 1 do

begin

if not (AHex[i] in Digits) then

begin

Value := -1;

break;

end

else

begin

if AHex[i] in BigLetters then

Inc(Value, (ord(AHex[i]) - ord('A') + 10) * Power);

if AHex[i] in SmallLetters then

Inc(Value, (ord(AHex[i]) - ord('a') + 10) * Power);

if AHex[i] in Decimal then

Inc(Value, (ord(AHex[i]) - ord('0')) * Power);

Power := Power * 16;

end;

end;

Result := Value;

end;

procedure TMainForm.ModeClick(Sender: TObject);

begin

TestMode := (Sender = SteppingButton);

TraceButton.Enabled := TestMode;

CLK.Enabled := not TestMode;

if TestMode then OffSignal(crd_TEST)

else OnSignal(crd_TEST);

end;

procedure TMainForm.ROM(Sender: TObject);

begin

Command := cmdNull;

Done := False;

Step := 1;

DL.Text := '40';

DH.Text := 'FF';

AL.Text := '20';

CS.Text := '0200';

DS.Text := '0800';

DataSeg.Items.Add;

DataSeg.Items[0].Caption := '08005';

DataSeg.Items[0].SubItems.Add('00');

with CodeSeg do

begin

Items.Add;

Items[0].Caption := '02000';

Items[0].SubItems.Add('MOV AX,DX');

Items.Add;

Items[1].Caption := '02002';

Items[1].SubItems.Add('INC AX');

Items.Add;

Items[2].Caption := '02004';

Items[2].SubItems.Add('JMP FC');

end;

end;

procedure TMainForm.ScrollBarChange(Sender: TObject);

begin

CLK.Interval := ScrollBar.Position + 500;

end;

procedure TMainForm.CLKTimer(Sender: TObject);

begin

crd_CLK.Brush.Color := clGreen;

if Done then OffInternalSignals;

case Command of

cmdNull: Done := ForGetCommand;

cmdMov: Done := ForMovTimer; //MOV AX,DX

cmdInc: Done := ForIncTimer; //INC AX

cmdJmp: Done := ForJmpTimer; //JMP FC

end; {case}

if not Done then Step := Step + 1

else Step := 1;

crd_CLK.Brush.Color := clNavy;

end;

function TMainForm.ForGetCommand(): Boolean;

begin

Result := GetCommand(Step);

end;

procedure TMainForm.OffInternalSignals;

var

i: Integer;

begin

for i := 0 to ComponentCount-1 do

begin

if (Components[i] is TShape) and (Components[i].Tag = 0) then

OffSignal(Components[i] as TShape);

if (Components[i] is TEdit) then

OffRegister(Components[i] as TEdit);

end;

OffSpecBlock(SFA);

OffSpecBlock(BAD);

OffSpecBlock(MUU);

OffSpecBlock(ALU);

OffSpecBlock(UUS);

OffSpecBlock(MUUOZU);

end;

procedure TMainForm.OffSignal(crd: TShape);

begin

crd.Brush.Color := clNavy;

end;

procedure TMainForm.OffRegister(reg: TEdit);

begin

reg.Font.Color := clNavy;

end;

procedure TMainForm.OnRegister(reg: TEdit);

begin

reg.Font.Color := clGreen;

end;

procedure TMainForm.OnSignal(crd: TShape);

begin

crd.Brush.Color := clGreen;

end;

procedure TMainForm.TraceButtonClick(Sender: TObject);

begin

CLK.OnTimer(nil);

end;

function TMainForm.ForIncTimer: Boolean;

begin

Result := Inc(Step);

end;

function TMainForm.ForJmpTimer: Boolean;

begin

Result := Jmp(Step);

end;

function TMainForm.ForMovTimer: Boolean;

begin

Result := Mov(Step);

end;

function TMainForm.GetCommand(Step: Integer): Boolean;

begin

case Step of

1: begin

if TCommand(HexToInt(IP.Text) div 2 + 1) = cmdMov then

begin

CodeSeg.Items[0].ImageIndex := 0;

CodeSeg.Items[1].ImageIndex := 0;

CodeSeg.Items[2].ImageIndex := 0;

end;

OnSpecBlock(UUS, 'УУиС подает сигнал на формирование физического адреса в СФА');

OnRegister(IP);

OnRegister(CS);

OnSignal(crd_US2SFA1);

OnSignal(crd_US2SFA2);

OnSpecBlock(SFA, IntToHex(HexToInt(CS.Text)*16 + HexToInt(IP.Text), 5));

Result := False;

end;

2: begin

OnSpecBlock(UUS, 'Запись адреса из СФА в БАД');

OffRegister(IP);

OffRegister(CS);

OffSignal(crd_US2SFA1);

OffSignal(crd_US2SFA2);

OnSignal(crd_SFA2busC);

OnSignal(busC);

OnSignal(crd_busC2BAD);

OnSpecBlock(BAD, IntToHex(HexToInt(CS.Text)*16 + HexToInt(IP.Text), 5));

Result := False;

end;

3: begin

OnSpecBlock(UUS, 'Выдача адреса из БАД на ША');

OffSignal(crd_SFA2busC);

OffSpecBlock(SFA);

OffSignal(busC);

OffSignal(crd_busC2BAD);

OnSignal(crd_BAD2BUS);

OnSignal(busAddress);

OnSignal(crd_MIO);

Result := False;

end;

4: begin

OnSpecBlock(UUS, 'Защелкивание адреса в регистре РА ОЗУ');

OnSignal(busControl);

OnSignal(crd_UUS2BUS);

OffSignal(busC);

OffSignal(crd_busC2BAD);

OnSignal(crd_BUS2PA);

OnRegister(PA);

PA.Text := IntToHex(HexToInt(CS.Text)*16 + HexToInt(IP.Text), 5);

Result := False;

end;

5: begin

OnSpecBlock(UUS, 'УУиС подает сигнала чтения ОЗУ');

OffSignal(crd_BAD2BUS);

OffSpecBlock(BAD);

OffSignal(busAddress);

OffSignal(crd_BUS2PA);

OnSignal(crd_PA2MUUOZU);

OnSignal(crd_BUS2MUUOZU);

OnSpecBlock(MUUOZU, 'Чтение ОЗУ');

OnSignal(crd_MUUOZU2CS);

OnSignal(crd_PD2MUUOZU);

OnRegister(PD);

with CodeSeg.Items[HexToInt(IP.Text) div 2] do

begin

Selected := True;

ImageIndex := 1;

PD.Text := SubItems.Strings[0];

end;

Result := False;

end;

6: begin

OffSpecBlock(UUS);

OffSignal(crd_MUUOZU2CS);

OffSignal(crd_PA2MUUOZU);

OffRegister(PA);

OffSignal(crd_BUS2MUUOZU);

OffSignal(crd_UUS2BUS);

OffSignal(busControl);

OnSpecBlock(MUUOZU, 'Выдача содержимого РД ОЗУ на ШД');

OnSignal(crd_BUS2PD);

OnSignal(busData);

Result := False;

end;

7: begin

OnSpecBlock(MUUOZU, 'МУУ ОЗУ посылает сигнал готовности данных на ШД');

OnSignal(crd_BUS2MUUOZU);

OnSignal(busControl);

OnSignal(crd_UUS2BUS);

OnSpecBlock(UUS, 'Защелкивание данных в БАД');

OnSpecBlock(BAD, PD.Text);

OnSignal(crd_BAD2BUS);

Result := False;

end;

8: begin

OffSpecBlock(MUUOZU);

OffSignal(busData);

OffSignal(busControl);

OffSignal(crd_BUS2MUUOZU);

OffRegister(PD);

OffSignal(crd_BUS2PD);

OffSignal(crd_PD2MUUOZU);

OffSignal(crd_UUS2BUS);

OffSignal(crd_BAD2BUS);

OnSpecBlock(UUS, 'Выдача содержимого БАД на шину С и запись в РК');

OnSignal(busC);

OnSignal(crd_busC2BAD);

OnSignal(crd_busC2PK);

OnRegister(PK);

PK.Text := PD.Text;

Result := False;

end;

9: begin

OffInternalSignals;

OnSpecBlock(UUS, 'УУиС определяет код команды');

OnRegister(PK);

OnSignal(crd_PK2busA);

OnSignal(busA);

if TCommand(HexToInt(IP.Text) div 2 + 1) = cmdJmp then

begin

Command := cmdJmp;

Result := True;

end

else Result := False;

end;

10: begin

OnSpecBlock(UUS, 'УУиС увеличивает счетчик команды IP');

OffRegister(PK);

OffSignal(crd_PK2busA);

OffSignal(busA);

OnRegister(IP);

Command := TCommand(HexToInt(IP.Text) div 2 + 1);

IP.Text := IntToHex(HexToInt(IP.Text) + 2, 4);

Result := True;

end;

end; {case}

end;

procedure TMainForm.OnSpecBlock(block: TRxLabel; hint: String);

begin

if block = SFA then

begin

SFATip.Show;

SFATip.Hint := hint;

SFA.Font.Color := clGreen;

end;

if block = BAD then

begin

BADShape.Brush.Color := TColor($00E0E0);

BADTip.Show;

BADTip.Hint := hint;

BAD.Font.Color := clGreen;

end;

if block = ALU then

begin

ALUTip.Show;

ALUTip.Hint := hint;

ALU.Font.Color := clGreen;

end;

if block = MUU then

begin

MUUShape.Brush.Color := TColor($00E0E0);

MUUTip.Show;

MUUTip.Hint := hint;

MUU.Font.Color := clGreen;

end;

if block = MUUOZU then

begin

MUUOZUShape.Brush.Color := TColor($00E0E0);

MUUOZUTip.Show;

MUUOZUTip.Hint := hint;

MUUOZU.Font.Color := clGreen;

end;

if block = UUS then

begin

UUSShape.Brush.Color := TColor($00E0E0);

UUSTip.Show;

UUSTip.Hint := hint;

UUS.Font.Color := clGreen;

end;

end;

procedure TMainForm.OffSpecBlock(block: TRxLabel);

begin

if block = SFA then

begin

SFATip.Hide;

SFA.Font.Color := clGray;

end;

if block = BAD then

begin

BADShape.Brush.Color := clSilver;

BADTip.Hide;

BAD.Font.Color := clGray;

end;

if block = ALU then

begin

ALUTip.Hide;

ALU.Font.Color := clGray;

end;

if block = MUU then

begin

MUUShape.Brush.Color := clSilver;

MUUTip.Hide;

MUU.Font.Color := clGray;

end;

if block = MUUOZU then

begin

MUUOZUShape.Brush.Color := clSilver;

MUUOZUTip.Hide;

MUUOZU.Font.Color := clGray;

end;

if block = UUS then

begin

UUSShape.Brush.Color := clSilver;

UUSTip.Hide;

UUS.Font.Color := clGray;

end;

end;

function TMainForm.Mov(Step: Integer): Boolean;

begin

case Step of

1: begin

OnSpecBlock(UUS, 'Выдача содержимого DX на шину A и запись в PO');

OnSignal(crd_busA2UO);

OnSignal(busA);

OnSignal(crd_busA2PO);

OnRegister(PO);

OnRegister(DH);

OnRegister(DL);

PO.Text := DH.Text + DL.Text;

Result := False;

end;

2: begin

OnSpecBlock(UUS, 'Выдача содержимого PO на шину A и запись в AX');

OffRegister(DH);

OffRegister(DL);

OnRegister(AH);

OnRegister(AL);

AH.Text := Copy(PO.Text, 1, 2);

AL.Text := Copy(PO.Text, 3, 2);

Result := True;

Command := cmdNull;

CodeSeg.Items[0].ImageIndex := 2;

end;

end; {case}

end;

function TMainForm.Inc(Step: Integer): Boolean;

begin

case Step of

1: begin

OnSpecBlock(UUS, 'Выдача содержимого AX на шину A и запись в BR1');

OnSignal(crd_busA2UO);

OnSignal(busA);

OnRegister(AH);

OnRegister(AL);

OnRegister(BR1);

BR1.Text := DH.Text + DL.Text;

Result := False;

end;

2: begin

OffInternalSignals;

OnSpecBlock(UUS, 'УУиС дает сигнал запуска МУУ');

OnSignal(crd_UUS2MUU);

OnSpecBlock(MUU, 'Выполнение операции в АЛУ');

OnSignal(crd_MUU2ALU);

OnRegister(BR1);

OnSignal(crd_BR12ALU);

OnSpecBlock(ALU, 'INC');

Result := False;

end;

3: begin

OffSpecBlock(UUS);

OffSignal(crd_UUS2MUU);

OnSpecBlock(MUU, 'Выдача результата операции в BRR');

OnSpecBlock(ALU, IntToHex(HexToInt(BR1.Text) + 1, 4));

OffSignal(busA);

OffRegister(BR1);

OffSignal(crd_busA2BR1);

OffSignal(crd_BR12ALU);

OnSignal(crd_ALU2BRR);

OnRegister(BRR);

BRR.Text := IntToHex(HexToInt(BR1.Text) + 1, 4);

Result := False;

end;

4: begin

OnSpecBlock(UUS, 'Выдача результата из BRR на шину A и сохранение в AX');

OnSpecBlock(MUU, 'МУУ сообщает о готовности результата');

OffSpecBlock(ALU);

OffSignal(crd_MUU2ALU);

OnSignal(crd_UUS2MUU);

OffSignal(crd_ALU2BRR);

OnSignal(crd_BRR2busA1);

OnSignal(crd_BRR2busA2);

OnSignal(busA);

OnRegister(AL);

OnRegister(AH);

OnSignal(crd_busA2UO);

AH.Text := Copy(BRR.Text, 1, 2);

AL.Text := Copy(BRR.Text, 3, 2);

Result := True;

Command := cmdNull;

CodeSeg.Items[1].ImageIndex := 2;

end;

end; {case}

end;

function TMainForm.Jmp(Step: Integer): Boolean;

begin

case Step of

1: begin

OnSpecBlock(UUS, 'УУиС запсывает значение IP в PO');

OnRegister(IP);

OnRegister(PO);

OnSignal(crd_PO2US);

PO.Text := IP.Text;

Result := False;

end;

2: begin

OnSpecBlock(UUS, 'Выдача PO на шину A и запись в BR1');

OffSignal(crd_PO2US);

OffRegister(IP);

OnSignal(crd_busA2PO);

OnSignal(busA);

OnSignal(crd_busA2BR1);

OnRegister(BR1);

BR1.Text := PO.Text;

Result := False;

end;

3: begin

OffInternalSignals;

OnSpecBlock(UUS, 'Выдача относительного адреса команды на шину A и запись в BR2');

OnRegister(PK);

OnSignal(crd_PK2busA);

OnSignal(busA);

OnSignal(crd_busA2BR2);

OnRegister(BR2);

BR2.Text := 'FFFC';

Result := False;

end;

4: begin

OffInternalSignals;

OnSpecBlock(UUS, 'УУиС дает сигнал запуска МУУ');

OnSignal(crd_UUS2MUU);

OnSpecBlock(MUU, 'Выполнение операции в АЛУ');

OffSignal(crd_busA2BR1);

OffSignal(crd_busA2BR2);

OnSignal(crd_MUU2ALU);

OnRegister(BR1);

OnSignal(crd_BR12ALU);

OnRegister(BR2);

OnSignal(crd_BR22ALU);

OnSpecBlock(ALU, 'ADD*'#13#10'* - флаги не изменяются');

Result := False;

end;

5: begin

OffSpecBlock(UUS);

OffSignal(crd_UUS2MUU);

OnSpecBlock(MUU, 'Выдача результата операции в BRR');

OnSpecBlock(ALU, '0000');

OffSignal(busA);

OffRegister(BR1);

OffSignal(crd_busA2BR1);

OffSignal(crd_BR12ALU);

OffRegister(BR2);

OffSignal(crd_busA2BR2);

OffSignal(crd_BR22ALU);

OnSignal(crd_ALU2BRR);

OnRegister(BRR);

BRR.Text := '0000';

Result := False;

end;

6: begin

OnSpecBlock(UUS, 'Выдача результата из BRR на шину A и сохранение в PO');

OnSpecBlock(MUU, 'МУУ сообщает о готовности результата');

OffSpecBlock(ALU);

OffSignal(crd_MUU2ALU);

OnSignal(crd_UUS2MUU);

OffSignal(crd_ALU2BRR);

OnSignal(crd_BRR2busA1);

OnSignal(crd_BRR2busA2);

OnSignal(busA);

OnRegister(PO);

OnSignal(crd_busA2PO);

PO.Text := BRR.Text;

Result := False;

end;

7: begin

OffInternalSignals;

OnSpecBlock(UUS, 'Запись содержимого PO в IP');

OnRegister(PO);

OnRegister(IP);

OnSignal(crd_PO2US);

IP.Text := PO.Text;

Result := True;

Command := cmdNull;

CodeSeg.Items[2].ImageIndex := 2;

end;

end; {case}

end;

end.