Вычислительная система IBM 1130 , представленная в 1965 году, [3] была наименее дорогим компьютером IBM в то время. Двоичная 16-битная машина, она была продана на чувствительные к цене, вычислительно-интенсивные технические рынки, такие как образование и инженерия, сменив десятичную IBM 1620 в этом сегменте рынка. Типичные установки включали 1-мегабайтный диск, на котором хранилась операционная система, компиляторы и объектные программы, с исходным кодом программы, сгенерированным и поддерживаемым на перфокартах . Fortran был наиболее распространенным используемым языком программирования , но были доступны и несколько других, включая APL .
Модель 1130 также использовалась в качестве интеллектуального интерфейса для подключения графического дисплея IBM 2250 или в качестве рабочей станции удаленного ввода заданий (RJE), подключенной к мэйнфрейму System/360 .
Общий объем производства 1130 оценивается в 10 000 экземпляров. [4] 1130 занимает место в истории вычислительной техники, поскольку он (и его клоны, не относящиеся к IBM) дал многим людям первое прямое взаимодействие с компьютером. Его соотношение цены и производительности было хорошим, и он, в частности, включал недорогое съемное дисковое хранилище с надежным, простым в использовании программным обеспечением, которое могло быть на нескольких языках высокого уровня . Низкая цена (примерно от 32 000 долларов или 41 000 долларов с дисководом) [3] и хорошо сбалансированный набор функций позволили разрабатывать интерактивные программы «open shop» .
IBM 1130 использует ту же электронную упаковку, называемую Solid Logic Technology (SLT), которая использовалась в System/360 . Он имеет 16-битную двоичную архитектуру, как и более поздние мини-компьютеры, такие как PDP-11 и Data General Nova .
Адресное пространство составляет 15 бит, что ограничивает 1130 32 768 16-битными словами ( 65 536 байт ) памяти. 1130 использует память на магнитных сердечниках , к которой процессор обращается по границам слов, используя режимы прямой, косвенной и индексированной адресации.
IBM реализовала пять моделей центрального процессора 1131, основного компонента обработки IBM 1130. Модели с 1 по 5 описывают время цикла основной памяти, а также способность модели иметь дисковое хранилище. Буква от A до D, добавленная к номеру модели, указывает на объем установленной основной памяти.
Центральный процессор IBM 1131 весит около 760/1050 фунтов (345/477 кг). [5]
Модель 4 была более дешевым продуктом с временем цикла 5,9 мкс. Некоторые покупатели улучшений производительности заметили, что корректировка на месте для достижения улучшения была на удивление тривиальной.
Принтер IBM 1132 полагается на процессор 1130, а не на внутреннюю логику, чтобы определить, когда запускать печатающие колеса по мере их вращения. Принтеры для Model 4 работают медленнее, но более медленный процессор все равно не может с ним справиться. В руководстве по оборудованию говорится, что когда Model 4 обслуживала два прерывания самого высокого уровня (прерывание столбца считывателя карт уровня 0 или прерывание принтера уровня 1), она работала с более быстрым временем цикла 3,6 мкс. Некоторые пользователи Model 4 писали фальшивый драйвер принтера , который не отключал прерывание принтера, чтобы воспользоваться более высокой скоростью процессора. Однако прерывания более низкого уровня отключаются в течение этого интервала, даже прерывание конца карты (уровень 4) от считывателя карт 1442.
IBM 1800 , анонсированный в ноябре 1964 года, [6] является предшественником IBM 1130 для приложений управления процессами . Он использует аппаратную часть, а не основную память для трех индексных регистров и имеет две дополнительные инструкции (CMP и DCM) плюс дополнительные возможности прерываний и ввода-вывода . Он является преемником IBM 1710 , так же как IBM 1130 является преемником IBM 1620 .
IBM 1500 — это многопользовательская образовательная система на базе IBM 1130 или IBM 1800. К ней можно подключить до 32 рабочих станций учащихся, каждая из которых имеет различные аудиовизуальные возможности.
Помимо этих систем IBM не производила совместимых с 1130 систем-преемников. IBM System/7 — это система управления процессами и реального времени, а IBM Series/1 — это 16-разрядный мини-компьютер общего назначения, причем обе имеют архитектуру, отличную от 1130 и друг от друга.
Для обеспечения максимальной скорости и экономии места операционная система и компиляторы написаны полностью на языке ассемблера и используют методы, которые сегодня встречаются редко, включая смешивание кода и данных, а также самомодифицирующийся код .
Большая часть пользовательского программирования выполняется на языке Fortran . Компилятор Fortran 1130 может работать на машине с ядром всего в 4096 слов, хотя скомпилированная программа может не поместиться на такой машине. В этом многопроходном компиляторе каждая «фаза» обрабатывает всю исходную программу и делает еще один шаг к машинному коду. Например, первая фаза считывает исходные операторы в память, отбрасывает строки комментариев, удаляет пробелы, за исключением текстовых литералов, объединяет строки продолжения и идентифицирует метки. Компилятор доступен в резидентной версии на диске, а также на восьмиканальной перфоленте или перфокартах.
Наиболее широко используемая операционная система для 1130 — Disk Monitor System Version 2 (DM2), представленная в 1967 году. DM2 — это однозадачная пакетно-ориентированная система. Для нее требуется система с не менее чем 4 КБ основной памяти и одним интегрированным дисководом 2310 для размещения системы. Supervisor по современным стандартам крошечный, содержащий различные системные детали, такие как процедуры прерываний первого уровня, называемые подпрограммами уровня прерываний , а также драйвер диска и процедуры для загрузки интерпретатора команд управления заданиями и драйвера считывателя карт. Драйверы устройств для других устройств ввода-вывода, требуемых заданием, включаются как часть загрузки этого задания, что может также включать замену базового драйвера диска более продвинутым драйвером. Во время выполнения задания в памяти находится только резидентный монитор , называемый Skeleton Supervisor . Этому Supervisor требуется всего 1020 байт, поэтому первая доступная память задачи начинается с адреса /01FE ( шестнадцатеричный ) или слова 510. Когда задание заканчивается или прерывается, Supervisor загружает Monitor Control Record Analyzer ( MCRA ), чтобы прочитать управление заданием для следующего. Пока задание выполняется, Supervisor неактивен. За исключением драйверов устройств и обработки прерываний, все время ЦП полностью посвящено действиям задания. Другими программами, распространяемыми как часть операционной системы, являются утилита дампа ядра , DUMP , и программа Disk Utility , DUP .
Для поддержки систем без диска была доступна система программирования на основе карт/бумажной ленты.
Существует иерархия драйверов устройств: те, чьи имена заканчиваются на Z, предназначены для Fortran, например DISKZ, в то время как программисты на ассемблере могут использовать DISK0, а DISK1 был даже быстрее при чтении нескольких секторов диска. Но DISKZ начинает адресацию секторов с первого доступного неиспользуемого сектора, в то время как другие начинают с нулевого сектора диска, что позволяет программисту, не знакомому с организацией диска, непреднамеренно перезаписать загрузчик начальной загрузки.
Другие языки программирования, доступные на 1130, включают:
Существует даже компилятор ALGOL на французском языке , в котором, например, " Debut ...Fin;
" заменяет " Begin ... End;
". Все его сообщения на французском языке, поэтому "Bonne compilation" является целью.
Восточно-Мичиганский университет разработал компилятор Fortran IV для 1130, известный как Fortran-EMU, как альтернативу компилятору Fortran IV (subset), предоставленному IBM. Он добавляет множество функций Fortran Iv, не поддерживаемых компилятором IBM, включая тип данных LOGICAL, шестибуквенные имена переменных и расширенную диагностику. Компилятор Fortran-EMU распространялся в виде колоды перфокарт в формате файла образа диска, при этом вся оставшаяся системная область была удалена, чтобы предотвратить копирование других модулей, которые обычно находятся на том же диске, таких как ассемблер или компиляторы.
В Университете штата Оклахома был разработан компилятор ALGOL 68 , написанный на ANSI Fortran 1966. [13] [14] [15]
В Мичиганском университете был разработан интерпретатор FOCAL .
IBM также распространяла большую библиотеку программ, как поддерживаемых IBM (тип I и II), так и неподдерживаемых (тип III и IV).
Поскольку 1130 был ориентирован в первую очередь на научный рынок, преобладали научные и инженерные программы:
Модель 1130 также заняла свою нишу в качестве машины для обработки данных для небольших организаций:
Также имеется специализированное программное обеспечение:
Пакетная работа 1130 управляется контрольными записями в первичном входном потоке (считыватель карт или бумажной ленты). Существует два типа контрольных записей: контрольные записи монитора и контрольные записи супервизора. [19]
Записи управления монитором идентифицируются по //␢
«коду псевдооперации» в столбцах 4–7. «␢» представляет собой один пробел.
Запись JOB
может иметь "T" в столбце 8, чтобы указать, что любые файлы, добавленные в Пользовательскую область этим заданием, должны быть удалены в конце. Столбцы 11–15 могут содержать метку картриджа; система проверяет, что указанный картридж смонтирован, прежде чем продолжить.
Запись XEQ
может содержать имя программы, которая будет запущена, в столбцах с 8 по 12. Если это пропущено, будет выполнена программа, которая в данный момент находится в рабочей памяти. Если столбец 14 содержит «L», а программа находится в формате Disk System (не core-image), то Core Load Builder напечатает карту ядра. Если за этим оператором следует LOCAL
NOCAL
, или FILES
Supervisor Control Records, столбцы 16 и 17 содержат количество этих записей. Столбец 19 необязательно указывает, какая подпрограмма драйвера диска должна быть связана. «0», «1» или «N» запрашивают DISK1, DISK2 или DISKN, любой другой символ, включая пробел, запрашивает DISKZ, дисковую подпрограмму FORTRAN.
Записи управления супервизора начинаются с "*" в столбце 1, за которым сразу следует псевдооперация команды в столбце 2. Это LOCAL
, NOCAL
, и FILES
для Core Load Builder. Записи управления DUP имеют аналогичный формат. Эти записи управляют связыванием программ, либо для // XEQ
оператора, либо для команды DUP *STORECI
.
Устойчивые воспоминания об IBM 1130 могли быть результатом его потребности в постоянном вмешательстве человека. Обычно он был занят выполнением «заданий», указанных колодой перфокарт . Человек-оператор загружал задания в считыватель карт и разделял их обратно на задания для возврата, возможно, вместе с распечатанным выводом, отправителю. Оператор также должен был следить за 1130 на предмет признаков неисправности или остановки задания и вмешиваться, нажимая клавишу INT REQна клавиатуре, чтобы перейти к началу следующего задания. [20]
Начало задания обозначалось перфокартой, начинавшейся с // JOB
. Любая карта, начинавшаяся с , //
была командой для Супервизора и не могла использоваться в качестве пользовательской программы или данных. Другие команды включали // DUP
выполнение программы Disk Utility (удаление файлов или добавление файла во временную область в коллекцию файлов) и // XEQ
выполнение именованной программы с диска. Если пользовательская программа пыталась прочитать командную карту, стандартная процедура считывателя карт сообщала программе об окончании ввода и сохраняла содержимое этой карты для Супервизора.
В отличие от IBM 360, где загрузочное устройство можно выбрать из системной консоли, IBM 1130 можно «загрузить» (IPL: Initial Program Load) только с внешнего устройства: устройства для чтения карт или перфоленты. [21] [22]
Процедура начальной загрузки считывает одну карту из устройства чтения карт. Загрузочная карта содержит двоичный код [23] для считывания содержимого нулевого сектора диска, который, в свою очередь, обрабатывает прерывание «операция завершена» от диска и выполняет дополнительные считывания с диска для подготовки 1130 к первой работе с перфокартой. Весь процесс занимает около секунды.
При запуске IBM 1130 Supervisor все еще находится в памяти и, вероятно, не поврежден, поскольку основная память сохраняет свое состояние без питания. Если оператор приходит к выводу, что пользовательская программа остановилась, Supervisor может почувствовать нажатие клавиши, чтобы прервать программу и перейти к следующей карте //. Supervisor не защищен от модификации плохо написанным заданием, случай, который может потребовать от оператора перезагрузки 1130. Также не было защиты от записи на диск. Если копия системного программного обеспечения на диске была изменена, ее можно восстановить, перезагрузив ее примерно с 4000 двоично-кодированных перфокарт (примерно два ящика).
Дисковод IBM 2310 хранит сектора по 320 слов (640 байт) плюс адрес сектора из одного слова. Цилиндр состоит из двух дорожек на верхней и нижней поверхностях 2315 или из одной пластины на дисковом блоке 1316, используемом в 2311. Каждый дисковый цилиндр содержит восемь секторов. Сектор логически делится монитором на шестнадцать дисковых блоков по 20 слов (40 байт) каждый. Дисковый блок является единицей распределения для файлов.
Система различает системные картриджи , которые содержат монитор и утилиты вместе с пользовательскими данными, и несистемные картриджи , которые содержат только пользовательские данные. Все картриджи содержат информацию о цилиндре 0, включая таблицу дефектных цилиндров, идентификатор картриджа и программу начальной загрузки ( код начальной загрузки ). На несистемных картриджах начальная загрузка просто выводит сообщение об ошибке и ждет, если будет сделана попытка загрузки с этого картриджа. На системном картридже это программа холодного запуска , за которой следует область связи и резидентный монитор в секторах один и два. Секторы с третьего по пятый содержат таблицу эквивалентности расположения системы (SLET) — каталог всех фаз всех программ монитора. Другая управляющая информация заполняет первую дорожку.
Системная область присутствует на системных картриджах. Она содержит программу Disk Monitor и опционально компилятор FORTRAN, Assembler и буфер образа ядра , используемый для связывания перемещаемых программ. Она также содержит каталоги файлов пользователя — Fixed Location Equivalence Table (FLET) и Location Equivalence Table (LET),
После системной области картридж содержит до трех логических подразделений: фиксированную область , пользовательскую область и рабочую память . Как фиксированная область, так и пользовательская область хранят невременные программы и данные. Размер фиксированной области определяется DUP и хранит данные и программы только в формате основного образа. Она не переупаковывается при удалении файлов. Пользовательская область хранит данные и программы в любом формате. Граница между пользовательской областью и рабочей памятью «плавает» — пользовательская область расширяется по мере добавления файлов и сужается по мере переупаковки для освобождения места от удаленных файлов. Если файл необходимо изменить, обычным процессом является использование // DUP
команд для его удаления, что перемещает все последующие файлы обратно, чтобы закрыть пробел, а затем дает это имя временному файлу как новой версии файла. Таким образом, редко изменяемые файлы перемещаются к началу диска по мере добавления новых файлов или новых версий, а часто изменяемые файлы сохраняются к концу диска.
Рабочее хранилище начинается после последнего файла в пользовательской области и занимает все оставшееся пространство на картридже. Оно может содержать один временный файл, созданный системой или пользователем, например, вывод компилятора или прикладной программы. Этот файл может быть удален в конце текущего задания, если только он не сохранен в фиксированной области или пользовательской области.
Все файлы на диске являются непрерывными блоками диска, поэтому фрагментации нет . Программа может использовать и изменять именованные файлы, но не может расширять их за пределы созданного размера. Программа, создающая более одного файла, должна иметь все, кроме одного, предварительно выделенного DUP.
При ограниченном дисковом пространстве исходные файлы программ обычно хранятся в виде колод карт. Пользователи с большими требованиями могут иметь собственный диск, содержащий операционную систему, но только свои файлы, и им придется заменить системный диск «пула» на свой и перезапустить систему, когда их программы должны быть запущены. Система со вторым диском, который может быть полностью выделен для кода и данных одного пользователя, обеспечивает некоторое облегчение.
Пакет дисков или картридж инициализируется для использования на 1130 процедурой инициализации пакета дисков (DIPR). Эта процедура сканирует диск и записывает адреса секторов на всех цилиндрах, отмечает дефектные сектора и записывает идентификатор картриджа на нулевой цилиндр. DIPR — это автономная программа , которая загружается с карт или бумажной ленты и принимает идентификатор картриджа с системной консоли. [19]
Программа Disk Utility Program (DUP) предоставляет команды для переноса программ, подпрограмм и данных. Она вызывается картой управления заданиями // DUP
, за которой следуют одна или несколько карт управления: [24]
Другие команды, в основном предназначенные для использования системным администратором, определяют или расширяют фиксированную область, удаляют компилятор FORTRAN и/или ассемблер из системы и восстанавливают правильные адреса секторов в рабочей памяти, если они были изменены.
Операнды должны быть размещены в фиксированных столбцах. Код исходного устройства указывается в столбцах 13 и 14, целевого устройства — в столбцах 17 и 18. Эти коды устройств следующие:
При желании имя программы может быть закодировано в столбцах 21–25, а поле количества — в столбцах 27–30. Интерпретация этих полей зависит от запрошенной функции DUP.
Программы можно преобразовать в формат с более быстрой загрузкой с помощью команды STORECI , которая вызывает Core Image Builder (аналог Linkage Editor в DM2). В качестве альтернативы программа может проходить этот процесс каждый раз, когда ее нужно запустить, и для редко используемых программ это предпочтительно для экономии места на диске.
Следующая контрольная карта инструктирует DUP взять текущее содержимое рабочей памяти и переместить его в пользовательскую область, назвав его PROGM. DUP знает размер файла в рабочей памяти. Размер пользовательской области будет увеличен на размер файла, а размер рабочей памяти будет соответственно уменьшен.
Дисковая память используется для хранения операционной системы, объектного кода и данных, а исходный код хранится на перфокартах.
Базовая модель 1130 поставлялась с дисководом IBM 2310 с звуковой катушкой, называемым «Ramkit», от IBM General Products Division в Сан-Хосе. [7] : 497 Их картриджи IBM 2315 размером с коробку для пиццы вмещают 512 000 слов или 1 024 000 байт (меньше, чем 1,44 МБ у 3,5-дюймовой HD-дискеты или даже 1,2 МБ у 5,25-дюймовой HD-дискеты ). Скорость передачи данных составляет 35 000 слов в секунду (70 КБ/с) с использованием захвата цикла . [25]
Консольная пишущая машинка IBM 1053 использует механизм IBM Selectric , что означает, что можно изменить гарнитуру или набор символов, заменив полый элемент типа размером с мяч для гольфа. Существует специальный элемент типа для APL , мощного языка программирования, ориентированного на массивы, использующего специальную символьную нотацию. Ряд из 16 тумблеров на консольной пишущей машинке можно индивидуально тестировать из программ, используя , например, специальный оператор Fortran .IF (SENSE SWITCH i)
Другие доступные периферийные устройства включают:
Для упрощения конструкции периферийных устройств они полагаются на процессор. Кардридер не имеет буферов памяти, но вместо этого дает ЦП прерывание нулевого уровня (самый высокий приоритет) после того, как каждый отдельный столбец карты был прочитан. Если ЦП не отвечает и не сохраняет двенадцать бит данных до того, как другое такое прерывание укажет, что следующий столбец был прочитан, данные будут потеряны. Аналогично, принтер 1132 полагается на программное обеспечение в 1130. Когда буква, такая как , A
занимает позицию, ЦП должен проанализировать буферизованную строку текста и собрать массив бит, который укажет 1132, какие позиции печати следует напечатать с A
. Если ЦП не может ответить до того, как , A
повернется из позиции, скорость печати может сильно ухудшиться.
Другие периферийные устройства принимают текст в коде, специфичном для устройства, удобном для его оборудования. ЦП должен преобразовать его в или из кода EBCDIC, в котором ЦП обрабатывает текст.
Инструкции имеют короткий (однословный) и длинный (двухсловный) форматы. Большинство вычислительных, загрузочных и хранимых инструкций ссылаются на один регистр (обычно ACC) и ячейку памяти. Ячейка памяти идентифицируется в коротком формате 8-битным смещением со знаком либо от текущего адреса, либо от одного из индексных регистров; или в длинном формате полным 15-битным адресом, который может быть индексирован и указывать косвенность. Память адресуется в единицах слов.
1130 поддерживает только двоичные данные одинарной и двойной точности изначально (16 и 32 бита), хранящиеся в формате big-endian . Стандартные и расширенные данные с плавающей точкой (32 и 48 бит) и десятичные данные поддерживаются с помощью подпрограмм.
Условные передачи основаны на (a) текущем содержимом аккумулятора или (b) индикаторах переноса и переполнения, установленных предыдущей операцией. Передачи могут быть пропуском (который предполагает, что следующая инструкция была короткой) или переходом. Пропуск происходит, если любой из указанных тестов истинен. Переход происходит, если ни один из указанных тестов не истинен.
Основные регистры:IAR = Регистр адреса инструкцииACC = АккумуляторEXT = Регистр расширенияXRx = Индексные регистры: x = 1,2,3 Реализованы как слова памяти 1,2,3, а не как аппаратные регистры.Тесты состояния:Z Аккумулятор ноль- Аккумулятор отрицательный+ Аккумулятор положительныйE Аккумулятор четныйC Индикатор переноса выключенO Индикатор переполнения выключенМнемоника набора инструкций 1130:LD = Загрузка ACC STO = Сохранить ACCLDD = Двойная загрузка (ACC и EXT) STD = Двойное хранение (ACC и EXT)LDX = Индекс нагрузки STX = Индекс магазинаLDS = Статус загрузки STS = Статус храненияA = Добавить ACC AD = Добавить DoubleS = Вычитание ACC SD = Вычитание DoubleМ = Умножить D = РазделитьИ = Булево И ИЛИ = Булево ИЛИXOR = Булевое исключающее ИЛИSLA = Сдвиг влево ACC SLT = Сдвиг влево ACC & EXTSLCA = Сдвиг влево и подсчет ACC SLC = Сдвиг влево и подсчет ACC & EXTSRA = Сдвиг вправо ACC SRT = Сдвиг вправо ACC & EXTRTE = Поворот вправо ACC и EXTBSC = Переход или пропуск по условию (зависит от модификатора) т.е. БП БНП БН БНН БЗ БНЗ БК БО БОДBOSC — ответвление или пропуск по условию (альтернатива BSC с установленным битом 9) Выход из текущего уровня прерывания.BSI = IAR отделения и магазинаMDX = Изменить индекс и пропустить (увеличить IAR на единицу, если знак изменился или стал нулевым)WAIT = Остановка NOP = Нет операции (альтернатива SLA 0)XIO = Выполнить ввод-вывод1800 дополнительных инструкций Мнемоника:CMP = Сравнение ACC DCM = Двойное сравнение ACC и EXTЭквивалентные мнемоникиДисковый ассемблер ввел несколько мнемоник, эквивалентных существующиминструкции, призванные прояснить намерения программиста:SKP — пропуск при условии, эквивалентно короткому BSCB — безусловное ветвление, эквивалентно BSC без указания каких-либо условийBP — положительный аккумулятор ветви, эквивалентный BSC, указывающему условие «+»BNP - Накопитель ветви не положительныйBN - Отрицательный аккумулятор ветвиBNN - Накопитель ветви не отрицательныйBZ - Накопитель ветви ZeroBNZ - Накопитель ветви не равен нулюBC - Отделение на CarryBO — Ветвление при переполненииBOD - Накопитель ветви нечетныйMDM — Modify Memory, эквивалентно неиндексированному длинноформатному MDXXCH — обменный аккумулятор и расширение, эквивалент RTE 16Формат короткой инструкции (одно 16-битное слово): 1Биты 0...45678......5 OP---FTTDisp----ОП — это ОперацияF — формат 0 = короткийTT — это тегDisp — это смещениеДлинный формат инструкции (два 16-битных слова): 1 1Биты 0...456789.....50..............5 OP---FTTIMod----Адрес---------ОП — это ОперацияF — формат 1 = ДлинныйTT — это тегI — косвенный битМодификатор — это модификаторРасчет эффективного адреса (EA): Ф = 0 | Ф = 1, Я = 0 | Ф = 1, Я = 1 Прямая адресация| Прямая адресация| Косвенная адресация-------------------------------------------------- -----------------ТТ = 00 | EA = Displ + IAR | Советник = Добавить | ЕА = С/ДобавитьTT = 01 | EA = Displ + XR1 | EA = Add + XR1 | EA = C/Add + XR1TT = 10 | EA = Displ + XR2 | EA = Add + XR2 | EA = C/Add + XR2TT = 11 | EA = Displ + XR3 | EA = Add + XR3 | EA = C/Add + XR3-------------------------------------------------- ----------------- Disp = Содержимое поля смещения Добавить = Содержимое поля адреса инструкции C = Содержимое местоположения, указанного с помощью Add или Add + XR
Использование младших адресов основной памяти определяется либо аппаратными возможностями, либо соглашениями:
1130 не имеет аппаратной поддержки стека . Большинство подпрограмм вызываются с помощью инструкции BSI (Branch and Store IAR). Это помещает значение IAR (адрес возврата) в адрес назначения и передает управление на destination+1. Подпрограммы возвращаются туда, где они были вызваны в тот момент, используя косвенный переход через первое слово подпрограммы. Размещение адреса возврата в строке было распространенной техникой компьютеров того времени, таких как Hewlett-Packard HP 2100 , [30] DEC PDP-8 , [31] и Scientific Data Systems SDS 920. [ 32]
Таким образом, подпрограмма с именем SIMPL может быть организована следующим образом (комментарии следуют за операндом инструкции):
SIMPL: DC *-* Это точка входа, изначально заполненная нулем. (что бы ни делала рутина) BI SIMPL Возврат через непрямое отделение по адресу, указанному в местоположении SIMPL. END SIMPL Указывает ассемблеру, что исходный код для процедуры SIMPLE завершен.
Подпрограмма будет называться следующим образом:
BSI L SIMPL Вызвать SIMPL. L (длинный) требуется, если SIMPL находится на расстоянии более -128 или +127 слов.
Обычно используется псевдокод операции CALL.
Как показано, точка входа подпрограммы — это DC *-*
, псевдооперация ассемблера, которая используется для определения константы (занимающей одно слово памяти) со значением, указанным выражением. * обозначает текущий адрес сборки, поэтому *-* дает ноль. Запись этого вместо 0 обеспечивает визуальное отличительное замечание того, что значимое значение (адрес возврата) будет размещено там во время выполнения. Точка входа не обязательно должна быть первым словом подпрограммы. Действительно, предшествующее слово может быть началом инструкции прямого перехода из двух слов, поле адреса которой находится в SIMPL. Затем возвраты могут быть выполнены с помощью переходов из одного слова там:B SIMPL-1
При вызове SIMPL инструкция BSI заменяется *-*
текущим значением IAR, который является адресом сразу после инструкции BSI. После того, как SIMPL сделает то, что ему предписано делать, B I SIMPL
переходит не на SIMPL, а косвенно через него, таким образом продолжая выполнение с инструкцией, следующей за инструкцией BSI, которая вызвала SIMPL.
Без дополнительных мер по защите обратного адреса рекурсия невозможна: если SIMPL вызывает себя или вызывает подпрограмму, которая его вызвала, ее исходный обратный адрес перезаписывается. Повторный вход проблематичен по той же причине: процедура обслуживания прерываний должна воздерживаться от вызова любой подпрограммы, которая могла бы быть прерванным кодом.
Вызывающий SIMPL может передавать ему параметры, которые могут быть значениями или адресами значений. Параметры могут быть закодированы в строке (сразу после инструкции BSI) или могут быть помещены в индексные регистры XR1 и XR2. Если параметры помещены в строку, SIMPL изменяет свой собственный адрес возврата, так что его конечная косвенная ветвь возвращается за пределы параметров.
Целочисленные функции одного целого числа ожидают параметр в аккумуляторе и возвращают свой результат там. Функции с плавающей точкой используют аккумулятор с плавающей точкой (область из двух слов, выделенная библиотекой с плавающей точкой, три слова для повышенной точности) и т. д.
Соглашение о кодировании 0 в качестве начального значения в точке входа означает, что если ошибка программирования приводит к возврату SIMPL до того, как он был вызван в первый раз, выполнение перейдет к ячейке памяти 0. Как упоминалось выше, обычно ячейка 0 содержит переход к ячейке 0. 1130 застрянет в ячейке 0, а индикаторы IAR на консоли будут полностью темными, что даст понять, что программа дала сбой.
Для подпрограмм, которые будут вызываться много раз (например, подпрограммы для арифметики с плавающей точкой ), важно уменьшить размер каждого вызова до одного слова. Такие «библиотечные процедуры» используют протокол LIBF. Он сложнее протокола CALL, описанного в предыдущем разделе, но LIBF скрывает сложность от автора программы на языке ассемблера.
Библиотечные процедуры адресуются через индексный регистр XR3. (Подпрограммы Fortran используют индексный регистр XR1 для адресов параметров и адреса возврата, но регистр XR2 не используется.) XR3 указывает на последовательность трехсловных векторов передачи , так что первая запись составляет -128 слов от значения XR3. Программист вызывает библиотечную процедуру LIBF
, используя псевдооперацию, которая собирает не прямую BSI
к процедуре, а однословную индексированную инструкцию ветвления ( ), смещение которой (-128, -125 и т. д.) идентифицирует начало вектора передачи процедуры.BSI 3 disp
Вектор переноса подготавливается загрузчиком связей, когда он собирает программу. Запись вектора переноса в библиотечную функцию с именем SIMPL имеет следующую форму:
DC *-* Слово, в котором BSI сохраняет обратный адрес. BL SIMPL Переход к началу библиотечной функции.
Способ, которым SIMPL узнает, где находится ее адрес возврата, заключается в том, что если SIMPL объявлен подпрограммой LIBF, загрузчик связей изменит код SIMPL, поместив адрес записи вектора переноса SIMPL в SIMPL+2. Подпрограммы LIBF, в отличие от подпрограмм CALL, начинаются не с директивы DC для хранения адреса возврата (он находится в векторе переноса), а с фактического кода, как показано ниже:
SIMPL STX 1 RCVR1+1 Сохранение значения XR1 вызывающего абонента в ближайшем месте. LDX I1 *-* Загрузчик связей изменяет адресное слово, чтобы оно указывало на вектор переноса.
Размещение адреса вектора передачи SIMPL в SIMPL+2 оставляет место для однословной инструкции для сохранения выбранного индексного регистра, здесь XR1. Затем косвенная инструкция LDX указывает XR1 не на вектор передачи, а через него на адрес возврата или на любые параметры, сохраненные в строке после BSI. Затем SIMPL делает то, для чего он был написан, получая доступ к любым встроенным параметрам через XR1 (в этом случае он должен увеличить XR1 для адреса возврата), и возвращается следующим образом:
STX 1 RETN+1 Сохраните XR1, чтобы подготовить его к использованию в качестве обратного адреса.RCVR1 LDX L1 *-* Первая инструкция SIMPL изменила этот адрес. Теперь,* восстановить исходное значение XR1.RETN BL *-* Эта инструкция была изменена две инструкции назад; возврат.
Предположим, что вызов SIMPL в стиле LIBF был по адресу 100. Тогда адрес возврата будет 101, поскольку это однословная инструкция. XR3 указывает на группу векторов переноса. Если вектор переноса для SIMPL начинался с адреса 2000, то BSI будет собран с таким образом, что XR3+disp = 2000. Выполнение BSI сохраняет 101 в месте 2000 и переходит в место 2001. В месте 2001 находится длинный переход из двух слов к точке входа SIMPL, которую загрузчик связей мог бы поместить по адресу 300.BSI 3 disp
disp
Длинный переход передает управление SIMPL. После инструкции в 300 сохраняет XR1, инструкция в 301 — это , загрузчик связей поместил 2000 в ячейку 302. Это не загружает 2000 в XR1; это косвенная инструкция, и она загружает содержимое 2000, которое равно 101, обратному адресу для этого вызова SIMPL.LDX I1 2000
В последовательности возврата, показанной выше, к моменту, когда управление достигает RETN, инструкция там находится B L 101
, которая возвращается вызывающей стороне. (Если в 101 есть один или несколько встроенных параметров, SIMPL увеличит XR1, чтобы указать на 102 или дальше, и это будет местом назначения инструкции B
.)
Если SIMPL берет параметры, закодированные в строке после инструкции BSI, SIMPL получает к ним доступ с индексированной адресацией от XR1. Первый может быть получен с помощью LD 1 0
, второй с помощью LD 1 1
, и так далее. Если второй параметр является адресом фактического параметра, то получает его значение. Перед возвратом SIMPL увеличивает XR1 после n параметров с помощью инструкции, например , чтобы поместить правильное значение в RETN+1.LD I1 1
MDX 1 n
Процедура LIBF, которая отказалась восстановить исходное значение XR1, могла бы пропустить вышеуказанные шаги и вернуться с простым пропуском n встроенных параметров. Однако такая процедура не может быть вызвана другими процедурами LIBF, поскольку она нарушает использование вызывающим XR1 для доступа к его собственным параметрам и адресу возврата.B 1 n
Сложность LIBF экономит память для часто вызываемых подпрограмм.: [33] : стр. 24 Связи LIBF требуется одно слово на вызов, плюс три слова для записи вектора переноса и дополнительного кода в самой процедуре, тогда как связке CALL требуется два слова на вызов, поскольку большинство CALL будут по адресу за пределами диапазона слов от -128 до +127 кода операции из одного слова.
Регистр XR3 должен указывать на записи вектора передачи для библиотечных процедур, а не на таблицу диспетчеризации только их адресов, поскольку последнее потребовало бы, чтобы процедуры LIBF вызывались с помощью косвенной инструкции BSI. Эти инструкции имеют длину в два слова, поэтому такая конструкция сведет на нет экономию размера кода LIBF. Восьмибитный предел для поля disp кода инструкции из одного слова ограничивает использование процедур LIBF не более чем 85 различными записями.
Предыдущие разделы показывают, что код и данные перемешаны. В программировании 1130 часто модифицируют поля адресов инструкций и, по сути, модифицируют целые инструкции.
Компилятор Fortran создает самомодифицирующийся код при генерации кода для любых подпрограмм (подпрограмм или функций), имеющих параметры. Компилятор создает таблицу каждого местоположения, где подпрограмма ссылается на один из своих параметров, и компилирует в качестве первой инструкции в теле подпрограммы вызов подпрограммы с именем SUBIN, которая использует таблицу для изменения поля адреса каждой ссылки на параметр, чтобы оно стало фактическим адресом параметра во время текущего вызова. SUBIN создает эти исправления каждый раз, когда вызывается подпрограмма.
Когда программа Fortran вызывает подпрограмму, адреса всех параметров появляются в строке после вызова. Например, оператор Fortran CALL SIMPL(X) может компилироваться в:
BSI L ПРОСТОЙ DC X Адрес X, на котором будет работать SIMPL
В подпрограмме доступ к параметрам может осуществляться посредством косвенной индексной адресации, как показано выше в разделе «Вариации», поэтому, учитывая, что XR1 был соответствующим образом подготовлен, целочисленный параметр может быть загружен в аккумулятор с помощью такой инструкции:
LD I1 0 Загрузить значение первого параметра (смещение 0) в аккумулятор
Вместо этого компилятор использовал прямую адресацию. Когда запускается SUBIN, он получает адрес X и исправляет поле адреса инструкции, чтобы оно стало:
LD LX Загрузить значение X в аккумулятор
Преимущества SUBIN следующие:
Недостатками SUBIN являются время, необходимое для его выполнения, и память, необходимая для таблицы ссылок. Размер этой таблицы равен сумме 5, количества параметров и количества ссылок; если эта сумма превышает 511, компиляция завершится неудачей. Для подпрограмм с большим количеством ссылок на параметр автор подпрограммы может скопировать параметр в локальную переменную.
Изменение целых инструкций было распространенной техникой в то время. Например, хотя 1130 имеет инструкцию OR, синтаксис Fortran не позволяет ее написать. Можно определить целочисленную функцию IOR, что позволяет логическому OR быть частью выражения Fortran, например:
М = 3 * МОР ( И , Дж ) + 5
Компилятор Fortran размещает адреса I и J в строке и ожидает результат в аккумуляторе. Использование IOR(I,J) в выражении Fortran компилирует следующие четыре слова:
BSI L IOR Переход на два слова к началу функции IOR. Однословный встроенный параметр DC IA: адрес I. Однословный встроенный параметр DC JA: адрес J.
На самом деле функция IOR ассемблера вообще не вычисляет I или J. Вместо этого она заменяет четыре приведенных выше слова следующим:
LD LI Загрузить аккумулятор с помощью I (инструкция из двух слов) OR LJ ИЛИ аккумулятор с J (инструкция из двух слов)
После выполнения этого преобразования он не возвращается за пределы конца блока из четырех слов (который он только что изменил). Вместо этого он переходит на точный адрес, с которого он был вызван изначально. Инструкции BSI больше нет; теперь там есть две инструкции, которые он только что написал. Они объединяют два целых числа с помощью инструкции OR на машинном языке и оставляют результат в аккумуляторе, как и требуется.
Вызов IOR и преобразование блока из четырех слов происходит максимум один раз за запуск программы. Если проиллюстрированная выше строка Fortran выполняется снова, она выполняется быстрее, чем в первый раз. Аналогичные функции можно разработать для других полезных операций.
Функция, которая изменяет себя сама, как это делает IOR, не может использоваться в подпрограмме Fortran ни для одного из параметров этой подпрограммы (хотя ее можно использовать для объединения локальных переменных), поскольку она несовместима с подпрограммой SUBIN, обсуждавшейся выше. Преобразование IOR ее последовательности вызова из четырех слов, показанное выше, перемещает местоположение адреса переменной I. При последующих вызовах подпрограммы Fortran таблица ссылок на параметры будет содержать ошибку, и SUBIN исправит неправильное слово, в этом случае поместив новый адрес I над кодом операции OR.
1130 FORTRAN предлагает два формата с плавающей точкой: 32-битный формат «стандартной точности» и 40-битный формат «расширенной точности».
Стандартный формат точности содержит 24-битную мантисса с дополнением до двух , в то время как расширенная точность использует 32-битную мантисса с дополнением до двух . Этот формат полностью использует 32-битные целочисленные операции ЦП. Расширенный формат занимает три 16-битных слова, при этом старшие восемь бит первого слова не используются. Характерной чертой обоих форматов является 8-битное поле, содержащее степень двойки, смещенную на 128. Арифметические операции с плавающей точкой выполняются программным обеспечением. [34]
Карта *EXTENDED PRECISION
опций компилятора сообщает компилятору FORTRAN о необходимости использовать 40 бит вместо 32 бит для всех данных с плавающей точкой, смешивание форматов не предусмотрено.
Данные, которые нужно обработать, и инструкции, которые ими манипулируют, должны находиться вместе в основной памяти. Объем установленной памяти (от 4096 до 32768 слов) является ключевым ограничением. Fortran предоставляет несколько методов для написания больших программ, несмотря на это ограничение.
Fortran позволяет любой подпрограмме быть обозначенной как "LOCAL" (Load-on-Call). Каждая LOCAL подпрограмма является оверлеем ; она является частью исполняемой программы, находящейся на диске, но загружается в основную память (если она еще не там) только во время ее вызова. Так, например, шесть LOCAL подпрограмм потребуют только столько основной памяти, сколько требуется самой большой, а не общий объем для всех шести. Однако ни одна из шести не может вызвать другую, ни напрямую, ни через промежуточные подпрограммы.
Вся программа Fortran может передать управление последующей фазе, выходя в Supervisor с инструкцией загрузить последующую фазу в основную память. Большая программа может быть разделена на три части, отдельно скомпилированные, называемые PART1, PART2 и PART3. Выполнение начинается с // XEQ PART1
и в подходящей точке PART1 выполнит оператор Fortran CALL LINK(PART2)
и так далее. Имя последующей программы в CALL не может быть переменным, но логика программы может управлять тем, передается ли управление другой фазе, и какой CALL LINK
оператор выполняется. Как упоминалось выше, сам компилятор Fortran был написан таким образом, причем каждая фаза компиляции достигалась отдельной программой.
Программы, такие как программы Fortran, находятся в нижних адресах основной памяти (чуть выше Supervisor). Fortran выделяет пространство в верхних адресах для любых переменных и массивов, объявленных COMMON. Если последующая фаза программы содержит соответствующее объявление COMMON, то информация в этой общей области может быть разделена между фазами. Фазы могут опускать объявление COMMON без проблем, при условии, что эти фазы не настолько велики, чтобы их программный код вторгался в общую область. Хранилище COMMON не только разделяет данные между фазами; переменные COMMON в нижней памяти могут использоваться для передачи данных между основной программой и подпрограммами в пределах одной фазы, хотя данные могут быть потеряны при переходе к следующей фазе.
Примеры можно выполнить на эмуляторе IBM 1130, доступном на сайте IBM 1130.org.
В следующем листинге показана колода карт , которая компилирует и запускает ассемблерную программу, выводящую колоду карт на строчный принтер.
// РАБОТА // АСМ *СПИСОК * LCARD.ASM - СПИСОК КОЛОДЫ КАРТ НА СТРОЧНОМ ПРИНТЕРЕ * * ПРОГРАММА * НОВАЯ СТРАНИЦА НА ПРИНТЕРЕ * ПРОЧИТАЙТЕ КАРТУ * КОНВЕРТИРОВАТЬ ФОРМАТ * ПЕЧАТЬ СТРОКИ НА ПРИНТЕРЕ * ПЕРЕЙТИ К А * НАЧАТЬ LIBF PRNT1 ПЕРЕЙТИ НА НОВУЮ СТРАНИЦУ НА 1132 DC /3100 КАНАЛ ПРИНТЕРА 1-НОВАЯ СТРАНИЦА * СЛЕДУЮЩАЯ КАРТА LIBF 0 СЧИТАНА С КАРТРИДЕРА 1442 DC /1000 УПРАВЛЕНИЕ ДЛЯ ЧТЕНИЯ DC CBUFF МАГАЗИН 80 СТОЛБЦОВ CINP LIBF КАРТА0 ДК 0 B CINP LOOP ДО ПРОЧТЕНИЯ КАРТЫ * LIBF ZIPCO ПРЕОБРАЗУЕТ КАРТУ В ПРИНТЕР DC /1100 РАСПАКОВАННЫЙ, УПАКОВАННЫЙ DC CBUFF+1 ВХОДНОЙ БУФЕР DC PBUFF+1 ВЫХОДНОЙ БУФЕР КОЛИЧЕСТВО ПЕРСОНАЖЕЙ DC 80 ВЫЗОВ HLEBC HOLLERITH В EBCDIC * LIBF PRINT1 ПЕЧАТЬ 80 СИМВОЛОВ DC /2000 КОД УПРАВЛЕНИЯ ДЛЯ ПЕЧАТИ БУФЕР ПЕЧАТИ DC PBUFF DC PERR ОШИБКА ПЕЧАТИ POUT LIBF PRNT1 ПРОВЕРКА НА ПЕЧАТЬ ЗАВЕРШЕНА ДК 0 B POUT LOOP ДО ЗАВЕРШЕНИЯ * B NEXTC ПРОЧИТАЙТЕ СЛЕДУЮЩУЮ КАРТУ * * ДАННЫЕ * CBUFF DC 80 80 СТОЛБЦОВ НА КАРТУ БСС 80 * PBUFF DC 40 40 СЛОВ 80 СИМВОЛОВ БСС 40 * ПЕРР DC 0 БИ ПЕРР ЭТО ВОЗВРАЩАЕТСЯ К * ОБРАБОТЧИК ОШИБОК ПРИНТЕРА * ЧТО ПРИВЕДЕТ К ПРЕКРАЩЕНИЮ ПРОГРАММЫ * КОНЕЦ НАЧАЛО ПРОГРАММА ТОЧКА ВХОДА // КСЕК ДАННЫЕ ИСПЫТАНИЙ 1 ПРИВЕТ, МИР ДАННЫЕ ИСПЫТАНИЙ 2
В этом задании ассемблер оставляет результат своей сборки во временной области системного диска, а команда XEQ выполняет содержимое временной области. Странно выглядящий символ END START
имеет два значения: конец исходного кода ассемблера и имя точки входа процедуры, которая имеет метку START.
Исходный код ассемблера начинается со столбца 21 карты, а не с первого. В системах без дисковода ассемблер вбивал код в начало только что считанной карты (считыватель карт на самом деле был считывателем-перфоратором, со станцией перфорации после станции чтения), а затем считывал следующую карту. Для обработки прямых переходов и т. п. второй проход ассемблера буквально включал второй проход карт через считыватель/перфоратор. Если требовались изменения исходного кода, программист дублировал карты, чтобы получить колоду с пустыми столбцами 1-20, готовыми к следующему прогону через ассемблер.
По соглашению буферам предшествует количество слов. DC
(Define Constant) собирает слово количества, а следующее BSS
(Block Started by Symbol) резервирует необходимое количество слов для буфера. Буфер карты требует 80 слов, по одному для каждого столбца карты. Драйвер CARD0 считывает каждый столбец карты буквально, используя 12 из 16 бит в слове буфера, с битом, установленным на on для каждого отверстия, пробитого в соответствующей строке для этого столбца. Шаблон перфорации обычно описывает текстовый символ с использованием кода Холлерита . Клавиатура консоли также дает входные данные программе в коде Холлерита, единственный случай, когда два устройства используют одну и ту же кодировку символов.
Однако процедура принтера работает с текстом в 8-битном EBCDIC с двумя символами на слово, требуя буфера из 40 слов. Программа использует библиотечную процедуру ZIPCO для выполнения преобразования. Несмотря на видимость, оператор CALL HLEBC
не выполняется, поскольку HLEBC — это не подпрограмма, а таблица преобразования Холлерита в EBCDIC, поставляемая IBM. Оператор CALL предоставляет адрес таблицы для ZIPCO и гарантирует, что загрузчик ссылок включает таблицу в программу, таким образом, это пятый параметр для ZIPCO, хотя один занимает два слова памяти: кодовое слово операции BSI для CALL не используется и, таким образом, обычно теряется, но второе слово расширения CALL HLEBC
— это адрес таблицы HLEBC, необходимой ZIPCO. После преобразования программа отправляет преобразованный вывод, теперь в буфере PBUFF, на принтер через драйвер PRNT1. Снова программа зацикливается, пока драйвер принтера не сообщит о завершении, затем программа считывает следующую карту.
В этом примере нет кода, который бы решал, когда остановиться. Более полная программа проверяла бы карты, начинающиеся с //
, что обозначает начало следующего задания. Чтобы остановить устройство чтения карт как можно скорее, программа могла бы проверить код Холлерита /
еще до преобразования карты в EBCDIC.
Вызов CARD0 для чтения карты инициирует эту операцию и немедленно возвращается к вызывающему, который может продолжить другую деятельность. Однако пример программы не пытается перекрывать ввод и вывод с помощью буферов, хотя у него есть две отдельные рабочие области; он просто возвращается к CIMP для повторного тестирования. После того, как CARD0 обнаружил прерывание завершения операции считывателя карт, он возвращается на одно слово дальше, таким образом пропуская переход обратно к CIMP и выходя из цикла.
Примеры процедур не запускают устройства ввода-вывода на максимальной скорости. В частности, считыватель карт, всего через несколько миллисекунд после сообщения о завершении чтения карты, начнет свою последовательность остановки, после чего новой команде чтения придется ждать, чтобы инициировать другой цикл чтения. Считыватель IBM 1442 мог считывать 400 карт/минуту на полной скорости, но даже небольшая задержка в командах чтения могла бы вдвое сократить его пропускную способность или даже хуже. Программа на Fortran не могла бы завершить даже самую простую обработку ввода вовремя, и поэтому не могла бы считывать карты на полной скорости. Один общий DO
цикл Fortran для считывания карт заставлял двигатель останавливаться и запускаться так часто, что ускорял износ. С буферизацией управление считывателем карт могло перекрываться обработкой, и считыватель мог работать на полной скорости с большими колодами данных, но память для более сложной программы и для буферов часто была в дефиците.
Даже с ассемблером и двойной буферизацией программа для вывода колоды карт со считывателя IBM 2501 (1000 карт/минуту) на строчный принтер не справлялась, поскольку преобразование из шаблонов отверстий карт в EBCDIC для принтера, выполняемое EBPRT, было слишком медленным; вместо этого требовались более сложные ZIPCO и HLEBC, как в примере.
На следующем изображении показан простой сеанс APL \ 1130. Этот сеанс был выполнен с помощью симулятора 1130, доступного на IBM 1130.org.
Приведенный выше сеанс показывает вход, сложение целых чисел от 1 до 100, генерацию таблицы сложения для целых чисел 1..5 и выход.
В том же году, когда была представлена модель 1130, компания Digital Equipment Corporation представила меньший, более дешевый и более продаваемый 12-разрядный PDP-8 , признанный первым успешным мини-компьютером.
... Я колотил в двери местного офиса продаж IBM, пока продавец не сжалился надо мной. После того, как мы немного поболтали, он вручил мне Fortran [руководство]. Я уверен, что он дал его мне, думая: «Я больше никогда не услышу об этом парне». Я вернулся на следующей неделе со словами: «Это действительно круто. Я прочитал все и написал небольшую программу. Где я могу найти компьютер?» Этот парень, к моему удовольствию, нашел для меня время программирования на IBM 1130 по выходным и поздним вечерам. Это был мой первый опыт программирования, и я должен поблагодарить того анонимного продавца IBM за то, что он положил начало моей карьере. Спасибо, IBM.
Система представляла собой компьютер IBM 1130, машину размером со стол с 8 КБ оперативной памяти, дисководом на 512 КБ, устройством чтения бумажной ленты Teletype CX и перфоратором бумажной ленты BRPE, а также фотомеханическим наборным устройством Photon 713. Это задание стало моим первым опытом управления базой данных документов, пригодных для машинного считывания: я научился аккуратно сворачивать перфорированную бумажную ленту, чтобы ее можно было аккуратно хранить в цилиндрических корзинах для бумаг.
Тем временем, хотя я об этом и не знал, корни обобщенной разметки уже были заложены. Исторически электронные рукописи содержали управляющие коды или макросы, которые заставляли документ форматироваться определенным образом («определенное кодирование»). Напротив, обобщенное кодирование, которое началось в конце 1960-х годов, использует описательные теги (например, «заголовок», а не «формат-17»).
Из примерно 10 000 произведенных систем по состоянию на 2024 год известно о существовании следующих:
Предположения о том, почему продукту был присвоен номер 1130, основывались на следующих вариантах:
Другие предполагают, что существование IBM 1130 объясняет, почему в семействе машин PDP-11 не появилось ни одного компьютера с обозначением «11/30». [54]
{{cite web}}
: Отсутствует или пусто |title=
( помощь ){{cite web}}
: Отсутствует или пусто |title=
( помощь )