Honeywell ARGUS - Honeywell ARGUS

АРГУС был Язык ассемблера разработан в 1960-х годах Honeywell для них Honeywell 800 и 1800 компьютеров. Название ARGUS было акроним расшифровывается как Автоматическая система создания и обновления подпрограмм.[1] Как и в случае с другими языками ассемблера, каждая строка ARGUS была скопирована на одну карту и связана с одним словом в памяти, за исключением того, что одна команда ARGUS, RESERVE, могла зарезервировать любое указанное количество слов в указанной позиции. Команда RESERVE также была исключительной, так как не предписывала начальные данные в зарезервированных словах. За некоторыми исключениями слова машинного языка кодировались в том же порядке, что и строки ARGUS.[2]

Память Honeywell 800

Honeywell 800 и 1800 имели основную память и управляющую память, в обеих использовались ферритовые сердечники. В основной памяти было от 4 до 16 банки, в зависимости от требований заказчика. Каждый банк содержал 2048 слов по 48 бит в каждом. Фактическое количество банков в отдельной установке должно быть кратно 4.[1]

Контрольная память имела 256 регистры по 16 бит каждый. Теоретически в любой момент времени на машине может быть запущена одна операционная система и 7 прикладных программ, каждая с эксклюзивным использованием 32 регистров.[1]

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

Расположение команд ARGUS

Каждая строка команды ARGUS содержит следующие поля:

Место расположения[3] было необязательным именем ARGUS, которое нужно было присвоить этому слову в памяти. Когда адрес каждого слова был назначен в памяти, имя ARGUS строки будет связано с позицией соответствующего слова. Другие строки ARGUS могут ссылаться на это имя, и их словам будет назначен правильный адрес памяти. В программе каждое имя должно быть уникальным.

Это поле может начинаться с R,. В таком случае остальная часть карты является только примечаниями.

Это поле может начинаться с X или X, адресного имени. Если так, то эта линия и любые другие линии X, будут размещены вдали от линий, не отмеченных таким образом. Затем к ним можно обратиться с помощью X, + n или имени адреса в поле адреса.[4]

Это поле может начинаться с M, имени маски. Если это так, строка определяет Маска

Операция: имя ARGUS команды машинного языка или команды только ARGUS. При необходимости за ним может следовать адрес маски. Несколько команд содержали дополнительную информацию.

Адреса A, B и C: переводятся в машинный код (см. Ниже). Адреса A и B обычно были двумя входными словами, а адрес C был местом назначения.

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

Схема команд машинного языка

Каждая команда машинного языка использовала одно слово из 48 бит. Он был разделен на 4 раздела по 12 бит в каждой. Первые 12 битов определяют операцию со вспомогательной информацией, включая адрес смещения любой маски для команды. Три других раздела были адресами A, B и C.

Если была указана маска, то окончательный результат команды пройдет через эту маску до достижения пункта назначения. Например, если бит 17 маски был равен 1, то результат перешел бы в бит 17 адресата. Если бит 17 маски был 0, то что-то еще перешло бы в бит 17 адресата. Это может быть 0 или неизмененный бит 17 входного слова, в зависимости от команды.

Сегменту разрешалось использовать до 16 масок, и они должны были состоять из последовательных слов, начиная с адреса, все последние четыре бита которого были равны 0. Все они имели имена местоположений ARGUS. Специальный регистр, называемый регистром маски, содержал базовый адрес. Поле команды имело 4 бита для хранения адреса смещения названной маски.

Режимы адресации памяти

Для большинства команд секции адресов A, B и C использовались для обозначения фактических мест в памяти. Было шесть режимов адресации. Два использовались редко. Остальные были: прямой, прямой специальный регистр, косвенная адресация и индексирование.

Прямая адресация

Адрес основной памяти указывается непосредственно в команде. В машинном языке один из 12 битов указывает на прямой режим, другие 11 указывают точный адрес. 11 битов могут представлять числа от 0 до 2047, но не больше. Однако это наиболее эффективный тип адресации. Эта дилемма объясняет, почему в банке всего 2048 слов, а сегмент ограничен только одним банком.

Есть два способа записать это в строке кода ARGUS: 1. Имя, ранее определенное в столбце местоположения. К этому можно добавить число (десятичное), например: BUFFER0 + 592. Местоположение на несколько строк (слов) за текущей строкой, например C, 2 означает две строки за этой.

