Настоящий конкурент для Mathatron появился примерно через год после его выхода. Пока американские инженеры покоряли умы пользователей алгебраической логикой, на другом берегу океана, в солнечной Италии, назревала не менее радикальная революция в настольном сегменте. В 1965 году в продажу поступил следующий герой — Olivetti Programma 101 (или Р101) от компании Olivetti-Underwood Inc. (Италия).

До сих пор ведутся споры, какой же из аппаратов считать первым по-настоящему программируемым, ведь критерии оценки могут разниться. Однако создатели Р101 претендовали на открытие целой категории — «персонального компьютера» — задолго до того, как этот термин стал мейнстримом.
Революция в корпусе печатной машинки
Olivetti Programma 101 – программируемый калькулятор весом 36 кг, по размерам лишь немногим больше печатной машинки. Выполнен на дискретной транзисторной логике. Его вычислительные возможности не выглядели впечатляющими даже по меркам того времени – четыре арифметических действия, квадратный корень и некая экзотика: вычисление абсолютного значения и дробной части числа.

Тем не менее калькулятор выпускался вплоть до 1972 (по цене 3200-3500$), и стал одним из самых известных и массовых устройств своего времени — вплоть до появления HP 9100A. И, кстати, Hewlett Packard впоследствии была вынуждена выплачивать Olivetti лицензионные отчисления за использование запатентованных решений, реализованных в P101.
Философия дизайна «не отношений со шкафом»
Компания Olivetti к началу 60-х была знаменитым производителем печатных машинок и арифмометров, фактически являясь законодателем моды в превращении «железных агрегатов» в эстетически совершенные приборы.


Генеральный директор компании Роберто Оливетти поручил Пьеру Джорджио Перотто, инженеру Olivetti, и его команде всего из четырех человек создать нечто революционное –компактный компьютер для «обычных» людей. Оливетти хотел создать личный, персональный компьютер. По замыслу директора это должен был быть «свой предмет», с которым у пользователя возникают отношения понимания:
«…объект, который живёт вместе с человеком, стоит на его столе и становится частью повседневной жизни — в отличие от компьютеров размером со шкаф, с которыми у нас нет никаких отношений».

С самого начала были сформулированы три ключевых принципа продукта – простота в использовании, продуманная эргономика и красота. Проект стартовал в 1962 году.
Разработчики прекрасно понимали важность этих требований. Простоту и удобство работы они обеспечивали архитектурой и техническими решениями, а внешний вид доверили известному дизайнеру Марио Беллини.


Первое что бросается в глаза при виде Р101 – элегантность и футуристический дизайн аппарата. Глядя на рабочий прототип инженеров, становится понятно, почему в результате машина получила большое количество наград в области промышленного дизайна. Аппарат и сегодня выглядит стильно и современно.
Ввод-вывод
Для работы с устройством использовалась клавиатура из 37 кнопок, колесо установки десятичной точки (от 0 до 15 знаков), а также три клавиши с фиксацией: запись программы, печать программы и разблокировка клавиатуры. И опять нет кнопки "равно".

Вывод информации осуществлялся с помощью барабанного принтера со скоростью 30 символов в секунду. Печатались 22-разрядные числа со знаком и десятичной точкой, а также два столбца служебных символов программы. Использовалась стандартная бумажная лента для калькуляторов и кассовых аппаратов.
Дополнительно имелась световая индикация: постоянный синий свет – готовность к работе; мигающий — выполнение программы; красный сигнализировал об ошибке (переполнение, деление на ноль и т.д.).

Память и архитектура
Технологии начала 1960-х были громоздкими и разработчикам пришлось изобретать что-то новое практически для каждого элемента задуманного устройства.
Особенно остро стояла проблема памяти. Существующие решения были слишком большими и дорогими, поэтому команда реализовала собственный вариант по технологии магнитострикционной линии задержки на основе свернутой металлической проволоки длиной около 6,5 метра. (Такая технология уже встречалась в калькуляторе Friden EC-130/132, см. первый очерк цикла.)
Сам модуль был размером с небольшую материнскую плату современного компьютера. Объем составлял 240 байт!

