Автор: Пользователь скрыл имя, 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 Опис програми.
Висновок.
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; {DIV_}
{-----------------------------
Procedure XOR_ ;
begin
Address;
SecOp;
Number_1:=Number_1 xor 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; {XOR_}
{-----------------------------
// три команды условных и безусловных переходов
Procedure JS;
begin
if RP=[1] then
begin
Address;
SAK:=Aisp
end
end; {JS}
{-----------------------------
Procedure JZ;
begin
if RP=[2] then
begin
Address;
SAK:=Aisp
end
end; {JZ}
{-----------------------------
Procedure JMP;
begin
Address;
SAK:=Aisp
end; {JMP}
{-----------------------------
Procedure INC_;
begin
Address;
RAO := Aisp;
RS := Memory[RAO];
// вычисление значения
Set_Number(RS,Number_1);
// увеличение значения
Inc(Number_1);
Number_Set(Number_1,RS);
Memory[RAO] := RS;
If Number_1=0 then
begin
SAK:=SAK+1;
RP:=[4]
end
end; {INC_}
{-----------------------------
Procedure CALL;
var tmp:set_14;
begin
Address;
RAO:=Aisp;
Number_Set(SAK,RS);
RS:=RS+[1,2,3];
Memory[RAO]:=RS;
SAK:=Aisp+1;
end; {CALL}
{-----------------------------
Procedure Step;
Var
i, Switch : byte;
begin
RAO := SAK;
RS := Memory[RAO];
RK.KOP := [];
RK.KOP:=RK.KOP+RS;
//установка используемого регистра
if 5 in RS then
RK.RR:=1 // регистр RB
else
RK.RR:=0; // регистр RA
//установка способа адресации
if 6 in RS then
RK.PA:=1 // косвенная
else
RK.PA:=0; // прямая
RK.A2:=[];
for i:=7 to 14 do
if i in RS then
RK.A2:=RK.A2+[i-6];
Inc(SAK);
//перевод кода операции в числовую форму
Switch:=0;
for i:=1 to 4 do
begin
Switch:=2*Switch;
if i in RK.KOP then
Switch:=Switch + 1;
end;
Case Switch of
0 : begin
halten:=false;
kon:=true;
end;
1 : LOAD;
2 : SAVE;
3 : ADD;
4 : SUB;
5 : MUL;
6 : DIV_;
7 : subm;
8 : AND_;
9 : OR_;
10 : XOR_;
11: INC_;
12 : JS;
13 : JZ;
14 : JMP;
15 : CALL;
end;
if 3 in RP then
begin
MessageDlg(' Зафиксировано переполнение при выполнении команды ' , mtWarning , [mbOk],0);
EXIT;
end
end; {Step}
end.
Текст модуля ad
unit ad;
interface
Uses rab;
Procedure Set_Number(Operand:Set_14;Var Number:integer);
Procedure Number_Set(Number:integer;Var Operand:Set_14);
Procedure ModuleRead;
Procedure LoadTest;
implementation
{-----------------------------
//Преобразование множества в число
Procedure Set_Number(Operand:Set_14;Var Number:integer);
Var
i : byte;
Cond : boolean;
begin
Cond:=False;
//инверсирование отрицательного двоичного числа
If 1 in Operand then
begin
Cond:=True;
for i:=1 to 14 do
If i in Operand then
Operand:=Operand-[i]
else
Operand:=Operand+[i]
end;
Number:=0;
//перевод 2_с.с -> 10_с.с
for i:=2 to 14 do
begin
Number:=2*Number;
if i in Operand then
Number:=Number+1;
end;
If Cond then
begin
Inc(Number);
Number:=-Number;
end;
end {Set_Number};
{-----------------------------
//преобразование числа в множество
Procedure Number_Set(Number:integer;Var Operand:Set_14);
Var
i : byte;
Cond : boolean;
k,Divisor : integer;
begin
Cond:=False;
If Number<0 then
begin
Cond:=True;
Number:=-Number;
Dec(Number);
end;
Divisor:=4096;Operand:=[];
//перевод 10_с.с -> 2_с.с
for i:=2 to 14 do
begin
k:=Number div Divisor;
if k>0 then
Operand:=Operand + [i];
Number:=Number mod Divisor;
Divisor:=Divisor shr 1;
end;
If Cond then
for i:=1 to 14 do
if i in Operand then
Operand:=Operand - [i]
else
Operand:=Operand + [i];
end; {Number_Set}
{-----------------------------
//Ввод файла эмулируемой программы
Procedure ModuleRead;
Var
k,i,j : byte;
S : String_4;
sbin : String_14;
ch : char;
begin
Readln(ResFile,SAK);
k:=SAK;
StartAddress := SAK;
While not eof(ResFile) do
begin
Readln(ResFile,s);
Sbin:='';
case s[1] of
'0' : sbin := sbin + '00';
'1' : sbin := sbin + '01';
'2' : sbin := sbin + '10';
'3' : sbin := sbin + '11';
'F' : sbin := sbin + '11';
end;
for i:=2 to 4 do
begin
ch := S[i];
j := Pos(ch,Dig);
Sbin := Sbin + Hex[j]
end;
BufSet:=[];
for i:=1 to 14 do
if sbin[i]='1' then
BufSet:=BufSet + [i];
Memory[k]:=BufSet;
Inc(k);
end;
EndAddress := k-1;
//Dump.Show;
end; {ReadModule}
{-----------------------------
Procedure LoadTest;
var i : byte;
Begin
{$i-}
AssignFile(ResFile,FName);
Reset(ResFile);
{$i+}
if IOResult=0 then
begin
SAK := 0;
RAO := 0;
RA := [];
RB := [];
RS := [];
RK.KOP := [];
RK.A2 := [];
RK.RR := 0;
RK.PA := 0;
RP := [];
ModuleRead;
end
End; {LoadTest}
{-----------------------------
end.
Текст модуля Rab
unit Rab;
interface
Const
MaxAddress = 255; { максимальный адрес оперативной памяти }
MaxNumber = 16383; { максимальное значение слова в памяти }
Type
Set_2 = set of 1..2;
Set_4 = set of 1..4;
Set_8 = set of 1..8;
Set_14 = set of 1..14; { описание типов для памяти и регистров }
String_2 = string[2];
String_4 = string[4];
String_7 = string[7];
String_8 = string[8];
String_14 = string[14];
CommandType = record
KOP : set_4; { код операции }
RR, { номер используемого регистра RA или RB}
PA : byte; { способ адресации }
A2 : set_8; { адрес памяти }
end;
MemoryType = array [0..MaxAddress] of set_14;
Const
Dig = '0123456789ABCDEF';
Hex : array[1..16] of String_4 = ('0000','0001','0010','0011',
Kom : array[1..16] of String_4 = ('HALT','LOAD','SAVE','ADD',
Var
Aisp, { исполнительный адрес }
SAK, { счетчик адреса команд }
RAO : byte; { регистр адреса }
RK : CommandType; { регистр команд }
RP : Set_4; { регистр признаков }
RA, { регистр-аккумулятор RA}
RB, { регистр-аккумулятор RB}
RS, { регистр слова (для чтения или записи в память) }
BufSet : Set_14; { буферная переменная }
Number_1, { численное значение операндов }
Number_2
: integer;
Memory : MemoryType; { оперативная память }
FName : String; { имя файла с программой }
ResFile : text; { файл с программой }
CondF : boolean = False; { Для файла }
Cond,
FirstStep, kon, halten, polnpam
: Boolean;
StartAddress, EndAddress : byte;
implementation
end.
Текст модуля Unit2
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Label1: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var datetime:TdateTime;
s,s1,s2,str,s3,s4: string;
i,kod : byte;
k,l,m : integer;
label2 : Tlabel;
begin
datetime := now;
s := datetimeToStr(datetime);
for i:=1 to 2 do s1:=s1+s[i];
for i:=4 to 5 do s2:=s2+s[i];
k:=strtoint(s2);
case k of
1: s3 := 'января';
2: s3 := 'февраля';
3: s3 := 'марта';
4: s3 := 'апреля';
5: s3 := 'мая';
6: s3 := 'июня';
7: s3 := 'июля';
8: s3 := 'августа';
9: s3 := 'сентября';
10: s3 := 'октября';
11: s3 := 'ноября';
12: s3 := 'декабря';
end;
str:=s1+' '+s3;
s3:='';
for i:=7 to 10 do s3:=s3+s[i];
str:=str+' '+s3+' года ';
s1:=''; s2:=''; s3:='';
for i:=12 to 13 do s1:=s1+s[i];
for i:=15 to 16 do s2:=s2+s[i];
for i:=18 to 19 do s3:=s3+s[i];
k:=strtoint(s1);
case k of
1 : s4:='час';
2..4 : s4:='часa';
0,5..20: s4:='часов';
21 : s4:='час';
22..24 : s4:='часa';
end;
str:=str+s1+' '+s4;
k:=strtoint(s2[2]);
case k of
1: s4:='минута';
2..4 :s4:='минуты';
0,5..9 : s4:='минут';
end;
str:=str+' '+s2+' '+s4;
k:=strtoint(s3[2]);
case k of
0 : s4:='секунд';
1: s4:='секунда';
2..4 :s4:='секунды';
5..9 : s4:='секунд';
end;
str:=str+' '+s3+' '+s4;
showMessage(str);
end;
end.