Моделирование вычислительной машины

Разработка программы для изображения в графическом режиме на экране структуры модели вычислительной машины и демонстрация функционирования при выполнении программы вычисления. Описание процесса разработки, обоснование структур данных и их форматов.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 07.06.2019
Размер файла 170,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

ФГОУ ВПО «Чувашский государственный университет

имени И.Н. Ульянова»

Факультет: Информатики и вычислительной техники

кафедра вычислительной техники

Курсовая работа

по программированию на тему:

«Моделирование вычислительной машины»

Выполнил: студентка Семенова А.А.

Проверил: доц. Симаков А.Л.

Чебоксары 2018 г.

Индивидуальное задание

1. Разработать программу для изображения в графическом режиме на экране ПЭВМ структуры модели вычислительной машины (МВМ) и демонстрации ее функционировании при выполнении программы вычисления F= A + A - (В + В) - 1. Дополнительно в переменной ZERO подсчитать количество значений вычитаемых переменных, равных нулю.

2. Программа должна отображать на экране монитора название работы, автора, структуру МВМ, язык управления и демонстрировать работу МВМ в автоматическом и управляемом режимах с изменяемой скоростью.

3. Программа должна иметь справку о своем назначении и использовании, вызываемую по ключу «/?» и по пустой командной строке.

4. Программа должна быть организована в соответствии с идеологией структурного программирования, состоять из модулей, процедур, функций. Текст должен быть структурирован. Подпрограммы не должны быть размером более 20…25 строк, должны быть легко читаемы и расширяемы, понятны; нестандартные решения должны быть прокомментированы.

Описание процесса разработки и обоснования способа решения задачи

Согласно заданию, для отображения структуры МВМ используется модуль Graph:

- Для вывода стрелок используется вывод символов “<” и “>”, это быстрее и проще, чем изображать стрелки из двух линий.

- Для вывода текста удобно использовать процедуру OutTextXY.

- Для вывода линий используется процедура Line с параметрами начала и конца линии, но, поскольку линии, используемые в изображении структуры МВМ, расположены только горизонтально или вертикально, указывается только координаты начальной точки, длина линии и направлении.

- Рамки выводятся процедурой Rectangle, но в описании рамки указываются координаты верхнего левого угла, длина и ширина рамки и значение регистра, содержащегося в данной рамке.

- Для выделения выбранного элемента используется двойная рамка, этот вариант легко реализуется, благодаря режиму вывода XORPut и процедуре SetWriteMode.

Описание разработки и обоснование структур данных и их форматов

На экране много однотипных элементов, для уменьшения кода они обрабатываются в цикле. Описание надписей, выводимых из кода программы, хранится в виде массива записей, содержащих координаты и строку записи.

type

TMsgTV = record

X,Y: integer;

Msg: string[10];

end;

Записи хранятся в типированной константе-массиве записей.

const

CountMsg = 43;

ArrMsg: array [0..CountMsg-1] of TMsgTV = (

(X:120; Y:120; Msg:'CPU'),

(X:450; Y:120; Msg: 'Memory'),

...);

Тип линии - запись, содержащая координаты начала, длину и направление линии, а все линии - массив записей.

type

TLineTV = record

X,Y: integer;

Len: integer;

Dir: (Down, Right);

end;

const

CountLine = 26;

ArrLine: array [0..CountLine-1] of TLineTV = (

(X:480; Y:0; Len:480; Dir: Down),

(X:0; Y:40; Len:640; Dir: Right),

...);

Тип рамки - запись, включающая координаты привязки, длину, высоту и адрес значения регистра.

Один из вариантов это массив AllReg как буфер для ввода и вывода.

Тогда при изменении содержимого регистров или памяти нужно будет новое значение передавать в этот буфер, а при изменении данных оператором содержимое буфера копировать в регистры или память, так же этот вариант организации данных требует две подпрограммы

1) пересылка данных из буфера в регистры и ячеек памяти при изменениях с клавиатуры.

2) пересылки значений регистров и ячеек памяти в буфер после выполнения каждого такта машинной программы.

Плюс в том что мы сможем обращаться к регистрам по именам,

но получим некоторые минусы:

-две дополнительные подпрограммы.

-подпрограммы копирования не являются регулярными, их код будет некрасив и не эффективен.

-обращение к элементам массива индикации при копировании будет происходить не в цикле, по индексам а не по именам.

Поэтому в своей программе я использовала другой способ.

Используя тип Value:^word мы получим некоторые преимущества

-доступ к регистрам по именам;

