Хотя доступной документации на процессор нет, в [1] и [2] приводятся некоторые подробности относительно процесса выборки очередной команды, обработки прерываний и выполнения некоторых команд.

Одним из источников информации по начальным стадиям микропрограммы выборки команд и микропрограмм обработки прерываний является приведённый ниже небольшой фрагмент (32 слова) содержимого памяти микрокоманд в текстовом виде, включённый в качестве примера в [2]. Подробный разбор попавших в него микрокоманд, представляющих интерес, будет дан позже.

Фрагмент содержимого ДЗУ, часть 1
Фрагмент содержимого ДЗУ, часть 1
Фрагмент содержимого ДЗУ, часть 2
Фрагмент содержимого ДЗУ, часть 2
Фрагмент содержимого ДЗУ, часть 3
Фрагмент содержимого ДЗУ, часть 3
Фрагмент содержимого ДЗУ, часть 4
Фрагмент содержимого ДЗУ, часть 4

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

Из приведённого фрагмента видно, что адреса микрокоманд даются в десятичном виде — сначала единым числом, например, 286, а затем значениями отдельных тетрад адреса (1.1.14). Сами микрооперации представлены их мнемониками, за которыми в скобках следуют коды с указанием полей, в которых они задаются. Кроме того, микрооперации, выполняемые в разных полутактах, размещаются в отдельных столбцах. Наконец, указывается базовый адрес следующей выполняемой микрокоманды, а также возможные значения младшей тетрады адреса, если текущая микрокоманда содержит какие-либо микрооперации анализов.

Выборка команды

К [2] был приложен полный и, скорее всего, точный, кроме обычных опечаток, алгоритм этой микропрограммы, находящийся вместе с другими иллюстрациями в отдельном альбоме, но, к сожалению, альбом не сохранился, и поэтому остаётся довольствоваться только имеющимся текстовым описанием, а также блок-схемой алгоритма выборки из [1] из пяти частей, причём последний местами сомнителен или откровенно неверен.

Выборка команды, часть 1
Выборка команды, часть 1
Выборка команды, часть 2
Выборка команды, часть 2
Выборка команды, часть 3
Выборка команды, часть 3
Выборка команды, часть 4
Выборка команды, часть 4
Выборка команды, часть 5
Выборка команды, часть 5

Вход в микропрограмму выборки производится при завершении выполнения команды, при завершении выполнения микропрограммы прерывания или при завершении начальной загрузки программы (IPL, блоки 01, 02 и 03 соответственно на первой части блок-схемы выборки). Здесь следует заметить, что ход выборки команды, как он изображён в первой части блок-схемы, нарушает принципы работы Системы 360 сразу в нескольких пунктах. Важнейшим является то, что, если исходить из блок-схемы, выборка команды, т. е. её считывание из ОП (блоки 06 и 13), начинается до анализа на останов (блоки 12 и 15) и до анализа на наличие разрешённых запросов прерываний (блок 10). По всей вероятности, составитель этой блок-схемы не удосужился разобраться ни с документацией на архитектуру, ни с микропрограммой процессора. Начало последней частично приведено в [2] и сопровождается текстовым описанием — правда, неполным и местами тоже не совсем точным.

Концептуально корректная последовательность действий при завершении выполнения команды или после обработки прерывания — последняя сводится к сохранению старого PSW и, возможно, некоторой другой информации, связанной с прерыванием, и к загрузке нового PSW — в Системе 370 (именно 370, это не опечатка) заключается в следующем:

  • если имеются разрешённые запросы прерываний, самый приоритетный из них обрабатывается, после чего анализ на наличие разрешённых запросов прерываний повторяется (поскольку при обработке прерывания производится загрузка нового PSW, состояние разрешённости прерываний может измениться; кроме того, за время выполнения прерывания могут поступить новые запросы);

  • если запросов прерываний нет, проверяется состояние процессора «Стоп» или «Работа». Если процессор находится в состоянии «Стоп», дальнейшие действия прекращаются, на пульте управления загорается индикатор ручной работы и процессор переходит в ожидание нажатия определённых кнопок на пульте. В частности, нажатие кнопки «Пуск» переводит процессор из состояния «Стоп» в состояние «Работа», что позволяет ему продвинуться к следующему шагу алгоритма выборки команды;

  • если процессор не находится в состоянии «Стоп», он проверяет состояние бита PSW[14]. Если он установлен, процессор находится в состоянии «Ожидание», в котором команды не выполняются, но запросы разрешённых прерываний обрабатываются, поэтому процессор возвращается к началу данной последовательности, т. е. к анализу на наличие запроса прерывания;

  • если же бит PSW[14] сброшен, процессор находится в состоянии «Счёт» и обычным образом выполняет программу. Соответственно, в такой ситуации начинается собственно выборка команды.

В Системе 360 последовательность действий, связанных с обработкой прерываний и проверкой состояния процессора, строго не регламентирована, поэтому между реализациями возможны некоторые отклонения. Общая идея, однако, остаётся той же самой: если процессор находится в состоянии «Стоп», он не обрабатывает прерывания и не выполняет команды и реагирует лишь на определённые манипуляции с кнопками пульта управления; если он находится в состоянии «Работа», но при этом в PSW установлен бит ожидания, он обрабатывает прерывания, но не выполняет команды, и лишь в состоянии «Работа» и «Счёт» он выполняет команды, если нет разрешённых запросов прерываний.

Момент обновления значения интервального таймера ни в Системе 360, ни в Системе 370 не регламентирован, но большинство машин выполняет его в промежутке между завершением одной команды и началом выполнения следующей. Единственное условие его продвижения — нахождение процессора в состоянии «Работа», т. е. при останове процессора таймер тоже стоит.

Начальной частью микропрограммы выборки, как её описывает [2], является так называемая петля ожидания, блок-схема которой приводится в [1] и показана на следующем рисунке.

«Петля ожидания» в начале микропрограммы выборки команды
«Петля ожидания» в начале микропрограммы выборки команды

Петля состоит из четырёх микрокоманд, а соответственно, полное её выполнение занимает четыре такта, обозначенных на блок-схеме петли как Т1–Т4.

Первая микрокоманда петли (такт Т1) расположена по адресу 10F (271 или 1.0.15; она вместе с несколькими следующими микрокомандами имеется на приведённом в начале фрагменте ДЗУ, что даёт возможность точно восстановить алгоритм начального фрагмента микропрограммы выборки) и включает две микрооперации, выполняемые по тактовому сигналу С1: ТИС:=ТРС и ТРС=1. Первая из этих микроопераций передаёт текущее значение триггера рабочего состояния ТРС в триггер индикации состояния ТИС, вторая — анализирует текущее состояние ТРС, что обеспечивает переход либо на микрокоманду с адресом 10B (ТРС сброшен), либо повтор микрокоманды 10F (ТРС установлен).

Пока триггер рабочего состояния ТРС установлен, процессор находится в состоянии «Стоп», в котором команды не выполняются, прерывания не обрабатываются и значение интервального таймера не изменяется, при этом на пульте горит индикатор ручной работы — он зажигается благодаря микрооперации ТИС:=ТРС, поскольку им управляет триггер ТИС, а не напрямую триггер ТРС.

