Арифметико-логический блок (АЛБ) — возможно, самая сложная и запутанная часть процессора ЭВМ ЕС-1030, причём его блок-схема из [1], приведённая на следующем рисунке, показывает лишь вершину айсберга.

Структура АЛБ
Структура АЛБ

АЛБ имеет «три с половиной» узла обработки данных, технически способных работать одновременно: основной 32-разрядный двоичный сумматор СМ и дополняющий его в некоторых случаях 4-битный сумматор СМД, однобайтовый десятичный сумматор СМДЕС и узел обработки байтов УОБ, отвечающий за логические операции. Кроме этих узлов, имеется большое количество регистров и счётчиков различной разрядности и пути передачи информации между ними.

Основной и дополнительный сумматоры

Каждый бит основного и дополнительного двоичных сумматоров вполне ожидаемо имеет идентичную конструкцию, показанную на схеме (кстати говоря, на ней можно увидеть старые обозначения микросхем: 1ЛБ553 и 1ЛР551, которые в середине 1970-х были переименованы соответственно в К155ЛА3 и К155ЛР1).

Схема одного бита двоичного сумматора
Схема одного бита двоичного сумматора

На вход схемы поступают четыре сигнала. Два из них — это i-е разряды обоих исходных операндов, хранящихся в регистрах РA и РB для основного сумматора и Р6 и РX для дополнительного; на схеме они обозначены как «Вход "1" РАi» и «Вход "1" РВi» (в этой записи "1" означает, что сигналы являются прямыми, а не инверсными). Два других сигнала — это прямое и инверсное значение входного переноса из предыдущего разряда Ci-1 (кстати говоря, с точки зрения архитектуры, правильней было бы обозначать предыдущий разряд как i+1, ведь нулевой разряд в Системе 360 является старшим, а не младшим, — это, пожалуй, наиболее запутывающая особенность этой и последующих архитектур этого семейства, включая современную z/Architecture).

У каждого бита сумматора три выхода. На S поступает собственно сформированная сумма битов исходных операндов с учётом входного переноса. На выходе H формируется полусумма (откуда, вероятно, и возникло обозначение H — half), т. е. результат операции «исключающее или» («сложение по модулю 2», как её обычно называют в советской литературе) между битами исходных операндов. Наконец, на выход G подаётся результат операции «логическое и» между битами исходных операндов. Единица на выходе G показывает, что из данного разряда гарантированно возникает перенос в следующий разряд независимо от значения входного переноса, а единица на выходе H показывает, что входной перенос, если он есть, необходимо передать на выход. Таким образом, сигналы H и G функционально подобны более привычным сигналам ускоренного переноса P и G, формируемым, например, классическим АЛУ SN74181 (К155ИП3).

Входные переносы внутри каждой 4-разрядной группы сумматора формируются схемой ускоренного переноса, показанной на рисунке ниже. На нём можно заметить микросхемы 1ЛП551 — это расширители К155ЛД1, выступающие в роли дополнительных элементов И на входе элементов ИЛИ-НЕ из микросхем К155ЛР1 и К155ЛР3.

Схема ускоренного переноса для четырёх разрядов сумматора
Схема ускоренного переноса для четырёх разрядов сумматора

Выходной сигнал вида Ci — это выход переноса из i-го разряда сумматора в следующий за ним старший разряд. Входные сигналы вида Hi, Gi являются выходами i-го разряда сумматора, схема которого была приведена ранее. На схеме ускоренного переноса они везде перепутаны: вместо G должен стоять H, и наоборот (единица на Gi должна безусловно формировать единицу на Ci; единица на Hi должна формировать единицу на Ci только при наличии входного переноса из предыдущего разряда).

Сигнал Cгр является входным переносом группы и одновременно входным переносом для младшего разряда этой группы.

Несложно посчитать, что для реализации четырёхразрядного сумматора по двум приведённым схемам необходимо шесть микросхем К155ЛА3, элементы которой используются как инверторы, и по десять микросхем К155ЛР1 и К155ЛД1. Не совсем понятно, зачем понадобились отдельные инверторы битов исходных операндов на входе каждого бита сумматора: их можно было бы «бесплатно» получить, используя готовые инверсные выходы разрядов регистров РA и РB (Р6 и РX) исходных операндов. Заметим, что, если отбросить эти инверторы, то число потребных микросхем К155ЛА3 сократится до четырёх, и в сумме на четыре бита сумматора потребуется 24 микросхемы — а ровно столько помещается на одном ТЭЗе типа 1, использовавшемся в процессорах ЭВМ ЕС-1020 и ЕС-1030. Это даёт основания предполагать, что физически данные инверторы всё же отсутствуют.

Остаётся вопрос о формировании входных переносов в каждую 4-разрядную группу сумматора. Судя по не очень вразумительному описанию в [1], для младших шести групп переносы формируются параллельно; для этого, надо полагать, формируются аналоги сигналов G и H для целых 4-разрядных групп, а не отдельных битов, а схема ускоренного переноса формирует из них переносы не для отдельных разрядов сумматора, а для групп. Для двух старших групп используется последовательный перенос.

В некоторых случаях (при выполнении некоторых команд с плавающей запятой и десятичной арифметики) к основному сумматору СМ подключается дополнительный 4-разрядный сумматор СМД. Исходные операнды для него хранятся в регистрах Р6 и РX, а в качестве входного переноса используется выходной перенос основного сумматора. Связка СМ и СМД, таким образом, позволяет выполнять сложение или вычитание 36-разрядных чисел.

Процесс суммирования занимает, согласно [1], 330 нс, т. е. незначительно меньше половины такта (335 нс). Думается, в действительности он происходит ощутимо быстрее. У 4-битной группы всего пять уровней логики (1: входной инвертор, 2: элементы формирования сигналов G/H, 3: элемент формирования инверсного выходного переноса, 4: инвертор переноса, 5: элемент формирования суммы); к ним следует добавить 3 или 4 уровня на схему формирования межгрупповых переносов. В сумме получаем не более 10 уровней логики, что при задержке сигнала в одной микросхеме 155-й серии не свыше 22 нс (типичное время чуть ли не наполовину меньше) даст не более 220 нс на формирование суммы — правда, без учёта времени распространения сигналов по проводникам, но им в данном случае можно пренебречь, ибо оно весьма невелико по сравнению со временем переключения микросхем.

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

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

  • при сложении десятичных операндов на основном сумматоре выходные переносы каждой тетрады не только подаются на вход следующей тетрады, но и запоминаются в соответствующих триггерах ТКОРР. Вслед за сложением выполняется коррекция, и состояние триггера ТКОРР определяет, необходимо ли корректировать данную тетраду.

Сумматоры СМ и СМД управляются группой микроопераций, назначение которых не описано, но о нём можно догадаться из приводимых в [1] и [2] описаний логики работы некоторых микропрограмм:

  • СМ[31]:=1 — подача единичного значения входного переноса в младший (31-й) разряд сумматора СМ. Если ни этой, ни других микроопераций подачи переноса нет, подаётся нулевой перенос;

  • СМ[31]:=Т30 — по этой микрооперации в качестве входного переноса СМ подаётся выход триггера Т30, что можно использовать при сложении или вычитании чисел, превосходящих по разрядности 32 бита, а также для организации сдвигов (информация в Т30 может быть принята из старшего бита регистра Р4);

  • СМ[29]:=1 — вероятно, принудительная подача входного переноса в 29-й разряд СМ. Точное назначение этой микрооперации не указывается, но такой перенос может использоваться для увеличения некоего значения на 4 без использования явно заданной константы, что потенциально полезно, например, при последовательной обработке нескольких слов памяти (физическая ширина доступа к ОП в ЕС-1030 составляет четыре байта);

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

  • СМД[3]:=ПЕР[0] — подача выходного переноса основного сумматора в качестве входного переноса дополнительного сумматора;

  • СМД:=1 или СМД[0/3]:=1 — в [1] приведены две указанных мнемоники, но в этой книге довольно много опечаток, а из контекста создаётся впечатление, что это одна и та же микрооперация. Её функции неясны, но, не исключено, что правильным обозначением является СМД[3]:=1, а функцией — принудительная подача переноса в младший разряд дополнительного сумматора;

  • ЗАПРЕТ — запрет переносов между 4-разрядными группами сумматора, что, как уже говорилось, необходимо для операций коррекции десятичного операнда или результата.

