«Доктор Ан Ван был пятым по богатству американцем в 1984 году, обладателем 40 патентов и 23 почетных ученых степеней, был магнатом компьютерной индустрии, изобретателем и филантропом. Он основал компанию Wang Labs, которая в 1970–1980-х годах успешно конкурировала с такими гигантами, как IBM»

Если совсем коротко: талантливого доктора Вана обманул деловой партнёр. Чтобы не впасть в депрессию и нищету, он сосредоточился на собственной компании Wang Laboratories и наконец воплотил давнюю мечту — создал электронный вычислитель. Но не просто вычислитель, а научный калькулятор, который был бы самым быстрым в мире. Решение подсказала сама математика: логарифм произведения равен сумме логарифмов. Так появился настольный калькулятор Wang LOCI-2.

Ну а теперь — обо всём по порядку.

Нужен иной подход

Этот LOCI-2, не похожий ни на один другой вычислительный аппарат, появился в начале 1965 года. Он умел складывать и вычитать, а вместо умножения и деления вычислял логарифмы и экспоненты (кстати, LOCI это LOgarithmic Computing Instrument — инструмент логарифмических вычислений). Кроме того, калькулятор был программируемый.

Машинка весом 20 кг явно создавалась без участия дизайнеров. Эргономика тоже осталась за бортом.

Интересно сравнить две концепции: LOCI-2 и появившейся почти одновременно Olivetti Programma 101 (см. третью статью цикла). Итальянские инженеры начинали проектирование с вопроса: как сделать вычислитель удобным для человека? Разработчики LOCI-2 задавали совсем другой вопрос: как добиться максимального быстродействия? Поэтому Programma 101 выглядит как законченный офисный прибор, тогда как LOCI-2 скорее напоминает лабораторный инструмент, форма которого полностью определяется внутренней архитектурой — его клавиатура, регистры, тумблеры и индикаторы отражают устройство машины почти напрямую.

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

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

С вычислением функций ситуация была еще хуже. Редкие и недешевые программируемые машины того времени, такие как Olivetti Programma 101, Monroe EPIC-2000 или Wyle Labs WS-02, вычисляли тригонометрические функции и логарифмы исключительно программным способом. Это создавало серьезные проблемы.

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

Во‑вторых, алгоритмы вычисления занимали значительную часть и без того дефицитной памяти программы, оставляя пользователю гораздо меньше места для собственных расчетов. Исключение составлял передовой Mathatronics 8–48 (см. вторую статью цикла) в варианте со встроенными математическими функция (тоже с небыстрым временем выполнения), но стоил он существенно дороже.

В результате инженерам и ученым приходилось мириться с тем, что для действительно сложных вычислений по‑прежнему требовалось часами ждать доступа к большим мейнфреймам.

Именно тогда доктор Ан Ван понял, что рынку нужен принципиально иной подход. Он поставил перед своей командой амбициозную цель: создать компактный калькулятор, вычисляющий трансцендентные функции на аппаратном уровне — без затрат пользовательской памяти, без долгих секунд ожидания и с выдачей результата за считанные миллисекунды!

Аппаратный генератор логарифмов

Чтобы совершить заявленный прорыв и превратить секунды вычислений в миллисекунды, Ан Ван отказался от классического построения арифметического блока. Такой путь потребовал бы еще тысячи дефицитных транзисторов и, главное, не позволил бы радикально сократить время вычислений.

Главным секретом LOCI-2 стала огромная диодная матрица, которая выполняла роль постоянного запоминающего устройства с жестко «прошитой» таблицей логарифмов.

Когда оператор вводил число и нажимал клавишу «×» или «÷», калькулятор не запускал программный алгоритм вычислений. Вместо этого электрический сигнал проходил через диодную матрицу, где практически мгновенно преобразовывался в соответствующий натуральный логарифм ln | W| и записывался в специальный регистр L. Обратное преобразование — экспонирование — выполнялось тем же способом, только в обратном направлении.

Такой подход подарил LOCI-2 уникальное свойство — практически постоянное время выполнения операций. В большинстве калькуляторов того времени скорость вычислений зависела от исходных чисел: например, деление «всех девяток на единицу» заставляло регистры долго выполнять последовательность сдвигов и вычитаний. Диодной логике Wang было безразлично, логарифм какого числа вычислять: сигнал проходил через матрицу за одно и то же время. Поэтому неоновая лампа RESPONSE (индикатор занятости калькулятора) даже при самых сложных вычислениях лишь едва успевала мигнуть — результат появлялся за доли секунды.

Ввод — вывод 

Для вывода результатов LOCI-2 не использовал печать. Вместо принтера он получил дисплей на газоразрядных индикаторах Nixie (индикаторах тлеющего разряда).

На экран выводилось содержимое рабочего W регистра: десять десятичных разрядов, а также отдельные неоновые индикаторы знака числа («+» или «−») и положения десятичной запятой.

За отображение отвечала одна из девяти плат калькулятора. Лампы Nixie устанавливались в гнезда, что упрощало их замену в случае поломки. Каждая лампа имела собственный набор из десяти управляющих транзисторов и диодный дешифратор, преобразующий 4-битный двоично‑десятичный код (BCD) в сигнал управления катодами. Кстати, сами индикаторы были редкого торцевого типа — с обзором цифр сверху.