Всё, что процессор может делать в состоянии «Стоп», — это реагировать на нажатия некоторых кнопок на пульте управления. Как правило, нажатие той или иной кнопки вызывает принудительный переход на ту или иную микропрограмму путём занесения её адреса в РАДЗУ; например, нажатие кнопки «Ввод» при положении переключателя «Загрузка» в положении «Начальная загрузка» инициирует процесс начальной загрузки программы, для чего в РАДЗУ заносится адрес E04. Исключением является кнопка «Пуск»: при нажатии на неё РАДЗУ не изменяется, но производится сброс триггера ТРС, что обеспечит прекращение выполнения микрокоманды Т1 и переход на микрокоманду Т2, расположенную по адресу 10B. Если же ТРС изначально был сброшен (процессор находится в состоянии «Работа», т. е. обычным образом выполняет команды и обрабатывает прерывания), микрокоманда Т1 сразу переходит на Т2.

Вторая микрокоманда Т2 (адрес 10B, он же 267 или 1.0.11) содержит единственную микрооперацию — РССП[14]=0, что приводит к переходу либо на микрокоманду с адресом 100 (условие не соблюдается, т. е. РССП[14] установлен), либо на микрокоманду с адресом 102 (РССП[14] сброшен). Установленное состояние РССП[14] означает, что процессор находится в состоянии «Ожидание», а сброшенное — в состоянии «Счёт»; соответственно, микрокоманда 102 находится вне петли ожидания: с неё начинается собственно выборка команды.

Третья микрокоманда Т3 (адрес 100, он же 256 или 1.0.0) содержит две микрооперации: по синхросигналу С1 выполняется анализ ТИВ=1, а по синхросигналу С2 — передача РФПД:=РФП.

Анализ ТИВ=1 проверяет, не нужно ли перейти на продвижение таймера: триггер интервала времени ТИВ устанавливается по сигналу от электросети с частотой 50 Гц, а сбрасывается в микропрограмме продвижения таймера. Если он установлен, производится переход на микрокоманду с адресом 103, которая содержит переход на микрокоманду F30 — точку входа в микропрограмму продвижения таймера. Хотя на блок-схеме из [1] изображён переход от обновления таймера к выборке команды, это неверно: следом за обновлением таймера необходимо, как минимум, проверить и при необходимости обработать имеющиеся запросы прерываний (а возможно, опять выполнить полную проверку состояний «Стоп»/«Работа» и «Ожидание»/«Счёт») и лишь затем, возможно, выбирать очередную команду. По этой причине микропрограмма продвижения таймера должна перейти либо на микрокоманду 10F, т. е. на начало петли ожидания, либо на микрокоманду 100, либо на микрокоманду 101 — на последнюю переходит микрокоманда Т3, если ТИВ был сброшен.

Передача РФПД:=РФП готовит процессор к анализу наличия запросов прерываний.

Четвёртая микрокоманда Т4 (адрес 101, он же 257 и 1.0.1) является последней в петле ожидания и содержит четыре микрооперации. Одна из них — ТРС:=1, ЕСЛИ ПЕРЕКЛ≠АВТ — выполняется по тактовому сигналу С1 и устанавливает триггер ТРС, если переключатель режима работы на пульте управления не находится в положении «Автомат», т. е. если после выполнения каждой команды процессор должен останавливаться. Благодаря этой установке нажатие кнопки «Пуск», сбрасывающей ТРС, приведёт к выполнению лишь одной команды, если этого требует переключатель режима работы.

Три другие микрокоманды — БЛОК(А63), БЛОК(В63) и АН РФПД — обеспечивают переход на одну из пяти микрокоманд в зависимости от того, имеется ли разрешённый запрос прерывания и какой из них является самым приоритетным:

  • 109 — программное прерывание;

  • 10A — прерывание по вызову супервизора;

  • 10D — внешнее прерывание;

  • 10E — прерывание ввода-вывода;

  • 10F — разрешённых запросов прерываний нет.

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

Собственно выборка команды начинается с микрокоманды по адресу 102 (258, 1.0.2). Она содержит следующие микрооперации:

  • РЗПР[4]:=1 — выполняется по синхросигналу С1 и запрашивает обращение к ОП со стороны процессора;

  • ТДАН:=1 — выполняется по синхросигналу С1 и устанавливает триггер ТДАН, что указывает блоку обращения к ОП на выборку команды, т. е. что адрес обращения к памяти находится в РССП[40/63], а его младший бит должен быть равен нулю (команды располагаются на границе полуслов);

  • РОЦ[1/3,7/15]:=0 и РОЦ[4/6]:=0 — выполняются по синхроимпульсу С2 и обнуляют РОЦ, т. е. сбрасывают признаки любых особых случаев, приводящих к программному прерыванию.

Строго говоря, в [2] указана микрооперация РОЦ[1/3,7/21]:=0, а не РОЦ[1/3,7/15]:=0. Однако, согласно всем доступным описаниям, в регистре РОЦ имеется лишь 15 значащих разрядов, соответствующих 15 возможным причинам программных прерываний, а кроме того, по самому смыслу данной микрокоманды здесь должны сбрасываться индикаторы, которые будут устанавливаться в процессе выборки и выполнения команды при возникновении того или иного особого случая. Всё это позволяет предположить, что в [2] допущена ошибка, хотя не исключено, что битов всё-таки больше, см. ниже обсуждение микрокоманд 105 и 107.

Таким образом, запуск считывания начала очередной команды из ОП, указанный блоками 06 и 13 первой части приведённой выше блок-схемы выборки команды из [1], задаётся именно этой микрокомандой, расположенной после анализа состояний процессора «работа/останов» и «счёт/ожидание». Однако при выборке команды, т. е. если действуют режимы «работа» и «счёт», мы не видим анализа на наличие запросов обслуживания таймера и прерываний — а они должны анализироваться и обрабатываться! Единственное объяснение этому — анализ на наличие прерываний и запроса на продвижение таймера в конце выполнения каждой команды. Собственно, приведённая диаграмма это и показывает, но содержит ошибку: после команды управление должно передаваться на такт петли Т3, а не Т4, ведь именно там анализируется запрос на продвижение таймера и подготавливается анализ на наличие запросов прерываний.

Вторая микрокоманда выборки команды находится по адресу 105 (261, 1.0.5) и содержит следующие микрооперации:

  • РССП[32/33]:=0, полутакт С1 — обнуление кода длины команды (по мере выборки полуслов команды он будет увеличиваться);

  • ОЧ≠4, полутакт С1 — анализ начала фактического выполнения запроса процессора блоком обращения к памяти;

  • РОЦ[16,19,21]≠0, полутакт С1 — упоминавшийся ранее «неправильный» анализ, проверяющий биты РОЦ, которых не должно существовать (см. ниже);

  • РОЦ[6]:=1 (ПРИ УСЛ), полутакт С2 — установка признака особого случая спецификации при выполнении некоего условия. Поскольку идёт выборка команды и в предыдущей микрокоманде был установлен ТДАН, разумно предположить, что этим условием является нечётный адрес команды, т. е. наличие единицы в бите РССП[63]: в такой ситуации вместо выборки команды должно произойти программное прерывание по особому случаю спецификации.

Если оба заданных в микрокоманде анализа будут успешно выполнены, произойдёт переход на микрокоманду 107. Если удовлетворено лишь условие ОЧ≠4, т. е. выполнение запроса процессора на выборку команды ещё не начато, повторяется выполнение микрокоманды 105. Наконец, если ни одно из условий не выполнено, т. е. выполнение выборки фактически началось, управление получит микрокоманда 104.