Для управления триггерами ТКОРР предусмотрены, по меньшей мере, следующие микрооперации:

  • ТКОРР:=1 — установка всех восьми триггеров ТКОРР без дополнительных условий. Применяется для последующей коррекции всех восьми десятичных цифр 32-разрядного операнда;

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

  • микрооперация, чьё обозначение не указано, устанавливающая триггеры ТКОРР, если при сдвиге влево на один разряд из соответствующей тетрады выдвигается единица или если после сдвига в этой тетраде появляется значение, большее 9 (1001). Такая установка ТКОРР, согласно [1], применяется при реализации команды ПРЕОБРАЗОВАНИЕ В ДЕСЯТИЧНУЮ (CVD; 32-разрядное двоичное целое число преобразуется в его десятичный эквивалент); [2] указывает на её использование при десятичном умножении для формирования удвоенного и учетверённого значений множимого путём сдвига значения влево с последующей коррекцией прибавлением шестёрок.

Десятичный сумматор и узел обработки байтов

Десятичный сумматор СМДЕС, как видно из его названия, выполняет операции двоично-десятичного сложения и вычитания над операндами длиной байт, т. е. над парами двоично-десятичных цифр. Его исходные операнды подаются из регистров РC и РD, а результат поступает в любой из байтов регистра Р5.

Как известно, чтобы выполнить десятичное сложение или вычитание на двоичном сумматоре, требуется корректировка одного из исходных операндов (при сложении) и коррекция результата (всегда). Как именно управляются операции коррекции, [1] не сообщает, однако кое-какие подробности имеются в [2]. Для сложения знаки первого и второго операндов перед началом операции запоминаются в триггерах Т10 и Т20, после чего вообще не упоминаемый в [1] триггер вариантов ТВАР обнуляется, если знаки разные, или устанавливается, если они одинаковые. Во время собственно сложения установленное состояние ТВАР заставляет подавать на первый вход десятичного сумматора операнд из РC с предварительной коррекцией путём прибавления 6 к каждой тетраде без распространения переноса между ними, а на второй вход — операнд из РD в неизменном виде. При нулевом значении ТВАР операнд из РC подаётся без коррекции, а операнд из РD инвертируется; кроме того, инвертируется значение входного переноса (строго говоря, [2] говорит о подаче в этом случае единичного переноса на вход сумматора, но это корректно лишь для младшего байта складываемых чисел, в дальнейшем должен использоваться межбайтовый перенос, запоминаемый в триггере Т30). На выходе собственно сумматора имеется схема коррекции результата: если из некоторой тетрады в процессе выполнения операции не было переноса, необходимо вычесть из этой тетрады лишнюю шестёрку, что технически осуществляется прибавлением десятки (кода 1010); переносы между тетрадами при коррекции не распространятся.

Состояние триггеров Т10 и Т20 задаётся следующими микрооперациями:

  • Т10:=Р8[0/3] — если в старшей тетраде регистра Р8 содержится код десятичного знака «минус», Т10 устанавливается, в противном случае — сбрасывается (в Р8 при выполнении десятичных операций хранятся, как легко догадаться, их исходные знаки, заранее заносимые туда микропрограммой);

  • Т20:=Р8[4/7] — аналогичная операция для знака второго операнда из младшей тетрады Р8;

  • Т20:=–Р8[4/7] — занесение в Т20 инвертированного знака второго операнда, что применяется для команд вычитания и сравнения;

  • Т20:=1 — эта микрооперация упоминается при описании выполнения операций вещественной арифметики, где Т20 выступает признаком возможного переполнения порядка.

Про способы управления состоянием триггеров Т30 и ТВАР информации нет.

Десятичный сумматор участвует в выполнении операций десятичного сложения и вычитания (команды AP и SP, а также сводящиеся к тем же операциям команды сравнения CP и так называемого сложения с нулём или сложения с очисткой ZAP), но не для умножения и деления, а также, кажется, преобразования двоичного числа в десятичное или десятичного в двоичное (команды MP, DP, CVD и CVB) — они выполняются на основном сумматоре.

Узел обработки байтов УОБ состоит из комбинационной схемы и схемы сравнения, а также логики, управляющей передачей данных. Входной информацией для него служит содержимое однобайтовых регистров РC и РD — тех же, что и для десятичного сумматора, а результат поступает в регистр Р7, откуда может быть передан в регистр Р5 и регистр-счётчик РС1. УОБ реализован на двух ТЭЗах типа ЕС-2030/0012.

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

Один бит логической схемы УОБ
Один бит логической схемы УОБ

Результат операций «и» и «исключающее или» принимается в регистр Р7, о чём будет сказано в следующем разделе. А вот микрооперации для приёма результата операции «исключающее или-не», похоже, нет: её результат упоминается лишь в качестве исходных данных для схемы сравнения байтов и для схем контроля (последние описаны в отдельном разделе).

Схема сравнения выдаёт два сигнала, показывающие выполнение условий РC>РD и РC≠РD, а также аналогичные условия сравнения отдельных тетрад: РC[0/3]>РD[0/3], РC[0/3]≠РD[0/3], РC[4/7]>РD[4/7], РC[4/7]≠РD[4/7]. Судя по [2], они применяются для организации условных переходов в микропрограммах, реализующих команды беззнакового сравнения (CL, CLR, CLI, CLC), причём анализ может выполняться в том же такте, в котором исходная информация заносится в РC и РD: последние, как и любые регистры процессора, являются защёлками и пропускают информацию со своего входа на выход всё время действия тактового сигнала, а небольшое время распространения сигнала через них и через схемы сравнения даёт возможность использовать его результат для формирования адреса следующей микрокоманды прямо в конце действия того же тактового сигнала.

Операционные регистры

В литературе название «операционные регистры» не встречается, оно «изобретено» для данной публикации, чтобы выделить регистры, при выполнении обычных операций хранящие операнды, промежуточные и окончательные результаты.

Регистр Р1 имеет размер 32 бита и при выполнении многих команд хранит второй операнд или его старшую часть. Он выполнен на восьми ТЭЗах типа ЕС-Т000/0001, расположенных на раме A процессора по адресам 1E07, 1E10, 1H07, 1H10, 2E11, 2E14, 2H12, 2A14. Как можно видеть по шифру этих ТЭЗов, они не привязаны к конкретной модели устройства (процессора); буква Т, вероятно, обозначает, что они выполнены на микросхемах ТТЛ, а не ЭСЛ. Каждый ТЭЗ содержит 12 триггеров-защёлок с индивидуальным управлением; регистр Р1 использует лишь четыре из них — остальные используются описанными ниже регистрами Р2 и Р3.

