В современных компьютерах организация ввода/вывода по крайней мере столь же сложна, как центральный процессор. Чтобы не увеличивать в два раза объем задачи, предположим, что супервизор управляет прохождением каждой задачи пользователя.
Таблица 25.1 Сводка кодов операций
Обращения к супервизору могут осуществляться как непосредственно при помощи команды вызова супервизора Supervisor Call, так и косвенным образом — при возникновении особых случаев. Различные поля команды Supervisor Call используется для задания требуемых действий и передачи параметров. Далее представлен минимальный набор действий супервизора в зависимости от содержимого указателя регистра R1.
R1 = 0 — Завершить выполнение программы и произвести после нее «чистку мусора»
R1 = 1 — Прочитать из входного потока целое число и записать его по исполнительному адресу команды SVC (адрес должен указывать на слово).
R1 = 2 — Прочитать вещественное число и записать его по исполнительному адресу.
R1 = 3 —Прочитать литеру и записать по исполнительному адресу.
R1 = 4 — Перейти во входном потоке к новой записи.
R1 = 5 — Слово по исполнительному адресу записать в выходной поток в виде целого числа.
R1 = 6 — Слово по исполнительному адресу записать в выходной поток в виде вещественного числа.
R1 = 7 —Байт по исполнительному адресу записать в выходной поток в виде литеры.
R1 = 8 —Записать в выходной поток признак конца записи.
R1 = 9 и R2 = 0 —Закончить трассировку выполнения команд.
R1 = 9 и R2 = 1 — Начать трассировку выполнения команд. Печатать текущую информацию о каждой выполняемой команде.
R1 = А — Исполнительный адрес команды SVC должен быть адресом слова. Правое полуслово указывает адрес начала, а левое — адрес конца участка памяти для дампа. Программа дампа должна выдавать содержимое памяти в указанных пределах как в шестнадцатеричном, так и в текстовом формате. Возможно, окажется полезным выводить также мнемонику команд. Идущие подряд одинаковые строки программа дампа должна распознавать и печатать одну из них.
R1 = F — Данный вызов супервизора никогда не будет предназначаться для системного применения и может быть использован в имитаторе для любых целей.
Предполагается, что целые и вещественные числа во входном и выходном потоках заканчиваются пробелами.
Особые случаи имеют место, когда в процессе выполнения команд возникают ошибки. При этом выполнение программы прерывается и супервизор извещается о причине прерывания и адресе команды, вызвавшей прерывание. Приведем вкратце перечень особых случаев.
Запрещенный адрес команды — на начало цикла выполнения команды адрес в САК — нечетный.
Некорректная команда — команда с данным кодом операции отсутствует.
Некорректная косвенная адресация — косвенный адрес — нечетный.
Неверная адресация слова — адрес слова, указанный в операнде команды, не делится на четыре.
Некорректность вещественного представления — результат некоторой операции, определяющей вещественное значение, не может быть представлен в формате нормализованного вещественного числа.
Некорректность команды Execute — исполнительный адрес команды Execute — нечетный.
Деление на нуль — в операциях деления или нахождения остатка делитель равен нулю.
Зацикливание кода операции — четырехбайтовая команда начинается с FFFE.
Реакция супервизора на особый случай оставляется на усмотрение исполнителя, она должна лишь включать в себя сообщение пользователю о происшедшем событии.
Файл абсолютной загрузки описывает содержимое памяти УМ-1 перед выполнением программы. Обычно такие файлы получаются с помощью загрузчика УМ из перемещаемого языка загрузки, и в практически работающих системах такие файлы для экономии места в памяти, как правило, представляются в некотором двоичном формате. В нашем случае мы опишем формат, который можно отперфорировать, что облегчает процесс отладки. Каждая из записей физического файла состоит из 80 внешних литер, при этом допустимыми являются цифры, буквы А, В, С, D, E, F, N и пробел. Чаще всего эти внешние литеры будут объединяться в группы, образуя шестнадцатеричные числа. Заметим, что для образования одного двухразрядного шестнадцатеричного числа требуются две внешние литеры, и это в свою очередь как раз обеспечивает заполнение позиции одной внутренней литеры (байта) УМ-1). [51]