ЕС ЭВМ. Введение
Цикл статей, начинаемый этой публикацией, посвящён внутреннему устройству нескольких отечественных моделей ЕС ЭВМ, начиная с самой младшей из них — ЕС-1020.
В данной статье будет сказано несколько слов о причинах появления ЕС ЭВМ (исторические вопросы довольно подробно описаны в других источниках, поэтому я не буду здесь повторять других авторов, а желающих подробнее ознакомиться с этой темой адресую, например, в «Виртуальный компьютерный музей», https://www.computer-museum.ru/), но в первую очередь будет дан краткий обзор основных особенностей архитектуры IBM System/360, реализованной в ЕС ЭВМ: без знакомства с архитектурой затруднительно понять причины и назначение довольно многих технических решений, принятых при её реализации. Собственно схемотехника начнётся со следующей статьи.
Предыстория
Как известно, в ранних вычислительных машинах всех стран, в том числе США и СССР, не было разделения между архитектурой и реализацией: почти каждая новая машина была совершенно несовместима с более ранними разработками, а её архитектура (в первую очередь — система команд) была тесно связана со схемотехническими решениями. Кроме того, внешние устройства подключались к машине каждое по своему собственному, зачастую уникальному интерфейсу, поэтому для добавления, скажем, нового принтера могли потребоваться доработки в аппаратуре процессора. Всё это представляло большие неудобства для пользователей и делало невозможным более-менее дешёвый «апгрейд»: требовалось менять сразу всю аппаратуру и заново писать все необходимые программы, и даже перенос данных мог создать определённые проблемы.
В 1964 году компания IBM впервые в истории анонсировала не новый компьютер, а новое семейство совместимых компьютеров — System/360. Цифра 360 в названии означала »360 градусов»: по утверждению фирмы, эти машины годились для решения всего круга возможных задач (что, конечно же, было не так даже на тот момент, но как же в капиталистической стране без рекламы?). В этой серии машин впервые были реализованы следующие принципы, которые сейчас кажутся абсолютно естественными.
Полное отделение архитектуры вычислительной машины от её физической реализации: система команд, принципы обработки прерываний, организация ввода-вывода и т. п. едины для всех моделей Системы 360 независимо от их внутреннего устройства, что обеспечивает переносимость программ как между ними, так и на будущие модели — при условии, конечно, что программа не использует ресурсы, имеющиеся на одной модели, но отсутствующие на другой. Хотя программно совместимые машины встречались и раньше (например, IBM 1401 и 1410), только в Системе 360 этот принцип был, хотя бы в теории, проведён до конца, в полном объёме и заранее распространялся не только на анонсированные, но и на будущие модели. Правда, нельзя не отметить, что, хотя в общем и целом IBM своё обещание выполнила, и прикладные программы, написанные в 1965 году для любой из первых моделей Системы 360, технически можно использовать и сегодня на любом современном мэйнфрейме IBM z/Architecture (что делает эту архитектуру, вероятно, самой старой из не утративших актуальность), в процессе развития модельного ряда Системы 360 она временами нарушала свои же принципы. Например, появившаяся несколько позже первых машин модель 20, призванная стать самой дешёвой, получилась в результате сильно урезанной, откровенно неполноценной, и не обладала полной совместимостью с другими, «настоящими» моделями. Кроме того, в формальных рамках Системы 360 было создано несколько полуэкспериментальных машин, а также моделей, созданных по особым требованиям заказчиков (например, для НАСА), где совместимость тоже в чём-то нарушалась. Тем не менее, общий курс на соблюдение совместимости в общем и целом соблюдался.
Разбиение машинного слова (32 бита) на несколько более мелких элементов — впервые появившихся 8-разрядных байтов. Память адресовалась именно байтами, а не словами, как в любых более ранних машинах, что сильно упрощало программирование задач, не связанных с научно-техническими расчётами (например, обработку текстовой информации).
Единый интерфейс ввода-вывода для подключения любых устройств, что позволяло добавлять и заменять устройства или процессоры без необходимости менять остальное оборудование. Естественно, имелись ограничения, связанные с производительностью; например, скоростные диски нельзя было подключить к младшим моделям, поскольку их каналы ввода-вывода не обеспечивали минимально необходимую скорость передачи, но периферию младших моделей можно было подключать к старшим, что обеспечивало плавное обновление оборудования по мере необходимости.
Поставки машин начались с 1965 года, и они быстро завоевали популярность, несмотря на высокую стоимость (самый дешёвый вариант младшей на тот момент модели 30 с 8 Кбайтами памяти — стоил, кажется, порядка 130 тысяч тогдашних долларов, т. е. больше миллиона на современные деньги).
Когда в СССР задумались о внедрении ЭВМ в народное хозяйство (в частности, в рамках прорабатываемой, но так в итоге и не реализованной «Общегосударственной автоматизированной системы учёта и обработки информации»), быстро выяснилось, что по-настоящему подходящих машин у нас попросту нет. После нескольких лет обсуждений на тему «создавать с нуля или копировать, а если копировать, то у кого» было принято решение скопировать архитектуру System/360 и разработать на её основе ряд своих машин, получивших название Единой Системы ЭВМ. С самого начала предполагалась кооперация в рамках Совета экономической взаимопомощи (СЭВ) — экономического объединения большинства социалистических стран во главе с СССР. В частности, в разработке и производстве собственно машин первой очереди участвовали:
Хотя все эти машины изначально задумывались как полностью совместимые, не всё пошло так, как планировалось. Венгерская ЕС-1010 вообще никакого отношения к Системе 360 не имеет — это 16-разрядный компьютер совершенно другой архитектуры (на Википедии в качестве её прототипа указывается французская мини-ЭВМ Mitra 15, но ни подтвердить, ни опровергнуть это я не могу). Чехословацкая ЕС-1021 реализует лишь подмножество команд Системы 360 и несовместима с последней на системном уровне — таким образом, эту машину нельзя считать полноценной реализацией архитектуры. Остальные четыре ЭВМ, однако, действительно полностью совместимы между собой и с американскими «предками».
Так или иначе, младшей из «настоящих» ЕС ЭВМ стала ЕС-1020, разработанная в Минске и производившаяся с 1971 по 1975 год. Вопреки иногда встречающемуся мнению, она не является копией и даже близким аналогом модели 30 Системы 360: хотя отдельные элементы внутреннего устройства действительно похожи (что неудивительно, учитывая идентичную архитектуру и близкие исходные требования — создать как можно более дешёвую машину), в целом эти ЭВМ различаются очень сильно. В частности, у «американки» реализовано 16 линий физического адреса, а у нашей машины — 18 (что потребовало иной конструкции адресных регистров); ширина доступа к памяти «у них» — один байт, а у нас — два байта (что влечёт изменение в регистре данных памяти); серьёзно различается структура микрокоманды и другие детали реализации процессора. Коротко говоря, в данном случае мы скопировали архитектуру IBM, но не реализацию.
Следует заметить, что все ранние ЕС ЭВМ имели весьма посредственную надёжность, но дело не в порочности самих проектов, а в низком качестве микросхем ранних выпусков. Когда технологические проблемы микроэлектронного производства были решены, качество элементной базы стало, по большей части, вполне удовлетворительным, а вместе с ним резко возросла и надёжность вычислительной техники —, но это касалось, главным образом, уже более поздних машин, производившихся с середины 1970-х годов.
Напоследок замечу, что совместимыми с Системой 360 в нашей стране были не только ЕС ЭВМ. Например, в те же годы в рамках «Агрегатной системы средств вычислительной техники» (АСВТ) была разработана ЭВМ М-4000 и её модификации М-4030 и М-4030–1 (последняя по своим возможностям соответствовала самому первому варианту архитектуры Системы 370 — с некоторыми расширениями системы команд и средств отсчёта времени, но ещё без поддержки виртуальной памяти). Довольно сложно понять, зачем в сверхцентрализованном СССР распыляли силы на решение разными организациями одних и тех же задач, но что было, то было.
Основные особенности архитектуры
Подробное англоязычное описание архитектуры Системы 360 можно найти в Сети (поисковый запрос вида «System 360 principles of operations»; всего существует восемь редакций этого руководства — от первоначального A22–6821–0 до финального A22–6821–7, выпущенного в сентябре 1968 года). Благодаря практически полной совместимости «снизу вверх» можно воспользоваться и документацией на Систему 370, в том числе выполненным мной переводом последней редакции соответствующего документа IBM (GA22–7000–10, сентябрь 1987 года). Здесь я остановлюсь лишь на важнейших элементах архитектуры, знание которых требуется для лучшего понимания устройства процессора любой реализующей её машины.
Память
Вся доступная программисту память является оперативной — программно доступной постоянной памяти архитектура не предусматривает в принципе. Она начинается с нулевого адреса и является непрерывной. IBM для обозначения ОЗУ вместо привычного термина random access memory (RAM) использовала и продолжает использовать термин main storage, обычно переводимый на русский язык как «основная память» (ОП). В дальнейшем для обозначения памяти, видимой программисту, будет использоваться именно этот термин, а термин «оперативная память» или ОЗУ будет применяться по отношению к физической памяти, которая не всегда в полном объёме доступна программисту (например, у ЕС-1020 ОЗУ используется для хранения не только информации, доступной программисту, но и некоторых «внутримашинных» данных, т. е. ОП в ней является лишь частью полного объёма ОЗУ).
Как уже говорилось, информация в памяти адресуется побайтово. При хранении многобайтовых величин (16-разрядных полуслов, 32-разрядных слов и 64-битных двойных слов) используется порядок «старший-младший»: самый старший байт хранится по наименьшему адресу (в архитектуре IA-32, чаще называемой x86, и в большинстве других современных архитектур принят порядок «младший-старший»; в архитектуре ARM допустимы оба порядка, хотя «младший-старший» используется намного чаще). Многобайтовое поле фиксированной длины в памяти должно выравниваться на его естественную границу, т. е. адрес этого поля должен быть кратен размеру поля в байтах (2, 4 или 8 байтов; в Системе 370 это требование ослабили — там выровненными должны быть лишь управляющие поля и операнды некоторых специальных команд, а все остальные данные могут располагаться по произвольным адресам —, но ценой возможного падения производительности). Помимо данных фиксированной длины, могут обрабатываться байтовые поля переменной длины, содержащие либо произвольную «логическую» или символьную информацию (длина от 1 до 256 байтов включительно), либо двоично-кодированные десятичные числа (от 1 до 16 байтов, т. е. от 1 до 31 десятичной цифры плюс знак).
Непривычной особенностью архитектуры является нумерация битов, начиная со старшего: номер 0 всегда имеет старший бит величины (например, байта), а не младший.
Адрес памяти является 24-разрядным, что ограничивает адресное пространство 16 Мбайтами (огромная величина для 1960-х годов; машины с таким объёмом памяти стали появляться в сколько-нибудь ощутимых количествах лишь во второй половине 1970-х); при размещении адреса в 32-разрядном машинном слове он занимает три младших байта, а старший байт игнорируется.
Поддержка виртуальной памяти отсутствует (она не сразу появилась даже в Системе 370, а в Системе 360 была реализована, кажется, лишь в одной полуэкспериментальной модели: в IBM считали, что она не нужна, но потребители в конце концов переубедили производителя). Аппаратная защита памяти не является обязательной, но по факту присутствовала почти во всех моделях. В ЕС-1020 технически она может отсутствовать, но мне неизвестно, выпускались ли машины без защиты; во всех средних и старших моделях ЕС ЭВМ она де-факто является обязательной.
С точки зрения программиста защита организуется следующим образом.
Выполняемая процессором программа имеет свой ключ доступа — 4-битовую величину, хранящуюся вместе с другой управляющей информацией в слове состояния программы (PSW, см. ниже). Аналогичным образом, у каждой выполняемой программы канала (о них будет сказано позже) также имеется свой ключ доступа, задаваемый при запуске этой программы.
Ключ защиты памяти
С каждым блоком ОП размером 2 Кбайта связывается свой 5-битный ключ защиты, включающий 4 бита доступа ACC и один бит защиты от выборки F. Попытка записи информации в ОП разрешается, если ключ доступа программы процессора или канала совпадает с битами ACC в ключе защиты адресуемого блока либо если ключ доступа равен нулю. Попытка считывания информации разрешается, если в ключе блока памяти сброшен бит F, либо если ключ доступа совпадает с битами ACC ключа защиты, либо если ключ доступа равен нулю. Таким образом, нулевое значение ключа доступа де-факто отключает защиту, поэтому оно используется только для нужд операционной системы. В некоторых моделях IBM предусматривалась защита только от записи: бит F в ключах памяти отсутствовал, поэтому любые обращения на считывание всегда разрешены; в советских машинах, насколько мне известно, этот бит присутствовал всегда. Замечу, что этот механизм защиты с небольшими расширениями и модификациями используется мэйнфреймами IBM и по сей день.
Младшие 4 Кбайта ОП отведены под хранение управляющей информации, расположенной по строго определённым адресам и используемой для организации ввода-вывода и обработки прерываний (подробнее см. ниже). Очевидно, что в многопроцессорной ЭВМ каждый процессор должен иметь собственную область нижних адресов; в то же время, вся память должна быть доступна всем процессорам без ограничений. Это достигается использованием механизма префиксации.
Программа оперирует так называемыми реальными адресами — они хранятся в регистрах, вычисляются при определении адресов операндов и т. д. Для доступа к памяти реальные адреса преобразуются в абсолютные адреса, для чего у каждого процессора многопроцессорной системы имеется собственный 12-разрядный префикс. Правила преобразования просты:
если старшие 12 разрядов реального адреса равны нулю, они заменяются на значение префикса, чем достигается «перемещение» нижних 4 Кбайт реального адресного пространства данного процессора в произвольный 4-Кбайтовый блок абсолютного адресного пространства ОП;
если старшие 12 разрядов реального адреса равны префиксу, они заменяются нулями, чем достигается возможность обращения процессора к блоку с нулевым абсолютным адресом;
во всех остальных случаях абсолютный адрес равен реальному.
Значение префикса в Системе 360 задаётся переключателями на пульте управления до загрузки системы; в Системе 370 и последующих версиях архитектуры оно задаётся программно с помощью специальной привилегированной команды.
Машины, не поддерживающие многопроцессорную работу (ЕС-1020, как и любая младшая модель, входит в их число), механизмом префиксации не располагают.
Заметим, что каналы ввода-вывода оперируют напрямую абсолютными адресами, поэтому префиксация на них не действует, не считая момента запуска операции и обработки прерываний ввода-вывода, где ведущую роль играет не канал, а процессор.
Программно доступные регистры
В распоряжении программиста имеется 16 32-разрядных общих регистров (general registers). В отличие от, скажем, микропроцессоров Intel 8086 и 8088 (на последнем была построена IBM PC), эти регистры действительно являются почти равноправными, за исключением следующих особенностей:
в командах умножения, деления и некоторых сдвигов, где имеется 64-разрядный операнд или результат, его старшая половина должна находиться в регистре с чётным номером, а младшая — в следующем за ним регистре с нечётным номером;
при формировании адресов операндов в памяти содержимое регистра 0 считается нулевым независимо от его реального содержимого (в обычных операциях обработки данных он выступает наравне с остальными регистрами);
в трёх специфических командах неявно используется строго определённый общий регистр, все остальные команды задают используемые регистры явным образом без каких-либо ограничений, кроме указанных выше.
Кроме общих регистров, имеется четыре 64-разрядных регистра с плавающей запятой (float-point registers). В случае использования 32-разрядных вещественных операндов они занимают только старшую половину регистра, содержимое младшей половины игнорируется. Регистры с плавающей запятой имеют номера 0, 2, 4 и 6 — это одна из странностей архитектуры (подобная нумерация 64-разрядных регистров теоретически позволяет слегка упростить аппаратуру адресации регистров, учитывая, что ей приходится обеспечивать обращение и к 32-, и к 64-разрядным регистрам; на практике особых преимуществ это не даёт).
Состояние процессора и адрес следующей выполняемой команды хранятся вместе в 64-разрядном регистре, называемом словом состояния программы PSW (program status word). Назначение его разрядов следующее:
PSW Системы 360
биты 0–6 — маски прерываний от каналов ввода-вывода с соответствующими номерами (нулевое значение маски запрещает прерывания). Если машина имеет менее семи каналов, в качестве масок используются только самые левые (старшие) биты; если каналов больше семи, бит 6 (IO) является маской для всех каналов, начиная с имеющего номер 6;
бит 7 (EX) — маска внешних прерываний;
биты 8–11 — ключ доступа процессора;
бит 12 (A) — задаёт кодировку символов, влияющую на выполнение некоторых команд: 0 для EBCDIC (в СССР был дополнен русскими буквами и получил название ДКОИ), 1 для ASCII;
бит 13 (M) — маска прерываний от схем контроля машины;
бит 14 (W) — бит ожидания: когда он установлен, процессор прекращает выполнение команд до тех пор, пока не поступит разрешённый запрос какого-либо прерывания;
бит 15 (P) — состояние «задача» (problem state): когда он равен нулю, процессор находится в состоянии супервизора и может выполнять любые команды, когда равен единице — только непривилегированные;
биты 16:31 — код прерывания. В собственно PSW это поле никак не используется, информация в нём появляется лишь в значении PSW, записываемом в память при некоторых прерываниях (см. ниже);
биты 32:33 (ILC) — двухбитовый код длины команды (см. ниже);
биты 34:35 (CC) — двухбитовый код условия (см. ниже);
биты 36:39 — так называемая маска программы, включающая четыре бита масок прерываний, которые могут возникать при выполнении некоторых команд (например, маска целочисленного переполнения). В отличие от остальных битов, доступных лишь привилегированной программе (супервизору), маска программы может быть изменена прикладной программой с помощью специальной команды, что даёт возможность программе разрешать или запрещать эти прерывания;
биты 40:63 — 24-разрядный адрес следующей команды.
В порядке небольшого «лирического отступления» замечу, что в Системе 370 для расширения возможностей архитектуры и одновременно для сохранения возможно более полной совместимости с Системой 360 отказались от поддержки не пользовавшейся популярностью у самой IBM и её покупателей кодировки ASCII (кто ж в конце 1960-х знал, что именно она, а отнюдь не EBCDIC, станет стандартом и сохранится даже в составе Юникода в кодировке UTF-8). Бит 12 в PSW этих машин стал определять режим работы: когда он сброшен, процессор работает в режиме основного управления (BC), совместимом с Системой 360, когда установлен — в режиме расширенного управления (EC), введённом в Системе 370 для поддержки её новых возможностей. В режиме EC формат PSW в значительной степени изменяется, а управление многими функциями машины переносится в управляющие регистры, отсутствовавшие в Системе 360. Таким образом, совершенно стопроцентной совместимости «снизу вверх» между Системой 360 и последующими поколениями архитектуры нет, но это отступление — единственное, затрагивающее переносимость прикладных программ (впрочем, таковых, использующих кодировку ASCII, вероятно, практически не было, почему IBM и пожертвовала этим режимом).
Система команд
Команды имеют длину 2, 4 или 6 байтов (одно, два или три полуслова) и всегда выравниваются на границу полуслова. По этой причине в нормальных ситуациях адрес команды в PSW имеет младший бит, равный нулю. Данное свойство используется операционными системами: при возникновении какой-либо критической ошибки, делающей невозможным продолжение работы, система переводит процессор в состояние ожидания с запрещёнными прерываниями, загружая при этом в PSW нечётный адрес команды, служащий в такой ситуации кодом ошибки.
В отличие от, скажем, архитектуры IA-32, определить длину кода команды в Системе 360 и всех последующих версиях архитектуры очень просто: она задаётся двумя старшими битами старшего байта кода команды: 00 — одно полуслово, 01 или 10 — два полуслова, 11 — три полуслова. Благодаря этому свойству выборка и анализ команды намного проще, чем во многих других архитектурах.
В Системе 360 выделяется пять форматов команд: RR, RX, RS, SI и SS.
Команда формата RR
Формат RR является единственным, занимающим одно полуслово, и используется для команд «регистр-регистр». Старший его байт содержит код операции (два старших бита всегда равны нулю), младший разделён на две половины, в каждой из которых размещается номер регистра — поля R1 и R2 (заметим, что эти обозначения указывают именно поля кода команды, а не задают регистры с номерами 1 и 2). Например, команда И, выполняющая операцию «логическое И» между двумя общими регистрами 5 (первый операнд и приёмник результата) и 10 (второй операнд) записывается на языке ассемблера как NR 1,3 и имеет шестнадцатеричный код 145A.
Команда формата RX
Формат RX имеет длину два полуслова и является наиболее широко используемым для команд «регистр-память». Старший его байт содержит код операции (два старших бита содержат 01), биты 0:3 следующего байта — номер регистра, содержащего первый операнд и обычно являющегося приёмником результата (R1), биты 4:7 этого байта — номер индексного регистра (X2) для вычисления адреса второго операнда, старший полубайт третьего байта — номер базового регистра (B2), младший полубайт третьего байта и весь четвёртый байт — 12-разрядное смещение (D2). При вычислении адреса операнда процессор складывает между собой содержимое базового и индексного регистров и добавляет к ним смещение; все значения рассматриваются как числа без знака. Если в качестве базового и/или индексного регистра указан регистр 0, вместо его содержимого используется значение 0. Таким образом, для обращения к первым 4096 байтам памяти регистры можно не использовать, достаточно 12-разрядного смещения; адресация остальной памяти возможна только с помощью регистров. (Аналогичная ситуация имеет место, например, в архитектуре ARM, где нет возможности прямо указать полный адрес памяти.) Заметим, что технически регистры X2 и B2 ничем не отличаются, и используемые для них названия «индексный» и «базовый» являются лишь «логическими».
Форматы RS и SI также занимают два полуслова, но, в отличие от формата RX, их код операции содержит в двух старших битах комбинацию 10.
Команда формата RS
Формат RS предполагает использование трёх операндов: двух в регистрах (задаются полями R1 и R3) и одного в памяти (задаётся суммой базового адреса и смещения — поля B2 и D2).
Команда формата SI
Формат SI имеет два операнда: первый располагается в памяти и задаётся полями B1 и D1, а вторым является 8-разрядная константа, являющаяся частью самого кода команды (поле I2).
Команды формата SS
Команды формата SS состоят из трёх полуслов; два старших бита их кода операции имеют значение 11. Они задают операции «память-память»; к ним относятся, например, команда пересылки строк символов MVC и все команды десятичной арифметики. Код команды содержит адреса двух операндов в памяти (поля B1, D1 и B2, D2) и либо единое поле длины L (значения 0–255 соответствуют длине от 1 до 256 байтов включительно), либо два поля L1 и L2, указывающие длины каждого из операндов (значения 0–15 соответствуют длине от 1 до 16 байтов включительно).
В действительности не все команды в точности соответствуют этим форматам. Например, команда вызова супервизора SVC формально относится к формату RR, но её второй байт содержит не номера двух регистров, а код запрашиваемой функции, т. е. 8-разрядную константу; команды сдвигов относятся к формату RS, но операнд R3 в них вообще не используется, а сумма B2 и D2 задаёт не адрес в памяти, а количество разрядов, на которые необходимо выполнить сдвиг, и т. д. В последующих версиях архитектуры добавилось ещё несколько форматов, но лишь в z/Architecture подобные команды наконец-то «юридически» выделили в отдельные форматы, реально соответствующие их кодированию.
Система команд включает обязательную часть, общую для всех машин, и несколько расширений, наиболее крупными из которых являются наборы команд вещественной арифметики и обработки десятичных чисел. Американские машины включали те или иные наборы в зависимости от модели и требований заказчика; в советских, насколько мне известно, всегда реализовывался полный набор команд Системы 360 (144 команды).
Формат вещественных чисел отличается от современного, определяемого стандартом IEEE 754, хотя сама идея, конечно, та же самая. Главное отличие — мантиссы чисел являются не двоичными, а шестнадцатеричными, поэтому порядок задаёт степень не двойки, а 16, что обеспечивает намного больший диапазон представимых чисел. В то же время точность несколько хуже: во-первых, нет скрытой старшей единицы, а во-вторых, в зависимости от старшей цифры мантиссы ещё до трёх старших битов могут быть равны нулю; таким образом, по сравнению с IEEE 754 теряется от одного до четырёх двоичных разрядов точности. Из любопытных особенностей — наличие команды ПОПОЛАМ (HDR или HER в зависимости от размера числа — 8 или 4 байта), которая делит вещественное число на 2 (для этого нужно выполнять сдвиг мантиссы и иногда корректировать порядок; в IEEE 754 аналогичная операция выполняется уменьшением порядка на единицу без всяких сдвигов). В z/Architecture этот формат называется шестнадцатеричными числами с плавающей запятой; помимо них, в архитектуру были введены десятичные и двоичные вещественные числа — последние полностью соответствуют стандарту IEEE 754.
Десятичное число в упакованном формате
Десятичные числа в Системе 360 технически являются целыми («юридически» они, как и двоичные целые числа, называются числами с фиксированной запятой) и хранятся только в ОП, а не в регистрах. Для обработки они должны быть представлены в так называемом упакованном формате по две цифры 0–9 в одном байте, лишь младший полубайт самого правого байта (т. е. байта с наибольшим адресом) хранит код знака. В одном числе может быть от одного до 16 байтов включительно, т. е. от одной до 31 десятичной цифры. Все команды обработки десятичных чисел имеют формат SS («память-память»); помимо обычных арифметических операций сюда относятся весьма сложные команды РЕДАКТИРОВАНИЕ (ED) и РЕДАКТИРОВАНИЕ И ОТМЕТКА (EDMK), предназначенные для облегчения преобразования чисел в печатаемый вид по определённому шаблону. Кроме них, имеются две команды УПАКОВКА (PACK) и РАСПАКОВКА (UNPK), преобразующие десятичные числа из зонного формата в упакованный и обратно. В зонном формате в каждом байте находится код одной цифры, занимающий младший полубайт, а в старшем находится код зоны. Для почти всех цифр числа он зависит от выбранной кодировки и равен F для EBCDIC и 3 для ASCII (в соответствии с кодами символов цифр в этих кодировках — F0–F9 и 30–39 соответственно); зона самого правого символа может либо иметь такой же код (в этом случае число считается положительным), либо иметь одно из специальных значений, кодирующих знак. Любопытно, что команды PACK и UNPK относятся не к командам десятичной арифметики, которые в Системе 360 являются необязательными (они стали обязательными лишь в Системе 370), а к основному набору команд, т. е. должны быть реализованы всегда. Ещё одной «хитрой» командой, формально относящейся к основному набору, но реально предназначенной, в первую очередь, для обработки десятичных чисел, является ПЕРЕСЫЛКА СО СДВИГОМ (MVO): она пересылает содержимое заданного количества байтов памяти из одного места в другое, параллельно сдвигая его на полбайта, что позволяет организовать умножение или деление десятичного числа на 10 без использования очень «тяжёлой» команды ДЕЛЕНИЕ ДЕСЯТИЧНОЕ (DP).
Десятичное число в зонном формате
Заметим, что выбор кодировки EBCDIC или ASCII в PSW влияет только на коды знаков и зон; все остальные операции, выполняемые процессором, никак от этого режима не зависят.
В отличие от большинства более современных архитектур, результат выполнения некоторой операции, например, сложения или сравнения, отражается не четырьмя флажками признаков (как правило, носящих обозначения N, Z, V, C, но в IA-32 — SF, ZF, OF и CF), а двухбитовым кодом условия CC. Правила его установки зависят от команды, а невозможность отразить сразу все возможные результаты выполнения арифметических операций привела к тому, что в системе команд имеются отдельные команды для сложения или вычитания целых чисел со знаком и без знака. Например, знаковое сложение «регистр-память» задаётся командой A (формат RX), которая устанавливает код результата равным 00, если получен нулевой результат, 01 для отрицательного результата, 10 для положительного результата и 11 для переполнения. Аналогичное беззнаковое сложение выполняется командой AL; собственно результат в регистре будет таким же, как и для команды A, но правила установки кода условия отличаются: 00 указывает на нулевой результат при отсутствии переноса, 01 — на ненулевой результат при отсутствии переноса, 10 — на нулевой результат и наличие переноса, 11 — на ненулевой результат и наличие переноса. Достоинством архитектуры такой способ индикации свойств результата назвать трудно, но и большим недостатком он тоже не является. Кроме того, иногда этот способ даже удобен: команды условного перехода BC и BCR вместо обычного поля R1 имеют поле M1, содержащее четыре бита маски, соответствующие четырём возможным значениям кода условия, и выполняют переход, если бит маски, соответствующий фактическому значению кода условия, установлен; благодаря этому можно, например, одной выполнить переход, если получен положительный или отрицательный результат, но не нуль и не переполнение.
Значительно большим недостатком архитектуры является отсутствие стека — причём он так и не появился даже в z/Architecture (тот стек, что появился в поздних моделях Системы 370, имеет совершенно другие функции и для обычного вызова подпрограмм и сохранения регистров использоваться не может). Для вызова подпрограммы используются команды BAL и BALR, заносящие адрес возврата и некоторую другую информацию в общий регистр, заданный полем R1 (адрес перехода, как и в командах BC и BCR, задаётся либо суммой X2, B2, D2, либо содержимым общего регистра R2; если в качестве последнего указан нулевой регистр, переход никогда не выполняется, поэтому на нулевой адрес можно перейти только командой формата RX). Для сохранения содержимого регистров, в том числе и хранящего адрес возврата, и размещения временных операндов в Системе 360 требуются дополнительные усилия — особенно в случае, если необходимо обеспечить повторную входимость (реентерабельность) подпрограммы. Впрочем, обсуждение используемых для этого программных приёмов выходит за рамки данной статьи.
Прерывания
В зависимости от причины возникновения все прерывания делятся на пять категорий:
прерывания от схем контроля машины;
прерывание по вызову супервизора;
прерывания ввода-вывода;
внешние прерывания;
программные прерывания.
Прерывания от схем контроля возникают при обнаружении какой-либо аппаратной проблемы (не обязательно ошибки в полном смысле слова; так, это прерывание может возникнуть при отказе одного из вентиляторов, что не приведёт немедленно к неправильной работе машины, но требует внимания обслуживающего персонала). Общая идея заключается в том, что операционная система, получив сведения об ошибке, может уведомить персонал и предпринять меры для минимизации последствий сбоя. Например, если вышел из строя какой-то блок памяти, система может пометить соответствующую область как непригодную для использования, а пострадавшую задачу либо аварийно завершить с соответствующим уведомлением, либо перезапустить с