Приём в Р1 выполняется из регистра Р5, но не целиком, а отдельными разрядами под управлением следующих микроопераций:

  • Р1[0]:=Р5[0];

  • Р1[1/3]:=Р5[1/3];

  • Р1[4/7]:=Р5[4/7];

  • Р1[0/7]:=Р5[0/7];

  • Р1[8/15]:=Р5[8/15];

  • Р1[8/19]:=Р5[8/19];

  • Р1[16/23]:=Р5[16/23];

  • Р1[24/27]:=Р5[24/27];

  • Р1[28/31]:=Р5[28/31];

  • Р1[20/31]:=Р5[20/31].

Обилие микроопераций у этого, как и у многих других регистров, объясняется, вероятно, тем, что разработчики стремились обеспечить передачу интересующих частей регистров для каждого возможного случая — как для ускорения работы, так и из-за отсутствия у процессора полноценного универсального АЛУ, позволяющего выделять нужные разряды с помощью логических операций. Скажем, микрооперация Р1[0]:= Р5[0] заносит в Р1 только старший (знаковый) разряд числа, не затрагивая его остальные разряды; микрооперация Р1[0/7]:=Р5[0/7] передаёт только старший байт, в котором, в частности, находится порядок вещественного числа; микрооперация Р1[20/31]:= Р5[20/31] может использоваться для передачи младших 12 разрядов одного из полуслов кода команды, в которых содержится значение смещения, чтобы, сложив его с содержимым базового и индексного регистров, вычислить адрес операнда… Что происходит с теми разрядами, передача которых не выполняется, информации нет; резонно предположить, что они не изменяют своё состояние.

Наличие избыточных микроопераций (скажем, для передачи старшего байта из Р5 в Р0 вместо микрооперации Р1[0/7]:=Р5[0/7] можно было бы одновременно выполнить три микрооперации Р1[0]:=Р5[0], Р1[1/3]:=Р5[1/3] и Р1[4/7]:=Р5[4/7]) объясняется, вероятно, тем, что микрокоманда не позволяет закодировать все возможные комбинации необходимых «мелких» микроопераций одновременно.

Из Р1 информация передаётся прямо или инверсно в регистр РA и через него на один из входов основного сумматора; кроме того, старший бит Р1 передаётся, также прямо или инверсно, в триггер знака второго операнда ТЗН2. Нетрудно догадаться, что эти передачи используются при обычном сложении или вычитании. Кроме того, предусмотрена передача двух старших байтов Р1 в два младших байта РA и любого байта Р1 в однобайтовый регистр РC и через него на десятичный сумматор или узел обработки байтов. Что касается передачи в РC, её назначение очевидно: выполнение логических операций и операций сложения и вычитания десятичных чисел, а также выполнение операций, требующих перестановки или замены тетрад в пределах одного байта. Передача же старшего полуслова Р1 в младшее полуслово РA используется в двух случаях: при выборке команды и при выполнении операции с полусловами. В этих ситуациях логически из памяти считывается полуслово, однако физически производится выборка полного слова, и необходимое полуслово может оказаться как в старшей, так и в младшей половине слова.

Регистр Р2 имеет размер 32 бита и хранит младшую часть второго операнда. Как уже говорилось, технически он расположен на тех же ТЭЗах, что Р1 и Р3.

Информация в Р2 принимается из Р5 всего двумя микрооперациями: Р2[0/7]:= Р5[0/7] и Р2[8/31]:=Р5[8/31]. Такое малое их количество по сравнению с Р1 объясняется, конечно, намного более редким использованием этого регистра: он нужен, в первую очередь, для операций над вещественными числами двойной точности.

Содержимое Р2 может быть передано в регистр РB и через него на другой вход основного сумматора. В отличие от передачи Р1 в РA, эта передача всегда выполняется только прямо, возможности инвертировать содержимое регистра нет.

Регистр Р3 имеет размер 32 бита и хранит первый операнд команды или его старшую часть; он расположен на тех же ТЭЗах, что и регистры Р1 и Р2.

Информация в Р3 принимается из Р5 по следующим микрооперациям:

  • Р3[0]:=Р5[0];

  • Р3[0/7]:=Р5[0/7];

  • Р3[8/15]:=Р5[8/15];

  • Р3[1/31]:=Р5[1/31];

  • Р3[16/19]:=Р5[16/19];

  • Р3[20/23]:=Р5[20/23];

  • Р3[24/31]:=Р5[24/31].

Подобно паре регистров Р1 и РA, содержимое Р3 может передаваться прямо или инверсно в РB и далее на основной сумматор, а его старший бит — запоминаться, опять-таки, прямо или инверсно, в триггере знака первого операнда ТЗН1; старшее полуслово Р3 может передаваться в качестве младшего полуслова РB, а любой байт Р3 может передаваться в однобайтовый регистр РD и далее в десятичный сумматор или в узел обработки байтов, — все эти случаи полностью совпадают с использованием регистра Р1 и применяются в обычных командах обработки данных. Однако Р3 участвует и в ряде других операций.

Биты Р3[24/30] могут передаваться в регистр информации памяти ключей защиты РИПКЗ, что используется при выполнении команды УСТАНОВКА КЛЮЧА ПАМЯТИ (SSK), новое значение ключа для которой как раз хранится в младшем байте первого операнда. Правда, ключ памяти в Системе 360 имеет длину 5 бит и занимает разряды 24:28, а не 24:30 — последнее имеет место лишь в моделях Системы 370, поддерживающих виртуальную память. Физически ключ, как уже говорилось, имеет длину 9 разрядов, включая контрольный, но три бита не используются. В любом случае, резонно предположить наличие в [1] опечатки: логично было бы передавать либо только разряды 24:28 (собственно ключ), либо весь младший байт целиком (биты 29:31 для ключа не используются, но и мешать не будут).

Биты Р3[16/19] могут передаваться в четырёхразрядный регистр счёта адреса РСА и использоваться для адресации местной памяти. Выбор именно этих разрядов объясняется, вероятно, тем, что как раз в них находится номер базового регистра, необходимый для формирования адреса операнда в памяти. Косвенно это подтверждается тем, что блок микропрограммного управления обеспечивает переход по нулевому содержимому битов Р3[16/19], т. е. в случае, когда базовый регистр не используется: этот переход во время вычисления адреса операнда, находящегося в основной памяти, позволяет пропустить этап сложения содержимого базового регистра со смещением.

Наконец, содержимое Р3 и только оно может записываться в основную память путём его передачи в регистр коммутатора процессора РКП (микрооперация РКП:=Р3). Выбор именно этого регистра объясняется просто: микропрограмма выборки команды и подготовки операндов заносит значение общего или вещественного регистра, заданного в команде в качестве первого операнда, в Р3, а именно первый операнд является источником информации, записываемой в память командами типа «регистр-память» (STD, STE, ST, STH, STC).

Регистр Р4 имеет размер 32 бита и в ряде случаев хранит младшую часть первого операнда, но основное его назначение — сдвиг слова вправо на два разряда или влево на четыре разряда за один такт. Для этого он работает в связке с регистром Р4": последний, по сути, является промежуточным хранилищем для сдвинутых данных.

Собственно регистр Р4 выполнен на ТЭЗах двух типов: ЕС-2030/0013 и ЕС-Т000/0002, расположенных на раме A по адресам 1E09 (биты 0:1), 1E08 (2:7), 1H08 (8:15), 2E13 (16:23), 2H13 (24:27), 2H07 (28:31). Каким адресам какие ТЭЗы соответствуют, информации нет, но разумно предположить, что два ТЭЗа, содержащие биты 8:15 и 16:23, а также, возможно, ТЭЗ с битами 2:7 — это ЕС-Т000/0002: этот же ТЭЗ в количестве четырёх экземпляров реализует весь регистр Р4" (адреса 1E04, 1H04, 2E17, 2H17).

