Моделирование машины Фон-Неймана

Автор работы: Пользователь скрыл имя, 25 Февраля 2015 в 20:19, реферат

Описание работы


Данная вычислительная практика посвящена изучению структуры и работы ЦВМ, изучению, освоению и использованию графических возможностей C++, знакомству с основами языка ассемблера и машинного языка, составом стандартных библиотек системы программирования на языке С++.

Файлы: 1 файл

Отчет практика.doc

— 202.00 Кб (Скачать файл)

    switch (ArrLine[i].Dir)

    {

      case Right: line(ArrLine[i].X,ArrLine[i].Y,ArrLine[i].X+ArrLine[i].Len,ArrLine[i].Y);

      break;

      case Down : line(ArrLine[i].X,ArrLine[i].Y,ArrLine[i].X,ArrLine[i].Y+ArrLine[i].Len);

      break;

    }

  }

  for (i=0;i<CountInfo;i++)

    outtextxy(ArrInfo[i].X,ArrInfo[i].Y,ArrInfo[i].Msg);

  return 0;

}

int InitMBM(void)

{

   /* request auto detection */

   int gdriver = DETECT, gmode, errorcode;

 

   /* initialize graphics mode */

   initgraph(&gdriver, &gmode, "");

 

   /* read result of initialization */

   errorcode = graphresult();

 

   if (errorcode != grOk)  /* an error occurred */

   {

      printf("Graphics error: %s\n", grapherrormsg(errorcode));

   //   printf("Press any key to halt:");

      getch();

      exit(1);             /* return with error code */

   }

   OutStructure();

   return 0;

}

 

void OutValues()

{

  short int i;

  char *S,*Str;

  for (i=0; i<CountReg;i++)

  {

    if (ArrReg[i].Value != NULL)

 

   if ((i==0)||(i==1))

    {OutIntXY(ArrReg[i].X+5, ArrReg[i].Y+7,5, *ArrReg[i].Value);}

    else if (i==23)

    {ClearBar(ArrReg[i].X+1, ArrReg[i].Y+1, ArrReg[i].X+47, ArrReg[i].Y+19);

     }

     else if (i==7)

     {OutIntXY(ArrReg[i].X+17, ArrReg[i].Y+7,2,*ArrReg[i].Value); }

     else OutHexXY(ArrReg[i].X+5, ArrReg[i].Y+7, 4, *ArrReg[i].Value);

     }

  OutSost();

 

}

 

void RectangleDouble()

{

  rectangle(ArrReg[CurrentReg].X+3,ArrReg[CurrentReg].Y+3,ArrReg[CurrentReg].X+ArrReg[CurrentReg].W-3,ArrReg[CurrentReg].Y+ArrReg[CurrentReg].H-3);

}

char ReadKey()

{

  char Symbol;

  asm{

    mov AH,07h

    int 21h

    mov Symbol,AL

  }

  return Symbol;

}

 

void OutSost()

{

  ClearBar(535,175,535+4*8,170+4*3);

  outtextxy(535,175,SostName[Sost]);

}

Модуль графических подпрограмм (graphlib.cpp)

//графическая библиотека GraphLib.cpp

#include <graphics.h>

#include <strstream.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <graphics.h>

#include "func.h"

 

void ClearBar(int Left,int Top,int Right,int Bottom)

{

  setfillstyle(1,0);

  bar(Left,Top,Right,Bottom);

}

char * WordToHex(word N,short int Lens)

{

  const char HexDigit[]="0123456789ABCDEF";

  char *S="0000";

  int Pos; int Ost;

  for (Pos=Lens-1;Pos>-1;Pos--)

  {

    Ost=N%16;

    N/=16;

    S[Pos]=HexDigit[Ost];

  }

  return S;

}

 

void OutHexXY(int X,int Y, int short Lens, word Val)

{

  char *S,*Str;

  ClearBar(X,Y,X+textwidth("0")*(Lens+1),Y+textheight("0"));

  Str[0]='$';

  S=WordToHex(Val,Lens);

  Str[1]=S[0];Str[2]=S[1];Str[3]=S[2];Str[4]=S[3];Str[5]='\0';

  outtextxy(X,Y,Str);

}

 

void OutIntXY(int X, int Y, int Lens,word IntVal)

{

  char Str7[7];

  ultoa(IntVal,Str7,10);

  ClearBar(X,Y, X+45,Y+7);

  outtextxy(X,Y,Str7);

}

Модуль выполнения машинных команд (MBMcpu.cpp)

#include <dos.h>

#include "func.h"

 

extern word NumTakt;

extern word Adres;

extern word Aisp;

extern word Data;

extern word Mem[];

extern word buf;

extern word Akk;

extern word Flags;

extern word PC;

extern int EndProg;

extern word Command;

extern word ADR;

extern int EndCmnd;

extern word Speed;

extern word COP;

extern TSost Sost;

extern word MaxTakt[]={5,11,11,11,10,8,10,11};

 

void ExecAdd()

{

  switch (NumTakt)

 

  {

    case 7 : Adres=Aisp; break;

    case 8 : Data=Mem[Adres]; break;

    case 9 : buf=Akk;Akk+=Data;break;

    case 10: if (buf>Akk)

       {

if (Akk==0) Flags=3;

else Flags=1;

       }

     else

       {

if (Akk==0) Flags=2;

else Flags=0;

       }

       break;

  }

}

 