-произвольное расположение данных в моделируемой оперативной памяти

-появляется дополнительная возможность иметь рамку без значения числа если value = nil;

- требуются минимальные изменения в имеющемся коде добавление"^".

type

TRegTV = record

X, Y: integer;

W, H: integer;

Value:^word;

end;

const

CountReg = 14;

ArrReg: array[0..CountReg-1] of TRegTV = (

{ Shag } (X:40; Y:360; W:70; H:30; Value:@Shag),

{ Speed } (X:140; Y:360; W:70; H:30; Value:@Speed),

{ Pc} (X:180; Y:160; W:70; H:30; Value:@PC),

...);

Описание программы

модель вычислительная машина

Общие сведения.

Наименование программы: «Модель вычислительной машины Фон-Неймана». Программное обеспечение, необходимое для функционирования программы: операционная система Microsoft Windows. Язык программирования, на котором написана программа: Pascal.

Функциональное назначение.

Программа предназначена для демонстрации функционирования машины Фон-Неймана при выполнении вычисления функции

F=A + A - (В + В) - 1

В программе есть возможности:

- ввода значений некоторых элементов хранения, увеличением или уменьшением их на шаг, который тоже можно указывать;

- изменения режимов выполнения вычислений: ввод, такт, команда, демонстрация, автомат;

- изменения скорости демонстрации;

- вывода результата вычисления.

Описание логической структуры

Алгоритм программы.

Для реализации режимов работы используется структура выбора case: запуск модели в требуемом режиме переводит программу в соответствующее состояние, по которому делаются действия, связанные только с этим состоянием. Модель имеет следующие состояния: ввод, такт, демонстрация, автомат, команда. Вводится переменная состояния, которой присваивается начальное значение «Ввод». В этом состоянии процедура выполнения программы сразу возвращает управление, не выполняя более никаких операций. Если после каждого такта команды состояние будет иметь значение «Ввод», то в результате можно получить режим «Такт». Для выполнения всей программы («Авто») нужно после выполнения последнего такта программы нужно состояние изменить на «Ввод». Чтобы знать, выполнен последний такт или нет, вводится булева переменная. Аналогично определяется завершение выполнения команды. При выполнении прерывания состояние сбрасывается в «Ввод».

Структура программы

Проект состоит из следующих модулей:

1. MBM - главный модуль - получает управляющие директивы пользователя и вызывает подпрограммы выполнения требуемых функций интерактивного режима;

2. MBMData - модуль данных - хранит общие данные проекта и общие типы данных.

3. MBMInOut - модуль ввода-вывода - содержит подпрограммы для реализации интерфейса с пользователем.

4. GraphLib - модуль с графическими подпрограммами - расширяет возможности модуля Graph.

5. MBMCpu - модуль выполнения машинных команд - содержит подпрограммы моделирования работы процессора ЦВМ.

Используемые технические средства

1. Персональный компьютер;

2. Монитор;

3. Клавиатура.

Вызов и загрузка.

Программа вызывается через exe-файл: MBM.exe.

На диске программа занимает 4503 К.

Объем программы: 670 строк.

Входные данные.

1. Значения операндов A, В, One, Zero, F. Хранятся в массиве вместе с машинной программой.

2. Значение счетчика команд.

3. Значение скорости тактов как количество тактов, выполняемых за одну секунду.

4. Шаг изменения значений, предназначенный для инкрементирования/декрементирования операндов, счетчика команд, скорости демонстрации.

5. Режим пуска МВМ (Такт - F7, Демонстрация - F9, Автомат - Ctrl-F9).

6. Прерывание выполнения программы МВМ (Esc).

7. Выход из модели (Alt-X).

Для моделирования выполнения машинной программы необходима сама машинная программа, которая должна быть размещена в модели памяти в формате машинных команд.

Машинные команды

$2000

A

0007

$2001

B

0006

$2002

One

0001

$2003

Zero

0000

$2004

F

FFFF

$2005

loa A

$0300

$2006

add A

$0100

$2007

Sto A

$0400

$2008

loa B

$0301

$2009

add B

$0101

$200A

Sto B

$0401

$200B

loa A

$0300

$200C

sub B

$0201

$200D

Sto F

$0404

$200E

jz IncZero1

$0513

$200F

loa F

$0304

$2010

sub one

$0202

$2011

Sto F

$0404

$2012

jmp exit

$0618

$2013

loa zero

$0303

$2014

add one

$0102

$2015

Sto zero

$0403

$2016

jmp m1

$0619

$2017