Косвенная адресация

В 12 битах идентифицируются режим адресации и адрес регистра в управляющей памяти. Также указывается приращение от 0 до 32. Адрес основной памяти находится в регистре в управляющей памяти. Процессор сначала получит адрес основной памяти из регистра, а затем вызовет слово по этому адресу основной памяти. Наконец, он увеличит (инкремент) значение регистра на указанную величину. 16-битный адрес из регистра содержит адрес банка от 0 до 31 с использованием 5 бит и слово в этом банке с использованием 11 бит. Увеличение рекомендовалось только для адресов A и B.

В ARGUS: N, R0,3 означает использование регистра R0, а затем увеличение его на 3.

Прямой специальный регистр

К регистру обращаются напрямую так же, как и к слову в основной памяти.

В ARGUS: Z, R0,3 означает чтение или запись в регистр R0 напрямую, а затем увеличение его на 3. Увеличение при записи не рекомендуется.

Индексированная адресация

Это применимо только к 8 регистрам, называемым индексными регистрами. Требуется 3 бита для определения индексного регистра и еще 7 для указания смещения от 0 до 127. Таким образом, смещение добавляется к полному адресу основной памяти. Это мощный инструмент. Это полезно для обработки многословного текста или записи. Так обычно обращаются к ленточным буферам.

В ARGUS: X0,35 или 0,35 означает использование индексного регистра 0, увеличение этого числа на 35 (десятичное) и чтение или запись в это место в основной памяти. НЕ меняйте значение в X0.

Неактивный адрес

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

Регистры

Как уже упоминалось, программа имела доступ к 32 регистрам. 8[5] имел специальные функции, 16[5] регистры (от R0 до R15) были универсальными, а 8 (от X0 до X7) были индексными регистрами.

Индексная адресация была возможна только для индексных регистров.

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

SC (Счетчик последовательностей) SH (История последовательностей) CSC (Счетчик сопоследовательностей) CSH (История сопоследовательностей) MSK (Регистр маски) AU1 и AU2

Во время работы счетчик последовательностей всегда содержит полный адрес выполняемой команды. Обычно команды выполняются в порядке расположения. История последовательностей содержит последнее значение счетчика последовательностей. Это значение должно быть сохранено сразу после перехода к подпрограмме. В противном случае возврат будет невозможен. Счетчик сопоследовательностей и история выполняют те же функции для любой команды, которая имела X в начале своего местоположения ARGUS.

Регистр MSK содержит полное расположение первой маски (см. Ниже).

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

Команды

Каждая строка ARGUS определяет слово в памяти. При нормальной работе процессор выполняет каждую команду в адресном порядке. Некоторые команды могут заказывать JUMP на другой адрес (путем прямой адресации в тот же банк).

Арифметика

Команды WA, BA и DA по-разному получают числа из адресов A и B, складывают их вместе и помещают результат в адрес C.

Команды BS и DS вычитают число в адресе B из числа в адресе A, помещая результат в адрес C.

WA (Word Add) обрабатывает два входных числа как двоичные числа без знака. Это часто использовалось для добавления приращения к известному адресу.

BA и BS (двоичное сложение и двоичное вычитание) обрабатывают два входных числа как двоичные со знаком.

DA и DS (десятичное сложение и десятичное вычитание) обрабатывают два входных числа как десятичные со знаком.

Крайние левые четыре бита определяют знак. Если все они равны нулю, то знак положительный. В противном случае - отрицательно.

Команда DM умножает число в адресе B на число в адресе A, помещая левую половину результата в адрес C. Остальные младшие цифры остаются в LOP, нижнем регистре вывода. Оттуда они могут быть перенесены на адрес основной памяти с помощью команды TX или TS. DM полностью поддерживается адаптером с плавающей запятой. При его отсутствии требуется моделирование.

Передача данных и управление программой

TX Передача с адреса A на адрес C. Адрес B ДОЛЖЕН быть неактивным (см. Режимы адресации)

TS Передача с адреса A на адрес B, затем JUMP вне очереди к команде по адресу C. C должен быть прямым адресом. При желании A и B могут быть неактивными, и команда становится чистым прыжком. Это ближайшая к машине команда GOTO.