Клавиатура LOCI-2 отличалась глубоким ходом и четкой тактильной отдачей. На панели размещались 45 кнопок, 8 тумблеров и 24 световых индикаторов. По цвету и расположению они делились на цифровое поле, управление вычислениями и управления регистрами.

Ввод чисел

Для ввода чисел использовались цифровые клавиши, десятичная точка и отдельная клавиша [CHANGE SIGN] (±), позволявшая менять знак числа в любой момент вычислений.

При ошибке последнюю введенную цифру можно было удалить клавишей [←]. Но самое неожиданное — LOCI-2 умел сдвигать десятичную точку влево и вправо отдельными клавишами (стрелки с точкой). Столь развитые средства редактирования числа для калькуляторов не повторялись.

Попробуем посчитать

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

Но главное удивление ожидало впереди. У LOCI-2 тоже отсутствует клавиша «равно». Подготовленный пользователь мог бы предположить, что перед ним машина с обратной польской записью (RPN), которая к тому времени уже применялась, например у Friden EC-130 (см. первую статью цикла). Однако привычной клавиши ENTER тоже нет.

Попробуем умножить 10 на 5.

КЛАВИШИ

На ЭКРАНЕ

Ввели 10, нажимаем умножить [х], получаем «0», вводим 5. Что дальше? Подсказка — нажимаем опять [х], снова получаем «0». И далее вряд ли кто догадается — надо нажать [ANTI LOG], то есть экспоненту! И тогда получим «49.9999997». Зато практически мгновенно (а не несколько секунд)!

[1][0]

10

[x]

0

[5]

5

[x]

0

[ANTI LOG]

49.99999997

Что бы понять такую странную работу, надо разобраться в архитектуре калькулятора.

Архитектура и назначение регистров 

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

Work / Display Register

Регистр W — основной рабочий регистр. Через него вводятся числа с клавиатуры, в нем хранятся промежуточные результаты, и именно его содержимое отображается на дисплее.

Регистр имел емкость 10 десятичных разрядов, знак, плавающую точку и представлял число в диапазоне ±(10⁻¹⁰ … 10¹⁰−1).

Accumulator Register

Регистр A служил накопителем результатов сложения и вычитания. После нажатия соответствующих клавиш выполняются операции:

  • При нажатии [+]: A=A+W

  • При нажатии [‑]: A=A-W

(О поведении выполнения содержимого регистра W после операции будет далее.)

Диапазон регистра совпадал с регистром W, но внутреннее представление числа состояло из мантиссы и порядка, что увеличивало точность накопительных вычислений.

Logarithm Register

Именно L регистр делает LOCI-2 уникальным в истории калькуляторов. Его назначение — аккумулировать значения натурального логарифма от абсолютного значения числа из регистра W:

  • При нажатии [×]: L=L+ln | W|

  • При нажатии [÷]: L=L-ln | W|

После выполнения операции содержимое регистра W очищается.

Именно L регистр использовался в алгоритмах умножения, деления, извлечения корней, вычисления экспонент и логарифмов. Заметим, что отдельной кнопки найти логарифм — нет!

Структура L регистра также необычна: два разряда на целую часть и десять на мантиссу, точка фиксирована. Диапазон регистра невелик, примерно ±23, что как раз соответствовало пределам

e±23 ≈ 10±10.

Фактически содержимое регистра L можно рассматривать как число вида

±e±cc.mmmmmmmmmm

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

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

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

Суть метода доктора Ан Вана поиска логарифмов

Идея метода Вана заключалась в изящном трюке, который он запатентовал под названием «Метод комбинирования множителей» (Factor Combining). Математически это близкий родственник известного алгоритма CORDIC (он позже использовался в HP-35), но который появился через несколько лет.

Суть скоростной «магии» логарифмирования в LOCI-2 раскрывается в несколько шагов.

1. Избранные константы

Вместо таблицы для всех чисел, Ан Ван зашил в диодную матрицу (ПЗУ) значения натуральных логарифмов всего для нескольких десятков фиксированных констант.

Это были числа вида: 10, 0.1, 2, 0.9, 1.01, 0.99, 1.001, 0.999 и так далее (базовые сдвиги и их приближения к единице).

Почему именно они? Вспоминаем, что калькулятор не умел умножать и делить. Но умножить или разделить BCD‑число (двоично‑десятичное) на эти константы на уровне «железа» безумно просто:

  • Умножить на 10 или 0.1 — это просто сдвиг регистра на один разряд влево или вправо.

  • Умножить число N на 0.9 — это то же самое, что N — 0.1N. То есть: сдвигаем регистр вправо на один разряд и вычитаем результат из исходного числа.

  • Умножить на 1.01 — это N+0.01N. Сдвигаем на два разряда вправо и прибавляем к исходному числу.

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

2. Алгоритм «сведения к единице»

Допустим, калькулятору нужно найти натуральный логарифм числа N=18.

Задача алгоритма — последовательно умножать число 18 на константы в матрице до тех пор, пока результат не станет равен 1:

18×Δ1×Δ2×Δ3…≈1

