Ханивелл АРГУС
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
ARGUS — аббревиатура от «Автоматическая система создания и обновления программ» . [1] был языком ассемблера, разработанным в конце 1950-х годов. [2] компании Honeywell для компьютеров Honeywell 800 и 1800.
Как и в других языках ассемблера, каждая строка ARGUS копировалась на одну карту и ассоциировалась с одним словом в памяти, за исключением того, что одна команда ARGUS, RESERVE, могла зарезервировать любое указанное количество слов в указанной позиции. Команда RESERVE отличалась еще и тем, что не прописывала исходные данные в зарезервированные слова. За некоторыми исключениями, слова машинного языка кодировались в том же порядке, что и строки ARGUS. [ нужна ссылка ]
Память Honeywell 800
[ редактировать ]Honeywell 800 и 1800 имели основную и управляющую память, оба использовали ферритовые сердечники. Основная память имела от 4 до 16 банков , в зависимости от требований заказчика. Каждый банк содержал 2048 слов по 48 бит каждое. Фактическое количество банков в отдельной установке должно было быть кратно 4. [ нужна ссылка ]
Память управления имела 256 регистров по 16 бит каждый. В любой момент времени на машине теоретически может быть запущена одна операционная система и 7 прикладных программ, каждая с эксклюзивным использованием 32 регистров. [ нужна ссылка ]
Программу, требующую более 2048 слов (данные и инструкции вместе взятые), приходилось разбивать на сегменты по 2048 слов или меньше. Каждый сегмент будет иметь эксклюзивное право использования одного банка основной памяти. Были специальные инструкции по передаче управления от одного сегмента к другому.
Расположение команд ARGUS
[ редактировать ]Каждая строка команды ARGUS имела шесть полей:
Местоположение — это необязательное имя ARGUS, которое можно присвоить этому слову в памяти. Когда адрес каждого слова будет присвоен в памяти, имя строки ARGUS будет связано с позицией соответствующего слова. Другие строки ARGUS могут ссылаться на это имя, и их словам будет присвоен правильный адрес памяти. В программе каждое имя должно было быть уникальным.
Это поле может начинаться с R, . Если да, то остальная часть карты — это только примечания.
Это поле может начинаться с X или X,имя_адреса. Если да, то эта линия и любые другие линии X будут располагаться отдельно от строк, не отмеченных таким образом. Затем к ним можно обратиться по X,+n или по имени адреса в поле адреса. [ нужна ссылка ]
Это поле может начинаться с M,maskname. Если да, то строка определяет маску
Операция: имя ARGUS команды машинного языка или команды только для ARGUS. При необходимости за этим может следовать адрес маски. Несколько команд имели дополнительную информацию.
Адреса A, B и C: должны быть переведены в машинный код (см. ниже). Адреса A и B обычно были двумя входными словами, а адрес C был местом назначения.
Идентификатор: Обычно серийный номер, наносимый на карту перфоратором. Используется для использования любых карт, которые могут быть выброшены.
Расположение команд машинного языка
[ редактировать ]Каждая команда машинного языка использовала одно слово длиной 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+59.2. Расположение на несколько строк (слов) дальше текущей строки, например 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 бита, а для указания смещения от 0 до 127 — еще 7. Таким образом, смещение добавляется к полноразмерному адресу основной памяти. Это мощный инструмент. Это полезно для обработки многословного текста или записи. Ленточные буферы обычно обращаются таким образом.
В ARGUS: X0,35 или 0,35 означает использование индексного регистра 0, увеличение этого числа на 35 (десятичное) и чтение или запись в это место в основной памяти. НЕ меняйте значение X0.
Неактивный адрес
[ редактировать ]В ARGUS поле адреса было тире (-). Это означало, что поле будет игнорироваться процессором, тем самым сводя на нет часть обычного действия команды.
Регистры
[ редактировать ]Как уже говорилось, программа имела доступ к 32 регистрам. 8 имели специальные функции, 16 регистров (от R0 до R15) были общего назначения и 8 (от X0 до X7) были индексными регистрами. [ нужна ссылка ]
Индексная адресация была возможна только для индексных регистров.
Прямая и косвенная адресация применялась как к регистрам общего назначения, так и к индексным регистрам. Вероятно, они будут работать и с другими регистрами, но это будет плохой практикой.
Специальными регистрами были:
SC (Sequence Counter) SH (Sequence History) CSC (Cosequence Counter) CSH (Cosequence History) MSK (Mask Register) AU1 and AU2
Они использовались компьютером для выполнения программы.
Во время работы счетчик последовательностей всегда содержал полный адрес выполняемой команды. Обычно команды выполнялись в порядке расположения. История последовательности содержала последнее значение счетчика последовательности. Это значение нужно было сохранить сразу после перехода к подпрограмме. В противном случае вернуться было бы невозможно.Счетчик последовательных последовательностей и история выполняли одни и те же функции для любой команды, которая имела X в начале ее местоположения ARGUS.
Регистр MSK содержал полное местоположение первой маски (см. ниже).
AU1 и AU2 использовались внутри некоторых команд, особенно TN. Они также могут использоваться программами. Однако существовал риск того, что внутренняя операция может помешать, поэтому это был неразумный выбор.
Команды
[ редактировать ]Каждая строка ARGUS определяет слово в памяти. При нормальной работе процессор выполняет каждую команду в порядке адресации. Некоторые команды могут заказывать ПЕРЕХОД на другой адрес (путем прямой адресации в тот же банк).
Арифметика
[ редактировать ]Команды 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, затем внеочередной переход к команде по адресу C. C должен быть прямым адресом. При желании A и B могут быть неактивными, и команда станет чистым переходом. Это самое близкое к команде GOTO устройство.
MT Передача с адреса А на адрес С несколько раз. Количество раз указывается в виде десятичного числа в поле адреса B. Это число НЕ является истинным адресом. Он преобразуется в двоичный формат и помещается в раздел операций команды машинного языка. Поэтому значение не может быть большим. [ нужна ссылка ] Адрес C ДОЛЖЕН быть косвенным с приращением на единицу или более, чтобы каждая отдельная передача выполнялась с отдельным словом. В моем опыте программирования приложений эта команда использовалась редко. Однако это может быть более полезно в операционных системах и компиляторах.
TN Передача с адреса A на адрес C. Затем передача с A+1 на C+1. Продолжайте в общей сложности столько раз, сколько указано в адресе B. Что касается MT, это десятичное число, которое заканчивается в двоичном формате в разделе операций машинной команды. [ нужна ссылка ] Эта команда часто использовалась в приложениях, особенно для «зачеркивания» областей текста. Эта команда использовала регистры AU1 и AU2 для управления приращением адреса.
NA Сравните адреса A и B. Если они равны, продолжайте как обычно. Если не равно, перейдите по адресу C. [ нужна ссылка ]
LA Сравните адреса A и B. Если A (как беззнаковый двоичный файл) меньше или равен B, продолжайте как обычно. В противном случае перейдите к C. [ нужна ссылка ] Для цикла со счетчиком LA безопаснее, чем NA. Если логика сбивается, цикл NA может выйти из строя.
Пиар Продолжаем. Это была команда «ничего не делать», которая, тем не менее, заняла некоторое время. Все три адреса будут неактивны. Его можно использовать в цикле, чтобы дождаться, пока оператор предпримет какое-то действие, прежде чем, возможно, напомнить ему.
Константы и определение начального значения
[ редактировать ]Это были команды 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,text плюс отдельные записи x,text в КАЖДОМ поле адреса. Здесь x может быть O, H, D или A, что позволяет кодировать каждую 12-битную часть слова любым из описанных выше методов.
Для OCT, HEX и DEC самые левые 4 бита используются для обозначения знака числа.
Маски и команды переключения
[ редактировать ]Маска представляла собой константу с записью местоположения M,maskname. Хорошей практикой было объединение всех масок в ARGUS. В любом случае ARGUS соединит их в последовательные слова. Максимальное количество масок — 15.
Маску можно использовать для изменения действия любой команды, которая может изменить значение слова, например: TX,maskname применит маску «имя маски» к команде TX. Маскирование было важно для команды Switch Word, но не очень полезно для других команд. В некоторых установках был стандарт, позволяющий использовать их ТОЛЬКО для Switch Word. Полный адрес первой маски будет помещен в регистр MSK, а смещение отдельной маски будет помещено в командный раздел команды машинного языка, для которой оно было указано. Следовательно, программа нуждалась и имела только один набор масок и их можно было использовать из любого сегмента.
Команды переключения слова использовались для перемещения некоторых битов слова на другие битовые позиции. Было две команды Switch Word, и они были очень похожи. В 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.
Другой командой Switch Word была Switch Word и Superimpose, SWS, с тем же синтаксисом. Действие отличалось на этапе маски. Если бит маски был равен 0, то в выходное слово помещался несдвинутый, а не сдвинутый бит. Для бита маски, равного 1, действие было таким же, как и для SWE.
ПримерАдрес A содержит 8 символов по 6 бит каждый: ABCDEFGH.Маска ONECHAR содержит 1 в крайних правых 6 битах и 0 в остальных.
Команда:ШВЕ,ONECHAR AA,4,RCТогда адрес C будет содержать: 0000000D.
Если команда:SWS,ONECHAR AA,4,RCТогда адрес C будет содержать: ABCDEFGD.
В машинном языке все сдвиги были представлены как двоично-справа. Все коды ARGUS в формате x,n,d могут быть сокращены до двоичного права.
Макросы и подпрограммы
[ редактировать ]Макрос будет вызываться:L$,имя макросаЭто потребует от ассемблера вставить в эту точку текст ARGUS макроса «имя макроса». Это было сделано на ранней стадии сборки, прежде чем ARGUS был переведен в машинный код. В стандартной библиотеке было довольно много макросов (хранящихся на отдельной ленте), и клиенты могли добавлять больше. Макросы GET и PUT будут получать элемент из входного ленточного буфера или помещать элемент в выходной ленточный буфер, считывая или записывая запись в зависимости от ситуации.
Было два типа подпрограмм. Один был полностью написан на ARGUS. Вот пример использования подпрограммы SUBA:
Расположение | Команда | Адрес А | Адрес Б | Адрес С |
---|---|---|---|---|
У, НЬЮПРОГ | МАЙПРОГ | |||
Р, | ||||
R, ОСНОВНАЯ ПРОГРАММА НАЧИНАЕТСЯ | ||||
R, ЗАПЯТЬЯ R ОПРЕДЕЛЯЕТ СТРОКУ КАК СТРОКУ КОММЕНТАРИЯ. | ||||
Р, | ||||
....... | ||||
....... | ||||
R, КОМАНДА TS ВЫЗЫВАЕТ ПЕРЕХОД К ПОДПРОГРАММЕ SUBA. СЛЕДУЮЩЕЕ МЕСТО СОХРАНЯЕТСЯ В РЕГИСТРЕ SH. | ||||
ТС | - | - | НИЖЕ | |
R, ПОДПРОЦЕНТ ПЕРЕХОДИТ ЗДЕСЬ. | ||||
Вашингтон | ...... | |||
.... | ||||
.... | ||||
R, ОСНОВНАЯ ПРОГРАММА ЗАВЕРШАЕТСЯ ЗДЕСЬ. ПОДПРОГРАММЫ МОЖЕТ НАЧАТЬСЯ. | ||||
Р, | ||||
R, ПОДПРОГРАММА СУБА | ||||
Р, | ||||
R, ПОДПРОГРАММА ДОЛЖНА НАЧИНАТЬСЯ С СОХРАНЕНИЯ СОДЕРЖИМОГО РЕГИСТРА ИСТОРИИ ПОСЛЕДОВАТЕЛЬНОСТИ (SH). | ||||
R, В ПРОТИВНОМ СЛУЧАЕ ОН МОЖЕТ БЫТЬ ПОТЕРЯН ДРУГОЙ КОМАНДОЙ TS, NA ИЛИ LA. | ||||
Р, | ||||
НИЖЕ | Техас | З,Ш | – | Z,R0 |
R, НАЧИНАЕТСЯ ПОДПРОГРАММНЫЙ ПРОЦЕСС | ||||
......... | ||||
R, ПРОЦЕСС ПОДПРОГРАММЫ ЗАВЕРШЕН, ПЕРЕХОДИТЕ В СОХРАНЕННОЕ МЕСТО, ЧТОБЫ ПРОДОЛЖИТЬ ОСНОВНУЮ ПРОГРАММУ. | ||||
ТС | - | - | Н,Р0 | |
R, КОНЕЦ СУБЫ |
Другой тип подпрограммы был реализован на машинном языке с оболочкой макроса. Обычно его писали сотрудники Honeywell. Макрос использовал команду GOSUB для вызова подпрограммы.
Команды с плавающей запятой
[ редактировать ]Honeywell 1800 имел дополнительный адаптер с плавающей запятой для научных вычислений. Для этого существовал набор команд. Эти команды также были доступны в форме моделирования, если оборудование не включало адаптер, но это не рекомендуется для регулярного использования. Команды ARGUS с плавающей запятой были одинаковыми независимо от наличия адаптера. В его отсутствие ARGUS будет обеспечивать моделирование на машинном языке настоящей операции с плавающей запятой.
Периферийное управление вводом/выводом
[ редактировать ]Адреса устройств ввода и вывода на машинном уровне представляли собой две восьмеричные цифры 0–7. На уровне ARGUS это были две буквы AG. Первые цифры идентифицировали контроллер, вторая цифра идентифицировала номер устройства на этом контроллере.
При обработке ленты одна единица данных на ленте в руководствах 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 будет первым словом в буфере для этой операции чтения или записи. Было нормально использовать два буфера для каждого устройства, чтобы чтение или запись могли выполняться параллельно с обработкой. Это называется двойной буферизацией . Размер буфера был ограничивающим фактором размера «записей» (блоков), поскольку основная память была ограничена.
При подготовке к записи записи на ленту каждый элемент завершался словом «Конец элемента» с заданным кодом. Каждая запись завершалась словом Ortho для проверки ошибок, за которым следовало слово «Конец записи». После того, как выходной буфер был заполнен элементами, была использована команда «Вычислить орто» (CC) для вычисления слова «Орто» и предоставления слова конца записи. Для команды «Вычислить орто» адреса A и B обозначают позиции первого и последнего слова. Далее запись будет записана командой WF. Наконец управление будет возвращено основной программе.
Для нормальной работы приложения все периферийные команды, за исключением, возможно, RW, должны быть помещены в подпрограмму.
Команды администрирования программы
[ редактировать ]Существовали команды ARGUS, занимавшиеся администрированием программ. Для сборки программы потребовалось следующее: [ нужна ссылка ]
- Колода карт, содержащая код ARGUS для всех необходимых изменений.
- Входная лента, содержащая все установленные программы ARGUS.
- Выходная рабочая лента, содержащая все новые программы ARGUS и все версии старых.
- Входная лента, содержащая все программы машинного языка при установке.
- Входная лента, содержащая все программы машинного языка — неизмененные, новые или пересобранные.
- Входная лента, содержащая библиотеку макросов. Эти макросы будут добавлены в код ARGUS во время сборки и перед переводом в машинный код.
- Одна или несколько скретч-лент для сортировки изображений карточек.
Для каждой программы, которую нужно было создать или изменить, требовалось очень мало команд администрирования.
U,NEWPROG progname Следующие карточки относятся к полной новой программе, называемой progname.Имя программы U,REASSMB Следующие карты представляют собой версии существующей программы.U,NEWSEG имя_программы_имя_сегмента Следующие карточки представляют собой полный новый сегмент, называемый именем_сегмента, программы (новой или существующей) с именем имя_программы.U,SEGMENT имя программы имя программы Следующие карты представляют собой версии сегмента имени программы программы.U,ENDSEG Это конец сегмента (или его ревизий).U,ENDPROG Это конец программы (или ее версий).
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Руководство по продажам Honeywell 1800» (PDF) .
- ^ ARGUS — система автоматического создания и обновления рутинных программ, руководство по языку ассемблера . Ханивелл Инк., 1959 год.
Внешние ссылки
[ редактировать ]- Ашер Оплер и Майра Грей (1961), Разработка многопрограммного алгебраического компилятора (только по подписке)
- Система автоматического создания и обновления рутинных программ. Из HOPL: интерактивный список языков программирования .