Микрокоманда 107 (263, 1.0.7) получает управление, если выполнены оба условия ОЧ≠4 и РОЦ[16,19,21]≠0 микрокоманды 105, т. е. если обращение процессора к ОП фактически не началось, но установлен хотя бы один как бы несуществующий бит РОЦ. Она производит увеличение кода длины команды и продвижение её адреса на два комбинированной микрооперацией РССП[40/63]:=+2,РССП[32/33]:=+1 и передаёт управление микрокоманде 11E, которая, главным образом, контролирует содержимое адреса команды (микрооперация РМО[11]:=КРССП[40/63]) и переходит дальше — на адрес 1CC.

Можно предположить, что ветвь микропрограммы выборки, начинающаяся с адреса 107, отвечает за обработку особых случаев при выборке команды, в результате обнаружения которых фактическая выборка не начиналась. Такими особыми случаями, вообще говоря, могут быть особые случаи адресации (обращение к несуществующей области памяти) и спецификации (нечётный адрес команды), но из описания блока обращения к ОП складывается впечатление, что анализ на них производится только после приёма запроса процессора к исполнению, т. е. когда ОЧ=4. Однако нет технических причин, не позволяющих проверить корректность обращения в этой части заранее, просто по факту установки запроса в РОЧ[4]. Если такое действительно реализовано, то при обнаружении особых случаев должны устанавливаться соответствующие индикаторы. Конечно, напрашивается установка специально предназначенных для этого битов РОЦ[5/6], а несоответствие мнемоники микрооперации анализа можно объяснить грубой ошибкой в [2], что временами действительно случается. Однако нельзя исключить, что в РОЦ имеются дополнительные разряды, не упоминаемые ни в [1], ни в [2] и устанавливаемые именно в подобных случаях — при «предварительном» обнаружении особых случаев.

Что касается инкремента кода длины команды и её адреса в РССП, то оно необходимо в соответствии с принципами работы Системы 360: при особом случае в процессе выборки первого полуслова кода команды нельзя в старом PSW сохранять адрес этого полуслова и нулевой ILC, поскольку последний указывает на принципиальную невозможность определения адреса команды, вызвавшей особый случай; когда такая команда известна, ILC всегда содержит число полуслов, на которое необходимо уменьшить сохранённый в старом PSW программного прерывания адрес команды, чтобы получить истинный адрес команды, вызвавшей особый случай.

Макрокоманда 104 (260, 1.0.4) продолжает выборку начала очередной команды и получает управление, когда БООП фактически начинает выполнение запроса на считывание команды. В ней выполняются следующие действия:

  • Р5:=0 и РB:=0 по синхросигналу С1;

  • Р1[0/7]:=Р5[0/7] и Р1[8/19]:=Р5[8/19] по синхросигналу С2, т. е. обнуление указанных разрядов Р1;

  • РОЦ[4/6]:=РОП по С2 — приём индикаторов особых случаев защиты, адресации и спецификации, обнаруженных при попытке выборки команды.

Следом за ней выполняется микрокоманда 106 (262, 1.0.6), задающая микрооперации:

  • РМО[5/8]:=КР5 по С1 — контроль правильности обнуления Р5;

  • ТРС:=0 по С1 — сакральный смысл этого действия неясен, поскольку в этот момент ТРС сброшен, иначе выборка команды просто бы не началась. Можно предположить, что на самом деле здесь должна стоять микрооперация, устанавливающая ТРС, если переключатель рода работы задаёт покомандное выполнение — чтобы процессор остановился после завершения выполнения текущей команды;

  • анализ РССП[62]=1 по С1, позволяющий определить, в каком полуслове считанного слова находится начало новой команды;

  • Р3[0]:=Р5[0] и Р3[1/31]:=Р5[1/31] по С2, обнуляющие Р3.

В зависимости от результата анализа РССП[62] управление передаётся либо микрокоманде 112 (команда начинается со старшего полуслова), либо микрокоманде 113 (команда начинается с младшего полуслова), и эти две микрокоманды являются последними, содержимое которых точно известно из [2].

Микрокоманда 112 (274, 1.1.2), как уже сказано, получает управление, если команда начинается на границе слова. Она задаёт следующие микрооперации:

  • Р5:=РИОП по С1 — приём прочитанного кода команды из РИОП в Р5;

  • РСА:=0 по С1 — обнуление регистра счёта адреса для последующей передачи в регистр адреса местной памяти РАМП, чтобы иметь доступ к хранящимся в МП регистрам процессора;

  • РССП[40/63]:=+2,РССП[32/33]:=+1 по С1 — продвижение адреса и кода длины команды на одно полуслово;

  • РОЦ[4/6]≠0 по С1 — проверка на наличие особых случаев при выборке команды;

  • БЛОК(В63) и РАДЗУ[9/10]:=РИОП[0/1] по С1 — переход по двум старшим битам кода команды, что определяет её длину и формат;

  • РАМП[1]:=Р5[2],РВО:=Р5[0/7] по С2 — комбинированная микрооперация, пересылающая код операции в РВО и заносящая в РАМП[1] единицу, если команда, предположительно, будет обращаться к регистрам с плавающей запятой, и нуль, если обращение будет выполняться к общим регистрам;

  • РАМП[2/5]:=Р5[12/15],Р8:=Р5[8/15] по С2 — ещё одна комбинированная микрооперация, передающая второй байт кода команды в Р8, а номер регистра из поля R2 команды формата RR, из поля X2 команды формата RX или из поля R3 команды формата RS — в РАМП[2/5]. В командах форматов SI и SS эти разряды содержат не номер регистра, а какую-либо другую информацию, но в данном случае это неважно;

  • СЧ по С2 — считывание из местной памяти содержимого ячейки, адрес которой находится в РАМП — т. е. регистра, чей номер задан битами кода команды 12:15;

  • Р3[16/19]:=Р5[16/19] по С2 — пересылка номера регистра B1 или B2 для команд всех форматов, кроме RR;

  • Р1[20/31]:=Р5[20/31] по С2 — пересылка смещения D1 или D2 для команд всех форматов, кроме RR.

Нетрудно заметить, что нигде нет обнуления бита РАМП[0] — а это необходимо для правильного обращения к регистрам, чьи значения находятся в МП. Вероятно, обнуление РСА в полутакте С1 вызывает также обнуление РАМП или хотя бы этого разряда, хотя не исключено, что он обнуляется микрооперацией РАМП[1]:=Р5[2].

При наличии какого-либо особого случая управление получит одна из микрокоманд 129, 12B, 12D или 12F, что зависит от значения старших двух битов, занесённых из РИОП в Р5. В данном случае их значение безразлично, однако оба анализа выполняются параллельно, что и вызывает переход в сумме по восьми направлениям.

Если особых случаев нет, то для команд формата RR (два старших бита кода команды равны 00) управление передаётся на микрокоманду 128, для команд формата RX (01) — на 12A, для форматов RS и SI (10) — на 12C и для формата SS — на 12E.

Микрокоманда 113 (275, 1.1.3) получает управление, если код команды начинается с младшего полуслова и выполняет следующие действия:

  • Р5[0/15]:=РИОП[16/31] по С1 — приём первого полуслова прочитанного кода команды из РИОП в Р5;

  • РСА:=0 по С1 (в [2] ошибочно стоит РСА≠0, но с тем же кодом Е27, что РСА:=0 в предыдущей микрокоманде);

  • РССП[40/63]:=+2,РССП[32/33]:=+1 по С1;

  • РОЦ[4/6]≠0 по С1;

  • БЛОК(В63) и РАДЗУ[9/10]:=РИОП[16/17] по С1 — переход по двум старшим битам кода команды, которые находятся в младшем полуслове;

  • РАМП[1]:=Р5[2],РВО:=Р5[0/7] по С2;

  • РАМП[2/5]:=Р5[12/15],Р8:=Р5[8/15] по С2;

  • СЧ по С2.

