Автор: Пользователь скрыл имя, 23 Февраля 2012 в 20:12, курсовая работа
Мікропроцесори мають, як правило, обмежені можливості введення-висновку програм і оброблюваних даних, що утрудняє виконання робіт з налагодження програм. Такі роботи також утруднені або ж узагалі неможливі при розробці нових мікропроцесорних систем. Усе це стимулює використання універсальних ЕОМ G1 для налагодження програм мікроEOM і мікропроцесорів, тобто використання методики эмуляции програми.
Вступ
1. Навчальна обчислювальна машина G1.
1.1 Архітектура ЕОМ G1.
1.2 Система команд.
1.3 Принцип роботи ЕОМ G1.
2. Програмування в кодах навчальної ЕОМ G1.
2.1 Програмування формул.
2.2 Циклічна програма з розвилками.
2.3 Виконання логічних команд із використанням підпрограм.
2.4 Додаткові режими емулятора.
3. Програмна модель навчальної ЕОМ G1.
3.1 Призначення й область застосування.
3.2 Технічні характеристики програми.
3.3 Опис програми.
Висновок.
3.3 Опис програми
У програмі реалізовані наступні режими роботи:
уведення модуля з файлу;
покомандне виконання тесту;
повне виконання тесту;
перегляд дампа пам’яті(повна пам'ять, та частина пам'яті, під тест);
перегляд змісту усіх регістрів;
Перегляд поточного часу та дати (додатковий режим)
Головне вікно програми емулятора зображено на малюнку 6
Мал.6
В процесі виконання цієї курсової роботи я ознайомився з процесом моделювання електронних обчислюваних машин на прикладі ЕОМ G1.
Таким чином, я гадаю, що проведена робота сприяла розвитку мого розуміння внутрішньої роботи електронних обчислювальних машин – процесорів, також я зміцнив свої знання в принципах функціонування процесора й у цілому всієї системи, поліпшив навички в програмуванні і став краще розуміти пристрій EOM.
ДОДАТОК. ТЕКСТ ПРОГРАМИ-ЕМУЛЯТОРА
Текст модуля Unit1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, Unit2, ExtCtrls, DBCtrls, Grids, Buttons, Rab,
ad,command;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
file1: TMenuItem;
LOAD1: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
test21: TMenuItem;
test31: TMenuItem;
l1: TMenuItem;
N5: TMenuItem;
RegB: TStringGrid;
RegF: TStringGrid;
RegC: TStringGrid;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
BitBtn1: TBitBtn;
Dump: TStringGrid;
N6: TMenuItem;
CheckBox1: TCheckBox;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
procedure l1Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure test21Click(Sender: TObject);
procedure test31Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.l1Click(Sender: TObject);
var
s:string;
begin
Form2.Show;
end;
procedure TForm1.N5Click(Sender: TObject);
begin
Form2.Show;
end;
procedure RegisterUpdate;
forward;
procedure obnov;
forward;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
obnov;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:byte;
begin
halten:=true;
for i:=1 to 255 do memory[i]:=[];
Fname:='test/test1.txt';
LoadTest;
obnov;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i:byte;
begin
halten:=true;
for i:=1 to 255 do memory[i]:=[];
Fname:='test/test2.txt';
LoadTest;
obnov;
end;
procedure TForm1.Button3Click(Sender: TObject);
var i:byte;
begin
halten:=true;
for i:=1 to 255 do memory[i]:=[];
Fname:='test/test3.txt';
LoadTest;
obnov;
end;
Procedure RegisterUpdate;
var Numb : integer;
s : string_14;
i,m : byte;
Begin
//вывод основных регистров
Form1.RegB.Cells[1,1] := IntToStr(SAK); // SAK
Form1.RegB.Cells[1,2] := IntToStr(RAO);
Set_Number(RA,Numb);
Form1.RegB.Cells[1,3] := IntToStr(Numb);
Set_Number(RB,Numb);
Form1.RegB.Cells[1,4] := IntToStr(Numb);
Set_Number(RS,Numb);
Form1.RegB.Cells[1,5] := IntToStr(Numb);
//вывод RA RB RS в двоичном виде
s:='';
for i := 1 to 14 do
if i in RA then // RA
s := s + '1'
else
s := s + '0';
Form1.RegB.Cells[1,6] := s;
s:='';
for i := 1 to 14 do
if i in RB then // RB
s := s + '1'
else
s := s + '0';
Form1.RegB.Cells[1,7] := s;
s:='';
for i := 1 to 14 do // RS
if i in RS then
s := s + '1'
else
s := s + '0';
Form1.RegB.Cells[1,8] := s;
//вывод регистра признаков
if 1 in RP then // знак AC<0
Form1.RegF.Cells[0,1] := '1'
else
Form1.RegF.Cells[0,1] := '0';
if 2 in RP then // ноль AC=0
Form1.RegF.Cells[1,1] := '1'
else
Form1.RegF.Cells[1,1] := '0';
if 3 in RP then // переполнение
Form1.RegF.Cells[2,1] := '1'
else
Form1.RegF.Cells[2,1] := '0';
if 4 in RP then // конец цикла
Form1.RegF.Cells[3,1] := '1'
else
Form1.RegF.Cells[3,1] := '0';
//вывод регистра команд
m := 0;
for i :=1 to 4 do
begin
m := m * 2;
if i in RK.KOP then
inc(m);
end;
Form1.RegC.Cells[0,1] := Kom[m+1]; // команда
Form1.RegC.Cells[1,1] := IntToStr(RK.RR); // номер регистра
Form1.RegC.Cells[2,1] := IntToStr(RK.PA); // способ адресации
m := 0;
for i :=1 to 8 do
begin
m := m * 2;
if i in RK.A2 then
inc(m);
end;
Form1.RegC.Cells[3,1] := IntToStr(m); // RK.A2
End; {RegisterUpdate}
{-----------------------------
procedure TForm1.Button4Click(Sender: TObject);
begin
if halten then
step
else MessageDlg(' Уже все )) ' , mtWarning , [mbOk],0);
obnov;
end;
procedure obnov;
var i,j,m : byte;
k,t : integer;
sbin,mp : string_14;
sb,tsr : string_2;
s,shex : string_4;
tmp:integer;
begin
//Заголовки
Form1.RegB.Cells[0,0] :='Регистр';
Form1.RegB.Cells[1,0] :='Значение';
Form1.RegB.Cells[0,1] :='SAK';
Form1.RegB.Cells[0,2] :='RAO';
Form1.RegB.Cells[0,3] :='RA';
Form1.RegB.Cells[1,2] :=tsr;
Form1.RegB.Cells[0,4] :='RB';
Form1.RegB.Cells[0,5] :='RS';
Form1.RegB.Cells[0,6] :='RA-bin';
Form1.RegB.Cells[0,7] :='RB-bin';
Form1.RegB.Cells[0,8] :='RS-bin';
Form1.RegC.Cells[0,0] :='KOP';
Form1.RegC.Cells[1,0] :='RR';
Form1.RegC.Cells[2,0] :='PA';
Form1.RegC.Cells[3,0] :='A2';
//---------
Form1.RegF.Cells[0,0] :='S';
Form1.RegF.Cells[1,0] :='Z';
Form1.RegF.Cells[2,0] :='C';
Form1.RegF.Cells[3,0] :='E';
//---------
RegisterUpdate;
for i := 0 to Form1.Dump.ColCount do
for j := 1 to Form1.Dump.RowCount do
Form1.Dump.Cells[i,j] := '';
Form1.Dump.ColWidths[0] := 40;
Form1.Dump.ColWidths[1] := 100;
Form1.Dump.ColWidths[2] := 50;
Form1.Dump.ColWidths[3] := 50;
Form1.Dump.Cells[0,0] := '№ п/п';
Form1.Dump.Cells[1,0] := 'binary';
Form1.Dump.Cells[2,0] := 'dec';
Form1.Dump.Cells[3,0] := 'hex';
k := 1;
Form1.Dump.RowCount := 2;
Form1.Dump.FixedRows := 1;
if Form1.CheckBox1.Checked then
for i:= 1 to 255 do
begin
sbin:='00000000000000';
for j:=1 to 14 do
if j in Memory[i] then
sbin[j]:='1';
Set_Number(Memory[i],t);
shex := '';
sb := Copy(sbin,1,2);
if sb='00' then shex:='0';
if sb='01' then shex:='1';
if sb='10' then shex:='2';
if sb='11' then shex:='3';
for j := 0 to 2 do
begin
s := Copy(sbin,3+j*4,4);
for m := 0 to 15 do
if s = Hex[m+1] then
begin
if (m>=0) and (m<=9) then
shex := shex + IntToStr(m);
if m=10 then shex := shex+'A';
if m=11 then shex := shex+'B';
if m=12 then shex := shex+'C';
if m=13 then shex := shex+'D';
if m=14 then shex := shex+'E';
if m=15 then shex := shex+'F';
end;
end;
Form1.Dump.Cells[0,k]:=
Form1.Dump.Cells[1,k]:=sbin;
Form1.Dump.Cells[2,k]:=
Form1.Dump.Cells[3,k]:=shex;
inc(k);
Form1.Dump.RowCount := Form1.Dump.RowCount +1;
end
else
for i:=StartAddress to EndAddress do
begin
sbin:='00000000000000';
for j:=1 to 14 do
if j in Memory[i] then
sbin[j]:='1';
Set_Number(Memory[i],t);
shex := '';
sb := Copy(sbin,1,2);
if sb='00' then shex:='0';
if sb='01' then shex:='1';
if sb='10' then shex:='2';
if sb='11' then shex:='3';
for j := 0 to 2 do
begin
s := Copy(sbin,3+j*4,4);
for m := 0 to 15 do
if s = Hex[m+1] then
begin
if (m>=0) and (m<=9) then
shex := shex + IntToStr(m);
if m=10 then shex := shex+'A';
if m=11 then shex := shex+'B';
if m=12 then shex := shex+'C';
if m=13 then shex := shex+'D';
if m=14 then shex := shex+'E';
if m=15 then shex := shex+'F';
end;
end;
Form1.Dump.Cells[0,k]:=
Form1.Dump.Cells[1,k]:=sbin;
Form1.Dump.Cells[2,k]:=
Form1.Dump.Cells[3,k]:=shex;
inc(k);
Form1.Dump.RowCount := Form1.Dump.RowCount +1;
end;
Form1.Dump.RowCount := Form1.Dump.RowCount -1;
end;
procedure TForm1.N3Click(Sender: TObject);
begin
step;
obnov;
end;
procedure TForm1.N1Click(Sender: TObject);
begin
Fname:='test/test1.txt';
LoadTest;
obnov;
end;
procedure TForm1.test21Click(Sender: TObject);
begin
Fname:='test/test2.txt';
LoadTest;
obnov;
end;
procedure TForm1.test31Click(Sender: TObject);
begin
Fname:='test/test3.txt';
LoadTest;
obnov;
end;
procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
begin
i:=0;
kon:=false;
While kon = false do
begin
inc(i);
Step;
end;
obnov;
Form1.RegB.Cells[0,9] :='Кол-во вып.ком.';
Form1.RegB.Cells[1,9] :=IntToStr(i);
end;
end.
Текст модуля COMMAND
unit COMMAND;
interface
Uses Messages, Dialogs, SysUtils, Windows, Rab, Ad;
Procedure Address ; // формирование адреса
Procedure LOAD ; // загрузка в регистр
Procedure SAVE ; // сохранение в памяти
Procedure SUB ; // вычитание операндов
Procedure ADD ; // сложение операндов
Procedure MUL ; // умножение операндов
Procedure DIV_ ; // деление операндов
Procedure XOR_ ; // сумма по модулю два
Procedure OR_ ; // дизъюнкция
Procedure AND_ ; // конъюнкция
Procedure JS ; // переход по RP.S
Procedure JZ ; // переход по RP.Z
Procedure JMP ; // безусловный переход
Procedure INC_ ; // инкремент ячейки
Procedure CALL ; // обращение к подпрограмме
Procedure subm ; //Вычитание модулей
//Procedure RegisterUpdate;
Procedure Step;
implementation
//Uses Center;
{-----------------------------
{-----------------------------
Procedure SecOp;
Begin
if RK.RR=0 then
Set_Number(RA,Number_1)
else
Set_Number(RB,Number_1);
RAO:=Aisp;
RS:=Memory[RAO];
Set_Number(RS,Number_2);
End;
{-----------------------------
// формирование исполнительного адреса
// с учетом прямой и косвенной адресации
Procedure Address;
Var
i : byte;
begin
Aisp:=0;
for i:=1 to 8 do
begin
Aisp:=2*Aisp;
if i in RK.A2 then
Aisp:=Aisp + 1;
end;
if RK.PA=1 then
begin
//формирование исполнительного адреса, если косвенная адресация
RAO:=Aisp;
RS:=Memory[RAO];
//чтение ячеек памяти 7-14 оперативной памяти
RK.A2 := [];
for i := 7 to 14 do
if i in RS then
RK.A2 := RK.A2 + [i-6];
Aisp:=0;
//преобразуем в число
for i:=1 to 8 do
begin
Aisp:=2*Aisp;
if i in RK.A2 then
Aisp:=Aisp + 1;
end;
end;
end; {Address}
{-----------------------------
// команды работы с памятью
Procedure LOAD;
begin
Address;
//пересылка в регистр по Aisp
If RK.RR=0 then
begin
RAO := Aisp;
RS := Memory[RAO];
RA := RS
end
else
begin
RAO := Aisp;
RS := Memory[RAO];
RB := RS
end;
end; {LOAD}
{-----------------------------
Procedure SAVE;
begin
Address;
//сохранение в памяти по Aisp
If RK.RR=0 then
begin
RAO:=Aisp;
RS:=RA;
Memory[RAO]:=RS
end
else
begin
RAO:=Aisp;
RS:=RB;
Memory[RAO]:=RS
end;
end; {SAVE}
{-----------------------------
Procedure SUB ;
begin
Address;
SecOp;
Number_1:=Number_1 - Number_2;
if (Number_1<-MaxNumber-1) or (Number_1>MaxNumber) then
begin
RP:=[3];
Exit
end
else
begin
Number_Set(Number_1,BufSet);
if RK.RR=0 then
RA:=BufSet
else
RB:=BufSet
end;
// установка регистра признаков
if Number_1 < 0 then
RP := [1]
else
if Number_1 = 0 then
RP := [2]
else
RP := [];
end; {SUB}
{-----------------------------
Procedure subm ;
begin
Address;
SecOp;
Number_1:=abs(Number_1) - abs(Number_2);
Number_Set(Number_1,BufSet);
if RK.RR=0 then
RA:=BufSet
else
RB:=BufSet;
// установка регистра признаков
if Number_1 < 0 then
RP := [1]
else
if Number_1 = 0 then
RP := [2]
else
RP := [];
end; {SUBM}
{-----------------------------
Procedure OR_ ;
begin
Address;
SecOp ;
Number_1:=Number_1 or Number_2;
Number_Set(Number_1,BufSet);
if RK.RR=0 then
RA:=BufSet
else
RB:=BufSet;
// установка регистра признаков
if Number_1 < 0 then
RP := [1]
else
if Number_1 = 0 then
RP := [2]
else
RP := [];
end; {OR_}
{-----------------------------
Procedure AND_ ;
begin
Address;
SecOp;
Number_1:=Number_1 and Number_2;
Number_Set(Number_1,BufSet);
if RK.RR=0 then
RA:=BufSet
else
RB:=BufSet;
// установка регистра признаков
if Number_1 < 0 then
RP := [1]
else
if Number_1 = 0 then
RP := [2]
else
RP := [];
end; {AND_}
{-----------------------------
Procedure ADD ;
begin
Address;
SecOp;
Number_1:=Number_1 + Number_2;
if (Number_1<-MaxNumber-1) or (Number_1>MaxNumber) then
begin
RP:=[3];
Exit
end
else
begin
Number_Set(Number_1,BufSet);
if RK.RR=0 then
RA:=BufSet
else
RB:=BufSet
end;
// установка регистра признаков
if Number_1 < 0 then
RP := [1]
else
if Number_1 = 0 then
RP := [2]
else
RP := [];
end; {ADD}
{-----------------------------
Procedure MUL ;
begin
Address;
SecOp;
Number_1:=Number_1 * Number_2;
if (Number_1<-MaxNumber-1) or (Number_1>MaxNumber) then
begin
RP:=[3];
Exit
end
else
begin
Number_Set(Number_1,BufSet);
if RK.RR=0 then
RA:=BufSet
else
RB:=BufSet
end;
// установка регистра признаков
if Number_1 < 0 then
RP := [1]
else
if Number_1 = 0 then
RP := [2]
else
RP := [];
end; {MUL}
{-----------------------------
Procedure DIV_;
begin
Address;
SecOp;
Number_1:=Number_1 div Number_2;
if (Number_1<-MaxNumber-1) or (Number_1>MaxNumber) then
begin
RP:=[3];
Exit
end
else
begin