3 Разработка эмулятора
3.1 Программные модели узлов ЭВМ М1
Моделируемыми узлами ЭВМ М1 являются оперативная память, регистры и дешифратор. Им соответствуют в эмуляторе определенные переменные или массивы. Арифметико-логическое устройство АЛУ и сумматор адреса SA явным образом не моделируются: их функции выполняют соответствующие операторы программы.
Каждая ячейка памяти на машинном уровне – это последовательность битовых элементов. Две смежные ячейки памяти ЭВМ М1 могут интерпретироваться в машине как команда, если их содержимое направлено в регистр команд RK, или как обрабатываемые данные, если это содержимое поступает в блок регистров R или в операционные регистры OR1, OR2. В последнем случае данные могут обрабатываться как числа, если на дешифратор поступил код арифметической команды, или как последовательности бит, если дешифрирована логическая команда.
В общем случае память – это массив битовых строк. Однако язык Турбо Паскаль не имеет в явном виде средств для изображения и обработки таких строк. В связи с этим могут быть предложены два варианта моделирования памяти.
В первом варианте ячейка памяти рассматривается как строка типа string[8], каждый байт которой может принимать значение ‘0’ или ‘1’. Тогда модель памяти может быть представлена в следующем виде:
Type
string8 = string[8];
MemoryAr = array[0..255] of string8;
Var
Memory : MemoryAr;
Во втором варианте ячейка памяти изображается как множество из восьми элементов. Модель памяти для второго варианта:
Type
set8 = set of 1..8;
MemoryAr = array[0..255] of set8;
Var
Memory : MemoryAr;
Хотя внутренним представлением множества является битовая строка, но на уровне Паскаль-программы множество не может интерпретироваться как строка бит. Множество типа set8 лишь указывает, входят или не входят в его состав элементы 1 .. 8, что косвенным образом определяет значения 1 или 0 соответствующих разрядов ячейки памяти.
Регистры RS, OR1, OR2, Res, RP и блок регистров R моделируются аналогично памяти (string или set).
Регистр команд RK, включающий в себя поля KOP, MA, NR и AM, целесообразно моделировать записью, компонентами которой являются модели битовых строк.
Модель регистра RK для первого варианта:
Type
string2 = string[2];
string4 = string[4];
string8 = string[8];
RKType = record
KOP : string4;
MA,NR : string2;
AM : string8
end;
Var
RK : RKType;
Модель регистра RK для второго варианта:
Type
set2 = set of 1..2;
set4 = set of 1..4;
set8 = set of 1..8;
RKType = record
KOP : set4;
MA,NR : set2;
AM : set8
end;
Var
RK : RKType;
Рассмотрим теперь вопрос о модели дешифратора. В общем случае дешифратор – это устройство, имеющее входных ивыходных шин. Его функцией является активизация выходной шины, порядковый номер которой соответствует значению-разрядного двоичного числа на входе дешифратора. Моделью дешифратора является операторCase.
Предположим, что код операции RK.KOP (строка или множество) преобразован в программе в значение целочисленной переменной NumKOP типа byte. Тогда модель дешифратора может иметь вид: