Програмна модель навчальної ЕОМ G1

Автор: Пользователь скрыл имя, 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 Опис програми.

Висновок.

Работа содержит 1 файл

ПЗ.doc

— 783.00 Кб (Скачать)

      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',

                                    '0100','0101','0110','0111',

                                    '1000','1001','1010','1011',

                                    '1100','1101','1110','1111');

 

  Kom : array[1..16] of String_4 = ('HALT','LOAD','SAVE','ADD',

                                    'SUB ','MUL','DIV','SUBM',

                                    'AND ','OR','XOR','INC',

                                    'JS','JZ ','JMP','CALL');

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.



Информация о работе Програмна модель навчальної ЕОМ G1