MT Передача с адреса A на адрес C несколько раз. Количество раз указывается в виде десятичного числа в поле адреса B. Это число НЕ является истинным адресом. Он преобразуется в двоичный и помещается в рабочий раздел команды машинного языка. Значит, значение не может быть большим.[6] Адрес C ДОЛЖЕН быть косвенным с приращением на единицу или более, чтобы каждая отдельная передача работала с другим словом. Эта команда редко использовалась в моем опыте программирования приложений. Однако он может быть более полезным в операционных системах и компиляторах.

TN Передача с адреса A на адрес C. Затем переход с A + 1 на C + 1. Продолжайте в целом столько раз, сколько указано в адресе B. Что касается MT, это десятичное число, которое заканчивается в двоичном формате в операционном разделе машинной команды.[7] Эта команда часто использовалась в приложениях, особенно для «гашения» областей текста. Эта команда использовала регистры AU1 и AU2 для управления приращениями адреса.

NA Сравните адреса A и B. Если они равны, продолжайте как обычно. Если неравный JUMP на адрес C.[8]

LA Сравните адреса A и B. Если A (как двоичное без знака) меньше или равно B, продолжайте как обычно. В противном случае ПЕРЕЙДИТЕ на C.[9] Для петли со счетчиком LA безопаснее NA. Если логика сбивается, тогда цикл NA может исчезнуть.

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

Константы и определение начального значения

Это были команды ARGUS, которые нужно было преобразовать в начальное двоичное значение адреса в памяти. Фактическое значение будет поступать на адрес A, продолжаясь до адресов B и C, пока это необходимо. Большинство этих строк предназначались для использования в качестве констант и имели код местоположения для ссылки активными командами.

OCT Перфорированная буква или цифра преобразуется в трехбитовый восьмеричный код. Таким образом, 0 становится 000, 1 становится 001, 2 становится 010 .... и 7 становится 111.

HEX Перфорированная буква или цифра преобразуется в четырехбитный шестнадцатеричный код. 0 становится 0000, 1 становится 0001, ..... 9 становится 1001. Затем от B до G обозначают десятичные числа от 10 до 15, что в двоичном формате составляет от 1010 до 1111. Шестнадцатеричный код Honeywell используется от B до G, где IBM использует от A до F.

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

ALF Перфорированная буква или цифра преобразуется в соответствии с собственным двоичным кодом Honeywell для буквенно-цифровых чисел, букв и символов.

M, x, текст плюс отдельные записи x, текст в КАЖДОМ поле адреса. Здесь x может быть O, H, D или A, позволяя кодировать каждый 12-битный участок слова с использованием любого из вышеперечисленных методов.

Для OCT, HEX и DEC крайние левые 4 бита используются для обозначения знака числа.

Маски и команды переключения

Маска была константой с записью местоположения M, имя-маски. Собрать все маски вместе в ARGUS было хорошей практикой. В любом случае АРГУС соединит их в последовательные слова. Максимальное количество масок - 15.

Маска может использоваться для изменения действия любой команды, которая может изменить значение слова, например: TX, maskname применит маску «maskname» к команде TX. Маскирование было необходимо для команды «Переключить слово», но не очень ценно для других команд. Некоторые установки имели стандарт использовать их ТОЛЬКО для Switch Word. Полный адрес первой маски будет помещен в регистр MSK, а смещение отдельной маски будет помещено в раздел команд той команды машинного языка, для которой оно было указано. Следовательно, программе нужен был только один набор масок, и их можно было использовать из любого сегмента.

Команды переключения слова использовались для перемещения некоторых битов слова в другие битовые позиции. Было две команды переключения слова, и они были очень похожи. Команды Switch Word и Extract содержали команду ARGUS: SWE, имя-маски, адрес A был источником, а адрес C - местом назначения. Поле адреса B предназначалось для количества переключателей: x, n, d. x был B, D или A, представляющим двоичный, десятичный или буквенно-цифровой формат, то есть единицы из 1, 4 или 6 бит соответственно. d было L или R для левого или правого.

В действии:

Слово было получено из адреса A. Биты были перемещены влево или вправо на количество и размер указанной единицы. Биты, которые «отвалились» от конца, были возвращены в противоположный конец. Сдвинутое слово пропускалось через маску побитно. Если бит маски равен 1, то сдвинутый бит будет скопирован. В противном случае будет передан бит 0. Модифицированное слово было помещено в адрес C