Занесение информации в Р4 выполняется следующими микрооперациями:

  • Р4:=0;

  • Р4:=Р4";

  • Р4[0/3]:=Р5[0/3];

  • Р4[4/7]:=Р5[4/7];

  • Р4[8/15]:=Р5[8/15];

  • Р4[16/23]:=Р5[16/23];

  • Р4[24/31]:=Р5[24/31];

  • Р4:=Р5;

  • Р4[0/1]:=Р6[0/1];

  • Р4[28/31]:=Р6.

Приём информации из Р5 вполне традиционен для данного процессора. Микрооперация Р4:=0 говорит сама за себя: принудительное обнуление регистра. Микрооперация Р4:=Р4" используется при завершении сдвига и обеспечивает приём результата сдвига в Р4. Микрооперация Р4[0/1]:=Р6[0/1], очевидно, связана со сдвигом вправо на два разряда: освободившееся в двух старших битах Р4 место заполняется двумя старшими битами регистра Р6. То же самое относится и к микрооперации Р4[28/31]:=Р6: она явно связана со сдвигом влево на четыре разряда.

Микрооперации, управляющие приёмом информации в Р4", не упоминаются, хотя говорится о том, что сдвиг осуществляется именно во время передачи из Р4 в Р4". В качестве гипотезы можно предположить, что микрооперации Р4[0/1]:=Р6[0/1] и Р4[28/31] :=Р6 выполняются не так, как кажется из их мнемоник, а производят передачу соответствующих разрядов Р6 в Р4" и одновременно задают приём в оставшиеся разряды Р4" подобающих битов из Р4. Впрочем, не менее вероятным выглядит предположение, что они выполняют именно обозначенные в их именах передачи, а параллельно выполняемая микрооперация Р4:=Р4" заносит в остальные биты Р4 ранее сдвинутую информацию, хранящуюся в Р4". В любом случае остаётся неясным, как именно задаётся собственно сдвиг.

Информация из Р4 передаётся в регистр РB и через него на вход основного сумматора, что применяется, когда в Р4 находится младшая половина первого операнда. Старший полубайт (биты 0:3) Р4 может быть передан в младший полубайт Р5; эта передача, вероятно, осуществляется при нормализации или выравнивании порядков вещественных операндов двойной длины (вещественные числа в Системе 360 являются не двоичными, а шестнадцатеричными, и поэтому нормализация или выравнивание порядков требует сдвига мантиссы не на один бит, а сразу на четыре). Младший байт Р4 может быть передан в регистр Р8, о котором речь пойдёт в следующем разделе. Наконец, старший бит Р4 заносится в триггер Т30, который может использоваться в качестве входного переноса основного и десятичного сумматоров — эта возможность необходима для сдвига влево операнда двойной длины (64 бита).

Регистр РA является 32-разрядным и стоит на одном из входов основного сумматора. Он выполнен на восьми ТЭЗах типа ЕС-2030/0005, расположенным на раме A по адресам 1E06, 1E11, 1H06, 1H11, 2E09, 2E15, 2H10, 2H15.

Информация в РA заносится следующими микрооперациями:

  • РA:=0 (эта микрооперация не указывается по имени, однако про возможность обнуления регистра говорится и в [1], и в [2]);

  • РA:=Р1;

  • РA[0/7]:=Р1[0/7];

  • РA[0/7]:=–Р1[0/7];

  • РA[8/15]:=Р1[8/15];

  • РA[16/31]:=Р1[0/15];

  • РA[16/31]:=Р1[16/31];

  • РA[8/31]:=–Р1[8/31];

  • РA:=+6 — в каждую тетраду регистра РA заносится либо значение 0000, если соответствующий данной тетраде триггер ТКОРР сброшен, либо значение 0110 (десятичное число 6), если он установлен. Такое занесение требуется для коррекции десятичного операнда;

  • РA:=+10 — в каждую тетраду РA заносится значение 0000, если соответствующий триггер ТКОРР установлен, и значение 1010 (десятичное число 10), если он сброшен. Эта микрооперация нужна для коррекции результата десятичного сложения или вычитания.

Регистр РB является 32-разрядным и стоит на втором входе основного сумматора. Старшие три байта этого регистра собраны на шести ТЭЗах типа ЕС-2030/0001 (рама A, адреса 1E05, 1E12, 1H05, 1H12, 2E10, 2E16), младший байт — на двух ТЭЗах типа ЕС-2030/0005 (рама A, адреса 2H11 и 2H16).

Источников информации у РB больше, чем для РA:

  • РB:=0;

  • РB[8/31]:=0;

  • РB:=Р2;

  • РB:=Р3;

  • РB:=Р4;

  • РB[0/7]:=Р3[0/7];

  • РB[8/15]:=Р3[8/15];

  • РB[8/15]:=–Р3[8/15];

  • РB[16/31]:=Р3[0/15];

  • РB[16/31]:=Р3[16/31];

  • РB[16/31]:=–Р3[16/31];

  • РB[24/31]:=КОНСТ.

Последняя микрооперация заносит в младший байт РB константу, в роли которой выступают разряды 48:55 микрокоманды.

Регистр Р5 — 32-разрядный источник и одновременно конечная точка для почти всех операций, выполняемых процессором: вся обрабатываемая информация так или иначе проходит через него. Собственно регистр собран на ТЭЗах типа ЕС-Т001/0004, вместе с которыми используются ТЭЗы типа ЕС-2030/0002 — вероятно, на последних собраны дополнительные части входного мультиплексора. Эти ТЭЗы находятся в раме A на панелях 1C и 2С.

