Недавно я узнал много интересного о таком замечательном ЭВМ, как IBM 1401, о котором я расскажу в этой статье.
Компьютер IBM 1401 был анонсирован в 1959 году и стал самым продаваемым компьютером середины 1960-х годов с использованием более 10 000 систем. 1401 сдавался в аренду за 2500 долларов в месяц (около 20 тысяч долларов в текущих долларах), что являлся довольно низкой ценой, которая позволило многим компаниям использовать компьютеры. Даже средний бизнес мог использовать 1401 для расчета заработной платы, учета, инвентаризации, обработки заказов, выставления счетов, анализа и многих других задач. 1401 был назван Model-T компьютерной индустрии из-за его низкой цены и большой популярности. Даже в свое время IBM 1401 показала умеренную производительность, особенно по сравнению с высокопроизводительным бизнес-компьютером, таким как IBM 7080 (арендная плата: 48 000 долларов в месяц). Но IBM 1401 стал чрезвычайно популярным благодаря своей доступности, надежности, простоте использования, высококачественному принтеру и стильному внешнему виду.
1401 был ранним полностью транзисторным компьютером. Это были не кремниевые транзисторы, а германиевые транзисторы, технология до кремния. Транзисторы и другие компоненты были установлены на платах размером с игровую карту. Эти платы назывались стандартными модульными системами (SMS), и каждая из них обеспечивала такую функцию, как триггер или простые логические функции. IBM 1401 может содержать тысячи SMS-карт, в зависимости от установленных функций - в базовой системе было около 933 карт, в то время как в системе на фото 2881 SMS-карт.
Карты SMS вставляются в стойки, которые складываются с компьютера, как показано ниже. Модель 1401 разработана для легкого обслуживания - для доступа к воротам достаточно просто схватиться за ручку, и она отскакивает от компьютера, обнажая провода и платы для обслуживания. В нижней части ворот электропроводка соединяет ворота с другими частями компьютера. Всего 24 таких ворот.
Необычные особенности IBM 1401
Интересно смотреть на старые компьютеры, потому что они делают вещи совсем по-другому. Некоторые из необычных особенностей IBM 1401 заключаются в том, что он использует десятичную арифметику и 6-битные символы, имеет слова произвольной длины и дополнительные инструкции доступны за плату за аренду.
IBM 1401 основан на десятичной арифметике, а не двоичной. Конечно, он использует 0 и 1 для внутреннего использования, но числа хранятся в виде цифр с использованием двоично-десятичного кода (BCD). Число 123 хранится в виде трех символов: «1», «2» и «3». Если вы добавите 7 и 8, вы получите цифру 1 и цифру 5. Адреса в десятичном формате, поэтому объем памяти кратен 1000, а не 1024: система с 16 КБ памяти хранит ровно 16 000 символов. Вся арифметика сделана в базе-10. Таким образом, если вы разделите два числа, IBM 1401 выполнит аппаратное деление на основании-10.
IBM 1401 не использует байты. Вместо этого он использует 6-битное хранилище BCD. Каждый символ сохраняется в виде 4-битной цифры BCD с двумя дополнительными битами, называемыми «битами зоны», именуемыми A и B. Два дополнительных бита зоны позволяют сохранять буквы в верхнем регистре (и несколько специальных символов), а также цифры. Использование байта в качестве единицы работы стало популярным позже в IBM System / 360; в начале 1960-х компьютеры часто использовали странные размеры слов, такие как слова 13, 17, 19, 22, 26, 33, 37, 41, 45 и 50 бит.
На фото ниже показан основной модуль памяти IBM 1401 с 4000 символами памяти. Каждый бит хранится в крошечном ферритовом сердечнике в форме пончика, через который проходят провода. Основной модуль является более сложным, чем вы ожидаете, всего 16 слоев (кадров). Восемь кадров содержат 6 бит данных, плюс биты слова (поясняются ниже) и биты четности. В шести кадрах хранятся данные со щеток устройства считывания карт и молотков для печати и проверки ошибок. Оставшиеся два кадра просто используются для проводки.
Вероятно, самая необычная особенность 1401 состоит в том, что он использует слова переменной длины, с пометками слов, указывающими каждое слово. Вы можете ожидать, что слова переменной длины позволят вам использовать слова из 8, 16 и 32 бит. Но IBM 1401 допускает слова произвольного числа символов, вплоть до общего объема памяти! Например, инструкция может переместить строку из 47 символов или добавить 11-значные числа. (Лично я думаю, что легче думать об этом как о полях переменной длины, а не словах переменной длины.)
Сама метка слова - это бит, который устанавливается в ячейке памяти для обозначения границы слова (то есть поля). Инструкция на IBM 1401 последовательно обрабатывает данные в памяти, пока не достигнет словесного знака. Важно помнить, что словесные метки не являются частью символов, а скорее похожи на метаданные, поэтому они остаются, когда новые записи данных считываются и обрабатываются. Основной мотивацией для слов переменной длины было сохранение дорогой основной памяти, так как каждая длина поля может соответствовать точно требуемому размеру.
Еще одна интересная вещь о IBM 1401 заключается в том, что многие инструкции были опциями за дополнительную плату . Функция «расширенного программирования» предоставила новые инструкции для перемещения записей, хранения регистров и использования регистров индекса; это потребовало установки 105 новых SMS-карт и (по совпадению) стоило 105 долларов в месяц. Даже инструкция по сравнению стоит дополнительно. Поскольку 1401 использует BCD, вы не можете просто вычесть два символа, чтобы сравнить их, как на большинстве процессоров. Вместо этого 1401 использует для сравнения кучу дополнительных схем, около 37 SMS-карт, за которые вы платите 75 долларов в месяц. Аренда буфера принтера за 375 долларов в месяц добавила отдельный модуль основного хранилища, еще 267 SMS-карт и две новые инструкции. Стоимость инструкций по битовому тестированию составляла всего 20 долларов в месяц, а дополнительные инструкции по контролю перфорации карт - 25 долларов в месяц. Если вы купили одну из этих функций, инженер IBM установит новые карты и переместит несколько проводов на объединительной плате, чтобы включить эту функцию. Проволочные объединительные платы позволяли относительно легко обновить проводку в полевых условиях.
1401 может быть расширен до 16 000 символов основной памяти: 4000 символов в самом 1401 и 12 000 символов в коробке расширения 1406, размером с посудомоечную машину. Расширение 12K продавался за 55 100 долларов или арендовать за 1575 долларов в месяц. Теперь Вы можете понять, почему эффективное использование памяти было важно. Вместе с расширенной памятью появились дополнительные инструкции для управления большими адресами.
Одной из особенностей, которую вы ожидаете иметь на компьютере, является инструкция вызова подпрограммы и стек. Это то, что 1401 не имел. Чтобы вызвать подпрограмму в IBM 1401, вы переходите к началу подпрограммы. Затем подпрограмма сохраняет адрес возврата в инструкции перехода в конце, фактически изменяя код, поэтому в конце подпрограммы она возвращается к вызывающей стороне. Если ты хочешь рекурсию, ты сам по себе.
Некоторые расширенные возможности 1401
По сравнению с современными компьютерами IBM 1401 чрезвычайно медленный и ограниченный. Но это не так примитивно, как вы могли бы ожидать, и у него есть несколько удивительно продвинутых функций.
Одна сложная особенность IBM 1401 - Редактирование, которое похоже printf на аппаратное обеспечение. Команда Edit принимает ряд таких, как 00123456789 и формат строки. Компьютер удаляет начальные нули и вставляет запятые по мере необходимости, создавая такой результат, как 1 234 567,89. С помощью дополнительной функции расширенного редактирования (всего 20 долларов в месяц) вы можете получить плавающие звездочки (****** 1 234,56) или плавающий знак доллара (1 234,56 $), что удобно для печати чеков. Имейте в виду, что это форматирование не выполняется с помощью подпрограммы; он реализован полностью аппаратно, с форматированием, применяемым дискретными транзисторами.
Еще одна расширенная функция IBM 1401 - расширенная проверка на наличие ошибок. С десятками тысяч компонентов на тысячах плат многие вещи могут пойти не так. 1401 фиксирует неисправности, поэтому они не вызывают катастрофы (например, печать чеков на миллион долларов). Во-первых, память, внутренние пути данных, декодирование команд и преобразование BCD защищены от проверок на четность и достоверность. АЛУ использует qui-двоичное сложение для обнаружения арифметических ошибок. Устройство чтения карт читает каждую карту дважды и сравнивает результаты.1401 проверяет работу принтера в каждой строке. (При проверках чтения, перфорирования и печати используются дополнительные плоскости памяти ядра, обсуждавшийся ранее.) В результате 1401 оказался удивительно надежным.
Поскольку IBM 1401 имеет переменную длину слова, он может выполнять арифметику произвольной точности. Например, он может умножать или делить тысячи цифр с помощью одной инструкции. Попробуйте сделать это на своем процессоре Intel или AMD! Умножение 1000-значных чисел на 1401 занимает чуть меньше минуты. Умножение / деление аппаратного обеспечения - еще одна дополнительная функция; чтобы достичь целевой цены 1401, они сделали это с относительно высокой ценой в 325 долларов в месяц. Тем не менее, вы получаете много схем по этой цене - около 246 дополнительных SMS-карт, установленных в двух воротах. И помните, это десятичное умножение и деление, что гораздо сложнее сделать в аппаратных средствах, чем в двоичном.
1401 поддерживает арифметику в фунтах / шиллингах / пенсах, что удивительно видеть в аппаратном обеспечении. (Вплоть до 1971 года британская валюта выражалась в фунтах, шиллингах и пенсах, с 12 пенсами в шиллингах и 20 шиллингами в фунтах. Это усложняет даже сложение, как часто обнаруживают туристы.) Поддерживая арифметику валюты в аппаратных средствах, 1401 сделал код быстрее и проще.
Реализация Мандельброта на 1401 ассемблере
Написание кодового набора Мандельброта на 1401 немного сложнее, так как я делал это на ассемблере (он назывался Autocoder ). Сложнее всего было думать о словесных знаках. Еще одним осложнением было то, что 1401 не имеет собственной арифметики с плавающей запятой, поэтому я использовал фиксированную точку: я масштабировал каждое число на 10000, чтобы я мог представить 4 десятичных знака с целым числом. 1401 предназначен для бизнес-приложений, а не научных приложений, поэтому он не очень подходит для генерации фракталов. Но это все еще сделало работу.
1401 не нужно было программировать на ассемблере - он поддерживает такие языки, как Fortran и COBOL - но я хотел получить полный опыт работы с 1401. Меня действительно удивляет, что вы можете запустить компилятор COBOL на машине с 4 000 символов памяти. Компилятору Фортрана требовалась машина с 8000 ячеек памяти; чтобы соответствовать, это бежало в 63 отдельных фазах .
Код ассемблера для фрактала Мандельброта показан ниже. Первая часть кода определяет константы и переменные с DCW. Затем следуют три вложенных цикла, чтобы выполнить цикл по каждой строке, каждому столбцу и итерации для каждого пикселя. Некоторые инструкции в коде: M(умножить), A(сложить), S(вычесть) и C(сравнить). Комментарии начинаются со звездочек.
JOB MANDELBROT
*GENERATES A MANDELBROT SET ON THE 1401
CTL 6641
ORG 087
X1 DCW 001 *INDEX 1, COL COUNTER TO STORE PIXEL ON LINE
ORG 333
*
*VALUES ARE FIXED POINT, I.E. SCALED BY 10000
*Y RANGE (-1, 1). 60 LINES YIELDS INC OF 2/60*10000
*
YINC DCW 333
XINC DCW 220 *STEP X BY .0220
*
*Y START IS -1, MOVED TO -333*30 FOR SYMMETRY
*
Y0 DCW -09990 *PIXEL Y COORDINATE
*
*X START IS -2.5
*
X0INIT DCW -22000 *LEFT HAND X COORDINATE
X0 DCW 00000 *PIXEL X COORDINATE
ONE DCW 001
ZR DCW 00000 *REAL PART OF Z
ZI DCW 00000 *IMAGINARY PART OF Z
ZR2 DCW 00000000000 *ZR^2
ZI2 DCW 00000000000 *ZI^2
ZRZI DCW 00000000000 *2 *ZR *ZI
ZMAG DCW 00000000000 *MAGNITUDE OF Z: ZR^2 + ZI^2
TOOBIG DCW 00400000000 *4 (SCALED BY 10000 TWICE)
I DCW 00 *ITERATION LOOP COUNTER
ROW DCW 01
ROWS DCW 60
COLS DCW 132
MAX DCW 24 *MAXIMUM NUMBER OF ITERATIONS
*
*ROW LOOP
*X1 = 1 (COLUMN INDEX)
*X0 = -2.2 (X COORDINATE)
*
START LCA ONE, X1 *ROW LOOP: INIT COL COUNT
LCA X0INIT, X0 *X0 = X0INIT
CS 332 *CLEAR PRINT LINE
CS *CHAIN INSTRUCTION
*
*COLUMN LOOP
*
COLLP LCA @00@, I *I = 0
MCW X0, ZR *ZR = X0
MCW Y0, ZI *ZI = Y0
*
*INNER LOOP:
*ZR2 = ZR^2
*ZI2 = ZI^2
*IF ZR2+ZI2 > 4: BREAK
*ZI = 2*ZR*ZI + Y0
*ZR = ZR2 - ZI2 + X0
*
INLP MCW ZR, ZR2-6 *ZR2 = ZR
M ZR, ZR2 *ZR2 *= ZR
MCW ZI, ZI2-6 *ZI2 = ZI
M ZI, ZI2 *ZI2 *= ZI
MCW ZR2, ZMAG *ZMAG = ZR^2
A ZI2, ZMAG *ZMAG += ZI^2
C TOOBIG, ZMAG *IF ZMAZ > 4: BREAK
BH BREAK
MCW ZI, ZRZI-6 *ZRZI = ZI
M ZR, ZRZI *ZRZI = ZI*ZR
A ZRZI, ZRZI *ZRZI = 2*ZI*ZR
MCW ZRZI-4, ZI *ZI = ZRZI (/10000)
MZ ZRZI, ZI *TRANSFER SIGN
A Y0, ZI *ZI += Y0
S ZI2, ZR2 *ZR2 -= ZI2
MCW ZR2-4, ZR *ZR = ZR2 (/10000)
MZ ZR2, ZR *TRANSFER SIGN
A X0, ZR *ZR += X0
*
*IF I++ != MAX: GOTO INLP
*
A ONE, I *I++
C MAX, I *IF I != MAX THEN LOOP
BU INLP
MCW @X@, 200&X1 *STORE AN X INTO THE PRINT LINE
BREAK C X1, COLS *COL LOOP CONDITION
A ONE, X1
A XINC, X0 *X0 += 0.0227
BU COLLP
W *WRITE LINE
*
*Y0 += YINC
*IF ROW++ != ROWS: GOTO ROWLP
*
C ROW, ROWS *ROW LOOP CONDITION
A ONE, ROW
A YINC, Y0 *Y0 += 0.0333
BU START
FINIS H FINIS HALT LOOP
END START
Скомпилировать и запустить код можно с помощью компилятора и симулятора ROPE.
Как бы вел себя с этим кодом реальный ЭВМ.
Карты перфорировались автоматически с помощью клавиш IBM 029. Каждая пустая карточка выпадает из устройства подачи в верхнем правом углу. Карта перфорирована, когда она движется влево. Перфокарты затем складываются и складываются в верхнем левом углу (на этом рисунке пусто).
Получившаяся колода карт показана ниже вместе с результатами выполнения. Программа вмещает всего 16 карт, но формат карты немного необычный. Машинный код для программы Мандельброта вставляется в левую половину каждой карточки с таким кодом, как M384417A395417. Интересная вещь о 1401 - машинный код, почти читаемый человеком. M384417означает перемещение поля с адреса 384 на адрес 417. A395417означает добавление числа по адресу 395 к номеру по адресу 417. Текст на этих карточках - это фактический машинный код, который выполняется, а не код сборки. Поскольку машина основана на символах, а не двоичная, нет разницы между символами «428» и адресом 428.
Если вы посмотрите на правую половину карточек, то происходит нечто совершенно иное, например, с текстом L033540,515522,5259534. Там нет операционной системы, поэтому, невероятно, у каждой карты есть код, чтобы скопировать ее содержимое в нужное место в памяти (L инструкция), добавить метки слов ( ,инструкция) и загрузить следующую карту. Другими словами, правая сторона каждой карты - это программа, которая запускает карту за картой для загрузки в память программы с левой стороны колоды карт, которая выполняется после загрузки последней карты.
Чтобы запустить программу, сначала нажмите кнопку «Power On» на консоли IBM 1401. Реле время от времени застревает, чтобы включить систему, а затем компьютер готов к работе (в отличие от современных компьютеров, которые загружаются так долго). Вы кладете карты в картридер и нажимаете кнопку «Загрузить». Карты летят через устройство считывания со скоростью 800 карт в минуту, поэтому программа Мандельброта загружается всего за секунду. Когда программа запускается, консоль начинает мигать, и каждые несколько секунд линейный принтер выбивает другую строку фрактала. После 12 минут исполнения фрактал готов. (Интересно, что самое первое изображение набора Мандельброта было напечатано на линейном принтере в 1978 году.
Выводы
Написание программы Мандельброта для IBM 1401 было интересным проектом. Вы немного по-другому думаете о программировании, используя десятичные числа и отслеживание словесных меток. Но я должен сказать, что сравнение производительности с текущей машиной - не говоря уже о емкости хранения - заставляет меня ценить закон Мура.
Спасибо Музею компьютерной истории ibm-1401.info за, хоть и удаленную, но возможность, посмотреть на это чудо инженерной мысли.