Если особых случаев нет, то для команд формата RR управление передаётся на микрокоманду 130, для команд формата RX — на 132, для форматов RS и SI — на 134 и для формата SS — на 136; при обнаружении какого-либо особого случая управление получит одна из микрокоманд 131, 133, 135 или 137.

Вполне логично, что микрокоманда 113 выполняет те же действия, что микрокоманда 112, но для случая, когда в считанном слове содержится лишь первое полуслово выбираемой команды.

Действия микрокоманды 112 соответствуют блокам 3, 6, 9, 11 и 12 второй части блок-схемы выборки команды из [1], а действия микрокоманды 113 — блокам 2, 5, 8, 10 и 13.

В случае, если выбранная команда имеет формат RR (два старших бита кода операции равны 00), её выборка закончена: единственное полуслово команды уже получено, код длины уже равен 1, а адрес команды в PSW уже указывает на следующую команду. Дальнейшие действия не зависят от того, была ли команда расположена на границе слова или полуслова.

На момент начала выполнения микрокоманды 128 или 130 содержимое второго операнда, заданного полем R2, уже считано в регистр Р5 микрокомандой 112 или 113. Микрокоманды 128 и 130 выполняют полностью идентичные действия, показанные блоками 1, 4 и 7 второй части блок-схемы выборки, а именно:

  • пересылает содержимое регистра Р5, т. е. второй операнд (или его старшую половину, если команда обрабатывает длинные вещественные числа), в регистр Р1;

  • заносит в РАМП[2/5] номер регистра первого операнда, т. е. биты Р8[0/3];

  • инициирует считывание первого операнда из МП в Р5;

  • производит переход по битам рода команды РВО[2/3]. Этот переход позволяет уточнить, какую команду предстоит выполнить: сочетания 00 и 01 соответствуют либо командам обработки целых чисел, либо специальным командам вроде SVC (ВЫЗОВ СУПЕРВИЗОРА), 10 — командам обработки длинных вещественных чисел и 11 — командам обработки коротких вещественных чисел.

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

  • в случае ветвей 00 и 01 в следующей микрокоманде выбранный первый операнд пересылается из регистра Р5 в Р3 и производится переход по коду операции, хранящемуся в РВО, на первую микрокоманду выполнения команды;

  • в случае ветви 10 старшая часть первого операнда пересылается из Р5 в Р3 и производится считывание младших частей первого и второго операндов, которые заносятся в Р2 и Р4. Кроме того, необходимо проверить допустимость номеров регистров с плавающей запятой и переслать характеристики (порядки) операндов в регистры РC и РD (в дальнейшем может потребоваться их сравнение). После этого производится переход по коду операции к микропрограмме выполнения конкретной команды;

  • в случае ветви 11 первый операнд пересылается из Р5 в Р3, проверяются номера регистров, характеристики операндов заносятся в РC и РD и производится переход на микропрограмму выполнения команды.

В случае, если выбранная команда имеет формат RX (два старших бита кода операции равны 01), микрокоманда 112 выполняет переход на микрокоманду 12A, а микрокоманда 113 — на микрокоманду 132. В отличие от формата RR, действия этих двух ветвей различаются: команды формата RX имеют длину два полуслова, и если в первой ветви вся команда уже была выбрана из памяти, поскольку располагалась на границе слова, то во второй ветви было выбрано только её первое полуслово.

В обоих этих случаях в Р5 будет находиться содержимое регистра, заданного полем X2 команды — оно временно сохраняется в каком-либо из регистров блока обработки, например, в Р1 или Р3.

В первой ветке выполняется увеличение адреса команды в PSW на 2, а кода длины команды — на 1, отражая, тем самым использование второго полуслова кода команды. Во второй ветке выполняется считывание слова памяти, старшая половина которого будет вторым полусловом текущей команды, и тоже увеличиваются PSW и код длины команды; кроме того, необходимо проверить наличие особых случаев (эти действия второй ветки отражены блоками 1, 6 и 8 четвёртой части блок-схемы).

После того, как оба полуслова команды будут получены, производится считывание из МП содержимого регистра, заданного полем B2 (биты 0/3 второго полуслова команды), и переход по результату анализа значений полей X2 и B2: если какое-то из этих полей равно нулю, содержимое соответствующего регистра в вычислении адреса операнда не участвует, и вместо него подставляется нуль (блоки 5 и10 части 3 для первой ветви; блоки 12 и 13 части 4 для второй ветви).

Дальнейшие действия обоих ветвей совпадают; вероятно, эти ветви сливаются в одну. Если оба поля X2 и B2 равны нулю, адресом второго операнда будет значение поля D2 (биты 4/15 второго полуслова; блок 4 третьей части алгоритма). Если поле B2 содержит нуль, а поле X2 отлично от нуля, адресом второго операнда будет сумма поля D2 и содержимого регистра, заданного полем X2 (блок 33 третьей части). Если поле B2 содержит ненулевое значение, а поле X2 равно нулю, адресом второго операнда будет сумма поля D2 и содержимого регистра, заданного полем B2 (блок 23 третьей части). Наконец, если оба поля X2 и B2 отличны от нуля, адрес формируется как сумма поля D2 и содержимого обоих регистров X2 и B2 (блок 41 третьей части).

Если верить блок-схеме, далее инициируется выборка из памяти второго операнда (блок 9), считывание из МП первого операнда, заданного полем R1 (блок 14), и переход по битам 2/3 кода операции. Насчёт второго и третьего пунктов сомнений нет, а вот к первому пункту имеются вопросы. Проблем здесь три:

  • хотя большинство команд формата RX действительно считывают второй операнд из основной памяти, но есть команды, выполняющие не чтение, а запись, а также не обращающиеся к памяти вообще (LA — ЗАГРУЗКА АДРЕСА, вычисляющая адрес второго операнда и заносящая полученное значение в регистр, заданный полем R1). Соответственно, выборка из памяти может оказаться излишней и привести к возникновению особого случая, которого, на самом-то деле, нет (команда LA вправе формировать любой адрес: пока он не будет использован для фактического обращения к памяти, он не может вызвать ни один из особых случаев);

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

  • при более-менее внимательном взгляде на блок-схему можно заметить немало блоков, озаглавленных «Из операции по КОП 44». Этот код операции принадлежит команде EX (ВЫПОЛНЕНИЕ), она относится к формату RX и, как и прочие команды этого формата, сначала вычисляет адрес второго операнда и считывает содержимое первого операнда (регистра, заданного полем R1). Однако, в отличие от всех остальных команд, её вторым операндом являются не данные, а другая команда: вычисленный адрес используется для её выборки из памяти, второй байт кода выбранной команды модифицируется значением регистра R1, а затем выбранная и модифицированная команда выполняется. Толком выполнение этой команды блок-схемой не отражено.

Не исключено, конечно, что выборка значения по сформированному адресу выполняется всегда независимо от того, какая команда будет выполняться, а далее микропрограмма, проанализировав к тому времени код операции более подробно, что-то с прочитанным значением делает или не делает, а особые случаи обрабатывает или игнорирует: достаточной информации для надёжных выводов блок-схема не предоставляет.