Калькулятор запускает итерационный конвейер:

  1. Число 18 > 1. Машина умножает его на 0.1 (сдвиг регистра). Получается 1.8. Всё еще больше 1.

  2. Снова умножает на 0.1. Получается 0.18. О, результат стал меньше 1. Шаг по константе 0.1 останавливается.

  3. Теперь число 0.18 нужно «подтягивать» вверх к единице. Машина начинает умножать его на 2 (то есть складывать с собой). Получает 0.36, потом 0.72, потом 1.44 (опять выскочили за единицу, стоп).

  4. Теперь включаются более точные константы уменьшения: результат умножается на 0.9 (1.44 — 0.144 = 1.296), снова на 0.9 и так далее, пока шаг не дойдет до констант вроде 1.00001.

В итоге за фиксированное количество микрошагов (по числу знаков точности) калькулятор превращает исходное число в единицу.

3. Где здесь логарифм?

Вспоминаем базовое свойство логарифмов: ln A B =ln A +ln B .

Если мы возьмем логарифм от нашего уравнения сведения к единице, мы получим:

А это значит, что:

Вот она, главная идея: каждый раз, когда калькулятор на микрошаге сдвигал число и умножал его, например, на 0.9, он одновременно «давал команду» диодной матрице: «Найти значение ln (0.9) „. И это значение тут же вычиталось из логарифмического регистра L.“»

Когда число на основном регистре превращалось в единицу, в регистре L автоматически оказывалась готовая, просуммированная на диодах величина ln (18). Экспонента, или антилогарифм (LN⁻¹) работал точно так же, только в обратном порядке: машина разворачивала единицу обратно в число, складывая логарифмы.

Дважды два без малого четыре

Разобравшись с архитектурой LOCI-2, можно проследить весь процесс умножения:

Получается любопытная вещь: роль клавиши «=» при умножении и делении фактически выполняет кнопка [ANTI LOG]. Именно она преобразует накопленный в регистре L логарифм обратно в обычное число и выводит результат на экран. Иными словами, функция экспоненты применяется вовсе не к числу, отображаемому на дисплее, а к содержимому скрытого от пользователя регистра L.

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

Но такой метод вычислений имел и обратную сторону. Промежуточные результаты представляли собой трансцендентные числа, которые в цифровой машине невозможно хранить абсолютно точно. Поэтому даже при вычислении простых примеров LOCI-2 иногда выдавал слегка неожиданные результаты. Как видно из приведенного выше примера, произведение 20,5 × 15 отображалось как 307,4999999 вместо ожидаемых 307,5.

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

Стек — это ты

Из архитектуры калькулятора следовал еще один интересный вывод. Никакого аналога привычного современному пользователю стека в LOCI-2 не существовало — управление промежуточными данными полностью возлагалось на пользователя. Для этого калькулятор предоставлял определенный набор команд.

Команда /кнопка

Описание команды

Регистры

PRM (Prime)

Аппаратный сброс (инициализация). Сбрасывает все рабочие регистры и внутренние флаги в исходное состояние.

0→W, 0→A, 0→L; MSC=0; триггеры условий → 0.

Clear W

Очистка только рабочего регистра.

0→W 

Clear A

Очистка только регистра аккумулятора.

0→A 

W → A

Копирует число из рабочего регистра в аккумулятор.

W→A; регистр W неизменен.

A → W

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

A→W; регистр A неизменен.

W → L

Прямая перезапись логарифмического регистра без преобразования в логарифм.

W→L; регистр W неизменен.

L → W

Чтение логарифмического регистра в W с очисткой L.

L→W; 0→L.

Сумма и разность — не всё так просто

И только теперь можно разобраться, как в LOCI-2 выполнялись сложение и вычитание:

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

Но и на этом особенности не заканчиваются! Результат накапливается в неотображаемый регистр A и чтобы его увидеть, необходимо скопировать «на экран» — нажать клавишу [A→W].

Иными словами, пользователь оказывался перед выбором. Либо выполнять последовательность сложений и вычитаний практически «вслепую», не видя промежуточных результатов и рискуя не заметить ошибку, либо после каждой операции нажимать своеобразный аналог кнопки «=» — [A→W].

Именно так работали первые версии LOCI-2. Однако Ан Ван быстро понял, что такая организация вычислений, мягко говоря, не способствует удобству работы. Поэтому вскоре в левом нижнем углу клавиатуры появился необычный элемент — тумблер «AUTO DISP». При его включении содержимое регистра A автоматически копировалось в W после каждой операции сложения или вычитания, избавляя пользователя от необходимости постоянно нажимать [A→W].

Доктор Ван, надо отметить, внимательно относился к практическому опыту эксплуатации и мнению своих клиентов.

Вычислительные команды

Команда

Описание команды

Регистры

+ (сложение)

Содержимое W прибавляется к значению в аккумуляторе А.

A+W→A; 

А→W при «AUTO DISP»

— (вычитание)

Содержимое W вычитается из значения в аккумуляторе А.

A−W→A; 

А→W при «AUTO DISP»

х (умножение)

Вычисляет натуральный логарифм абсолютного значения числа в W и прибавляет его к текущему значению L, W обнуляется.