.end main

$071A

$2018

address of mark 'exit'

$2017

$2019

address of mark 'm1'

$200F

$201A

address of mark 'main'

$2005

Выходные данные

1. Структура МВМ (рис. 1).

2. Назначение основных клавиш управления (справка).

3. Содержимое всех регистров в шестнадцатеричной системе счисления.

4. Содержимое ячеек памяти с операндами в шестнадцатеричной системе счисления.

5. Содержимое части ячеек с командами программы МВМ.

6. Режим работы.

7. Скорость демонстрации в десятичной системе счисления.

8. Выделение активного в данный момент элемента.

9. Шаг изменения значений.

10. Номер выполненного такта.

Рис. 1. Структура МВМ.

Описание интерфейса:

Memory(память) содержит адреса RGA, Регистра данных RGD и массив ячеек ОЗУ.

Ячейки имеют последовательные номера начиная с 0.

В ячейке RGA указывается ячейка памяти доступная в данный момент.

RGD содержит данные размером в машинное слово, предназначенное для записи в ячейку или чтения из ячейки по адресу RGA.

Процессор предназначается для последовательного чтения команд из памяти и их выполнения. Процессор содержит счетчик команда Counter, регистр команда RGK, аккумулятор AKK, регистр флагов RGF.

Назначение регистров:

Counter(Счк) храните адреса следующей выполняемой команды.

RgK(Ргк) хранение кода текущей операции.

Акк хранение результатов операции.

RGF(Ргф) хранение признаков(флагов).

Список литературы

1. Моделирование машины Фон-Неймана. Метод. указания к лабораторной работе /Сост. А. Л. Симаков; Чуваш. ун-т. Чебоксары, 2001. - 24с.

2. Симаков А. Л. Разработка модели ЦВМ: лаб. практикум / А. Л. Симаков. - Чебоксары: Изд-во Чуваш. ун-та, 2010. - 52 с.

3. ГОСТ 19.402-78 ЕСПД

Приложение

Инструкция для пользователя

Программа запускается через файл MBM.exe;

На входе предлагается ввести имя бинарного файла, который содержит в себе машинный код. Файл с кодом обязательно должен находиться в папке с файлом. В программе пользователь должен задать адрес запуска программы в ячейке Counter.

Управление:

Tab - выбор следующего элемента;

F7 - выполнение по тактам;

F9 - демонстрация;

Ctrl-F9 - автомат;

+/-:

+увеличивает счетчик адреса на step едениц

- уменьшает счетчик адреса на step едениц

в режиме демонстрации - изменение скорости,

в режиме ввода - изменение значения выделенного элемента;

Speed увеличивает или уменьшает скорость демонстрации

Step число на которое изменяется переменная или команда при нажатии +/-

Esc - переход в режим ввода;

Alt-X - выход.

Тестовые данные

Входные данные

Выходные данные

A

B

F

Zero

$0000

$0000

$FFFF

$0001

$FFFF

$FFFF

$FFFF

$0000

$0008

$0004

$0007

$0000

$0000

$0005

$ FFF5

$0001

$0007

$0000

$000D

$0001

Листинг программы

1 Модуль МВМ

program MBM;

uses MBMData,GraphLib,MBMInout,MBMCPU,Crt,Graph;

var UserCmnd:char; {direktiva polzovatelya}

begin

if (Paramstr(1)='/?') or (Paramstr(1)='') then begin

OutHelp;

exit;

end

else ReadMachineCode;

if Bul then exit;

InitMBM; {ini grafik and vivod structur}

SetWriteMode(XORPut);

repeat

OutValues;

RectangDoubl; {dvoinay ramka}

repeat

OutTime;

ExecuteProgram;

until KeyPressed;

RectangDoubl; {odinarnay ramka}

UserCmnd:=GetUserCmnd; {poluchena directiva}

case UserCmnd of

{Tab}#9: CurrentReg:=(CurrentReg+1) mod MaxCurrReg;

{F7} ^T:Sost:=Takt;

{F8} ^K:begin Sost:=Cmnd; EndCmnd:=False; end;

{Ctrl-F9} ^A:begin Sost:=Avto; EndProg:=False; end;

{F9} ^D:begin Sost:=Demo; EndProg:=False; end;

{Esc} #27:Sost:=Vvod;

#45: begin

if Sost=Demo then begin

CurrentReg:=1;

Speed:=Speed-Shag;

end

else

case CurrentReg of

0:Dec(Shag);

1:Speed:=ChM(Speed, Shag);