Дальнейшая выборка «нормальных» команд формата RX соответствует, в общем и целом, командам формата RR: первый операнд заносится в регистр Р3 (а если обрабатываются длинные вещественные числа — то и в Р4, причём для любых вещественных чисел контролируется номер регистра, указанный в команде), второй, прочитанный из памяти — в Р1 (для длинных вещественных чисел из памяти считываются два слова, второе из которых помещается в Р2), после чего производится переход на микропрограмму выполнения конкретной команды.

В командах, осуществляющих запись в память, выборка второго операнда, если она производилась, является излишней, однако проблем не вызывает: если при её выполнении был обнаружен какой-то особый случай, он был бы обнаружен и при попытке записи.

Думается, что выполненного разбора достаточно, чтобы составить общее представление о процессе выборки команды и подготовки её операндов, и сколько-нибудь детальное рассмотрение команд остальных форматов особой пользы не принесёт. Заметим лишь, что в случае команд формата SS (два старших бита кода операции равны 11) подготовка операндов заключается в вычислении двух адресов, поскольку оба операнда располагаются в памяти.

Особенности выполнения арифметических операций над целыми числами

При обычных арифметических операциях над целыми операндами микропрограмма выборки заносит первый операнд в Р3, а второй — в Р1.

Микропрограмма, реализующая команды сложения целых чисел со знаком A, AR, выполняет собственно сложение одной микрокомандой, содержащей микрооперации РA:=Р1, РB:=Р3, Р5:=СМ и анализ результата операции, чтобы установить код условия в соответствии с полученным результатом.

Сохранение результата в регистре общего назначения производится микрокомандой, содержащей микрооперацию РИМП:=СМ и запускающую запись в МП (в РАМП к этому моменту уже присутствует адрес нужного слова МП, установленный микропрограммой выборки команды для считывания первого операнда из МП).

Вычитание чисел со знаком (команды S, SR) отличается от сложения подачей второго операнда в инверсном виде и подачей переноса на вход сумматора, что в совокупности изменяет знак второго операнда на противоположный: РА:=–Р1, СМ[31]:=+1.

Сравнение чисел со знаком (команды C, CR) выполняется подобно вычитанию, однако результат обратно в регистр, т. е. в МП, не записывается.

Операции беззнакового сравнения CL, CLR выполняются не на основном сумматоре, а побайтно в узле обработки байтов.

В начале выполнения команд арифметического сдвига SLA, SRA сдвигаемый первый операнд находится в Р1 (а не в Р3, куда обычно заносится значение первого операнда), а адрес второго операнда, используемый не как адрес, а как величина сдвига, — в Р4 (собственно величину сдвига определяют младшие шесть разрядов, остальные биты Р4 игнорируются). Количество сдвигов пересылается из Р4 в счётчик РС1 — вероятно, через регистр Р8, используя микрооперации Р8:=Р4[26/31], РС1[0/3]:=Р8[0/3] и РС1[4/7]:=Р8[4/7].

Сам сдвиг выполняется по одному биту с постоянным контролем содержимого РС1: когда оно станет равным нулю, операция завершена. При сдвиге влево (команда SLA), кроме того, микрооперацией анализа Р1[0/1]=01˅10 проверяется возникновение переполнения.

При умножении (M, MR) множимое заносится в Р1, множитель — в Р4. Произведение накапливается в Р3, Р4.

Перед началом умножения производится анализ операндов на нуль: если один из них нулевой, сразу формируется нулевой результат.

Для ускорения процесса умножения оно осуществляется сразу на два разряда множителя, начиная с его младших разрядов, что требует 16 сдвигов на два разряда. Число сдвигов заносится в РС2.

Для определения действий при очередной итерации цикла анализируются разряды Р4[30/31] (микрооперации Р4[30]=1 и Р4[31]=1). Обычно в зависимости от их значений происходит переход на одну из четырёх микрокоманд:

  • 00 — частичное произведение и множитель (Р3, Р4) сдвигаются вправо на два разряда;

  • 01 — к старшей части частичного произведения в Р3 прибавляется значение множимого из Р1, после чего частичное произведение и множитель (Р3, Р4) сдвигаются вправо на два разряда;

  • 10 — частичное произведение и множитель (Р3, Р4) сдвигаются вправо на один разряд, к старшей части частичного произведения в Р3 прибавляется значение множимого и Р3, Р4 сдвигаются вправо на ещё один разряд;

  • 11 — требуется прибавить утроенное значение множимого, но технически это неудобно. Поэтому из старшей части частичного произведения в Р3 вычитается значение множимого, после чего производится сдвиг частичного произведения и множителя (Р3, Р4) на два разряда вправо и устанавливается триггер вариантов ТВАР, в описании аппаратуры не упоминавшийся.

Значение триггера вариантов анализируется перед каждой итерацией совместно с разрядами Р4[30/31]. Когда он установлен, т. е. в предыдущей итерации вместо прибавления утроенного множимого производилось вычитание его одиночного значения, действия по тем или иным комбинациям Р4[30/31] отличаются от описанных выше тем, что выполняется лишнее сложение Р3 с множимым (эквивалентно прибавлению четырёхкратного множимого, что вкупе с выполненным ранее вычитанием даёт прибавку трёхкратного множимого).

Перед началом умножения проверяются два старших разряда множимого. Если первый разряд множимого равен нулю, умножение выполняется, как описано выше, и результат (Р3, Р4) записывается в регистровую пару, являющуюся первым операндом команды.

Если же первый разряд множимого равен единице, множимое сдвигается вправо на один бит, причём выдвигаемое значение заносится в триггер Т40, и лишь после этого выполняется умножение. После его окончания произведение в Р3, Р4 сдвигается влево на один разряд и, если Т40=1, к нему прибавляется множимое (с учётом знака множителя), что и формирует окончательный результат.

При делении (D, DR) делимое находится в регистрах Р3, Р4, а делитель — в Р1. Кроме того, в ТЗН1 находится знак делимого, в ТЗН2 — знак делителя.

Перед началом операции делимое и делитель анализируются на нуль. Нулевой делитель вызывает программное прерывание по особому случаю целочисленного деления; нулевое делимое приводит к немедленной записи нулевого результата (частного и остатка).

Кроме того, анализируется старший (не знаковый) разряд делимого. Если он значащий (отличается от знака делимого), сразу фиксируется переполнение.

Деление выполняется по одному разряду (32 итерации цикла) методом без восстановления остатка. Счётчиком цикла является РС1.

После завершения деления в Р4 будет частное, в Р3 — остаток.

Выполнение логических команд

Логические команды выполняются побайтно. Если их формат RR или RX, один из операндов размещается в Р1, другой — в Р3, затем они побайтно передаются в РC и РD, УОБ производит операцию, результат попадает в Р7 и далее в Р5.

В операциях формата SI (они всегда обрабатывают только один байт; один из операндов находится в памяти, вторым является второй байт кода команды) результат из Р5 пересылается в нужный байт Р3 для записи в память.

Выполнение логических команд формата SS (операнды одинаковой, но произвольной длины от 1 до 256 байтов, размещённые в памяти) не описывается, но очевидно, что очередные слова каждого из операндов считываются, производится их побайтовая обработка и запись слова результата по его готовности в память. Выборка и запись операндов выполняются независимо друг от друга, поскольку их начальные адреса могут быть произвольными.