Другой командой «Переключить слово» была команда «Переключить слово и наложение», SWS, с тем же синтаксисом. Действие отличалось маской. Если бит маски был 0, то в выходное слово помещался несмещенный, а не сдвинутый бит. Для бита маски 1 действие было таким же, как и для SWE.

ExampleAddress A содержит 8 символов по 6 бит каждый: ABCDEFGHMask ONECHAR содержит 1 в крайних правых 6 битах и ​​0 в других местах.

Команда: SWE, ONECHAR A A, 4, R C, тогда адрес C будет содержать: 0000000D

Если команда: SWS, ONECHAR A A, 4, R C, тогда адрес C будет содержать: ABCDEFGD

В машинном языке все сдвиги были представлены как двоичные права. Все коды ARGUS в формате x, n, d могут быть уменьшены до двоичного значения.

Макросы и подпрограммы

Макрос будет вызываться: L $, macroname Это запросит ассемблер вставить текст ARGUS макроса «macroname» в этот момент. Это было сделано на ранней стадии сборки до того, как ARGUS был переведен в машинный код. В стандартной библиотеке (хранящейся на собственной ленте) было довольно много макросов, и клиенты могли добавить больше. Макросы GET и PUT будут получать элемент из входного ленточного буфера или помещать элемент в выходной ленточный буфер, при необходимости считывая или записывая запись.

Было два типа подпрограмм. Один был полностью написан на ARGUS. Вот пример использования подпрограммы SUBA:

Место расположенияКомандаАдрес ААдрес BАдрес C
U, NEWPROGMYPROG
Р,
R, ОСНОВНАЯ ПРОГРАММА НАЧИНАЕТСЯ
R, R ЗАПЯТАЯ ОПРЕДЕЛЯЕТ СТРОКУ КАК СТРОКА КОММЕНТАРИИ.
Р,
.......
.......
R, КОМАНДА TS ВЫЗЫВАЕТ ПЕРЕХОД В ПОДПРОГРАММУ SUBA. СЛЕДУЮЩЕЕ МЕСТО СОХРАНЯЕТСЯ В РЕГИСТРЕ SH.
TS--СУБА
R, SUBROUTNE вернется сюда.
WA......
....
....
R, ОСНОВНАЯ ПРОГРАММА ЗАКАНЧИВАЕТСЯ ЗДЕСЬ. ПОДПРОГРАММЫ МОГУТ НАЧАТЬ.
Р,
R, SUBROUTINE SUBA
Р,
R, ПОДПРОГРАММА ДОЛЖНА НАЧАТЬ С СОХРАНЕНИЯ СОДЕРЖИМОГО РЕГИСТРА ИСТОРИИ ПОСЛЕДОВАТЕЛЬНОСТИ (SH).
R, ИНАЧЕ МОЖЕТ БЫТЬ УТЕРЯН ДРУГОЙ TS, NA ИЛИ LA COMMAND.
Р,
СУБАTXZ, SHZ, R0
R, ПОДПРОЧНЫЙ ПРОЦЕСС НАЧИНАЕТСЯ
.........
R, ПОДПРОГРАММА ЗАВЕРШЕНА, ПЕРЕЙДИТЕ К СОХРАНЕННОМУ МЕСТОПОЛОЖЕНИЮ, ЧТОБЫ ПРОДОЛЖИТЬ ОСНОВНУЮ ПРОГРАММУ.
TS--N, R0
R, КОНЕЦ СУБЫ

Подпрограммы другого типа поставлялись на машинном языке с оболочкой Macro. Обычно его писали сотрудники Honeywell. Макрос использовал команду GOSUB для вызова подпрограммы.

Команды с плавающей запятой

Honeywell 1800 имел дополнительный Плавающая точка Адаптер для научных вычислений. Для этого был набор команд.[10] Эти команды также были доступны в форме моделирования, если оборудование не включает адаптер, но это не рекомендуется для регулярного использования. Команды ARGUS с плавающей запятой были одинаковыми вне зависимости от наличия адаптера. В его отсутствие ARGUS предоставит имитацию истинных операций с плавающей запятой на машинном языке.

Периферийное управление вводом / выводом

