Приложение г
ЭКРАННЫЕ ФОРМЫ
Рисунок Г.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.
- Министерство образования и науки украины
- 2 Анализ структуры микропроцессора прототипа и алгоритмов выполнения заданного подмножества команд
- 3 Постановка задач проекта
- 4 Разработка алу микропроцессора
- 5 Разработка гипотетического микропроцессора
- Команда inc (Инкремент на 1) Команда inc прибавляет 1 к операнду - приемнику, но в отличие от add не влияет на флаг cf.
- Команда imul
- Команда mov
- 6 Разработка структуры центральной части микро эвм на базе микропроцессора
- Р исунок 6.1 – Структурная схема эвм
- 7 Разработка программы эмуляции работы микро эвм
- Приложение а
- Приложение б техническое задание на программу-эмулятор
- Приложение в руководство пользователя
- Приложение г