Выполнение десятичных операций

Десятичное сложение AP. Адреса правых (младших) байтов операндов помещаются в Р4 (первый) и Р2 (второй); два младших разряда адресов заносятся в РС3 и РС4, определяя положение байтов в слове. Размеры операндов заносятся РС1[0/3] и РС1[4/7].

Слова, содержащие очередные байты операндов, считываются в Р1 и Р3. По результатам анализа РС3 и РС4 нужные байты пересылаются в РC и РD и складываются десятичным сумматором, перенос которого запоминается в Т30 и подаётся в качестве входного переноса при сложении следующей пары байтов. Результат сложения очередной пары байтов через Р5 передаётся в нужный байт Р3; после заполнения содержащегося в этом регистре слова оно записывается в память и производится загрузка следующего слова — и так до исчерпания счётчика байтов в РС1[4/7]. В Р1 по мере необходимости также загружаются очередные слова.

Если в результате сложения получился отрицательный результат, он снова выбирается из ОП, переводится в прямой код и снова записывается в память (знак десятичного операнда отражается соответствующим полубайтом этого операнда, а цифры всегда хранятся в прямом коде).

Вычитание SP отличается только тем, что знак второго операнда заносится в Т20 в инверсном виде.

Сравнение CP выполняется как вычитание, но результат в память не записывается.

Десятичное умножение MP выполняется на основном сумматоре. Подготовительные операции включают:

  • проверку допустимости длин операндов: множимое (первый операнд) должно быть длиннее множителя, а длина последнего не может превышать 8 байтов;

  • множитель выбирается из ОП целиком, выравнивается по правой границе и сохраняется в рабочих ячейках МП с адресами 32 и 33. Если он короче 8 байтов, слева добавляются нулевые байты;

  • множимое также выбирается из ОП целиком, выравнивается и при необходимости дополняется до 16 байтов нулевыми байтами. Оно записывается в ячейки МП 36, 39, 32 и 45;

  • адрес множимого сохраняется в МП в ячейке 48 — он понадобится для записи результата, замещающего множимое;

  • формируются удвоенное и учетверённое значения множимого, помещаемые в ячейки 37, 40. 43, 36 и 38, 41, 44, 47 соответственно.

Для удвоения множимого оно сдвигается влево на один бит, т. е. производится двоичное удвоение, а затем производится корректировка: если некоторая тетрада после сдвига имеет значение больше 9 либо если из этой тетрады при сдвиге был выдвинут в следующую тетраду единичный бит, к данной тетраде прибавляется 6 (без переносов между тетрадами). Например, удвоение десятичного числа 97 производится следующим образом:

1) двоично-десятичное представление числа (в виде трёх цифр) — 0000 1001 0111;

2) результат сдвига влево на один разряд: 0001 0010 1110;

3) поскольку из средней тетрады была выдвинута единица, а правая тетрада стала больше 9, к ним прибавляются шестёрки: 0001 1001 0100, что даёт результат 194.

Учетверённое множимое получается из удвоенного аналогичным образом.

Далее производится собственно умножение, причём за одну итерацию обрабатывается одна цифра множителя, начиная с младшей, для чего он заносится в Р4 и с каждой итерацией сдвигается вправо. В зависимости от значения младшей цифры в Р3 считывается учетверённое, удвоенное или одиночное множимое, которое нужное количество раз складывается с частичным произведением; последнее накапливается в ячейках МП 51–54. По завершении операции произведение записывается в ОП, для чего предварительно сохранённый в ячейке 48 адрес заносится в Р2.

Десятичное деление DP также выполняется на основном сумматоре. Перед началом деления определяется и заносится в Т10 знак результата; знак остатка совпадает со знаком делимого и сохраняется в Т20. Кроме того, выполняются следующие проверки:

  • старшая цифра делимого должна быть нулевой;

  • длина делителя не должна превосходить 8 байтов;

  • длина делимого должна быть больше длины делителя.

Операнды загружаются из ОП и заносятся в МП, причём выравниваются по старшим (левым) разрядам. Делимое размещается в ячейках МП 32–35, делитель — 36 и 37.

Само деление, начиная со старших разрядов, выполняется по методу последовательного вычитания с восстановлением остатка. По мере деления делимое сдвигается влево по одной десятичной цифре, и в освободившуюся младшую тетраду вдвигается очередная цифра частного. В конце деления остаток занимает старшие разряды, а частное — младшие; для записи результата в память они меняются местами.

Операции вещественной арифметики

Для выполнения команд вещественной арифметики первый операнд во время выборки команды и подготовки операндов помещается в регистры Р3 и Р4 (либо только Р3, если используются короткие операнды), второй — в Р1 и Р2 (или только в Р1), знаки операндов заносятся в ТЗН1 и ТЗН2, а порядки (характеристики) операндов заносятся в РC и РD. Возможно также, что порядок первого операнда через Р7 помещается ещё и в счётчик РС1: он точно присутствует там во время выполнения сложения и вычитания, но неясно, заносится ли он микропрограммами реализации этих команд или же микропрограммой выборки и подготовки операндов.

Блок-схема алгоритма выполнения команд сложения с нормализацией из [1] приведена на рисунке. Заметим, что команды вычитания выполняются точно так же, только знак второго операнда в ТЗН2 меняется на противоположный.

Блок-схема сложения вещественных чисел с нормализацией
Блок-схема сложения вещественных чисел с нормализацией

Перед выполнением сложения необходимо выровнять порядки операндов. С этой целью текущие значения порядков сравниваются в узле обработки байтов (именно для этого они и были переданы из старших байтов регистров Р1 и Р3 во входные регистры УОБ РC и РD). Кроме того, судя по блоку 3 приведённого рисунка, одновременно с выполнением первого сравнения в счётчик РС2 заносится константа N — она равна 7 для коротких и 15 для длинных операндов и показывает количество шестнадцатеричных цифр в них (напомним, что вещественные числа в Системе 360 представлены в степени 16, а не 2).

Если порядки не равны, мантисса операнда с меньшим порядком сдвигается вправо на одну цифру, которая запоминается в Р6, и соответствующим образом изменяется содержимое РС1, где изначально находился порядок первого операнда: если сдвигается первый операнд, он увеличивается на 1, а если второй — уменьшается. Кроме того, производится уменьшение счётчика РС2, содержащего количество цифр в одном операнде. Данный цикл заканчивается либо при совпадении порядков операндов при очередном сравнении, либо при исчерпании счётчика цифр. В последнем случае в качестве результата операции берётся значение операнда с наибольшим порядком: другой операнд в процессе выравнивания стал равен нулю.

Если выравнивание не привело к обнулению одного из операндов, производится обработка их мантисс с учётом знаков в ТЗН1 и ТЗН2. Если знаки равны, осуществляется сложение, если не равны, то операнд с отрицательным знаком переводится из прямого кода в дополнительный, после чего выполняется сложение.

Если в результате сложения возник перенос (старший байт вещественного операнда занимают его знак и порядок, а на время выполнения операций он обнуляется, поэтому признаком переноса из старшей цифры мантиссы является появление единицы в 7-м разряде сумматора), то производится сдвиг результата вправо на одну тетраду, а порядок в РС1 увеличивается на 1. В такой ситуации возможно возникновение переполнения порядка, которое обнаруживается по единичному значению РС1[0]: порядок сам по себе имеет длину семь битов и занимает разряды РС1[1/7]. Переполнение порядка всегда приводит к установке кода условия 3 и программному прерыванию (микрооперации РССП[34,35]:=11 и РОЦ[12]:=1).