Программная организация памяти была тоже новаторской. Калькулятор имел 10 регистров по 24 символа. Каждый регистр определялся уникальным идентификатором и выполнял определенною роль:
Имя регистров | (Название) назначение регистров |
M | (Median), регистр ввода и промежуточный перенос данных, используется во время операций |
A | (Accumulator), Основной регистр результата, все операции формируют результат в A в усеченном виде (по заданному округлению). |
R | (Results) регистр результата: сложение/вычитание/ умножение → полный результат, деление → остаток |
B, С | Только хранение данных. Делиться на полурегистр. |
D, E, F | Хранение данных или программных инструкций. Делиться на полурегистр. |
p1, p2 | Только хранение программных инструкций. |
Регистры M, A и R используются во время операций, пользователь не может хранить здесь «постоянные» данные.
Минимальный размер программы составляет 48 инструкций (р1 и р2 по 24 инструкции в каждой), максимальный размер составляет 120 инструкций (D, E, F, р1 и р2 по 24 инструкции в каждой), и тогда данные хранятся только в B и C.

Пять регистров от B до F могли использоваться в двух режимах.
Full – регистр (обозначается прописной буквой) хранит 22 цифры плюс десятичную точку и знак (данные) или 24 инструкции программы.
Split – регистр разделен на два «полурегистра» и содержит 11 цифр, десятичную точку и знак или 12 программных инструкций. Первый полурегистр обозначается прописной буквой, например «F», второй – с оператором разделения «/», например «F/» (при выводе на печать строчной буквой «f», т.е. обозначение «F/» = «f»).
Эзотерика языка программирования
Для реализации принципа доступности программирования Перотто предложил создать простой язык, что-то вроде сильно упрощенного ассемблера, состоящего из небольшого набора инструкций.
Инструкции подразделяются на математические, обмена данными, служебные, переходов и записи констант.
Математические операции могут быть без указания исходного регистра/подрегистра (используется регистр М), или с указанием. Для этого все регистры (кроме М) имеют соответствующие именные кнопки на клавиатуре.
Кнопки Команды | Описание | Пример |
«+» «-» «х» | Содержимое A прибавляется, вычитается, умножается на/из содержимое M, результат сохраняется: в A с округлением в соответствии с положением десятичного круга, в R с полной точностью, без округления. | «х» умножает M и A, результат с учетом округления в A и полностью в R «-» из А вычитается M, результат с учетом округления в A и полностью в R |
«:» | Содержимое A делится на содержимое M, результат сохраняется: в A с округлением в соответствии с положением десятичного круга, в R остаток от деления. | «:» содержимое А (а0) делится на M, результат с учетом округления в A, остаток округления в R = а0 – А * М |
«√» | Значение корня из М сохраняется: в A с округлением в соответствии с положением десятичного круга, в М удвоенное значение В R может быть мусор. | «√» А = √М, М = 2√М |
«Регистр» «+», «-», «х», «:», «√» | Регистр/полурегистр (любой кроме М) копируется в М, далее, как описано выше | «В -» из А вычитается В. Предварительно копируется B в M. «C / :» A делится на второй полурегистр C, предварительно копируется в M «А :» получить в М=1 при любом А |
«A» «↕» | Абсолютное значение A сохраняет результат в A. | «A ↕» в А его модуль. |
(«↕» на клавиатуре обозначено как «А» с точками над и под буквой)
Команды обмена предназначены для переноса данных между регистрами.
Кнопки Команды | Описание | Примеры |
«регистр» «↑» (кроме регистров A и R) | Копирует содержимое M в заданный регистр. Установка десятичного круга не влияет. Содержимое регистров A и R не изменяется. Используется после ввода чисел с клавиатуры. | «C / ↑» Копирует содержимое M во второй полурегистр C. |
«регистр» «↓» | Копирует содержимое заданного регистра в A. Установка десятичного знака не влияет. Содержимое M и R не изменяется. | «↓» Копирует содержимое М в A. «B ↓» Копирует содержимое B в A. |
«регистр» «↕» (регистры A и R см. пример) | Обменивает содержимое A и заданного регистра между собой. Для R и А исключения, см. примеры. | «↕» Обменивается содержимое М и A. «D ↕» Обменивается содержимое D и A. «R ↕» Содержимое R копируется в A (как команда «R ↓»). «А ↕» Абсолютное значение A в А. |
«/» «↕» | Копирует дробную часть A в M.Выбор десятичного круга не имеет значения. | «/ ↕» при A = 3.141592, M = 0.141592. |
«R» «S» | Обменивает содержимое R и D между собой.Полезна при чтении магнитных карт во время выполнения программы. | «R S» Обменивается содержимое R и D. |
(Команды «↓» «↑» на клавиатуре вызываются кнопками «A↓» «M↑» соответственно)
Служебные команды.
Кнопки Команды | Описание | Примеры |
«S» | В ручном режиме перезапустить / продолжить / остановить программу. В программе: останов и ожидание ввода. Пользователь вводит число (сохраняется в регистре M) и нажимает S для продолжения. | «S» пуск / останов |
«регистр» «◊» | Печать значения заданного регистра. | «◊» печать регистра М. «Е/ ◊» печать второго полурегистра Е. «/ ◊» сдвиг для пробела. |
«регистр» «*» (кроме регистров М и R) | Обнуляет заданный регистр. | «D / *» очищает второй полурегистр D. |
Split
Специальной команды переключения режима полный регистр/ полурегистр нет. Для перехода в «split», по всей видимости, нужно было просто применить команду с полурегистром («/»), но точно это делала команда «B *» — очистить регистр, например для регистра В.
Для обратного перехода использования «full» необходимо выполнить команду «B/ » (очистить левую часть) и регистр использовался как целый. Логика машины следила, в каком режиме находиться регистр и оповещала оператора индикатором ошибки, в случаях:
передать число с более 11 разрядами в разделенный регистр
разделить регистр, который уже содержит значение более 11 разрядов.
Переходы и ветвления
В Р101 появилась полноценная система переходов и ветвлений в программе. Реализация такого функционала у калькулятора тоже достаточно оригинальна.
Существует 16 инструкций безусловного и 16 инструкций условного перехода, т.е. 32 именных оператора–отправлений.
Каждому отправлению соответствует оператор–назначение (метка), их тоже 32. Именно на него перейдет управление.
Фиксированные комбинации команд формируются сочетанием буквенных кнопок, кнопкой «/» и четырех специальных клавиш V, W, Y, Z. Взаимосвязь между инструкциями отправления и назначения следующая:
Отправление: | ? | C? | D? | R? |
Назначение: | A? | B? | E? | F? |
где знак вопроса означает одну из букв V, W, Y, Z, которая и характеризует имя связки отправление-назначение.
Таблица выше показывает создание безусловных переходов. Условные переходы формируются аналогично, но с добавлением символа «/».
Отправление: | /? | C/? | D/? | R/? |
Назначение: | A/? | B/? | E/? | F/? |
Условием на переход является значение регистра A больше нуля, иначе выполнение продолжится далее.
Примеры: Команда «C V» осуществит безусловный переход к «B V». Команда «D /Y перейдет к «E Y», если A большее нуля.
Метки в программе позволяли запустить программу с местоположения метки, введя соответствующую инструкцию перехода с клавиатуры. Например, клавиша «V» запустит программу с оператора «AV» (при его наличии в программе).
Константы
А вот с вводом констант в программу у Olivetti Programma 101 получилось «не очень», так как невозможно ввести числовую константу цифрами. Можно набрать и скопировать константу в регистр. Но для случая сохранить константу как часть программы разработана специальная последовательность инструкций и целый алгоритм её создания (в регистре M).
Вначале указывается специальная псевдоинструкция «A / ↑» — начало определения константы, далее вводится код для каждой цифры, начиная с младшего (правого) разряда. Завершающий код инструкции определяет старшую (левую) цифру константы.
Инструкции для цифр состоят из двух частей, первая – атрибутивная часть, определяется по вопросам – последняя цифра, цифра с десятичной точкой, знак числа.
Знак | Позиция | Код (кнопка) |
Начало ввода | A / ↑ | |
+ | Старший разряд | D |
+ | Не старший разряд | R |
- | Старший разряд | E |
- | Не старший разряд | F |
Разряд с точкой | Добавить «/» | |
Вторая часть инструкции – цифровая часть, каждой цифре соответствует кнопка с кодом.
Цифра | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Код | S | ↓ | ↑ | ↕ | + | - | x | : | ◊ | * |
Например: в регистре M создать значение Пи или минус единицу:
3.1415 = «A / ↑, R -, R ↑, R +, R ↑, D / ↕».
-1 = «A / ↑, Е ↓»
Это еще не Brainf*ck, но что-то эзотерическое в этом есть!
А вот как выглядит программа факториал натурального числа, запускается клавишей «Z»:

Язык программирования получился своеобразный. Команд не много, что позволяло быстро освоить неподготовленному человеку. При этом, по отзывам пользователей тех лет, Р101 позволял создавать сложные программы, обучать студентов программированию. Была создана большая библиотека программ, в том числе с переводом расчетных задач с языка Фортран.
Команды позволяли создавать неочевидные последовательности, например ниже показаны некоторые интересные приёмы языка (предполагается, что число а находиться в регистре А).

Два в одном
На случай нехватки памяти, когда программист разрывался между данными и командами, для продвинутых пользователей инженеры Olivetti предлагали использовать метод Instruction-Data Storage. Похожий на «хакерский» прием, метод предлагал хранение числа и программного кода в одной и той же половине (!) регистра.
Чтобы такая конструкция не привела к ошибке, используется механизм меток:
Программист резервирует место под цифры числа, вводя серию инструкций S (Stop).
Сразу за ними ставится метка перехода (например, AV).
При выполнении программа «перепрыгивает» через область данных с помощью безусловного перехода к этой метке.

Встроенная логика P101 позволяет проводить арифметические операции над числовой частью такого «гибридного» регистра, не затрагивая инструкции, лежащие дальше по линии задержки. Это превращало регистры памяти в гибкие контейнеры, где границы между данными и кодом определяются лишь искусством программиста.
Магнитный пасьянс
Однако, конечно, самым значимым достижением команды стала реализация внешнего хранения программ и данных. Решение, предложенное в середине 1960-х годов, сегодня так же производит сильное впечатление.
Разработчики и в этот раз думали о пользователе, далёком от вычислительной техники. В итоге появилось оригинальное решение – съемная карта с магнитными полосками. Карта вставлялась в приёмное устройство, после чего автоматически происходило чтение или запись. Появилась возможность не только создавать библиотеки программ, но и пользоваться ими людям без знания программирования вообще.