L+ln∥W∥→L 

0→W

÷ (деление)

Вычисляет натуральный логарифм абсолютного значения числа в W и вычитает его из L, W обнуляется.

L−ln∥W∥→L 

0→W

☐ (квадрат)

Возведение в квадрат. Вычисляет удвоенный логарифм числа в W и суммирует его с регистром L, W обнуляется.

L+2 ln∥W∥→L 

0→W

1/☐ (1/квадрат)

«Обратный» квадрат. Вычисляет удвоенный логарифм W и вычитает его из L, W обнуляется.

L−2 ln∥W∥→L 

0→W

√ (корень)

Извлечение корня. Вычисляет половину логарифма числа в W и прибавляет к L, W обнуляется.

L+​ln∥W∥/2→L 

0→W

1/√

«Обратный» корень. Вычисляет половину логарифма числа в W и вычитает из L, W обнуляется.

L−​ln∥W∥/2→L 

0→W

LN⁻¹ (Anti‑log)

Экспонирование (финал операции). Вычисляет экспоненту от накопленного в L значения, выдает результат в W и очищает L.

exp(L)→W 

0→L.

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

И еще, команда «Clear L» отсутствовала, регистр L очищался либо, опять‑таки, командой [Anti‑log], либо [L → W].

Как видим, для работы с LOCI-2 пользователю надо было хорошо понимать архитектуру машины и самому «выполнять логическую часть» в «арифметико‑логическом устройстве».

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

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

Регистры хранения

Помимо рабочих регистров A, W и L, в LOCI-2 имелись регистры хранения (Storage Registers), предназначенные для сохранения промежуточных результатов вычислений.

Каждый такой регистр был способен хранить число в том же формате, что и основные вычислительные регистры машины. Записанное значение сохранялось до тех пор, пока не заменялось новым. Более того, при выключении питания данные не терялись: память была построена на магнитных сердечниках и являлась энергонезависимой.

В ранних моделях семейства LOCI-2 использовалось всего четыре регистра хранения — S₀, S₁, S₂ и S₃. В более поздней модели LOCI-2A объём памяти был увеличен до шестнадцати.

Архитектура памяти также отражала общую логику машины и имела специфику. Регистр S₀ был предназначен для обмена данными с аккумулятором A, тогда как все остальные регистры хранения взаимодействовали через рабочий регистр W.

Для работы с памятью использовалось девять команд (и соответствующих клавиш):

Команда

Описание команды

Регистры

A → S₀

Копирует значение из аккумулятора А в регистр общего назначения S₀​.

A→S₀​; регистр A неизменен.

S₀ → A

Копирует значение из S₀​ в аккумулятора А.

S₀→A​; регистр S0​ неизменен.

W → S₁ / S₂ / S₃

Запись значения из W в выбранный регистр хранения S.

W→Sn; регистр W неизменен.

S₁ / S₂ / S₃ → W

Восстановление данных из выбранного регистра памяти в рабочий регистр W.

​Sn​→W; регистр Sn​ неизменен.

STEP MSC

Переключение счётчика Memory Selection Counter (MSC) активного банка памяти

​Изменение состояния MSC на следующее 0 → 4 → 8 → 12 → 0

Банки памяти

В расширенной модели LOCI-2A шестнадцать регистров были разбиты на четыре группы (банки памяти):

  • Группа 1: S₀‑S₃

  • Группа 2: S₄‑S₇

  • Группа 3: S₈‑S₁₁

  • Группа 4: S₁₂‑S₁₅

За выбор активной группы отвечал двухбитовый счётчик Memory Selection Counter (MSC). Он мог принимать всего четыре значения:

0 → 4 → 8 → 12 → 0

Команда инициализации [PRIME] устанавливала счётчик MSC = “0”. Переключение выполнялось командой [STEP MSC], а текущее состояние отображалось двумя неоновыми индикаторами «4» и «8» на клавиатуре. Погашенное состояние обоих индикаторов соответствовало MSC= “0”, при обоих включенных MSC= “12”.

Например, если MSC содержал значение «8», то команда записи в [W →S₁] фактически обращалась к регистру S₉. После следующего выполнения (нажатия) [STEP MSC] та же команда уже обращалась к S₁₃.

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

Фактически LOCI-2A реализовал принцип bank switching задолго до того, как он стал привычным для микрокомпьютеров и домашних компьютеров 1970–1980-х годов.

Программирование в беспамятстве 

Как отмечалось в начале, LOCI-2 — это программируемый калькулятор. Но и здесь доктор Ван применил нетрадиционные решения.

Сегодня невозможно представить машину без памяти для программ. Однако LOCI-2 был именно таким. Возникает закономерный вопрос: как же тогда выполнялись программы?

Ответ оказался неожиданным. Изначально LOCI-2 проектировался для работы с внешним считывателем перфокарт, поэтому внутреннюю память для хранения программы, из экономии, просто исключили. Перфокарта одновременно служила и носителем программы, и ее своеобразной «оперативной памятью»: команды последовательно считывались с карты и сразу же выполнялись. При необходимости к калькулятору можно было подключить даже второй считыватель.

Считыватель использовал программные перфокарты, выпускавшиеся компанией IBM по заказу Wang Laboratories.