Если переноса из старшего разряда мантиссы не было, может возникнуть нужда в нормализации результата путём сдвига влево до тех пор, пока четыре старших бита мантиссы результата не станут отличаться от нуля; при каждом сдвиге порядок результата в РС1 уменьшается на единицу. Первой вдвигаемой цифрой будет запомненная в регистре Р6 цифра, выдвинутая из меньшего операнда в процессе выравнивания порядков (так называемая guard digit): это повышает точность результата. Если при нормализации требуется больше одного сдвига, в дальнейшем справа вдвигаются нули. При нормализации возможны особые случаи потери значимости (получена нулевая мантисса результата) или исчезновения порядка (порядок стал меньше нуля), что может привести к программному прерыванию в зависимости от состояния битов маски программы в PSW.

Команды вещественного умножения складывают порядки чисел, перемножают мантиссы, при необходимости выполняют нормализацию, а также определяют знак результата на основании знаков исходных операндов. Их алгоритм приведён на рисунке из [1].

Блок-схема умножения вещественных чисел
Блок-схема умножения вещественных чисел

Поскольку порядок вещественного операнда является смещённым (истинным порядкам от –64 до +63 соответствуют хранимые значения от 0 до 127), при сложении порядков из суммы вычитается значение 64, т. е. удаляется лишнее смещение. Итоговый порядок должен быть проверен на возможное переполнение или исчезновение. Эти операции реализованы, в отличие от процессора в целом, весьма остроумно.

Само сложение порядков, т. е. старших байтов регистров Р1 и Р3, выполняется на основном сумматоре (технически, конечно, выполняется 32-разрядное сложение, но в младшие три байта входных регистров сумматора РA и РB заносятся нули), а сумма принимается в старший байт Р5. После этого два старших разряда результата проверяются на нуль (Р5[0/1]=00). Если это условие выполняется, значит, произошло исчезновение порядка; в этом случае записывается нулевой результат и, если маска разрешает (РССП[38]=1), происходит прерывание по исчезновению порядка (РОЦ[13]:=1).

Если исчезновения порядка нет, то производятся два действия. Во-первых, сумма из Р5[0/7] пересылается через Р7 в РС1, причём бит 1 инвертируется, а остальные пересылаются прямо: это эквивалентно вычитанию 64. Во-вторых, два старших бита суммы проверяются на равенство единицам (Р5[0/1]=11). Если это так, произошло переполнение порядка, но прерывание пока не выполняется, поскольку в результате умножения мантисс может потребоваться нормализация, которая приведёт к уменьшению порядка и возвращению его в допустимые пределы. Чтобы отметить факт переполнения на данном этапе, устанавливается триггер Т20.

Умножение мантисс выполняется одной микропрограммой, при этом, если операнды являются короткими, первый операнд из регистра Р3, куда он был помещён в процессе выборки команды, переписывается в Р4: он играет роль множителя и в процессе умножения пара Р3-Р4 сдвигается вправо, а в её левые биты помещаются цифры результата умножения. Если операнды являются длинными, первый операнд уже занимает пару Р3-Р4, и дополнительные действия не требуются.

Умножение мантисс само по себе выполняется так же, как и соответствующая целочисленная операция: анализируются очередные два разряда множителя (биты Р4[30/31]) и в зависимости от их значения и состояния триггера ТВАР производится неоходимое сложение, вычитание и сдвиг. Особенностью является то, что при использовании коротких операндов второй операнд, являющийся множителем, изначально находится лишь в регистре Р3, и перед началом умножения он переписывается в Р4. Если же умножаются длинные операнды, множитель уже занимает регистровую пару Р3-Р4, поэтому данная пересылка не требуется. Кроме того, обе мантиссы считаются положительными числами (или числами без знака: технически это одно и то же), поскольку в вещественных числах они всегда хранятся в прямом коде. Знак результата определяется микропрограммно анализом триггеров ТЗН1 и ТЗН2: если они совпадают, результат будет положительным, иначе — отрицательным.

После умножения мантисс проверяется старшая шестнадцатеричная цифра результата и при необходимости выполняется нормализация путём сдвига влево, при этом справа вдвигаются нули. В процессе нормализации порядок уменьшается, что может привести к его исчезновению с формированием нулевого результата (и прерыванию, если оно разрешено). Если до умножения было зафиксировано переполнение порядка (установлен Т20), после нормализации он может вернуться в допустимые пределы. Если переполнение не исчезло, происходит прерывание.

Вещественное деление заключается в вычитании порядков и делении мантисс операндов, причём после вычитания порядков к ним необходимо прибавить 64, чтобы вернуть удалённое вычитанием смещение порядка результата. Алгоритм деления представлен на рисунке из [1].

Блок-схема деления вещественных чисел
Блок-схема деления вещественных чисел

Выполнение деления вполне ожидаемо начинается с проверки мантиссы делителя (второго операнда) на нуль: если это так, вместо деления происходит программное прерывание по особому случаю вещественного деления.

После этого на нуль проверяется мантисса делимого (первого операнда и одновременно приёмника результата операции): если это так, на его место записывается истинный нуль. Запись требуется по той причине, что истинный нуль содержит нули во всех своих разрядах, в то время как для признания нулевым вещественного числа достаточно, чтобы оно имело нулевую мантиссу (порядок и знак игнорируются).

Если данных граничных случаев не обнаружено, производится нормализация исходных операндов: они могут быть ненормализованными. Признаком ненормализованного операнда служит наличие единиц в битах 8/11 регистра Р1 (делитель) или Р3 (делимое). В процессе нормализации операнды сдвигаются влево на необходимое количество шестнадцатеричных цифр, при этом их порядки уменьшаются. Хотя в результате порядок может стать отрицательным, это ещё не является признаком исчезновения порядка: в результате выполнения деления порядок результата может оказаться в допустимых пределах.

При делении коротких операндов делитель находится в Р1, делимое — в Р3, куда они были занесены микропрограммной начальной выборки команды и подготовки операндов; частное будет накапливаться в Р4. При делении длинных операндов делитель изначально занимает регистры Р1 и Р2, а делимое — Р3 и Р4, но перед началом деления местоположение операндов: делитель записывается в рабочие регистры местной памяти и будет оттуда считываться по мере надобности в Р1, старшая часть делимого остаётся в Р3, а вот его младшая часть из Р4 пересылается в Р2; Р4 будет использоваться для накопления значения частного.

Деление начинается с вычитания порядков на основном сумматоре. Результат попадает в старший байт Р5, где анализируется и одновременно через Р7 пересылается в счётчик РС1, причём его бит 1 инвертируется, что эквивалентно прибавлению 64 — тот же трюк, что использовался при выполнении умножения.

Если биты СМ[0/1]=01, произошло переполнение порядка, однако деление всё равно выполняется. Полученный результат будет иметь корректные мантиссу и знак, однако его порядок будет на 128 меньше истинного порядка. После записи этого результата происходит прерывание по переполнению порядка.

Если биты СМ[0/1]=10 говорят об исчезновении порядка промежуточного результата, однако он может стать допустимым в результате деления, поэтому в данный момент никаких действий не предпринимается (только, надо полагать, запоминается признак возможного исчезновения порядка) и начинается деление мантисс.

