Процессор ЭВМ ЕС-1020. Прерывания и интерфейс прямого управления
Общие сведения
Любая ЭВМ, соответствующая принципам работы Системы 360, имеет пять классов прерываний:
С точки зрения программиста, машина обрабатывает запросы прерываний следующим образом.
Проверяется, разрешено ли запрашиваемое прерывание. Запрещены могут быть прерывания ввода-вывода (индивидуально для каждого из каналов ввода-вывода с номерами 0–5; для каналов с большими номерами имеется только общая маска), внешние прерывания, прерывания от схем контроля и четыре подкласса программных прерываний из пятнадцати. Биты масок прерываний входят в состав слова состояния программы PSW.
Если прерывание запрещено, то в зависимости от его природы его запрос либо сохраняется в ожидании обработки, либо теряется.
Из всех имеющихся разрешённых прерываний выбирается самое приоритетное:
на втором месте находятся программные прерывания, возникающие в процессе выполнения команды (но не её выборки), и прерывания по вызову супервизора — они являются взаимоисключающими. Как уже говорилось, четыре возможных причины программных прерываний могут быть замаскированы (к ним относится, в частности, прерывание по переполнению в операциях сложения и вычитания двоичных целых чисел со знаком); в этом случае их запросы теряются. Остальные причины программных прерываний — например, особые случаи адресации (попытка обращения к ячейке памяти, отсутствующей в данной машине) и защиты (попытка обращения к ячейке памяти, защищённой от данного вида доступа), — являются немаскируемыми и прерывают выполнение команды;
далее следуют внешние прерывания: от интервального таймера, от кнопки прерывания и по внешним сигналам 0–5. Запросы этих прерываний хранятся в ожидании обработки неограниченное время и очищаются либо произошедшим прерыванием, либо сбросом процессора. Если внешние прерывания запрещены, появление нескольких запросов от одного и того же источника вызовет в итоге лишь одно прерывание; скажем, если таймер сработает несколько раз и лишь после этого внешние прерывания будут разрешены, произойдёт лишь одно прерывание, и программа не сможет определить, что таймер срабатывал многократно. Когда внешнее прерывание, наконец, произойдёт, программе одновременно указываются все имеющиеся к этому моменту запросы;
формально на последнем, а фактически на предпоследнем месте по приоритетности находятся прерывания ввода-вывода. Если прерывание запрашивается одновременно несколькими каналами, будет обслужен лишь один запрос, остальные продолжат ожидать своей очереди;
хотя «Принципы работы Системы 360» прямо об этом не говорят, самый низкий приоритет имеют программные прерывания, возникающие при выборке команды. В Системе 370 и последующих версиях архитектуры это уже не так: прерывания при выборке команды имеют тот же приоритет, что и возникающие при выполнении команд.
Выполняется сохранение информации о состоянии программы на момент прерывания:
в область памяти, адрес которой зависит от класса обрабатываемого прерывания, записывается так называемое старое PSW, т. е. содержимое слова состояния программы на момент возникновения прерывания. В числе прочей информации это PSW содержит адрес команды, которая должна была бы выполняться следующей, если бы прерывания не было, и код прерывания, точнее идентифицирующий причину его возникновения. Для прерывания по вызову супервизора это будет один байт информации, закодированной в самой команде SVC (предполагается, что это номер функции супервизора, которую последний должен выполнить, хотя реальное назначение этой информации зависит от операционной системы), для программного прерывания — код причины прерывания (некоторые причины программных прерываний могут иметь место одновременно, в этом случае указывается лишь одна из них), для внешнего прерывания — битовая маска, отражающая все имеющиеся запросы внешних прерываний одновременно, для прерывания ввода-вывода — адрес канала и устройства на канале, к которому относится прерывание. Для прерываний от схем контроля содержимое кода прерывания зависит от особенностей модели; оно может, например, указывать на источник возникшей проблемы;
в случае прерывания ввода-вывода дополнительно сохраняется слово состояния канала (CSW), содержащее информацию о конкретной причине прерывания и ходе операции ввода-вывода;
в случае прерывания от схем контроля дополнительно сохраняется содержимое различных аппаратных регистров процессора, что зависит от конкретной модели. Эта операция нередко именуется регистрацией состояния; сохранённая информация призвана помочь в поиске причины возникновения сбоя, а в некоторых случаях может позволить операционной системе, обрабатывающей прерывание, принять решение о дальнейших действиях.
Выполняется загрузка нового PSW из области памяти, адрес которой зависит от класса прерывания. Это PSW содержит, в частности, новые маски прерываний и адрес первой команды обработчика прерывания.
Производится повторная оценка наличия незамаскированных запросов прерываний: во-первых, за время сохранения старого и загрузки нового PSW могли появиться новые запросы, а во-вторых, только что загруженное новое PSW могло разрешить ранее запрещённые прерывания, ожидающие обслуживания.
Если никаких разрешённых запросов прерываний больше нет, возобновляется обычное выполнение программы (или процессор переходит в ожидание, если в PSW установлен соответствующий бит).
Заметим, что два прерывания подряд для одного и того же класса прерываний происходить не должны, поскольку из-за отсутствия стека старое PSW и прочая связанная с прерыванием информация записывается в строго определённые ячейки основной памяти. По этой причине новые PSW прерываний ввода-вывода, внешних и от схем контроля должны содержать маски, запрещающие, как минимум, прерывания соответствующих классов; они разрешаются позднее, когда вся необходимая для обработки информация уже переписана в безопасное место или стала ненужной.
Поскольку новое PSW может содержать недопустимый адрес команды (нечётный или указывающий недоступную область памяти), при попытке выборки первой же команды обработчика прерывания может возникнуть программное прерывание. Если недопустимый адрес задан в новом PSW программных прерываний, возникает бесконечная цепочка прерываний. В Системе 360 она может быть прервана сбросом процессора либо незамаскированным запросом прерывания ввода-вывода или внешним, а вот в Системе 370 — только сбросом процессора. Именно эта особенность и позволяет говорить, что в Системе 360 приоритет программных прерываний зависит от времени их возникновения (при выборке команды или при её выполнении).
В зависимости от влияния прерывания на выполнение команды в Системе 360 различают три вида окончания выполнения команды: завершение, подавление и прекращение.
При завершении (completion) выполнение команды полностью завершается, как если бы прерывания не было, а само прерывание произойдёт лишь после полного завершения команды. Завершение имеет место при прерываниях ввода-вывода и внешних, при некоторых подклассах программных прерываний (например, при двоичном или десятичном переполнении операция выполняется до конца; «лишние» данные, не помещающиеся в разрядную сетку, просто отбрасываются, и лишь после этого происходит прерывание, если оно разрешено) и при прерывании по вызову супервизора.
При подавлении (suppression) команда, по сути, не выполняется: единственной изменяемой информацией являются адрес команды в PSW (он будет указывать на команду, следующую за подавленной). Записываемый при прерывании в составе старого PSW двухбитовый код длины команды (ILC) обычно позволяет определить положение команды, вызвавшей прерывание, поскольку задаёт её длину в полусловах.
При прекращении (termination) выполнение команды останавливается «посредине процесса», в результате чего данные в памяти и регистрах могут быть частично изменены, а частично оставаться старыми, что делает, вообще говоря, невозможным перезапуск команды. Выполнение команды прекращается при прерывании от схем контроля и при некоторых программных прерываниях. Например, если в процессе выполнения десятичной операции была обнаружена неверная десятичная цифра, операция прекращается, при этом часть результата может быть уже записана в память, затерев, тем самым, часть одного из исходных операндов.
В Системе 370 появился ещё один вид окончания — аннулирование (nullification), отличающееся от подавления тем, что адрес команды, сохраняемый в старом PSW, указывает не на следующую команду, а на саму команду, вызвавшую прерывание. Это связано, главным образом, с расширением причин возникновения программных прерываний, а последнее вызвано, в первую очередь, внедрением механизма виртуальной памяти.
В процессоре ЭВМ ЕС-1020 обработка прерываний организована, как легко догадаться, почти исключительно микропрограммными средствами. Общий ход микропрограммного цикла, обеспечивающего выборку и выполнение команд, обработку прерываний и продвижение значения таймера, приведён на рисунке.
Общий цикл работы процессора, скан из [1]
Три причины возникновения прерываний — по сбою машины, по особым случаям адресации и защиты — обнаруживаются аппаратно и вызывают немедленный аппаратный переход на соответствующую микропрограмму; остальные запросы могут обнаруживаться либо чисто микропрограммно, либо аппаратно, но переход на микропрограмму их обслуживания выполняется микропрограммным путём по результатам анализа соответствующих триггеров.
Прерывания от схем контроля
Средства аппаратного контроля были рассмотрены в предыдущей статье. Обнаружение сбоя, если прерывания от схем контроля разрешены (установлен бит маски PSW[13], состояние которого отражается триггером ТМКТРМ, он же бит 5 регистра РБР, описанного вместе с другими регистрами в одной из предыдущих статей), вызывает установку триггера ТКТРМ, что приводит к прекращению выполнения текущей микропрограммы и аппаратному переходу на микропрограмму обработки машинного сбоя, блок-схема которой приведена на следующем рисунке.
Блок-схема микропрограммы обработки машинных сбоев, скан из [1]
Как видно из блок-схемы, первым делом анализируется состояние триггера ТПЗП, он же бит 1 регистра РБД: он устанавливается на время выполнения первоначальной загрузки программы (как правило, операционной системы). Если ТПЗП установлен, т. е. сбой возник во время начальной загрузки, микропрограмма переводит процессор в состояние тяжёлого останова (устанавливается триггер ТТО).
Далее проверяется состояние триггера ТЦП, он же бит РБД[0]. Когда он установлен, выполняется микропрограмма обслуживания какого-либо из каналов; в этом случае управление передаётся микропрограмме обработки ошибок каналов. Её алгоритм не приводится, но в конце концов управление возвращается в общую микропрограмму обработки прерываний от схем контроля для выполнения регистрации состояния процессора и собственно прерывания от схем контроля (смены PSW). Микропрограмма обработки сбоев каналов вызывается и в случае, если выполняется команда ввода-вывода, причём её выборка уже полностью завершена (сброшен триггер выборки команды ТВК).
Затем производится регистрация, т. е. запись в основную память по строго определённым адресам содержимого некоторых аппаратных регистров. Конкретно в процессоре ЭВМ ЕС-1020 записываются регистр ошибок РО (в ячейку с шестнадцатеричным адресом 80), регистры РБД, РБС, РБР и байт состояния БА (соответственно в ячейки A0–A3).
Наконец, управление передаётся микропрограмме смены PSW. Эта микропрограмма является общей для всех обработчиков прерываний, поскольку все действия, специфичные для конкретного класса прерываний, производятся до её вызова.
Программные прерывания
В Системе 360 определено 15 причин программных прерываний, называемых в советской документации особыми случаями (exceptions). В ЕС-1020 два из них — особые случаи адресации и защиты — обнаруживаются чисто аппаратными средствами, и их возникновение приводит к прекращению выполнения текущей микропрограммы и переходу на микропрограмму обработки этих особых случаев; их обнаружение описывалось в статье, посвящённой памяти.
Остальные особые случаи обнаруживаются либо совместными усилиями аппаратуры и микропрограммы (например, неверная десятичная цифра или переполнение при сложении или вычитании двоичных целых чисел обнаруживаются схемами БА и приводят к установке соответствующих битов ББА, однако анализ состояния этих битов является обязанностью микропрограммы), либо чисто микропрограммными средствами (например, переполнение в десятичной операции возникает, если результат операции не помещается в поле основной памяти, отведённое под результат, что обнаруживает микропрограмма, записывающая результат).
Блок-схема микропрограммы обработки программных прерываний приведена на рисунке.
Блок-схема микропрограммы обработки программных прерываний, скан из [1]
Для каждого особого случая, в обнаружении которого участвует микропрограмма, существует своя точка входа в микропрограмму обработки прерывания. В большинстве случаев её единственной задачей является формирование младшего байта кода прерывания — именно он отражает причину возникновения прерывания; на блок-схеме эта операция обозначена аббревиатурой ФКП. Куда именно в этот момент заносится код прерывания, литература не сообщает; я предполагаю, что он помещается в один из внутренних регистров процессора, например, в РЛ. После формирования кода прерывания управление передаётся общей части микропрограммы обработки программных прерываний.
Для четырёх особых случаев, которые могут быть замаскированы, — переполнения в операции с двоичными целыми числами, переполнения в десятичной операции, значимости и исчезновения порядка в операции с вещественными числами — микропрограмма проверяет соответствующий бит маски, находящийся в PSW. Если прерывание запрещено, производится переход на микропрограмму выборки следующей команды, если же разрешено, выполняется формирование младшего байта кода прерывания и управление передаётся общей части микропрограммы обработки программных прерываний. Для двух особых случаев, связанных с операциями с вещественными числами, значение маски определяет также способ формирования результата: если прерывание запрещено, формируется истинный нуль, если разрешено — оставляется «промежуточный» результат, возникновение которого и послужило причиной появления прерывания. На блок-схеме это не отражено; кроме того, почему-то не показана проверка маски для особого случая значимости. Заметим, что технически байт PSW, содержащий маски программных прерываний, хранится в одной из ячеек локальной памяти, куда он заносится в процессе загрузки PSW.
Микропрограмма обработки особых случаев адресации и защиты является общей для них и вызывается, как уже говорилось, чисто аппаратными средствами. Первым делом она проверяет, не выполнялась ли на момент обнаружения особого случая микропрограммная приостановка (МПРС) для обслуживания одного из каналов (это достигается анализом состояния триггера ТЦП), а затем — не выполнялась ли одна из команд ввода-вывода. Если проблема так или иначе связана с каналом, то её дальнейшей обработкой занимается микропрограмма обслуживания каналов; на блок-схеме она не показана и обсуждать её мы не будем (заметим лишь, что она прекратит операцию передачи данных, а в CSW, которое в конечном итоге будет записано при прерывании ввода-вывода, будет указана причина прекращения). Если же особый случай возник при выполнении «нормальной» команды процессора или при выборке команды, производится формирование кода прерывания и переход на общую часть микропрограммы. Для формирования правильного кода микропрограмма анализирует признаки соответствующих особых случаев — они отражаются двумя старшими битами регистра РБС.
Общая часть микропрограммы обработки программных прерываний формирует старший байт кода прерывания (в Системе 360 он всегда равен нулю) и передаёт управление микропрограмме смены PSW.
Прерывание по вызову супервизора
Это прерывание является самым простым. Оно происходит в результате выполнения команды SVC (ВЫЗОВ СУПЕРВИЗОРА); микропрограмма, реализующая данную команду, формирует код прерывания (старший байт равен нулю, младший байт равен второму байту кода команды SVC) и передаёт управление микропрограмме смены PSW.
Прерывания внешние и ввода-вывода и «главный цикл» процессора
Источниками прерываний ввода-вывода являются (кто бы мог подумать!) каналы ввода-вывода. Есть надежда, что когда-нибудь об организации ввода-вывода в Системе 360 вообще и в ЕС-1020 в частности будет написана отдельная серия статей, здесь же достаточно помнить, что запросы от каналов фиксируются в соответствующих триггерах регистра РБР, а другие триггеры этого же регистра хранят маски прерываний от каналов; с точки зрения программиста последние являются битами PSW[0:2]. Если одновременно установлен запрос от некоторого канала и соответствующий ему бит маски, по тактовому сигналу ТИ4 будет установлен триггер ТВВВ, что и послужит для процессора признаком необходимости отвлечься на обработку прерывания.
Про источники внешних прерываний мы поговорим в конце этой статьи, пока отметим, что их запросы устанавливают соответствующие триггеры регистра РБК. Наличие хотя бы одного установленного разряда в этом регистре вызывает формирование общего сигнала запроса внешнего прерывания. Если бит маски внешних прерываний (разряд PSW[7], он же триггер ТМПРВВ, он же бит 7 регистра РБР) установлен, запрос внешнего прерывания вызывает установку по тактовому импульсу ТИ4 того же самого триггера ТВВВ.
Этот триггер может устанавливаться — на этот раз уже без всяких масок — по запросу на обновление таймера и при установленном триггере ТОСТ, о чём будет сказано ниже.
Схема установки триггера ТВВВ приведена на рисунке.
Схема установки триггера ТВВВ, скан из [1]
Об условиях сброса ТВВВ литература не сообщает, но никаких микропрограммных способов для этого не упоминается. Возможно, что он сбрасывается аппаратно по тому же самому импульсу ТИ4, если нет никаких причин для его установки.
Состояние ТВВВ анализируется микропрограммно в «главном цикле» процессора, а именно, в самом начале микропрограммы выборки очередной команды, а также в цикле ожидания, о котором будет сказано позже. Блок-схема анализа и последующей обработки запроса, приведшего к установке ТВВВ, приведена на двух следующих рисунках.
Обработка запросов прерываний ввода-вывода и внешних, скан из [1]
Обработка остальных запросов, отражаемых состоянием ТВВВ, скан из [1]
Как видно из первой блок-схемы, если ТВВВ сброшен, производится обычная выборка и выполнение команды, после чего, как правило, «главный цикл» повторяется, начиная с анализа состояния ТВВВ. В случае возникновения незамаскированного машинного сбоя или при программном прерывании или прерывании по вызову супервизора вместо обычного завершения выполнения микропрограммы реализации текущей выполняемой команды и возврата на начало «главного цикла» управление получает микропрограмма обработки возникшего прерывания, но, в конечном итоге управление всё равно получит «главный цикл», только это произойдёт после смены PSW в рамках входа в обработчик прерывания.
Если ТВВВ установлен, выполняется анализ условий, которые могли привести к его установке.
Сначала проверяется наличие незамаскированного запроса внешних прерываний. Технически для этого микропрограмма анализирует состояние регистра РБК (он не должен быть равен нулю) и состояние бита маски РБР[7] (он должен быть установлен). Если незамаскированный запрос имеется, производится формирование кода внешнего прерывания (старший байт равен нулю, младший байт равен содержимому регистра РБК), очистка регистра РБК, т. е. сброс принятых к обработке запросов прерываний, и переход на микропрограмму смены PSW. Возможное наличие запросов прерываний ввода-вывода в этом случае игнорируется: их приоритет ниже, чем внешних прерываний.
Если запроса внешнего прерывания нет или он замаскирован, аналогичный анализ выполняется для запросов прерываний ввода-вывода, при этом одновременно определяется, какой из трёх каналов запросил прерывание и в зависимости от этого вызывается та или иная микропрограмма. Общим итогом её выполнения является запись в память слова состояния канала CSW, формируемого на основе информации, хранящейся в регистрах и триггерах канала, формирование кода прерывания, равного адресу канала и устройства ввода-вывода, и переход на микропрограмму смены PSW.
«За кадром» первой блок-схемы остаётся обслуживание таймера и состояния останова, что отчасти показано на второй блок-схеме.
Сначала, если необходимо, выполняется обновление таймера (об этом будет сказано позже), а затем анализируется его текущее значение. Если оно меньше нуля (старший бит значения таймера установлен), необходимо сформировать запрос внешнего прерывания от таймера, что выполняется микропрограммно: устанавливается бит 0 регистра РБК, что приведёт к установке триггера ТВВВ, если внешние прерывания разрешены. Если же значение таймера нулевое или положительное, запрос не формируется (однако, если он был сформирован ранее, он сохраняется: как уже говорилось, сбросить запрос внешнего прерывания может только выполнение внешнего прерывания либо сброс процессора).
Затем проверяется триггер останова ТОСТ, он же бит РБД[4]. Этот триггер устанавливается при нажатии кнопки останова на пульте управления, что приводит к прекращению выполнения команд и обслуживания прерываний: обнаружив установленное состояние ТОСТ, микропрограмма «главного цикла» процессора, как показано на блок-схеме, переходит на «цикл останова», технически являющийся микропрограммой обслуживания пульта, о чём будет сказано в следующей статье. Триггер ТОСТ сбрасывается при нажатии кнопки «Пуск», в результате микропрограмма обслуживания пульта возвращается в микропрограмму выборки команды, и весь описанный выше анализ повторяется.
Наконец, если ТОСТ сброшен, проверяется состояние бита состояния ожидания PSW[14], он же триггер ТЖС, он же бит РБД[2]. Если он установлен, происходит вход в цикл ожидания, на блок-схеме не показанный (он показан на блок-схеме микропрограммы загрузки PSW, речь о которой пойдёт ниже). Если же он сброшен, блок-схема указывает переход на выборку и выполнение команды, но это вызывает определённые сомнения. Дело в том, что, пока описанная микропрограмма анализа условий установки ТВВВ работала, могли возникнуть новые условия (скажем, появился запрос внешнего прерывания, которого изначально не было), и их надо обработать. Думается, что в реальности происходит переход на начало «главного цикла», т. е. на повторный анализ состояния ТВВВ, и выборка команды будет выполнена, лишь если он сброшен.
Микропрограмма смены PSW
Как мы увидели, все микропрограммы обслуживания запросов прерываний в конечном итоге вызывают микропрограмму смены PSW, поскольку вход в обработчик любого прерывания заключается в записи старого и загрузке нового PSW. На входе эта микропрограмма получает код прерывания (где именно он находится, литература умалчивает; можно предположить, что в регистрах общего пользования РЛ и РД, но это не обязательно) и адрес второго полуслова старого PSW, находящийся в адресном регистре РГРИ; неясно, обнуляются ли регистры РГ и РР микропрограммами обработки прерываний или же они лишь заносят младший байт адреса в РИ: поскольку старшие биты адреса всегда равны нулю, с точки зрения экономии ёмкости постоянной памяти логичней обнулять их уже в микропрограмме смены PSW.
Микропрограмма смены PSW состоит из двух частей: первая сохраняет в основной памяти старое PSW, а вторая производит загрузку нового. Блок-схема первой части приведена на рисунке.
Микропрограмма сохранения PSW, скан из [1]
Как видим, первым делом микропрограмма заносит нулевой ключ доступа в регистр РБЗ: это, по сути, отключает защиту памяти. Сразу после этого производится запись в ОП кода прерывания; он занимает второй и третий байты старого PSW, и именно поэтому микропрограмме смены PSW передаётся адрес второго полуслова, а не начала PSW.
Затем в ОП сохраняются два младших байта адреса команды. Они должны попасть в четвёртое полуслово PSW, так что сначала производится изменение младшей части адреса PSW в регистре РИ. Поскольку все PSW выровнены в памяти по границе двойного слова, для обращения к тому или иному полуслову PSW достаточно менять биты РИ[5:6]; в данном конкретном случае для перехода от второго к четвёртому полуслову нужно установить бит 5, не изменяя остальные разряды. Обычно адрес следующей команды находится в адресном регистре РМФЕ, однако при выполнении некоторых команд этот регистр (точней, входящие в его состав однобайтовые регистры РФ и РЕ) используется в качестве рабочего, а адрес команды сохраняется в локальной памяти. Местоположение адреса указывается состоянием триггера ТАК, поэтому микропрограмма анализирует его, при необходимости загружает адрес команды из локальной памяти в РМФЕ и лишь затем записывает в четвёртое полуслово PSW в ОП содержимое регистров РФ и РЕ.
Следом сохраняется третье полуслово PSW, для чего первым делом опять меняется адрес в регистре РИ (сбрасывается бит 6). Младший байт третьего полуслова PSW содержит восемь старших разрядов 24-разрядного адреса команды, так что в него будет записано содержимое регистра РМ. А вот старший байт третьего полуслова представляет собой «сборную солянку», содержащую двухбитовый код длины команды (ILC), двухбитовый же код условия (CC) и четырёхбитовую маску программы. Последняя хранится в локальной памяти, CC содержится в разрядах 6 и 7 регистра РБС, а ILC формируется микропрограммно «на лету». Если прерывание (программное или от схем контроля; остальные прерывания всегда происходят только между командами — после завершения выполнения одной команды и до начала выборки следующей) произошло в момент выборки команды, о чём свидетельствует установленный триггер ТВК, ILC будет равен нулю: это означает, что адрес, сохраняемый в старом PSW, не является адресом следующей команды, и определить его невозможно (он мог уже быть частично модифицирован в процессе выборки). Если же ТВК сброшен, команда уже была выбрана или ещё не выбиралась, а соответственно, в РМФЕ находится адрес следующей команды; ILC в этом случае формируется, исходя из кода последней выбранной команды, который был сохранён в локальной памяти: он устанавливается равным 01 для команды длиной одно полуслово, 10 для двух полуслов и 11 для трёх полуслов.
Пара «лирических отступлений». В Системе 360 прерывание в момент выборки команды всегда является фатальным: оно может быть вызвано либо сбоем аппаратуры, либо программной ошибкой (попыткой выборки из недоступной области памяти, что приводит к возникновению особого случая адресации или защиты). Нулевой ILC, указывающий на невозможность определения правильного адреса команды, является в этой ситуации достаточно разумным. А вот в Системе 370 из-за появления виртуальной памяти и ряда других технических средств прерывание во время выборки или в процессе выполнения команды уже не всегда свидетельствует о программной или аппаратной ошибке (например, вся или часть команды может находиться в выгруженной странице памяти). По этой причине при разработке этой версии архитектуры обстоятельства, при которых может указываться нулевой ILC, были пересмотрены. Например, при прерывании в процессе выборки команды в старом PSW сохраняется адрес выбираемой команды, увеличенный на 1, 2 или 3 полуслова (даже если не удалось выбрать первое полуслово команды), и ILC, указывающий, на какую величину адрес был увеличен; в результате ОС может правильно определить адрес команды, чья выборка оказалась неудачной, после чего при необходимости скорректировать возникшую проблему (например, подгрузить недостающую страницу памяти) и перезапустить команду.
Второе отступление касается сохраняемого адреса команды. Старший его байт, как было сказано выше, подаётся из регистра РМ, но этот регистр является «обрезанным»: содержит не восемь, а всего три разряда, причём старший из них, бит 5, устанавливается, если при записи в регистр установлен хотя бы один из разрядов 0:5, т. е. любой из старших шести битов полного 24-разрядного адреса, — его установка свидетельствует о формировании адреса, выходящего за пределы максимально возможного на ЕС-1020 объёма основной памяти, и попытка обращения к такому адресу вызывает соответствующее программное прерывание. В том случае, если недопустимым является адрес операнда, а также в случае формирования недопустимого адреса следующей команды при увеличении последнего допустимого адреса в процессе последовательного выполнения команд проблем нет. Однако в случае, когда недопустимый адрес команды заносится командой перехода, при попытке выборки следующей команды возникает прерывание, но старшие шесть разрядов сохранённого в старом PSW адреса команды могут отличаться от адреса, на который был выполнен переход. Скажем, при попытке перехода на шестнадцатеричный адрес E01020 в регистр РМ будет занесено двоичное значение 100, и в старом PSW программных прерываний будет указан адрес команды 041020. Формально, это не нарушает принципы работы Системы 360: поскольку ILC в том же PSW будет равен нулю (прерывание возникло при выборке команды), адрес команды считается недостоверным, однако сохранение истинного адреса могло бы быть полезным при отладке программы.
Возвращаемся к микропрограмме сохранения PSW. Последним записывается его первое полуслово, старший байт которого содержит маски прерываний от каналов ввода-вывода и внешних, а младший — ключ доступа программы, маску прерываний от схем контроля и биты режимов: ASCII, супервизора и ожидания. Вся эта информация при загрузке нового PSW в неизменном виде записывается в локальную память, поэтому при сохранении старого PSW она просто извлекается из ЛП, а не собирается «по кусочкам».
Последним действием микропрограммы сохранения PSW является формирование адреса двойного слова ОП, откуда должно быть выбрано новое PSW, и передача управления микропрограмме загрузки PSW. Последняя используется не только в рамках микропрограммы смены PSW при прерываниях, но также при завершении начальной загрузки программы и микропрограммой реализации команды ЗАГРУЗКА PSW (LPSW; именно эта команда используется операционной системой, чтобы завершить обработку прерывания, загрузив ранее сохранённое старое PSW, или для передачи управления, используя современную терминологию, потоку пользователя). Вычисление адреса области нового PSW некоторого класса прерываний элементарно: оно всегда на шестнадцатеричную величину 40 больше адреса области старого PSW —, а именно этот адрес находится в РГРИ в момент завершения сохранения старого PSW.
Блок-схема микропрограммы загрузки нового PSW приведена на следующем рисунке.
Микропрограмма загрузки PSW, скан из [1]
Сначала из памяти считывается четвёртое полуслово нового PSW, содержащее два младших байта адреса команды; они записываются в локальную память (ячейки 8E и 8F) и в регистры РФ и РЕ.
Затем считывается третье полуслово; оно будет записано в ячейки ЛП 8C и 8D. Его младший байт, содержащий старшие разряды адреса команды, заносится в регистр РМ; как результат, в РМФЕ оказывается полный адрес команды, которая будет выполнена после завершения загрузки PSW.
Со старшим байтом ситуация несколько сложней. Формально он состоит из трёх полей — ILC, CC и маски программы. Код длины команды в новом PSW никакой роли не играет, поскольку единственное его назначение — дать возможность ОС определить адрес команды, вызвавшей прерывание, а соответственно, он имеет смысл только в старом PSW, сохраняемом при прерывании. Код условия используется программой постоянно, поэтому в процессоре он хранится в не в ЛП, а битах 6 и 7 регистра РБС; соответственно, микропрограмма загрузки PSW выделяет его из старшего байта третьего полуслова загружаемого PSW и помещает в РБС[6:7]. И лишь четыре бита маски программы сохраняются в локальной памяти для реального использования микропрограммами, когда они понадобятся.
Второе полуслово нового PSW никак не используется и поэтому не загружается: там содержится код прерывания, а соответственно, оно играет роль только в старом, но не новом PSW.
Первое полуслово после считывания помещается в ячейки ЛП 88 и 89. Кроме того, маски каналов, внешних прерываний и прерываний от схем контроля заносятся в соответствующие биты регистра РБР, а бит ожидания — в бит РБД[2] (последнее вызовет включение соответствующей лампы на пульте управления).
В состав младшего байта первого слова входит также ключ доступа. Если процессор имеет средства защиты памяти (установлен триггер ТБЗ), ключ заносится в биты 4:7 регистра РБЗ, чтобы в&nb