Данные размещались в 40 столбцах по 12 позиций (2 х 6). Заранее размеченные отверстия можно было легко проделать с помощью карандаша. Предлагались даже специальные аксессуары (под названием Port‑O-Punch), которые служили для упрощения перфорации программных карт (тоже от IBM).

Карта содержала 80 шагов программного кода. Каждая команда кодировалась шестью битами (отверстие есть / нет), что позволяло представить 64 различных кода операций.

Для составления программы имелась таблица команд и их восьмеричных кодов.

Для написания программы программист сначала составлял ее в виде мнемонических команд, после чего заменял их соответствующими восьмеричными кодами.

Например, программа вычисления функции exp(−x)при значении x, находящемся в регистре W, выглядела следующим образом.

Затем каждую команду нужно пробить на программной карте. Для этого цифровой код команды необходимо разложить на сумму чисел 40, 20, 10, 4, 2 и 1 (наверняка пользовались соответствующей таблицей); затем программист пробивал отверстия в каждой позиции, которая необходима для составления этой суммы. Например, восьмеричный код для операции «W → L» равен 46, что эквивалентно 40+4+2. Следовательно, он пробивается следующим образом:

40 20 10 4 2 1

[■] [ ] [ ] [■] [■] [ ]

После подготовки карту вставляли в считыватель и закрывали крышку.

Сам считыватель выглядел весьма элегантно. Он содержал матрицу из 40 × 12 подпружиненных контактных штырей. Каждый штырь прижимался к своей позиции на карте. Если в этом месте было отверстие, контакт замыкался и соответствующий бит команды считывался электрически.

Текущий код операции отображался шестью лампами «OPERATION CODE» на клавиатуре. Пользователь мог определить выполняемую инструкцию, сложив значения, указанные под горящими лампами.

Кстати, если при перфорации текущего шага была допущен ошибка (отверстие «получилось» не на том месте), пользователь мог пробить все отверстия этого шаге — код «77» специально был без команды. Тем самым у перфокарты сохранялся шанс быть использованной.

Счётчик команд

Одной из особенностей, резко отличавших LOCI-2 от большинства калькуляторов своего времени, был полноценный счётчик команд — Program Counter (PC).

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

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

Для поддержки второго считывателя карт без расширения адресного пространства использовался специальный бит X, связанный с PC:

  • Если X = 0 — используется первый считыватель,

  • Если X = 1 — используется второй считыватель.

Таким образом, шаг 10 на первой карте соответствовал состоянию PC = 10, X = 0, а тот же адрес на второй карте — PC = 10, X = 1.

Такое простое решение позволяло использовать два считывателя и увеличить максимальный объем программы до 160 шагов без изменения архитектуры.

На клавиатуре под надписью Program Counter располагались восемь неоновых индикаторов. Левый отображал состояние бита X, а остальные семь показывали значение счетчика в двоично‑десятичном коде: сложив числа под горящими индикаторами, оператор получал текущий адрес выполняемой инструкции.

Регистры управления программой

Но на этом доктор Ванг не остановился. LOCI-2 получил возможности управления вычислениями, характерные скорее для «больших машин»: переходы, циклы, условное выполнение и даже подпрограммы.

Именно сочетание программного счетчика и команд перехода превращало простой набор инструкций в полноценный язык программирования.

Для организации циклов использовался специальный счетчик Decrement Counter (DC), способный хранить значение от 00 до 99. Программа могла выполнять с ним несколько операций:

  • «W→DC» загрузить в DC значение из регистра W (обратная команда «DC→W»),

  • «Decrement» уменьшить значение DC на единицу,

  • «TEST DC=0» проверка DC на нулевое значение, выполнить условный переход.

Кроме того, имелись два дополнительных теневых регистра — PCS и DCS, предназначенные для временного хранения значений PC и DC при выполнении подпрограмм.

Как и счетчик команд, Decrement Counter имел собственную индикацию на панели управления. Восемь неоновых ламп отображали его текущее значение в двоично‑десятичном коде.

Управление ветвлением программы

Было предусмотрено несколько команд установки и изменения значения Program Counter, что позволяло реализовать различное ветвление в программе.

Безусловный переход (W → PC, W → XPC)

Команда W→PC загружала в счетчик команд две старшие цифры числа из регистра W. Положение десятичной точки при этом игнорировалось: например, значения +310000000.0 и +3.1000000000 одинаково приводили к установке PC = 31.

Знак числа W использовался для выбора считывателя перфокарт:

  • положительное число — X = 0 (первый считыватель); 

  • отрицательное число — X = 1 (второй считыватель). 

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

Простой вариант перехода занимал три шага. Вот пример такого перехода. Для разнообразия, это «плохой пример» — всё время будет выполнятся шаг 12.

Команда W→XPC сначала принудительно делала число в регистре W отрицательным, а затем выполняла W→PC. Тем самым переход всегда осуществлялся на указанный шаг второго считывателя.

Подпрограмма (Store&Jump и Recall)

Команда Store&Jump выполняла сразу три действия:

  1. сохраняла содержимое PC в регистре PCS

  2. сохраняла содержимое DC в регистре DCS

  3. выполняла переход командой W→PC.