Мантиссы являются положительными числами (знаки хранятся в триггерах ТЗН1 и ТЗН2 и на деление не влияют, будучи используемыми лишь для формирования знака результата). Мантисса делимого должна быть меньше мантиссы делителя, иначе возникнет переполнение мантиссы частного. Чтобы этого избежать, сначала мантиссы сравниваются путём вычитания, и если делимое больше или равно делителю (СМ[0]=0), делитель до начала деления сдвигается влево на четыре бита, т. е. умножается на 16, что делает его гарантированно больше делимого, а к характеристике результата в РС1 прибавляется единица. [1] утверждает, что если при этом происходит переполнение порядка (Р8[0]=0, РС1[0]=1), происходит прерывание и выполнение операции прекращается, но если дело обстоит таким образом, это значит, что процессор неверно реализует команду деления: по правилам Системы 360, деление всё равно выполняется и лишь после этого происходит прерывание, а порядок результата будет на 128 меньше истинного значения. Скорей всего, машина всё-таки выполняет деление правильно, а в книге допущена грубая ошибка.

Собственно деление выполняется часто используемым способом без восстановления остатка. Если после очередного вычитания делителя из остатка получается положительный или нулевой результат, очередной бит частного равен единице и в следующем цикле делитель будет вычитаться из остатка. Если же после очередного вычитания получается отрицательный результат, очередной бит частного равен нулю, а в следующем цикле делитель будет прибавляться к остатку. После одного цикла остаток удваивается (сдвигается влево на один бит), и цикл повторяется. Цифры частного формируются в Р6 и потетрадно передаются в младшую тетраду регистра частного Р4, а число таких передач фиксируется в счётчике РС2. При коротких операндах после шести передач (24 цикла деления) в Р4 накапливается окончательное частное, и остаётся сформировать и записать окончательный результат, причём может потребоваться сдвиг мантиссы и корректировка порядка, а также анализ на возможное исчезновение порядка окончательного результата. При длинных операндах после шести передач сформирована лишь старшая часть мантиссы, которая сохраняется в местной памяти, а затем формируются младшие восемь цифр (32 бита) мантиссы и производятся прочие действия по окончательному формированию результата.

Обработка прерываний

Как говорилось в одной из предыдущих статей, запросы прерываний всех классов, кроме прерываний по машинным ошибкам (программные, по вызову супервизора, внешние, ввода-вывода), фиксируются в регистре фиксации прерываний РФП и в момент, когда необходимо проанализировать их наличие, передаётся в регистр-дублёр микрооперацией РФПД:=РПФ и приводят к переходу на ту или иную микрокоманду в соответствии с тем, какие запросы разрешены и каков их приоритет.

В распечатке части ДЗУ, приведённом в [2], присутствуют одна-две первых микрокоманды обработки прерываний каждого из этих четырёх классов.

Прерывание по вызову супервизора является самым простым. Оно возникает при выполнении команды ВЫЗОВ СУПЕРВИЗОРА (SVC), микропрограмма которого устанавливает бит РФП[2] и формирует код прерывания в РССП[16/31]: его старший байт всегда равен нулю, а младший байт равен второму байту кода команды SVC.

Собственно обработка прерывания начинается с микрокоманды по адресу 10A (266, 1.0.10). В [2] указана ошибочная мнемоника содержащейся в ней микрооперации — Р5:=РССП'[0/13]. На самом деле там наверняка содержится микрооперация Р5:=РССП[0/31], т. е. пересылка в Р5 левой половины слова состояния процессора PSW для его последующей записи в память в составе старого PSW прерывания по вызову супервизора, после чего будет произведена выборка нового PSW и произойдёт переход к выборке команды.

Обработка прерывания ввода-вывода начинается микрокомандой с адресом 10E (270, 1.0.14), единственной значимой микрооперацией которой является РОБ[0]:=1 — этим каналы извещаются о начале обработки прерывания.

«Увидев» установку РОБ[0], канал запросивший прерывание, выполняет свою часть операции: сохраняет в памяти код прерывания (номер канала и адрес внешнего устройства) и слово состояния канала (CSW), после чего сбрасывает бит РОБ[0]. Процессор всё это время выполняет микрокоманду, проверяющую состояние РОБ[0], ожидая его сброса. Когда сброс произойдёт, он запишет оставшуюся часть старого PSW прерываний ввода-вывода (биты РССП[0/15,31/63]), загрузит новое PSW и перейдёт к выборке команды.

Внешнее прерывание начинается микрокомандой с адресом 10D (269, 1.0.13), содержащей микрооперации Р5:=0 (выполняется по С1) и РССП[16/31]:=Р5[16/31] (выполняется по С2). Как следствие, содержимое РССП[16/31] будет обнулено.

Следующей выполняется микрокоманда с адресом 10C (268, 1.0.12). Помимо микрооперации РАДЗУ:=КОНСТ 14, необходимой для переключения модуля ДЗУ (третья микрокоманда обработки внешнего прерывания находится по адресу E70), она содержит две микрооперации: РМО[5/8]:=КР5 и РССП[16/31]:=РВЛ3,ТППУ. Первая из них обеспечивает контроль правильности содержимого Р5, сформированного предыдущей микрокомандой, путём занесения индикаторов ошибок чётности байтов Р5 в соответствующие разряды регистра машинных ошибок РМО. Вторая микрооперация заносит в РССП[16/31], который был обнулён предыдущей микрокомандой, код внешнего прерывания. Далее последуют обычное сохранение старого PSW и загрузка нового PSW, после чего выполнение команд возобновится.

Самой сложной является микропрограмма обработки программного прерывания, начинающаяся с адреса 109 (265, 1.0.9). Находящаяся по этому адресу микрокоманда содержит четыре микрооперации:

  • РA:=0;

  • РB:=0;

  • Р5:=СМ;

  • РОЦ[1/10]=0.

Первые три микрооперации, как можно догадаться, обеспечивают занесение в Р5 нулевого значения, полученного суммированием нулей из регистров РA и РB. Это подтверждает расчёт, сделанный в одной из предыдущих статей и показывающий, что время сложения вряд ли превосходит 220 нс, хотя [1] утверждает, что оно составляет 330 нс, т. е. практически половину такта: в последнем случае нет гарантии, что нули, с началом тактового сигнала С1 заносимые в РA и РB, будут успешно сложены с формированием нулевого результата, чтобы последний был корректно занесён в Р5 в конце действия С1.

Последняя микрооперация проверяет возможные причины программного прерывания: к одной группе относятся особые случаи с кодами 1–10, к другой — 11–15. Единственная её цель – разделить причины программных прерываний на две группы, чтобы несколько сократить время их анализа: дальше каждая причина прерывания анализируется индивидуально, как можно видеть по иллюстрации из [1].

Далее следует формирование кода прерывания (как ранее говорилось, он формируется путём явного указания кода прерывания константой в микропрограмме; соответственно, определив, какой из разрядов РОЦ установлен, микропрограмма загружает в РССП[16/31] ту или иную константу), сохранение старого PSW программных прерываний, загрузка нового и возобновление выполнения команд.

Комментарии (2)


  1. rutenis
    02.01.2025 05:14

    Момент обновления значения интервального таймера ни в Системе 360, ни в Системе 370 не регламентирован, но большинство машин выполняет его в промежутке между завершением одной команды и началом выполнения следующей.

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


    1. SIISII Автор
      02.01.2025 05:14

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