Список микроопераций приёма в Р5 ожидаемо самый обширный из всех регистров:

  • Р5:=0;

  • Р5:=СМ — обычный приём результата выполнения сложения или вычитания в основном сумматоре по синхросигналу С1;

  • Р5:=ЛВ(1)СМ, Р5:=ЛВ(4)СМ, Р5:=ПР(1)СМ, Р5:=ПР(2)СМ, Р5:=ПР(4)СМ — смысл этих микроопераций не раскрывается, однако резонно предположить, что они осуществляют приём в Р5 результата сложения, сдвинутого влево или вправо на указанное количество разрядов. Чем заполняются «лишние» разряды Р5, полной ясности нет; разумно предположить, что они не изменяются или же обнуляются, если только одновременно не выполняется одна из микроопераций приёма информации из регистра Р6 (см. ниже);

  • Р5[8/31]:=ПР(1)СМ[8/31] — вероятно, приём сдвинутого вправо на один разряд результата суммирования в младшие три байта Р5. Можно предположить, что этот сдвиг потребовался для реализации команд ПОПОЛАМ (HDR и HER), делящих вещественное число на два; в разряд Р5[8] в этом случае должен заноситься нуль. Как уже упоминалось, что в Системе 360 вещественные числа представлены мантиссой в степени 16, а не 2, как в подавляющем большинстве других архитектур, и поэтому деление вещественного числа на 2 нельзя реализовать уменьшением порядка на единицу: нужно сдвигать мантиссу на один бит вправо и, если возникнет необходимость, выполнить нормализацию результата;

  • Р5[28/31]:=Р4[0/3] — пересылка старшего полубайта Р4 в младший полубайт Р5, что может использоваться в вещественных операциях и при обработке десятичных чисел, а возможно, и в многоразрядных сдвигах;

  • Р5[0]:=Р6[0], Р5[0/3]:=Р6, Р5[28/31]:=Р6, Р5[31]:=Р6[0] — микрооперации приёма в старшие или младшие разряды Р5 информации из четырёхразрядного регистра Р6. Этот регистр, как будет видно позже, может принимать информацию с выхода дополнительного сумматора СМД (через регистр Р6") или со старших или младших разрядов основного сумматора. Приём информации из СМД требуется в операциях десятичной и вещественной арифметики, где СМД расширяет основной сумматор и позволяет формировать цифру результата, выходящую за пределы основной разрядной сетки. Приём же в Р6 старших или младших битов результата СМ используется при организации сдвигов;

  • Р5[0]:=РС1[0], Р5[1/7]:=РС1[1/7] — эти пересылки могут использоваться в целом ряде «циклических» операций: регистр РС1, о котором речь пойдёт в следующем разделе, является одним из счётчиков, используемым, в частности, при нормализации результата операции с плавающей запятой;

  • Р5[0/7]:=Р7, Р5[8/15]:=Р7, Р5[16/23]:=Р7, Р5[24/31]:=Р7 — приём результата из узла обработки байтов УАБ, выходным регистром которого является Р7;

  • Р5[0/7]:=СМ ДЕС, Р5[8/15]:=СМ ДЕС, Р5[16/23]:=СМ ДЕС, Р5[24/31]:= СМ ДЕС — приём результата операции из десятичного сумматора;

  • Р5[0/7]:=РДПУ[0/7], Р5[8/15]:=КПУ[0/7], Р5[16/31]:=КПУ[8/23] — назначение этих микроопераций не описано, но, похоже, они принимают информацию от пульта управления;

  • Р5:=РИМП — приём в Р5 информации, считанной из местной памяти;

  • Р5:=РИОП, Р5[0/15]:=РИОП[16/31], Р5[16/31]:=РИОП[0/15] — приём информации, считанной из основной памяти. Передача полуслов крест-накрест предназначена, в частности, для обеспечения выборки команды: её код состоит из одного, двух или трёх полуслов, а соответственно, при считывании из памяти каждое полуслово может быть как чётным, так и нечётным, и данные микрооперации позволяют привести положение полуслов внутри процессора к единому формату независимо от их положения в памяти;

  • Р5:=РССП[0/31], Р5:=РССП[32/63] — занесение в Р5 старшей и младшей половины текущего слова состояния процессора;

  • Р5[31]:=Т20 — триггер Т20 имеет, как минимум, две функции. В десятичных операциях он устанавливается, если второй операнд имеет знак «минус», и сбрасывается в противном случае; в операциях с плавающей запятой (и, вероятно, над целыми числами тоже) он устанавливается при возникновении переполнения — правда, не очень понятно, идёт ли речь о переполнении в современном смысле слова или же об обычном переносе из старшего разряда суммы;

  • Р5[31]:=Т30 — в триггер Т30 может быть занесён старший бит регистра Р4 или младший бит регистра Р6", что может использоваться при сдвигах;

  • Р5[0]:=0, Р5[1/7]:=0, Р5[28/31]:=0, Р5[31]:=0, Р5[0]:=1 — сброс или установка указанных разрядов регистра.

Информация из Р5 может передаваться почти во все регистры процессора: Р1–Р4, Р7, Р8, РССП (слово состояния программы, т. е. PSW), РВО (регистр выполняемой операции, в котором хранится код текущей команды), РВЛ0 (регистр внешних линий 0, являющийся частью блока прямого управления), РИМП (регистр информации местной памяти — для записи в неё) и в счётчики РС2–РС6. Наиболее заметным исключением является отсутствие возможности записи в основную память прямо из Р5: единственным источником информации для неё является, как уже говорилось, регистр Р3.

Наконец, информация, содержащаяся в Р5, подаётся на схему анализа корректности десятичных цифр и знаков, что используется при выполнении десятичных операций. Её работа должна разрешаться некоей микрооперацией, но она нигде явным образом не упоминается.

Регистры Р6 и Р6" имеют ширину 4 бита. Первый из них предназначен для накопления очередной цифры частного или произведения и для выполнения сдвигов и нормализации; второй является вспомогательным и работает совместно с Р6. Регистр Р6 выполнен на одном ТЭЗе ЕС-2030/0015 и расположен в раме A по адресу 1D01; регистр Р6" выполнен на ТЭЗе ЕС-2030/0013 и расположен по соседству с первым — по адресу 1D03.

Информация в Р6 принимается следующими микрооперациями:

  • Р6:=0 — обнуление регистра; возможно, всегда выполняется совместно с микрооперацией РX:=0;

  • Р6[3]:=1;

  • Р6[0]:=СМ[0];

  • Р6[0]:=СМ[31];

  • Р6[0/1]:=СМ[30/31];

  • Р6:=СМ[0/3];

  • Р6:=СМ[28/31];

  • Р6:=Р6";

  • Р6:=Т10.

Как видим, больше половины микроопераций связаны с передачей в Р6 одного, двух или четырёх старших или младших разрядов результата операции в основном сумматоре. Несложно догадаться, что они совместно с микрооперациями приёма в Р5 обеспечивают сдвиг операнда вправо или влево, запоминая в Р6 выдвигаемые разряды.

Микрооперация Р6:=Р6", очевидно, принимает в Р6 содержимое регистра Р6".

Микрооперация Р6:=Т10 формирует в Р6 код знака результата десятичной операции в зависимости от знака первого операнда, отражаемого состоянием триггера Т10, и используемой кодировки десятичных чисел — EBCDIC (ДКОИ) или ASCII (КОИ-8), что определяется состоянием бита РССП[12]. Логика здесь такая: бит 0 регистра Р6 всегда устанавливается; бит 1 устанавливается, если РССП[12] сброшен, и сбрасывается в противном случае; бит 2 устанавливается равным биту РССП[12], т. е. противоположным биту 1; бит 3 устанавливается равным триггеру Т10. Знаку «плюс» в кодировке EBCDIC, являющейся основной, соответствует комбинация 1100, знаку «минус» — 1101; в практически не использовавшейся кодировке ASCII, поддержка которой была упразднена в Системе 370, знаку «плюс» соответствует комбинация 1010, знаку «минус» — 1011.

Информация, хранящаяся в Р6, может передаваться в регистры Р4, Р5 и Р6", что описывалось выше. Кроме того, она подаётся на один из входов дополнительного сумматора СМД и может использоваться для управления триггерами Т10, Т20 и Т30, однако служащие для этого микрооперации не описаны.

В регистр Р6" информация может заноситься либо из Р6 (со сдвигом на один разряд), либо с выхода дополнительного сумматора СМД:

  • Р6"[0/2]:=Р6[1/3];

  • Р6"[1/3]:=Р6[0/2];

  • Р6":=СМД.

Кроме перечисленных, имеется микрооперация Т30:=Р6"[3], заносящая в триггер Т30 содержимое младшего бита Р6". Учитывая, что в этот бит может заноситься младший разряд результата СМД, а последний зависит от значения выходного переноса из основного сумматора, такая передача может использоваться для последующей подачи переноса на вход основного сумматора (Т30 является одним из возможных источников его входного переноса) либо для учёта наличия переноса при выполнении микропрограммы.

Регистр РX имеет ширину 4 бита и хранит второй операнд дополнительного сумматора СМД. Он реализован на ТЭЗе ЕС-2030/0013 и расположен в раме A по адресу 1D02.

Приём в регистр РX выполняется двумя микрооперациями:

  • РX:=0 — обнуление регистра; возможно, всегда выполняется совместно с микрооперацией Р6:=0;

  • РX:=–СМ[28/31] — занесение инвертированного значения младшего полубайта результата СМ;

С обнулением всё ясно: подача на вход СМД двух нулевых операндов и выходного переноса из основного сумматора позволяет запомнить этот перенос в Р6"[3] и далее в Т30, чтобы использовать в последующих операциях; кроме того, первоначальное обнуление требуется для подсчёта количества переносов в процессе десятичного умножения или деления.

Назначение второй микрооперации остаётся туманным.

Регистр РC хранит один байт информации, являющийся одним из операндов десятичного сумматора СМДЕС и узла обработки байтов УОБ. В операциях с плавающей запятой в него заносится порядок одного из операндов для дальнейшего сравнения с порядком другого операнда. Этот регистр собран на паре ТЭЗов ЕС-2030/0005 и расположен в раме A по адресам 1D06, 1D07.

Информация в РC заносится следующими микрооперациями:

  • РC:=0;

  • РC[0]:=Р1[0], РC[1/7]:=Р1[1/7] — в операциях с плавающей запятой позволяют занести в РС знак второго операнда и его порядок соответственно, а при обработке десятичной и логической информации — старший байт второго операнда;

  • РC:=Р1[8/15], РC:=Р1[16/23], РC:=Р1[24/31] — позволяют занести в РC соответствующие байты второго операнда в десятичных и логических операциях;

  • РC[0/3]:=РС1[0/3], РC[4/7]:=РС1[4/7] — приём информации из счётчика РС1 (см. ниже);

  • РC[4/5]:=РС3 — приём информации из двухбитного счётчика РС3; назначение этой передачи неизвестно;

  • РC[0/3]:=ЗОНА — хотя назначение этой микрооперации не описано, его легко угадать, зная систему команд. Она используется при преобразовании десятичного числа из упакованного формата (две десятичные цифры в одном байте) в распакованный: в младшем полубайте остаётся десятичная цифра, а старший полубайт замещается кодом зоны, равным 1111 при использовании кодировки EBCDIC и 0011 при использовании ASCII (выбор кодировки задаётся двенадцатым битом PSW, т. е. разрядом РССП[12]). В результате весь байт становится кодом цифры в соответствующей кодировке (F0–F9 или 30–39).

Содержимое РC контролируется на его допустимость как десятичного операнда; при появлении в нём некорректного кода цифры формируется соответствующий сигнал, который в итоге приведёт к программному прерыванию по особому случаю в данных. Контроль выполняется аппаратно, однако его работа разрешена лишь при наличии некоей микрооперации, что позволяет использовать регистр для произвольных операндов, а не только для десятичных чисел.

Регистр РD также хранит один байт информации, поступающей на второй вход СМДЕС и УОБ, и реализован аналогично регистру РC. Он расположен в раме A по адресам 1D08, 1D09.

Управляющие им микрооперации сходны с микрооперациями РC:

  • РD:=0;

  • РD[0]:=Р3[0], РD[1/7]:=Р3[1/7], РD:=Р3[8/15], РD:=Р3[16/23], РD[0/3]:=Р3[24/27], РD[4/7]:=Р3[28/31];

  • РD[0/3]:=РС1[0/3], РD[0/3]:=РС1[4/7], РD[4/7]:=РС1[4/7];

  • РD[4/5]:=РС4.

Подобно РC, содержимое РD тоже контролируется на допустимость при выполнении десятичных операций.

Регистр Р7 принимает один байт информации с выхода узла обработки байтов УОБ. Он собран на двух ТЭЗах типа ЕС-2030/0005 и расположен в раме A по адресам 1C10, 1C11.

Для приёма информации в Р7 (осуществляется в полутакте С2) используются следующие микрооперации:

  • Р7:=0, Р7[4/7]:=0, Р7[0]:=1 — установка всего регистра или его отдельных разрядов в заданное состояние;

  • Р7:=РC˄РD — занесение в Р7 результата операции «логическое и», выполняемой в УОБ между содержимым регистров РC и РD;

  • Р7[0/3]:=РC⊕РD[0/3], Р7[0/3]:=РC⊕РD[4/7], Р7[4/7]:=РC⊕РD[0/3], Р7[4/7]:=РC⊕РD[4/7] — приём в полубайты Р7 результата выполняемой в УОБ операции «исключающее или» между полубайтами регистров РC и РD. Как можно видеть, полубайты могут приниматься как прямо, так и крест-накрест, что позволяет обменивать тетрады местами;

  • Р7:=Р5[–1,2/7] — такое явно ошибочное обозначение эта микрооперация носит в [1]. Понятно, что речь идёт о передаче части содержимого Р5 в Р7, но какой именно части, ясно не до конца;

  • Р7:=РИПКЗ — приём в Р7 данных из регистра информации памяти ключей защиты — т. е. ключа памяти, считанного из ПКЗ;

  • Р7:=РВЛ1 — приём информации с регистра внешних линий 1, который является частью блока прямого управления.

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

8.4.Служебные регистры

Термин «служебные регистры» тоже является «изобретением» для данной публикации: к их числу отнесены регистры арифметико-логического блока, которые, хотя и являются составной частью потоков данных процессора ЭВМ ЕС-1030, однако при выполнении обычных операций хранят не обрабатываемые данные, а служебную информацию — количество итераций, номера программно доступных регистров и т. п.

Регистр Р8 шириной один байт собран на двух ТЭЗах типа ЕС-2030/0013, расположенных в раме A по адресам 1C05 и 1C06. Он является промежуточным хранилищем номеров регистров, задаваемых во втором байте кода команды, знаков десятичных операндов или кода символа-заполнителя при выполнении команд РЕДАКТИРОВАНИЕ (ED) и РЕДАКТИРОВАНИЕ И ОТМЕТКА (EDMK). Эти две команды относятся к средствам десятичной арифметики и являются, вероятно, наиболее сложными и одновременно «странными» среди всех команд Системы 360, хотя и весьма полезными в определённых ситуациях при ручном программировании на языке ассемблера. В то же время они выполняются чисто микропрограммными средствами и не оказывают влияния на внутреннее устройство (микроархитектуру) процессора, поэтому останавливаться на них мы не будем — тем более, что подробности их реализации отсутствуют.

Приём информации в Р8 выполняется следующими микрооперациями:

  • Р8:=РС1;

  • Р8:=Р4[26/31] — именно так эта микрооперация обозначена в [1]. По всей вероятности, она заносит в Р8[0/1] нули, а в Р8[2/7] — значение младших шести разрядов регистра Р4, чтобы затем переслать полученную величину в регистр-счётчик РС1. Это используется при реализации команд сдвига, в которых величина сдвига задаётся как раз битами Р4[26/31];

  • Р8:=Р5[8/15] — пересылка в Р8 второго байта Р5, который во время выборки команды содержит её второй байт;

  • Р8[0/3]:=Р5[0/3], Р8[0/3]:=Р5[28/31], Р8[4/7]:=Р5[16/19], Р8[4/7]:=Р5[28/31] — пересылка определённого полубайта Р5 в заданный полубайт Р8. Представляется, что две из этих микроопераций — Р8[0/3]:=Р5[28/31] и Р8[4/7]:=Р5[28/31] — используются для занесения в Р8 кодов знаков сначала одного, а затем другого десятичного операнда.

Информация из Р8 может передаваться в регистр адреса местной памяти (см. ниже) и в счётчик РС1, а также использоваться для установки состояния триггеров знаков операндов, для чего служат упоминавшиеся ранее микрооперации Т10:=Р8[0/3], Т20:= Р8[4/7] и Т20:=–Р8[4/7].

Регистр адреса местной памяти РАМП является шестиразрядным, поскольку объём МП составляет 64 слова. Помимо простого хранения адреса, младшие четыре бита РАМП совместно с регистром счёта адреса РСА могут работать счётчиком, увеличиваясь на единицу по составной микрооперации РСА:=+1,РАМП[2/5]:=РСА.

Приём информации в РАМП, т. е. установка адреса слова местной памяти, выполняется следующими микрооперациями:

  • РАМП[2/5]:=Р5[0/3], РАМП[2/5]:=Р5[12/15], РАМП[2/5]:=Р5[16/19], РАМП[1]:=Р5[2], РАМП[0/1]:=Р5[14/15] — хотя выполняемые пересылки самоочевидны из названий микроопераций, их «сакральный смысл» не описывается. В случае с пересылками из Р5[0/3] и Р5[16/19] логично предположить, что речь идёт о передаче номера базового регистра, содержащегося в старшем полубайте второго и третьего полуслов кода команды: он нужен для последующего считывания содержимого этого регистра в процессе вычисления адреса соответствующего операнда. Аналогичным образом, пересылка из Р5[12/15] может передавать номер индексного регистра из второго байта кода команды формата RX. Передача РАМП[1]:=Р5[2] используется в процессе выборки команды и позволяет указать, будет ли выполняться доступ к регистрам общего назначения или регистрам с плавающей запятой: бит Р5[2] в этот момент принадлежит первому байту кода команды и будет сброшен для команд, использующих общие регистры, и установлен для команд вещественной арифметики;

  • РАМП[2/5]:=Р8[0/3], РАМП[2/5]:=Р8[4/7] — занесение номера регистра общего назначения или регистра с плавающей запятой, заданного в коде команды и хранящегося в Р8;

  • РАМП[2/5]:=РС1[0/3];

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

  • РАМП[0/5]:=КОНСТ — занесение фиксированного адреса МП из микрокоманды. Помимо доступа к рабочим областям МП, может применяться для установки строго определённого номера регистра общего назначения, что требуется для реализации трёх «редкоземельных» команд ПЕРЕКОДИРОВАНИЕ И ПРОВЕРКА (TRT, специальным образом использует регистры общего назначения 1 и 2), РЕДАКТИРОВАНИЕ И ОТМЕТКА (EDMK, регистр 1) и ВСТАВКА КЛЮЧА PSW (IPK, регистр 2), а также для установки в РАМП[0/1] старших разрядов адреса МП с последующим занесением в РАМП[2/5] номера регистра из кода команды;

  • РАМП[2/5]:=РСА — часть упомянутой выше составной микрооперации, пересылающая в РАМП младшие четыре байта адреса из счётчика РСА.

Регистр счёта адреса РСА (на блок-схеме арифметико-логического блока не показан) имеет ширину четыре бита и используется совместно с РАМП для адресации последовательно расположенных слов МП. Он выполнен на одном ТЭЗе ЕС-2030/0016, расположенном в раме A по адресу 1B01.

Для управления работой РСА имеются три микрооперации:

  • РСА:=0;

  • РСА:=Р3[16/19];

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

Регистр счёта РС1 может использоваться как один восьмиразрядный или два независимых четырёхразрядных счётчика. Он применяется для подсчёта циклов в командах деления, сдвига, групповой загрузки и записи регистров, при нормализации и выравнивании порядков в операциях с плавающей запятой, а также для подсчёта длин операндов в логических и десятичных операциях с операндами переменной длины.

Регистр РС1" является вспомогательным и каждый такт принимает значение из РС1. На его выходе собрана схема модификации значения, результат работы которой принимается при наличии соответствующей микрооперации в РС1.

РС1 собран на двух ТЭЗах типа ЕС-2030/0010, расположенных в раме A по адресам 1C07, 1C08. РС1" занимает один ТЭЗ ЕС-Т000/0001 в раме A по адресу 1B09.

Работой регистра управляют следующие микрооперации:

  • РС1:=0, РС1[0/3]:=0, РС1[4/7]:=0 — обнуление всего регистра или его половин;

  • РС1:=Р7, РС1[0/3]:=Р8[0/3], РС1[4/7]:=Р8[4/7] — загрузка всего регистра или его половин;

  • РС1:=+1, РС1:=–1 — увеличение или уменьшение содержимого всего регистра на единицу;

  • РС1[0/3]:=+1, РС1[0/3]:=–1, РС1[0/3]:=–4, РС1[4/7]:=+1, РС1[4/7]:= –1, РС1[4/7]:=–4 — увеличение на единицу или уменьшение на единицу либо на четыре половин регистра.

Информация из РС1 может передаваться в регистры Р5, Р8, РC, РD и РАМП.

Регистр счёта РС2 является четырёхразрядным и используется для подсчёта циклов в командах умножения. Как и в случае с РС1, технически предусмотрен регистр-дублёр РС2", каждый такт принимающий информацию из основного регистра РС2 и хранящий её во время формирования нового значения регистра. РС2 собран на ТЭЗе ЕС-2030/0010, расположенным в раме B по адресу 1E01, РС2" — на ТЭЗе ЕС-Т000/0001 рамы B по адресу 1E03.

Работой РС2 управляют следующие микрооперации:

  • РС2:=0;

  • РС2:=Р5[28/31];

  • РС2:=КОНСТ — приём константы из битов 48:51 микрокоманды;

  • РС2:=+1;

  • РС2:=–1.

Содержимое РС2 никуда не передаётся и используется только для анализов.

Регистры счёта РС3–РС6 являются двухбитными и тоже имеют соответствующие регистры-дублёры РС3"–РС6"; информация в последние из основных регистрах переписывается по каждому синхросигналу С1. Они предназначены для отслеживания байтов слов памяти, обрабатываемых в данный момент: это необходимо для операций над десятичными и символьными данными, располагающимися не в регистрах процессора, а в основной памяти без какого-либо специального выравнивания.

Основные регистры попарно размещены на ТЭЗах типа ЕС-2030/0010, расположенных в раме B по адресам 1E00 и 1E04, регистры-дублёры РС3"–РС6" — на одном ТЭЗе типа ЕС-Т000/0001 в раме B по адресу 1E03.

РС3–РС6 управляются следующими микрооперациями:

  • РС3:=0, РС4:=0, РС5:=0, РС6:=0;

  • РС3:=Р5[30/31], РС4:=Р5[30/31], РС5:=Р5[30/31], РС6:=Р5[30/31];

  • РС3:=+1, РС3:=–1, РС4:=+1, РС4:=–1, РС5:=+1, РС5:=–1, РС6:=+1, РС6:=–1;

  • РС3:=РС6, РС4:=РС5, РС6:=РС5;

Как видим, все четыре счётчика поддерживают сброс в нуль, инкремент, декремент и загрузку из двух младших битов регистра Р5. Последнее объясняется тем, что адрес в блок обращения к памяти подаётся с выходов основного сумматора, которые принимаются также в Р5 — именно этим путём два младших бита адреса, то есть номер байта внутри слова, и попадает в тот или иной счётчик.

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

Информация из счётчиков может с неизвестными целями передаваться в биты 4:5 регистров РC и РD. Кроме того, она применяется для выполнения переходов в микропрограмме.

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


  1. duselguy
    09.12.2024 21:25

    Ссылки [1] и [2] в статье не раскрыты (или я не нашёл).
    Upd. Надеюсь (не флейма ради), что фраза про запутанность Big Endian (vs Little Endian) относится лишь к конкретному случаю обозначений индексов.


    1. SIISII Автор
      09.12.2024 21:25

      1. В первой статье указал источники, дальше не повторял.

      2. Речь про неоднозначность обозначений разрядов внутри машины: архитектура обозначает старший бит как 0, а младший -- 7, 15, 31... в зависимости от разрядности величины; регистры внутри процессора тоже нумеруются в таком (архитектурном) порядке -- но перенос из предыдущего (младшего) разряда обозначается индексом i-1, хотя номер этого разряда будет больше, а не меньше, т.е. следовало бы обозначить его i+1.

        Но, замечу, тут не очень корректно говорить о big/little endian, так как под этим практически всегда понимают порядок следования байтов в памяти, а не номеров битов в байте/слове.


      1. netch80
        09.12.2024 21:25

        Но, замечу, тут не очень корректно говорить о big/little endian, так как под этим практически всегда понимают порядок следования байтов в памяти, а не номеров битов в байте/слове.

        В исходном документе, где ввели эти термины, говорят про оба, например:

        The Little-Endians assign B0 to the LSB of the words and B31 is the MSB. The Big-Endians do just the opposite, B0 is the MSB and B31 is the LSB.

        И особенно по поводу типовой странности нумерации (которую как раз не поддерживает IBM, практически как исключение, и, неожиданно, IETF в своих основных стандартах):

        Don't let the B0-to-B31 direction fool you!! Most computers were designed by Big-Endians, who under the threat of criminal prosecution pretended to be Little-Endians, rather than seeking exile in Blefuscu. They did it by using the B0-to-B31 convention of the Little-Endians, while keeping the Big-Endians' conventions for bytes and words.

        У IETF это можно увидеть, например, в RFC791 (IPv4), где чётко нумерация битов 0=MSB.


        1. SIISII Автор
          09.12.2024 21:25

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


          1. netch80
            09.12.2024 21:25

            Я видел источники со всеми 4 вариантами нумерации битов, так что вопрос просто в привычке;)
            Хотя стиль IBM, где надо думать, как именно понимается регистр в данном конкретном случае - 32- или 64-битный - неудобен именно этим сдвигом. Написано "биты 0-3" и сиди ищи контекст...

            0=LSB действительно принят ну почти всеми даже в BE мире. IBM и IETF исключения. Вполне вероятно, что мотивация такая же, как у вас (и у авторов той доки по 1030)...


            1. SIISII Автор
              09.12.2024 21:25

              Вроде б, в HP21xx (что у нас содрали и в АСВТ, и в виде СМ-1, СМ-2) тоже 0 -- старший бит, но голову на отсечение не дам...


              1. rutenis
                09.12.2024 21:25

                В HP2100A бит 0 младший, бит 15 старший, вот дока: http://bitsavers.org/pdf/hp/21xx/02100-90001_2100refManDec71.pdf

                Возможно, это как раз разработчики СМ-1 и СМ-2 использовали привычную им нумерацию начиная со старшего бита.


  1. saag
    09.12.2024 21:25

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


    1. netch80
      09.12.2024 21:25

      Веселье можно было себе обеспечить где угодно :) а выбора толком и не было.

      "Ломалось" зависело от конкретной установки. В Киевском Нефтехиме 1040 работала как швейцарские часы, а 1055 никогда не могли запустить дольше чем на полчаса, обычно до первого сбоя проходило минут 5:( Ценовская 1022 зависела непонятно от чего, но в (насколько помню) ≈⅔ дней работала нормально, в остальные от получаса до 2 часов до зависа.

      Когда году в 85-м пришла на кафедру настольная Электроника-85 (клон PDP-11) с 512K памяти, стало ясно, что эпоха ЕСок окончательно ушла в закат.


      1. SIISII Автор
        09.12.2024 21:25

        Замечу -- именно ЕСок, а не мэйнфреймов как таковых: просто они и СМки/персоналки -- под разные задачи. Но, опять-таки, под занавес Союза минчане выкатили ЕС-1130 -- очень надёжную и быструю машину, к тому что достаточно малогабаритную (проц, каналы и 16 Мбайт памяти по объёму... ну, примерно половина стандартной стойки, там конструктив был уже не традиционный стоечный).


      1. duselguy
        09.12.2024 21:25

        "а 1055 никогда не могли запустить дольше чем на полчаса, обычно до первого сбоя проходило минут 5"
        Странно, 1055 (как и 1040) немецкая машина, у нас работала без единого сбоя (но медленная).


        1. netch80
          09.12.2024 21:25

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


      1. saag
        09.12.2024 21:25

        В статуправлении "электронный мальчик" залазил в шкаф процессора ЕС-1022 как фиксик и что-то там пропаивал.


  1. Listenernow
    09.12.2024 21:25

    Дела давно минувших дней. Эх... Моих знакомых СПЕЦОВ, кто занимался запуском и ТО этих машин уже нет...


  1. safari2012
    09.12.2024 21:25

    А я типа программировать на Паскале и ассемблере (System/360) на них учился. До сих пор свой пароль в СВМ помню :)

    Если не считать вечного "ГУУ: нет ресурса", у нас ломалось только АЦПУ постоянно.


    1. sim2q
      09.12.2024 21:25

      у нас ломалось только АЦПУ постоянно.

      а как же : "...пройтись киянкой по ТЭЗам ?...", или байка?)


      1. duselguy
        09.12.2024 21:25

        В первые месяцы "выгорали" дребезжащие ТЭЗы, потом полёт нормальный (кроме задранных дисков).


      1. SIISII Автор
        09.12.2024 21:25

        Сильно зависело от машины. Как писал ещё в комментам к прошлому циклу, у нас было две ЕС-1035: простая и "военная", она же "золотая". У простой (с "оловянными" разъёмами) сбои были постоянно; чинилось пинками по рамам процессора -- но ненадолго. У "золотой" таких проблем не было вообще, лишь память дохла со скоростью примерно микросхема (К565РУ1) в месяц. Но, поскольку там уже код Хэмминга был, подыхание одной микросхемы не приводило к немедленной неработоспособности: текущие задачи досчитывали, после чего прогоняли тесты, находили и перепаивали подохшую микросхему, ну и опять запускались в работу.

        Вот с дисками беда была вечной: требовали постоянного обслуживания и всё такое прочее. Но, поскольку в сумме было 16 29-Мбайтных ЕС-5061 и 16 же 7,25-Мбайтных (вперемешку ЕС-5056 и ЕС-5052 -- они остались от ЕС-1022), на вычислительном процессе сказывалось очень редко: просто пара дисков были на техобслуживании, а работали на остальных, и так по кругу.

        Печать... Ну, бывало, что ломалось, но редко, плюс их четырех штуки было, что тоже устраняло простои по этой причине.


        1. sim2q
          09.12.2024 21:25

          лишь память дохла со скоростью примерно микросхема (К565РУ1) в месяц

          О, я ещё школьником был и это был мой первый урок по демонтажу многоножек. Повезло наблюдать полный процесс как машина встала, тест выдал на АЦПУ портянку по которой инженер вытащил ТЭЗ и заменил РУ1 отломав сначала у неё ножки специально изогнутой стальной проволокой, а дальше уже легко выпаивая по одной.
          На вопрос о причинах, ответил, что скорее всего что то по питающей сети прилетело.