Например, если: команда Store&Jump находится на шаге 09 (то есть после ее выполнения PC = 10), DC = 20, W = 31 000 00000, то после выполнения команды PCS = 10, DCS = 20, PC = 31.

Таким образом, команда сначала сохраняла текущие значения счётчиков, а затем передавала управление по новому адресу.

Возврат выполнялся командой Recall (Restore), которая восстанавливала сохраненные значения:

  • PCS ⇄ PC 

  • DCS → DC 

После этого программа продолжала выполнение с того места, где была вызвана подпрограмма.

Несмотря на простоту реализации, LOCI-2 поддерживал полноценный механизм вызова подпрограмм с возвратом.

Условные переходы

Для организации ветвлений калькулятор поддерживал шесть команд условного перехода.

Все они работали по единому принципу:

  • если условие ложно — PC = PC + 1

  • если условие истинно — PC = PC + 4.

Как уже отмечалось выше, разница в три инструкции позволяла записать безусловный переход и реализовывать классические условные конструкции типа

IF … THEN GOTO …

Команды организации переходов не имели отдельных клавиш на панели калькулятора и могли использоваться только внутри программы.

Команда

Описание

W→PC

Загружает в счётчик команд (PC) две старшие цифры числа из регистра W. Переходит к шагу программы, номер которого определяется первыми двумя цифрами регистра W. При W < 0 используется перфоридер № 2, иначе № 1

W→XPC

Безусловно устанавливает знак числа в регистре W отрицательным, после чего выполняет операцию W → PC. (Команда для безусловного использования перфоридера № 2)

W→DC

Загружает в счётчик декремента (DC) две старшие цифры числа из регистра W. Используется для организации циклов. 

DC→W

Копирует текущее значение счётчика декремента (DC) в регистр W. Значение DC при этом сохраняется.

Store & Jump

Сохраняет текущее значение счётчика программы (PC) и счётчика декремента (DC) в регистрах PCS и DCS, затем выполняет W→PC

Recall (Restore)

Восстанавливает ранее сохранённое значение счётчика декремента и счётчика программы (DCS → DC, PCS ⇆ PC). После восстановления выполнение продолжается со следующего шага после команды Store & Jump

Decrement 

Уменьшает значение счётчика декремента (DC) на единицу.

TEST ERROR

Если переполнение или ошибка отсутствуют, увеличивает PC на 4. Если обнаружена ошибка (переполнение любого регистра), увеличивает PC на 1. Содержимое регистров не изменяется.

TEST DC=0

Если значение DC равно нулю, увеличивает PC на 4. Если DC не равен нулю — на 1. Содержимое регистров не изменяется.

TEST A=0

Если содержимое регистра A равно нулю, увеличивает PC на 4. Если A не равен нулю — на 1. Содержимое регистров не изменяется.

TEST W=0

Если содержимое регистра W равно нулю, увеличивает PC на 4. Если W не равен нулю — на 1. Содержимое регистров не изменяется.

TEST W -

Если число в регистре W отрицательное, увеличивает PC на 4. Если число не отрицательное — на 1. Содержимое регистров не изменяется.

TEST L -

Если содержимое регистра L отрицательное, увеличивает PC на 4. Если регистр L не содержит отрицательного значения — на 1. Содержимое регистров не изменяется.

Управление программой

Основным элементом управления выполнения программ в LOCI-2 была клавиша [RUN]. Режим ее работы определялся положением трехпозиционного переключателя STEP / AUTO / MANL.

В режиме STEP калькулятор выполнял по одной инструкции при каждом нажатии [RUN]. Такой режим предназначался для отладки: он позволял пошагово проверить правильность работы программы и убедиться, что команды корректно пробиты на перфокарте.

В режиме AUTO после нажатия [RUN] программа выполнялась автоматически, начиная с текущего значения счетчика команд PC.

Наиболее необычным был режим MANL («ручной»). При его включении активировался блок из шести тумблеров на панели управления, которыми пользователь вручную задавал двоичный код команды. После нажатия [RUN] эта команда выполнялась, однако значение Program Counter при этом не изменялось.

Фактически MANL позволял выполнить любую инструкцию калькулятора вообще без перфокарты, минуя программу — весьма необычная возможность для вычислительной машины. И если применить фантазию со знаниями наших дней, режим MANL превращал клавиатуру в своеобразную «консоль» для «набора» команды вручную.

Функциональные точки входа (клавиши P₀‑P₃)

На клавиатуре располагались четыре специальные клавиши — P₀, P₁, P₂ и P₃. Каждая из них устанавливала счетчик команд в заранее определенное значение и запускала выполнение программы (всегда на первом считыватели):

  • P₀ → PC = 00 

  • P₁ → PC = 03 

  • P₂ → PC = 06 

  • P₃ → PC = 09

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

Таким образом, одна и та же программа могла иметь четыре независимые точки входа. А, например, команда P₀ в программе позволяла вернутся к шагу «00».

Остановить выполнение программы можно было командой «STOP» в программе или переводом тумблера в отличный от «AUTO» режим.

Команда / кнопка

Описание

Run