Адреса устройств ввода и вывода на машинном уровне представляли собой две восьмеричные цифры 0-7. На уровне ARGUS это были две буквы A-G. Первые цифры идентифицируют контроллер, вторая цифра - номер устройства на этом контроллере.

Для обработки ленты одна единица данных на ленте называлась в руководствах Honeywell записью. IBM назвал и до сих пор называет этот блок. Подразделение записи называлось элементом. IBM назвала это рекордом. Терминология IBM стала американским стандартом.

Команды:

Команда RW, AA перематывает ленту на магнитофон AA, восьмеричное 00.

Команда RF, AA прочитает следующую запись на магнитофоне AA в восьмеричном формате 00.

Команда RB, AA будет считывать предыдущую запись на ленточном накопителе AA, восьмеричное 00, без доставки данных. Чтобы изменить существующую ленту, вы можете использовать RF, чтобы найти первую запись, которая вам не нужна, затем RB, чтобы добраться до места перед ней, затем WF, чтобы записать поверх нее и далее.

Команда WF, AB запишет следующую запись на магнитофон AB, восьмеричный 01.

Команда RF, GA считывает следующую карту на устройстве чтения карт, устройство GA, восьмеричное 70.

Адрес A будет первым словом в буфере для этой операции чтения или записи. Было нормально использовать два буфера для каждого устройства, чтобы чтение или запись могли выполняться параллельно с обработкой. Это называется двойная буферизация. Размер буфера был ограничивающим фактором в размере «записей» (блоков), поскольку основная память была ограничена.

При подготовке записи на ленту каждый элемент заканчивался словом End of Item с предписанным кодом. Каждая запись завершалась словом Орто для проверки ошибок, за которым следовало слово Конец записи. После того, как выходной буфер был заполнен элементами, была использована команда Compute Ortho (CC) для вычисления слова Ortho и предоставления слова конца записи. Для команды «Вычислить орто» адресами A и B отмечены позиции первого и последнего слова.[11] Затем запись будет записана командой WF. Наконец, управление будет возвращено основной программе.

Для нормальной работы приложения все периферийные команды, кроме, возможно, RW, должны быть помещены в подпрограмму.

Команды администрирования программы

Были команды ARGUS для управления программами. Для сборки программы требовалось:[12]

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

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

U, NEWPROG progname. Следующие карточки предназначены для полной новой программы под названием progname.U, REASSMB progname. Следующие карточки представляют собой изменения существующей программы progname.U, NEWSEG progname segname. Следующие карточки представляют собой полный, новый сегмент, называемый имя сегмента (новой или существующей) программы с именем progname.U, SEGMENT progname segname Следующие карты представляют собой версии для сегмента имя сегмента программы progname.U, ENDSEG Это конец сегмента (или его версий) .U, ENDPROG Это это конец программы (или ее ревизий).

Рекомендации

  1. ^ а б c Руководство компании по продаже Honeywell 1800
  2. ^ Первоначальный автор этой статьи запрограммировал Honeywell 1800 для Восточное электрическое управление, Великобритания с января по август 1966 г., и эта статья в основном написана по памяти. Если у кого-то есть документальный материал, и он может просмотреть и исправить статью, предоставив встроенные ссылки, это будет полезно. Эта информация в целом верна, но может быть обнаружено несколько ошибок в деталях. Кажется, лучше написать статью по памяти, чем ждать статьи, на которую полностью ссылаются, которая может никогда не появиться. Компания Honeywell сыграла важную роль в компьютерной индустрии зародыша, и ее работа заслуживает упоминания
  3. ^ Возможно, у него было другое имя, но его функция заключалась в том, чтобы отслеживать слово в памяти.
  4. ^ Я никогда не видел, чтобы это использовалось, кроме собственных макросов Honeywell
  5. ^ а б Не уверен насчет этого числа
  6. ^ Я думаю максимум было 63
  7. ^ Я думаю максимум было 15
  8. ^ Возможно, он перескакивает на РАВНО и продолжает на НЕРАВНО. Не совсем уверен
  9. ^ Возможно наоборот
  10. ^ что я не узнал
  11. ^ Деталь Compute Ortho требует проверки
  12. ^ Я немного догадываюсь

внешняя ссылка

Ашер Оплер и Майра Грей (1961), Разработка многопрограммного алгебраического компилятора (Только подписка)