Моделирование вычислительной машины
Разработка программы для изображения в графическом режиме на экране структуры модели вычислительной машины и демонстрация функционирования при выполнении программы вычисления. Описание процесса разработки, обоснование структур данных и их форматов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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