Режим Mode Selection Switch: STEP — выполнение одного шага программы текущего PC,AUTO — запускает выполнение программы с текущего PC,MАNL — выполняет команду, заданную тумблерами.

Stop

Команда остановки программы и работы любого оборудования (телетайп и так далее), подключенного к LOCI. Чаще использовалась для ввода данных.

Clear Error

Команда сброса или выключения светового индикатора ошибки.

P₀, P₁, P₂, P₃

Клавиши / команды безусловного запуска. Устанавливают программный счетчик PC на фиксированные начальные шаги, соответственно 00, 03, 06, 09 для считывателя карт № 1, и запускают выполнение.

Обработка ошибок

LOCI-2 отслеживал возникновение вычислительных ошибок — переполнение регистров, попытку вычислить log(0) и другие исключительные ситуации. В этом случае загорался индикатор ERROR.

Однако на этом реакция машины практически заканчивалась — внутренний алгоритм обработки был не совершенен. Ошибка не останавливала выполнение программы, не блокировала клавиатуру и никак не влияла на дальнейшую работу калькулятора. Клавиша [CLEAR ERROR] лишь сбрасывала сам индикатор.

Если программе требовалось реагировать на ошибку, программист должен был самостоятельно проверять ее возникновение с помощью команды условного перехода TEST ERROR.

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

Факториал!

И вот так выглядит программа факториала числа. В примере вычисляется «11!». В шагах 01–02 задаётся исходное значение. Второй вариант — ввести число с клавиатуры и запустить программу клавишей P₁.

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

Внешний мир

Хотя LOCI-2 официально продавался как программируемый калькулятор, по своей архитектуре и возможностям расширения он был гораздо ближе к специализированному компьютеру. Главную роль в этом играла развитая шина ввода‑вывода (I/O Bus). Для настольной машины середины 1960-х годов такое решение было весьма необычным: калькулятор можно было превратить в центр управления внешней системой.

Через интерфейс I/O к LOCI-2 подключались специализированный принтер, телетайпы, устройства сбора данных, аналого‑цифровые и цифро‑аналоговые преобразователи, цифровые вольтметры, программируемые источники питания и другое лабораторное оборудование.

Благодаря командам READ и WRITE калькулятор мог не только выполнять вычисления, но и обмениваться данными с внешними устройствами, управляя экспериментами и технологическими процессами.

Любопытная деталь: если машина комплектовалась интерфейсом ввода‑вывода, клавиши сдвига десятичной точки заменялись на READ и WRITE — команды на клавиатуре уже были предусмотрены разработчиками.

Принтер и телетайп

Внешний принтер LOCI Printer, выпускавшийся Wang Laboratories, представлял собой массивное устройство с выдвижным печатным механизмом. Он печатал результаты вычислений на 12-колоночной бумажной ленте, избавляя инженеров и исследователей от необходимости вручную переписывать длинные последовательности измерений.

В качестве терминала использовался хорошо знакомый по предыдущим статьям цикла Teletype Model 33 ASR. Помимо вывода информации, он обеспечивал и автоматический ввод данных: встроенный восьмиканальный считыватель бумажной перфоленты позволял последовательно выполнять шаги программы или загружать массивы данных.

От калькулятора к вычислительной системе

Именно возможность взаимодействовать с внешним оборудованием постепенно изменила позиционирование LOCI-2. Wang Laboratories стала представлять его уже не просто как программируемый калькулятор, а как компактную настольную вычислительную систему, способную управлять экспериментами и технологическими процессами.

На базе LOCI-2 создавались специализированные комплексы автоматизации. Одним из них стала Wang 2315 On‑Line Computing System, предназначенная для сбора и обработки измерительной информации. Система позволяла программно выбирать любой из десяти аналоговых входных каналов, оцифровывать сигнал и передавать результаты непосредственно в калькулятор для дальнейшей обработки.

LOCI-2 нашел применение и в космической программе NASA Apollo (впрочем, трудно назвать крупную компанию в 1960-х, которая так или иначе не участвовала в этом проекте). Wang Laboratories разработала несколько специализированных комплексов для лунной программы, в которых LOCI-2 использовался как управляющий вычислительный блок.

Одним из наиболее известных применений стала система испытаний жизнеобеспечения скафандров для высадки астронавтов на Луну. LOCI-2 управлял испытаниями, взаимодействовал с датчиками и измерительным оборудованием, обрабатывал поступающие данные и выполнял необходимые вычисления.

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

Дао Ан Вана. Через кризис к LOCI

История создания LOCI — классический пример того, как инженерный талант, предпринимательская хватка и жесткий рыночный кризис вместе рождают технологический прорыв.

Гарвард и магнитная память

Основатель Wang Laboratories доктор Ан Ван (An Wang) родился в 1920 году в Китае, а после переезда (по правительственной программе) в США в 1947 году окончил Harvard University. Во время учебы он работал вместе с легендарным Говардом Эйкеном — одним из пионеров вычислительной техники и создателем компьютера Harvard Mark I. Получив степень PhD по прикладной физике, Ван остался научным сотрудником Гарвардской вычислительной лаборатории.

1940г.
1940г.

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

Wang Laboratories

