Програмна модель навчальної ЕОМ 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 Кб (Скачать)

 

3.3 Опис програми

 

У програмі реалізовані наступні режими роботи:

 

       уведення модуля з файлу;

       покомандне виконання тесту;

       повне виконання тесту;

       перегляд дампа пам’яті(повна пам'ять, та частина пам'яті, під тест);

       перегляд  змісту усіх регістрів;

       Перегляд поточного часу та дати (додатковий режим)

 

Головне вікно програми емулятора зображено на малюнку 6

Мал.6


4.Висновок

 

В процесі виконання цієї курсової роботи я ознайомився з процесом моделювання електронних обчислюваних машин на прикладі ЕОМ 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);                   // RA

  Form1.RegB.Cells[1,3] := IntToStr(Numb);

 

  Set_Number(RB,Numb);                   // RB

  Form1.RegB.Cells[1,4] := IntToStr(Numb);

 

  Set_Number(RS,Numb);                   // RS

  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]:=IntToStr(i);

      Form1.Dump.Cells[1,k]:=sbin;

      Form1.Dump.Cells[2,k]:=IntToStr(t);

      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]:=IntToStr(i);

      Form1.Dump.Cells[1,k]:=sbin;

      Form1.Dump.Cells[2,k]:=IntToStr(t);

      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

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