Карты размером 5 × 20 см имели магнитное покрытие с одной стороны и область для описания с другой. На ней можно было хранить две программы — по одной на каждую полозку.
На карте сохранялись пять регистров — р1, р2, D, E, F. Инструкция или цифра занимала один байт, магнитная карта содержала 120 байт на одной полосе.
Наследия этого изобретения использовались десятилетиями, включая более поздние варианты развития идеи, такие как магнитная дискета в различных модификациях.

План работ
Запись и составление программы осуществлялись непосредственно, без режима обучения.
Процесс ввода: оператор нажимал (фиксировал) клавишу RECORD PROGRAM и вводил последовательность команд с клавиатуры.
Исправление ошибок: калькулятор печатал каждую команду сразу после её полного ввода. Клавиша CLEAR ENTRY позволяла удалить последнюю напечатанную инструкцию.
Запуск: отжать клавишу RECORD PROGRAM, ввести при необходимости константы в регистры, запустить программу кнопкой «S» или командами переходов.
Выполнение: клавиатура блокировалась во время вычислений. При ожидании ввода параметров (инструкция «S») программа останавливалась, и клавиатура разблокировалась для ввода чисел.
Постоянное хранение: вставленная магнитная карта в прорезь считывателя автоматически протягивалась механизмом через головку считывания. Для записи необходимо было предварительно нажать клавишу RECORD PROGRAM. При отжатой клавише производилось чтение данных (с затиранием существующей информации в регистрах).
Печать программы: нажатием (фиксацией) клавиши PRINT PROGRAM и нажатием кнопки печати программа выводилась на печать. По окончании клавишу PRINT PROGRAM необходимо было отжать.

Неочевидная модульность
И еще одна, документированная, но неочевидная функция, позволяющая реализовать модульное / пакетное программирование.
При нажатой клавише PRINT PROGRAM ввод программы с клавиатуры осуществлялся непосредственно в регистры E и D (минуя p1, p2 и F).
При нажатых RECORD PROGRAM и PRINT PROGRAM на магнитную карту записывалось содержимое только регистров E и D.
При отжатой RECORD PROGRAM и нажатой PRINT PROGRAM с магнитной карты считывалось содержимое только регистров E и D.
Использование D и E таким образом позволяло реализовывать модульное программирование: можно было иметь одну основную программу в регистрах 1, 2, F, а в регистры D и E подгружать разные «библиотеки» функций (подпрограмм) с разных карт в зависимости от текущей задачи.
В случае чтения данных такая возможность позволяла последовательно считать с карт определенный массив чисел, не меняя программу и другие регистры. В этом, в частности, помогала (упомянутая выше) команда «RS», меняющая содержимое R и D между собой.
Драма успеха
Очевидно, разработчикам было чем гордится. Не случайно проект курировал лично гендиректор Роберто Оливетти, а Пьер Джорджо Перотто смело и гордо называл свое детище «первым персональным компьютером» — утверждение, которое позже вызовет немало споров, а немного погодя сыграет с ним недобрую насмешку.
Но как обычно бывает, история успеха развивалась драматично – аппарат мог вообще не увидеть свет. К апрелю 1964 года, спустя два года разработки, Programma 101 была практически готова. Но именно в этот момент компания Olivetti столкнулась с серьёзным финансовым кризисом.
В ходе реструктуризации было принято решение подразделение электроники продать гиганту General Electric. Для команды Перотто это означало катастрофу: их наработки могли просто выбросить. Чтобы спасти проект, инженеры пошли на хитрость: они официально изменили категорию устройства с «компьютера» на «калькулятор». Перотто лично занимался этой правкой — быстро, почти в авральном режиме, жертвуя своей главной идеей.
Этот манёвр оказался спасительным. В начале 1965 года GE поглотила электронный филиал Olivetti, но «калькулятор» P101 остался в составе Olivetti. Правда, триумфом это не казалось: Роберто Оливетти покинул пост, а новое руководство видело в новинке занятную безделушку, считая, что рынка для нее не существует. На Всемирной выставке в Нью-Йорке (1964–65) главным экспонатом от компании предполагался электромеханический (!) калькулятор Logos 27. (Кстати — это печатающий калькулятор, ставший вершиной инженерной мысли компании Olivetti перед наступлением эры электроники. Считается одним из самых сложных механических вычислительных устройств, когда-либо созданных)