Однако Ван имел предпринимательские склонности и накопив денег, несмотря на успешную академическую карьеру, в 1951 году покидает Гарвард. Одержимый идеей создавать электронные вычислительные устройства, он открыл собственную компанию Wang Laboratories.

Разрабатывать и выпускать новые компьютеры целиком было слишком дорого, поэтому маленькая компания выбрала другую нишу. Вместо готовых вычислительных машин Wang Laboratories выпускала универсальные цифровые «строительные блоки» — стандартизированные транзисторные модули (логические элементы, триггеры и другие узлы), из которых заказчики могли собирать собственные системы управления промышленным оборудованием.

Бизнес шел хорошо, но Ван мечтал о большем, а для этого требовались серьезные инвестиции.

Первый успех

Такой инвестор вскоре появился. Производитель станкостроительного оборудования Warner & Swasey приобрел долю в Wang Laboratories, профинансировав разработку системы числового программного управления станками.

Результатом стал один из первых контроллеров ЧПУ, использовавший перфоленту для управления металлорежущими станками. Контракт принес Wang Labs не только прибыль, но и финансовую подушку безопасности, которая вскоре оказалась жизненно необходимой.

Точка перелома

В начале 1960-х Wang Laboratories по заказу Compugraphic разработала систему Linasec — один из первых специализированных текстовых процессоров.

Устройство автоматически выравнивало газетные строки по ширине, значительно ускоряя подготовку материалов к печати. Именно продажи Linasec позволили Wang Laboratories к 1964 году впервые превысить годовой оборот в 1 миллион долларов.

Однако успех для Ван оказался недолгим. Compugraphic решила отказаться от его услуг и самостоятельно выпускать Linasec, воспользовавшись тем, что заключенный ранее контракт не предоставлял Wang Laboratories эксклюзивных прав на производство устройства.

Компания практически мгновенно лишилась своего ключевого источника дохода.

Из кризиса к мечте и успеху

Для многих такой удар стал бы фатальным. Однако Ван предусмотрительно сохранил часть средств, полученных от Warner & Swasey, для собственного исследовательского проекта.

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

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

Ответом на кризис стал LOCI.

Именно этот проект положил начало превращению Wang Laboratories из небольшой инженерной фирмы в одного из ведущих мировых производителей вычислительной техники конца 1960-х и 1970-х годов.

LOCI-1

Кстати, название LOCI-2 недвусмысленно намекает, что существовала и первая модель. Так и есть: именно LOCI-1 стал первым серийным калькулятором Wang Laboratories. Его представили в сентябре 1964 года по цене 2750 долларов.

LOCI-1 не поддерживал программирование и не имел адресуемых регистров памяти S, однако уже выполнял практически все вычисления и функции, которые позже унаследовал LOCI-2.

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

Однако продажи первой модели оказалась недолгими. Уже в январе 1965 года Wang Laboratories представила значительно более совершенный LOCI-2, сохранив прежнюю цену — 2750 долларов.

И ложки дёгтя

LOCI-2 имел огромный коммерческий успех. На выставках и отраслевых конференциях калькулятор производил большое впечатление на инженеров и ученых. Возможности машины говорили сами за себя: демонстрации неизменно собирали множество посетителей, а быстродействие и набор математических функций обеспечило устойчивый поток заказов. Именно LOCI-2 положил начало стремительному росту Wang Laboratories как одного из ведущих производителей в отрасли.

Но LOCI-2 тоже оказался заложником собственных достоинств. Многие технические решения, обеспечившие рекордное быстродействие и богатые вычислительные возможности, одновременно стали его главными недостатками.

Сложный пользовательский интерфейс

За впечатляющими возможностями скрывалась весьма непростая в освоении машина. Пользователей, привыкших к механическим вычислителям, клавиатура LOCI-2 отпугивала. Десятки кнопок, индикаторов и тумблеры представлялись скорее для управления сложным прибором, чем вычислительной машиной. Интуитивным такой интерфейс назвать было, мягко говоря, трудно. Его разработка определялась архитектурой машины, но не удобством пользователя.

Утомительное программирование

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

Трудности с обменом программ

Еще одной проблемой стала сама перфокарта. В отличие от магнитных карт, применявшихся, например, в Olivetti Programma 101, ее нельзя было быстро скопировать аппаратными средствами. Каждая копия изготавливалась вручную, что затрудняло распространение готовых программ и обмен ими между пользователями.

Ограниченный рынок

В результате LOCI-2 оказался великолепным инструментом для ученых и инженеров, но плохо подходил для массового офисного применения.

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

Что дальше? 300-я серия рассказа 

Практически сразу в Wang Laboratories стали прекрасно понимали ограничения LOCI-2. Тем не менее он еще много лет выпускался и успешно находил своего покупателя.

А для расширения рынка уже через год компания представила новое семейство — 300-ю серию. Ее разработчики сохранили сильные стороны LOCI, но постарались избавиться от главных недостатков.

О том, насколько им это удалось и что из этого вышло, — в следующей части цикла.

(Продолжение следует)

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


  1. atues
    31.07.2026 07:30

    Прекрасное подтверждение того, что когда очень надо, но ресурсы дефицитны или неразвиты, то человек все равно найдет способ решить задачу. Пусть криво (по современным меркам), но он ее решит