void ExecSub()

{

  switch (NumTakt)

  {

    case 7 : Adres=Aisp;break;

    case 8 : Data=Mem[Adres];break;

    case 9 : buf=Akk;Akk-=Data;

     break;

    case 10: if (buf<Akk) Flags=1;

     else

       if (Akk==0) Flags=2;

       else Flags=0;

     break;

  }

}

 

void ExecLoa()

{

  switch (NumTakt)

  {

    case 7 : Adres=Aisp;break;

    case 8 : Data=Mem[Adres];break;

    case 9 : Akk=Data; break;

    case 10: if (Akk==0) Flags=2; else Flags=0; break;

  }

}

 

void ExecSto()

{

  switch (NumTakt)

  {

    case 7 : Adres=Aisp; break;

    case 8 : Data=Akk; break;

    case 9 : Mem[Adres]=Data; break;

  }

}

 

void ExecJZ()

{

  if (Flags==2)

    switch (NumTakt)

    {

      case 7 : PC=Aisp; break;

    }

 

}

 

void ExecJmp()

{

  switch (NumTakt)

  {

    case 7 : Adres=Aisp; break;

    case 8 : Data=Mem[Adres];break;

    case 9 : PC=Data; break;

  }

}

 

void ExecEND()

{

  switch (NumTakt)

  {

    case 7 : Adres=Aisp; break;

    case 8 : Data=Mem[Adres]; break;

    case 9 : PC=Data; break;

    case 10: EndProg=1; break;

  }

}

 

void ExecOperation()

{

  switch (COP)

  {

    case 1 : ExecAdd(); break;

    case 2 : ExecSub(); break;

    case 3 : ExecLoa(); break;

    case 4 : ExecSto(); break;

    case 5 : ExecJZ() ; break;

    case 6 : ExecJmp(); break;

    case 7 : ExecEND(); break;

  }

}

 

void ExecTakt()

{

  switch (NumTakt)

  {

    case    0 : Adres=PC; break;

    case    1 : Data=Mem[Adres]; break;

    case    2 : Command=Data; break;

    case    3 : PC++; break;

    case    4 : COP=Command >> 8; break;

    case    5 : ADR=Command & 0x00FF; break;

    case    6 : Aisp= PC & 0xFF00 | ADR;break;

    case    7 : ExecOperation(); break;

    case    8 : ExecOperation(); break;

    case    9 : ExecOperation(); break;

    case    10: ExecOperation(); break;

  }

  NumTakt=(NumTakt+1)%MaxTakt[COP];

  if (NumTakt==0) EndCmnd=1;

}

 

void ExecuteProgram()

{

  if (Sost != Vvod)

  {

    ExecTakt();

    OutValues();

    switch (Sost)

    {

      case Takt : Sost=Vvod; break;

      case Cmnd : if (EndCmnd) Sost=Vvod; break;

      case Auto : if (EndProg) Sost=Vvod; break;

      case Demo : if (Speed != 0) delay(1000/Speed);

  if (EndProg) Sost=Vvod; break;

    }

  }

}

 

Главная программа (MBM.cpp)

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include "func.h"

extern char UserCmnd;

extern char CmndExit;

extern word NumTakt;

extern word PC;

extern word Shag;

extern int EndCmnd;

extern int EndProg;

extern TSost Sost;

extern TRegTV ArrReg[];

extern const word MaxTakt[];

extern word COP;

extern word CurrentReg;

extern word MaxCurrReg;

int main()

{

  InitMBM();

  setwritemode(1);

  do

  {

    OutValues();

    RectangleDouble();

    do

    {

      OutTime();

      ExecuteProgram();

    }

    while (!kbhit());

    RectangleDouble();

    UserCmnd=ReadKey();

    switch (UserCmnd)

    {

      case 9 : CurrentReg=(CurrentReg+1)%MaxCurrReg;break;  //Tab

 

      case 65: Sost=Takt;break;                             //F7

 

      case 66: Sost=Cmnd;EndCmnd=0;break;                   //F8

 

      case 67: Sost=Demo;EndProg=0;CurrentReg=0;break;      //F9

 

      case 68 :Sost=Auto;EndProg=0;break;                   //F10

 

      case 27: Sost=Vvod;NumTakt=0;PC=0x000C;break;         //Esc

 

      case 43: if (Sost==Vvod)                              //+

if (CurrentReg==1) *ArrReg[CurrentReg].Value+=1;

else

   *ArrReg[CurrentReg].Value+=Shag;

       if (Sost==Demo)

*ArrReg[CurrentReg].Value+=Shag;

       break;

 

      case 42: if (Sost==Vvod)                              //* vmesto -

if (CurrentReg==1) *ArrReg[CurrentReg].Value-=1;

else *ArrReg[CurrentReg].Value-=Shag;

       if (Sost==Demo)

*ArrReg[CurrentReg].Value-=Shag;

       break;

    }

  }

  while (UserCmnd!=CmndExit);

  closegraph();

  return 0;

}

 

 

 


 



Информация о работе Моделирование машины Фон-Неймана