2:PC:=ChM(PC, Shag);

else

MEM[$2000+CurrentReg-3]:=ChM(MEM[$2000+CurrentReg-3], Shag);

end; {1} {1}

end;

end;

until UserCmnd=CmndExit; {Alt-X}

closeGraph;

end.

2 Модуль MBMData

unit MBMData;

unit MBMData;

interface

type

TMsgTV = record {atributi nadpisei }

X,Y:integer; {poziciz na e'krane}

Msg:string[80]; {tekst nadpisi}

end;

const

CountMsg = 43; {kolichestvo nadpisei}

ArrMsg:array[0..CountMsg-1] of TMsgTV =

((X:120; Y:120; Msg:'CPU'),

(X:450; Y:120; Msg: 'Memory'),

(X:100; Y:20; Msg:'Course work in "Programming"'),

(X:120; Y:30; Msg:'The structure of model computer'),

(X:400; Y:70; Msg:' A+A-(B+B)-1'),

(X:400; Y:80; Msg:'Student IVT 42-17'),

(X:400; Y:90; Msg:'Semenova Anastasia'),

(X:80; Y:150; Msg:'RGF'),

(X:210; Y:150; Msg: 'Counter'),

(X:25; Y:145; Msg:'ALY'),

(X:272; Y:145; Msg:'YY'),

(X:100; Y:220; Msg:'AKK'),

(X:200; Y:220; Msg:'RgK'),

(X:400; Y:150; Msg:'RgA'),

(X:485; Y:135; Msg:'RAM locations'),

(X:400; Y:220; Msg:'RGD'),

(X:272; Y:200; Msg:'+'),

(X:295; Y:165; Msg:'Address'),

(X:292; Y:235; Msg:'data'),

(X:385; Y:265; Msg:'15 0'),

(X:300; Y:135; Msg:'R/W'),

(X:567; Y:150; Msg:'A'),

(X:567; Y:190; Msg:'B'),

(X:567; Y:220; Msg:'One'),

(X:567; Y:250; Msg:'Zero'),

(X:567; Y:280; Msg:'F'),

(X:567; Y:310; Msg:'One com'),

(X:45; Y:207; Msg:'<'),

(X:245; Y:207; Msg:'>'),

(X:185; Y:207; Msg:'>'),

(X:372; Y:175; Msg:'>'),

(X:485; Y:175; Msg:'>'),

(X:372; Y:243; Msg:'>'),

(X:485; Y:238; Msg:'>'),

(X:450; Y:238; Msg:'<'),

(X:55; y:350; Msg:'Step'),

(X:150; y:350; Msg:'Speed'),

(X:260; y:350; Msg:'Time'),

(X:100; y:410; Msg:'Help'),

(X:10; y:420; Msg:' Tab - Selection | F7 - Tact'),

(X:10; y:430; Msg:' Esc - Pause | Alt-X Close MVM'),

(X:10; y:440; Msg:' "+" - Enlarge 1 | Ctrl-F9 - Avro'),

(X:10; y:450; Msg:' "-" - Decrease 1 | F9 - Demo'));

type

TLineTV = record {atributi linii}

X,Y:integer; {pozicia na e'krane}

Len:integer; {Dlina}

Dir:(Down,Right); {Napravlenie}

end;

const

CountLine = 26; {kolichestvo linii}

ArrLine:array[0..CountLine-1] of TLineTV =

((X:251; Y:178; Len:128; Dir:Right),

(X:20; Y:130; Len:270; Dir:Right),

(X:20; Y:300; Len:270; Dir:Right),

(X:20; Y:130; Len:170; Dir:Down),

(X:290; Y:130; Len:170; Dir:Down),

(X:340; Y:130; Len:270; Dir:Right),

(X:340; Y:300; Len:270; Dir:Right),

(X:340; Y:130; Len:170; Dir:Down),

(X:610; Y:130; Len:170; Dir:Down),

(X:290; Y:145; Len:50; Dir:Right), {R/W}

(X:35; Y:285; Len:230; Dir:Right),

(X:35; Y:210; Len:75; Dir:Down),

(X:35; Y:210; Len:60; Dir:Right),

(X:95; Y:210; Len:20; Dir:Down),

(X:95; Y:260; Len:24; Dir:Down),

(X:150; Y:210; Len:74; Dir:Down),

(X:150; Y:210; Len:60; Dir:Right),

(X:210; Y:190; Len:20; Dir:Down),

(X:265; Y:245; Len:40; Dir:Down),

(X:240; Y:190; Len:40; Dir:Down),

(X:210; Y:260; Len:23; Dir:Down),

(X:240; Y:210; Len:40; Dir:Right),

(X:280; Y:178; Len:30; Dir:Down),

(X:265; Y:245; Len:115; Dir:Right),

(X:450; Y:178; Len:40; Dir:Right),

(X:450; Y:240; Len:40; Dir:Right));

type

TSost = (Vvod,Avto,Demo,Takt,Cmnd);

const

Sost:TSost = vvod; {sostoyanie modeli}

const

Flags:word = 0; {RGF}

Akk:word = 0; {AKK}

PC:word = $2005; {SchK}

Command:word = 0; {RGK}

Adres:word = 0; {RGA}

Data:word = 0; {RGD}

Shag:word = 1; {Shag izmenenia znachenia }

Speed:word = 10; {1 operacia v sekundu}

COP:word = 0; {Kod operacii }

ADR:word = 0; {Adresnay chast' komandi }

NumTakt:word = 0; {Nomer takta}

Aisp:word = 0; {Adres ispolnitel'n1o1i}

EndProg:Boolean = False; {Programa zavershena ? }

EndCmnd:Boolean = False; {Komanda zavershena ? }

CF:boolean=false;

ZF:boolean=false;

const

{mashinnaya programma}

MEM:array[$2000..$201A] of word = (

{Adress.Asm Kod }

$0007,

$0006,

$0001,

$0000,

$FFFF,

$0300,

$0100,

$0400,

$0301,

$0101,

$0401,

$0300,

$0201,

$0404,

$0513,

$0304,

$0202,

$0404,

$0618,

$0303,

$0102,

$0403,

$0619,

$071A,

$2017,

$200F,

$2005

);

type

TRegTV = record {Atribut1o1 ramki registra/ yacheiki}

X,Y:integer; {Pozicia na e'krane}

W,H:integer; {Shirina i v1o1sota}

Value:^word; {Ukazatel' na znachenie}

end;

const

CountReg = 14; {Kolichestvo ramok}

ArrReg:array[0..CountReg-1] of TRegTV=(

{ Shag } (X:40; Y:360; W:70; H:30; Value:@Shag),

{ Speed } (X:140; Y:360; W:70; H:30; Value:@Speed),

{ Pc} (X:180; Y:160; W:70; H:30; Value:@PC),

{ A } (X:490; Y:150; W:70; H:30; Value:@Mem[$2000]),

{ B } (X:490; Y:180; W:70; H:30; Value:@Mem[$2001]),

{ One } (X:490; Y:210; W:70; H:30; Value:@Mem[$2002]),

{ Zero } (X:490; Y:240; W:70; H:30; Value:@Mem[$2003]),

{ F } (X:490; Y:270; W:70; H:30; Value:@Mem[$2004]),

{One comand}(X:490; Y:300; W:70; H:30; Value:@Mem[$2005]),

{Flag} (X:60; Y:160; W:70; H:30; Value:@Flags),

{Akk} (X:60; Y:230; W:70; H:30; Value:@Akk),

{Command} (X:180; Y:230; W:70; H:30; Value:@Command),

{Adres} (X:380; Y:160; W:70; H:30; Value:@Adres),

{Data} (X:380; Y:230; W:70; H:30; Value:@Data));

CurrentReg:word=2; {Nomer v1o1brannoi ramki }

MaxCurrReg:word=8; {Kolichestvo v1o1biraem1o1x ramok}

const

bul: boolean = false;

CmndExit=^X; {Alt+X}

implementation

end. {MBMData}

3 Модуль MBMINOUT

unit MBMInOut;

interface

procedure OutStructure;

{V1o1vesti znachenia registrov i yacheek v grafike}

procedure OutValues;

{V1o1vesti / pogasit' dvoinuyu ramku}

procedure RectangDoubl;

{Inicial grafiki i v1o1vod struktur1o1}

procedure InitMBM;

{Prochitat' rashirenn1o1i kod klavishi i preobrazovat' ego v kod direktiv1o1 pol'zpvatelya}

function GetUserCmnd:char;

procedure OutTime;

function FileExists(s: string):boolean;

Function ChP(A, B:word):word;

Function ChM(A, B:word):word;

procedure ReadMachineCode;

procedure OutHelp;

implementation

uses

MBMData,crt,Graph,GraphLib;

const SostName:array[TSost] of string[4] = ('Vvod','Avto','Demo','Takt','Cmnd');

NewTime = 0;

OldTime = 1;

type

TRegTV = record

X,Y:integer;

W,H:integer;

Value:^word;

end;

{V1o1vesti strukturu modeli BM s nadpisyami }

procedure OutStructure;

var i:byte;

X,Y,W,H:integer;

Msg:string[50];

begin

for i:=0 to CountMsg-1 do

with ArrMsg[i] do

OutTextXY(X,Y,Msg);

for i:=0 to CountLine-1 do

with ArrLine[i] do

case Dir of

Right:Line(X,Y, X+Len, Y);

Down:Line(X,Y, X, Y+Len);

end;

for i:= 0 to CountReg-1 do

with ArrReg[i] do

Rectangle(X,Y, X+W, Y+H);

end;

{V1o1vestu znachenia}

procedure OutValues;

var

i:byte; a:integer;

begin

for i:=0 to CountReg-1 do

with ArrReg[i] do

if Value <> nil then

if i = 1 then

{V1o1vod speed demonstracii}

OutIntegerXY (X+15,Y+8,6, Value^)

else

OutHexXY (X+15, Y+8,4, Value^);

for i:=0 to 7 do begin

with ArrReg[i] do

OutTextXY(X,Y, 'a');

end;

end;

procedure RectangDoubl;

begin

with ArrReg[CurrentReg] do

Rectangle(X+3, Y+3, X+W-3, Y+H-3);

end;

procedure InitMBM;

var

GrDr,GrMd:integer;

begin

{Inicial graf. regima monitora}

GrDr:=9; GrMd:=2;

initGraph(GrDr,GrMd,'');

OutStructure;

end;

function GetUserCmnd:char;

var

Ch:char;

begin

{ Chtenie rashirennogo koda klavisi i psevdokodirovanie}

Ch:=Readkey;

if Ch=#0 then

case Readkey of

#45:Ch:=CmndExit;

#65:Ch:=^T;

#66:Ch:=^K;

#67:Ch:=^D;

#102:Ch:=^A;

end;

GetUserCmnd:=Ch;

end;

Function ChP(A, B:word):word;

var

L, PA, PB:longint;

begin

PA:=A;

PB:=B;

L:=PA+PB;

if L>$FFFF then

L:=Abs($FFFF-Abs(PA+PB)+1)

else

L:=PA+PB;

ChP:=L;

end;

Function ChM(A, B:word):word;

var

L, PA, PB:longint;

begin

PA:=A;

PB:=B;

if PA>=PB then

ChM:=PA-PB

else begin

ChM:=Abs($FFFF-Abs(PA-PB)+1);

end;

end;

procedure OutTime;

var CurrentTime,NewTime,OldTime,Time,TimeToTimeString: integer;

begin

NewTime:=CurrentTime;

if NewTime<>OldTime then begin

OldTime:=NewTime;

ClearBar (250,370,250+8*8,370+8);

OutTextXY (250,370,'hh:mm:ss');

end;

end;

Function FileExists(s: string): boolean;

var f: file;

begin

assign(f, s);

{$I-} Reset(F); {$I+}

if (IOResult = 0) then

begin

Close(F);

FileExists:= true;

end

else

FileExists:= false;

end;

procedure ReadMachineCode;

var

f: file of word;

s: string;

w,i: word;

begin

clrscr;

s:=paramstr(1);

while not FileExists(s) do begin

if not FileExists(s) then begin

writeln('” ©« ­Ґ ­ ©¤Ґ­!‚ўҐ¤ЁвҐ Є®а४в­л© ¤аҐб а бЇ®«®¦Ґ­Ёп д ©«.');

writeln('„«п ўл室 ўўҐ¤ЁвҐ /exit');

end;

readln(s);

if s='/exit' then begin

bul:=true;

exit;

end;

end;

assign(f,s);

reset(f);

i:=$2000;

while not Eof(f) do begin

read(f,w);

MEM[i]:=w;

inc(w);

end;

end;

procedure OutHelp;

var i: byte;

begin

clrscr;

for i:=1 to 9 do

write(i);

writeln('Najmite lybyu klavishu');

Readkey;

end;

end.

4 Модуль MBMCPU

unit MBMCPU;

interface

{V1o1polnit' mashinnuyu programmu po taktam}

procedure ExecuteProgram;

implementation

uses Crt,MBMData,MBMInOut;

type St7=string[20];

const MaxTakt:array[0..7] of word=(5, 11, 11, 11, 10, 8, 10, 11);

{NOp, Add, Sub, Loa, Sto, JZ, Jmp,.End}

Function FindCF(VOP:St7):boolean;

var OP, PAkk, PData:longint;

begin

Pakk:=Akk;

PData:=Data;

if VOP='ExecSub' then OP:=PAkk-PData;

if VOP='ExecAdd' then OP:=PAkk+PData;

if (OP>$FFFF) or (OP<-$0000) then FindCF:=true else FindCF:=false;

end;

procedure ExecAdd;

begin

case NumTakt of

7:Adres:=Aisp;

8:Data:=MEM[Adres];

9:begin

CF:=FindCF('ExecAdd');

AKK:=ChP(Akk, Data);

end;

10:begin

if Data=0 then

ZF:=true;

if (ZF=True) and (CF=True) then Flags:=$1001;

if (ZF=True) and (CF=false) then Flags:=$0001;

if (ZF=False) and (CF=True) then Flags:=$1000;

if (ZF=False) and (CF=False) then Flags:=$0000;

end;

end;

end;

procedure ExecSub;

begin

case NumTakt of

7:Adres:=Aisp;

8:Data:=MEM[Adres];

9:begin

CF:=FindCF('ExecSub');

Akk:=ChM(Akk, Data);

end;

10:begin

if Data=0 then

ZF:=true;

if (ZF=True) and (CF=True) then Flags:=$1001;

if (ZF=True) and (CF=false) then Flags:=$0001;

if (ZF=False) and (CF=True) then Flags:=$1000;

if (ZF=False) and (CF=False) then Flags:=$0000;

end;

end;

end;

procedure ExecLoa;

begin

case NumTakt of

7:Adres:=Aisp;

8:Data:=MEM[Adres];

9:Akk:=Data;

10:begin

if Data=0 then

ZF:=true;

if (ZF=True) and (CF=True) then Flags:=$1001;

if (ZF=True) and (CF=false) then Flags:=$0001;

if (ZF=False) and (CF=True) then Flags:=$1000;

if (ZF=False) and (CF=False) then Flags:=$0000;

end;

end;

end;

procedure ExecSto;

begin

case NumTakt of

7:Adres:=Aisp;

8:Data:=Akk;

9:Mem[adres]:=Data;

end;

end;

procedure ExecJZ;

begin

case NumTakt of

7:if zf = true then PC:=Aisp;

end;

end;

procedure ExecJMP;

begin

case NumTakt of

7:Adres:=Aisp;

8:Data:=MEM[Adres];

9:PC:=Data;

end;

end;

{V1o1polnit' psevdokomandu.END}

procedure ExecEND;

begin

case NumTakt of

7:Adres:=Aisp;

8:Data:=MEM[Adres];

9:PC:=Data;

10:begin

CF:=False;

ZF:=False;

EndProg:=True;

end;

end;

end;

{V1o1polnit' odnu komandu}

procedure ExecOperation;

begin

case COP of

1:ExecAdd;

2:ExecSub;

3:ExecLoa;

4:ExecSto;

5:ExecJZ;

6:ExecJmp;

7:ExecEnd;

end;

end;

{V1o1polnit' odin takt}

procedure ExecTakt;

var out:text;

x:integer;

begin

case NumTakt of

0:Adres:=PC;

1:Data:=MEM[Adres];

2:Command:=Data;

3:Inc(PC);

4:COP:=Command shr 8;

5:ADR:=Command and $00FF;

6:Aisp:=PC and $FF00 or ADR;

7..10:ExecOperation;

end;

NumTakt:=(NumTakt+1) mod MaxTakt[COP];

if NumTakt=0 then EndCmnd:=False;

end;

procedure ExecuteProgram;

begin

if Sost <> Vvod then begin

ExecTakt;

OutValues;

case Sost of

Takt: Sost:=Vvod;

Cmnd: if EndCmnd then Sost:=Vvod;

Avto: if EndProg then Sost:=Vvod;

Demo: begin

{V1o1polnit' zadergku v sootv so speed demonstracii}

if speed<>0 then

Delay (10000 div speed);

if EndProg then Sost:=Vvod;

end;

end; {case}

end; {if}

end; {ExecuteProgram}

end. {MBMCPU}

5 Модуль GRAPHLIB

unit GraphLib;

interface

{Ochistit' pryamougol'nik}

procedure ClearBar (Left,Top,Right,Bottom:integer);

{V1o1vesti celoe v 16-oi ss}

procedure OutHexXY (X,Y:integer; Lens:byte; Val:word);

{V1o1vesti celoe s chislom simvolov Lens}

procedure OutIntegerXY (X,Y,Lens:integer; IntVal:word);

implementation

uses

Graph;

type

string4=string[4];

{Ochistit' pryamougol'nik v graf. koordinatax}

procedure ClearBar (Left,Top,Right,Bottom:integer);

begin

SetFillStyle(EmptyFill, Black);

Bar(Left, Top, Right, Bottom);

end;

{Preobrazovat' celoe v 16-oi stroku}

Function WordToHex(N:word; Lens:byte):string4;

const

NexDigit:array[0..15] of char='0123456789ABCDEF';

var

S:string4; Pos:byte; Ost:word;

begin

S:='0000'; S[0]:=chr(Lens);

for Pos:= Lens downto 1 do begin

Ost:= N mod 16;

N:= N div 16;

S[Pos]:=NexDigit[Ost];

end;

WordToHex:= S;

end; { WordToHex }

{V1o1vesti celoe v 16-oi ss}

procedure OutHexXY (X,Y:integer; Lens:byte; Val:word);

begin

ClearBAr (X,Y,X+TextWidth('0')*(Lens+1),

Y+TextHeight('0'));

OutTextXY (X,Y,'$'+WordToHex(Val,Lens));

end;

procedure OutIntegerXY (X,Y,Lens:integer;

IntVal:word);

var Str7:string[7];

begin

Str (IntVal:Lens, Str7);

ClearBar(X, Y, X+TextWidth(Str7),

Y+TextHeight(Str7));

OutTextXY(X,Y,Str7);

end; { OutIntegerXY }

end. { GraphLib }

Размещено на Allbest.ru


Подобные документы

  • Функциональный состав микро-ЭВМ, разработка системы команд. Описание взаимодействия всех блоков электронно-вычислительной машины при выполнении команд программы. Арифметико-логическое устройство, кэш-память процессора, функциональное моделирование.

    курсовая работа [981,4 K], добавлен 27.05.2013

  • Формальная схема и закон функционирования моделируемой вычислительной системы для обработки программ. Составление алгоритма моделирующей программы на языке GPSS и листинга программы для стохастической модели. Верификация программы и анализ результатов.

    курсовая работа [347,3 K], добавлен 21.01.2013

  • Разработка вычислительной структуры, реализующей заданный набор операций для обработки запросов в реляционной базе данных (БД). Описание общей структуры системы с машиной баз данных. Разработка схем исполнительных процессоров и алгоритмов их операций.

    реферат [140,3 K], добавлен 27.10.2010

  • Порядок описание процесса разработки модели для разрешения задачи программирования с помощью средств языка программирования. Структуры данных и основные принципы их построения. Этапы компьютерного моделирования. Этапы и значение написания программы.

    курсовая работа [19,5 K], добавлен 19.05.2011

  • Разработка гипотетической машины при помощи макросредств ассемблера. Разработка алгоритма для реализации обязательных команд: сравнения двух символьных строк; их обмена; определения длины слова. Основные функции обработки строки, листинг программы.

    курсовая работа [59,6 K], добавлен 14.07.2012

  • Задачи диагностики электронно-вычислительной машины. Виды диагностических программ. Диагностические программы специального и общего назначения. Особенности метода микродиагностирования. Возможности программы AIDA64. Стоимость диагностических программ.

    курсовая работа [3,2 M], добавлен 04.04.2014

  • Разработка вычислительной системы, предназначенной для реализации заданного алгоритма обработки входных цифровых данных. Особенности ее построения на базе процессора x86 (К1810) в минимальном режиме. Описание микропроцессорного комплекта серии К1810.

    курсовая работа [318,4 K], добавлен 15.08.2012

  • Моделирование, анализ и исследование характеристик локальной вычислительной сети кольцевой структуры. Составление отчета о количестве необработанных заявок, особенности обработки всех данных, результаты отчета проиллюстрированы в виде гистограммы.

    курсовая работа [54,4 K], добавлен 25.11.2010

  • Чарльз Бэббидж - британский математик, философ, разработавший базовую концепцию вычислительной машины. Августа Ада Кинг (урождённая Байрон), графиня Лавлейс – английский математик. Работа над описанием вычислительной машины, появление первых программ.

    презентация [1,4 M], добавлен 07.05.2014

  • Исследование арифметических выражений и разработка простых программ. Таблица переменных для алгоритма и программы. Алгоритм решения, текст программы на языке С. Разработка программы вычисления значений выражений, сравнение результатов с ручным подсчетом.

    лабораторная работа [282,7 K], добавлен 30.01.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.