Programma 101, подобно Золушке, была спрятана в тесной задней комнате, её не планировали показывать всерьёз. Но когда в октябре 1965-го её наконец представили широкой публике, случился фурор. Презентация была эффектной: ведущий вставил магнитную карту и за несколько секунд рассчитал орбиту спутника. Конечно, такой пример особенно сильное впечатление произвел на присутствовавших специалистов NASA .
Интерес к машине рос лавинообразно, слухи распространялись мгновенно. Некоторые посетители не верили, что перед ними автономное устройство, и пытались найти кабели, ведущие к скрытому мейнфрейму.
В прессе появились восторженные статьи. Через пару месяцев компьютер поступил в продажу. Всего же было продано более 44 000 единиц (это огромный коммерческий успех).
Итоги и наследие
Практическая ценность машины быстро нашла подтверждение, она стремительно меняла жизнь людей. Один из первых пользователей, строительный архитектор, уже несколько десятков лет спустя вспоминал, что P101 дала ему серьёзное конкурентное преимущество. Там, где коллеги продолжали работать с логарифмическими линейками и электрическими арифмометрами, он выполнял расчёты на порядки быстрее и с меньшим количеством ошибок. Возможность создавать собственные программы автоматизировала его труд, перевела вычисления из тяжёлой рутины на новый, творческий уровень.
В историю вошла роль P101 и в миссии «Аполлон-11». NASA закупило несколько таких машин и распределило их между инженерами. Аппарат использовался не только как вспомогательный и резервный вычислитель. С их помощью рассчитывались углы наведения антенн, параметры траектории, расход топлива и другие критически важные величины Лунного модуля, некоторые передавались астронавтам по радиосвязи. Магнитные карты позволяли быстро загружать заранее подготовленные алгоритмы для разных этапов миссии. P101 помогал переводить фотографии лунной поверхности с «Лунар Орбитер» в точные числовые сетки для выбора безопасного место прилунения. В случае проблем с основными вычислительными системами P101 могла оперативно обеспечить инженеров резервными расчётами.
Первый
За год до Olivetti Programma 101 на рынке появился Mathatronics Mathatron (см. вторую часть цикла), став первым программируемым калькулятором.
Сравнение этих разных машин из одной ниши наглядно показывает, что технологическое совершенство не всегда определяет лидерство. Mathatron был «умнее» математически, он поддерживал сложные функции, плавающую точку, приоритет операций и скобки (которые надолго исчезли из настольных калькуляторов после его ухода с рынка).
Однако P101 взяла реванш за счет той самой «персональности». Магнитные карты превратили её из простого калькулятора в законченное решение. В платформу, где пользователь мог просто загрузить готовую программу, не вникая в алгоритмы.
Olivetti выиграла эту битву (P101 было продано гораздо больше) не за счет поддержки скобок, синусов и логарифмов (в чем Mathatron был бескомпромиссно впереди), а за счет удобства и простоты. P101 показала: чтобы стать массовым, продукт должен быть не обязательно самым мощным, но самым понятным.

Перотто до конца жизни (он ушел в 2002 году) твердо настаивал на своем: Programma 101 — и есть первый персональный компьютер. Несмотря на культовый статус, в академическом смысле Programma 101 остается «программируемым калькулятором»: в ней отсутствовала архитектура фон Неймана (программа не могла менять сама себя), а десятичная, не двоичная природа ограничивала её только математическими задачами (отсутствовала универсальность в представлении данных).
Но если судить не по формальным признакам, а по влиянию на индустрию, в этом утверждении итальянского инженера, конечно, есть доля истины.
Это действительно была первая машина, которая дала человеку опыт персональных вычислений.

