Данные General Nova - Data General Nova

Система Nova (бежево-желтая, в центре внизу) и система жесткого диска с картриджем (открытая, ниже Nova) в основном пустом креплении в стойку.
Передняя панель Data General Nova 1200
Nova 1200 (в центре справа) обрабатывал изображения, полученные с помощью EMI-Scanner, первого в мире коммерчески доступного компьютерного томографа .

General Nova Data представляет собой серию из 16-битных миникомпьютеров выпущенных американской компанией General Data . Семья Нова была очень популярна в 1970-х годах и в конечном итоге продала десятки тысяч единиц.

Первая модель, известная просто как «Nova», была выпущена в 1969 году. Nova была упакована в единственный стоечный корпус и обладала достаточной вычислительной мощностью для решения большинства простых задач. Nova стала популярной в научных лабораториях по всему миру. В следующем году за ним последовала SuperNOVA , которая прошла примерно в четыре раза быстрее.

Представленная в период быстрого прогресса в разработке интегральных схем (или «микрочипов»), эта линейка претерпела несколько обновлений в течение следующих пяти лет, включая модели 800 и 1200, Nova 2, Nova 3 и, наконец, Nova 4. A однокристальная реализация была также представлена ​​как microNOVA в 1977 году, но не получила широкого распространения, поскольку рынок перешел на новые конструкции микропроцессоров. Fairchild Semiconductor также представила микропроцессорную версию Nova в 1977 году, Fairchild 9440 , но она также имела ограниченное применение на рынке.

На смену линейке Nova пришла Data General Eclipse , которая во многом была похожа, но добавляла поддержку виртуальной памяти и другие функции, необходимые для современных операционных систем . 32-разрядное обновление Eclipse привело к созданию серии Eclipse MV 1980-х годов.

История

Эдсон де Кастро и PDP-X

Эдсон де Кастро был менеджером по продукту новаторской компании Digital Equipment Corporation (DEC) PDP-8 , 12-битного компьютера, который широко называют первым настоящим мини-компьютером. Он также руководил разработкой модернизированного PDP-8 / I, в котором вместо отдельных транзисторов использовались ранние интегральные схемы .

Во время процесса PDP-8 / I де Кастро посещал производителей печатных плат, которые быстро совершенствовали сложность плат, которые они могли собрать. де Кастро пришел к выводу, что 8 / I можно производить, используя полностью автоматизированную сборку на больших досках, что было невозможно только годом ранее. Другие в DEC привыкли к меньшим платам, используемым в более ранних машинах, и беспокоились о поиске проблем, когда на одной плате было много компонентов. Для 8 / I было принято решение остаться с небольшими платами, используя новую упаковку « flip-chip » для небольшого увеличения плотности.

В период разработки PDP-8 введение ASCII и его крупное обновление в 1967 году привело к появлению нового поколения конструкций с длиной слова, кратной 8 битам, а не 6 битам, как в большинстве предыдущих разработок. Это привело к тому, что средние разработки работали с длиной слова 16 бит вместо нынешних 12- и 18-битных линейок DEC. де Кастро был убежден, что PDP-8 можно улучшить, построив 16-битный процессор миникомпьютера на единой 15-дюймовой квадратной плате.

В 1967 году де Кастро начал новую разработку, известную как «PDP-X», которая включала в себя несколько продвинутых функций. Среди них был единый базовый дизайн, который можно было использовать для создания 8-, 16- и 32-разрядных платформ. Это привело к созданию нескольких подробных архитектурных документов. Кен Олсен не поддержал этот проект, считая, что он не предлагает достаточных преимуществ перед 12-битным PDP-8 и 18-битным PDP-9 . В конце концов, весной 1968 года он был отменен.

Дизайн Новы

Отмена PDP-X побудила де Кастро подумать об уходе из DEC и построении системы самостоятельно. Он был не один; В конце 1967 года группа инженеров-единомышленников собралась для рассмотрения такой машины. В состав группы входили Пэт Грин, менеджер подразделения, Ричард Согге, еще один инженер по аппаратному обеспечению, и инженер-программист Генри Буркхардт III. В отличие от PDP-X, новые усилия были сосредоточены на одной машине, которую можно было быстро вывести на рынок, поскольку де Кастро считал, что концепция PDP-X была слишком амбициозной для небольшой начинающей компании .

Обсуждая это с другими в DEC, первоначальная концепция привела к созданию 8-битной машины, которую было бы дешевле реализовать. Группа начала разговор с Гербертом Ричманом, продавцом Fairchild Semiconductor, который знал остальных благодаря своим контактам с DEC. В то время Fairchild боролась с Texas Instruments и Signetics на быстрорастущем рынке TTL и вводила новые фабрики, которые позволяли создавать более сложные конструкции. Последняя серия Fairchild 9300 позволяла использовать до 96 вентилей на чип, и они использовали это для реализации ряда 4-битных чипов, таких как двоичные счетчики и регистры сдвига .

Использование этих микросхем уменьшило общее количество микросхем, необходимое для реализации полного арифметико-логического блока (ALU), основного математического компонента ЦП, что позволило расширить его с 8-разрядной схемы до 16-разрядной. Это потребовало расширения ЦП с одной печатной платы 15 на 15 дюймов (38 см × 38 см) до двух, но такая конструкция все равно была бы значительно дешевле в производстве, чем 8 / I, при этом оставаясь более мощной и мощной. На основе ASCII. Третья плата содержала схемы ввода / вывода, и вся система обычно включала другую плату с 4 КБ оперативной памяти . Полная система с четырьмя картами помещается в единственное шасси для монтажа в стойку.

Платы были спроектированы таким образом, чтобы их можно было соединять вместе с помощью объединительной платы с печатной схемой , с минимальной ручной разводкой, что позволяло собирать все платы автоматизированным способом. Это значительно снизило затраты по сравнению с платой 8 / I, которая состояла из множества плат меньшего размера, которые нужно было соединить вместе на объединительной плате, которая сама была соединена вместе с помощью проволочной обмотки . Конструкция с более крупной платой также сделала Nova более надежным, что сделало ее особенно привлекательной для промышленных или лабораторных условий.

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

Нова введение

В конце 1967 года Ричман представил группу юристу из Нью-Йорка Фреду Адлеру, который начал поиск различных источников финансирования для получения начального капитала. К 1968 году Адлер заключил крупную сделку по финансированию с консорциумом венчурных фондов из района Бостона, который согласился предоставить первоначальные инвестиции в размере 400 000 долларов, а вторые 400 000 долларов были доступны для наращивания производства. де Кастро, Буркхарт и Согге покинули DEC и основали Data General (DG) 15 апреля 1968 года. Грин не присоединился к ним, считая предприятие слишком рискованным, и Ричман не присоединился, пока продукт не был запущен и запущен в конце года.

Работа над первой системой заняла около девяти месяцев, и первые продажи начались в ноябре. Им немного повезло, потому что осенняя совместная компьютерная конференция была отложена до декабря того же года, поэтому они смогли привезти рабочее устройство в центр Москоне, где они запустили версию Spacewar! . DG официально выпустила Nova в 1969 году по базовой цене 3 995 долларов США (что эквивалентно 28 193 долларам в 2020 году), рекламируя его как «лучший маленький компьютер в мире». Базовая модель была не очень полезна из коробки, и добавление 4 кВт (8 КБ) оперативной памяти в виде основной памяти обычно приводило к цене до 7 995 долларов. Напротив, 8 / I мощностью 4 кВт (6 КБ) стоил 12 800 долларов.

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

Система была успешной с самого начала: 100-я была продана через шесть месяцев, а 500-я - через 15 месяцев. Продажи ускорились по мере появления новых версий, и к 1975 году годовой объем продаж компании составил 100 миллионов долларов.

SuperNOVA

Кен Олсен публично предсказал, что DG потерпит неудачу, но с выпуском Nova стало ясно, что этого не произойдет. К тому времени о внедрении 16-битных проектов заговорили и многие другие компании. Олсен решил, что они представляют угрозу как для их 18-битной линии, так и для 12-битной, и начал новую разработку 16-битной системы. Он появился в 1970 году как PDP-11 , гораздо более сложный дизайн, который так же отличался от PDP-X, как и Nova. Эти два дизайна сильно конкурировали на рынке.

Слухи о новой системе от DEC достигли DG вскоре после начала поставок Nova. Весной 1970 года они наняли нового дизайнера, Ларри Селигмана, чтобы обойти любую возможную машину в процессе создания. С момента создания Nova произошли два основных изменения; было то , что Signetics ввел 8260, 4-битный IC , который объединил сумматор, XNOR и И, то есть количество фишек , необходимых для реализации основной логики была уменьшена примерно в три раза. Другой заключался в том, что Intel агрессивно заявляла о полупроводниковой памяти, обещая 1000 бит на одном кристалле и работая на гораздо более высоких скоростях, чем ядро.

В новом дизайне Селигмана использовались оба этих улучшения. Для начала, новые ИС позволили расширить АЛУ до полной 16-битной ширины на тех же двух картах, что позволило ему выполнять математические и логические операции за один цикл и, таким образом, сделало новый дизайн в четыре раза быстрее, чем исходный. . Кроме того, было использовано новое ядро ​​памяти меньшего размера, что позволило сократить время цикла с 1200 нс до 800 нс, что позволило увеличить время цикла.1/3улучшение. Производительность можно было бы еще больше улучшить, заменив ядро постоянной памятью ; из-за отсутствия цикла чтения / записи ядра, доступ к нему можно было получить на скорости 300 нс для значительного повышения производительности.

Получившаяся машина, известная как SuperNOVA , была выпущена в 1970 году. Хотя в первоначальных моделях по-прежнему использовалось ядро, вся конструкция была основана на предпосылке, что станут доступны более быстрые полупроводниковые запоминающие устройства, и платформа сможет полностью их использовать. Он был представлен позже в том же году, что и SuperNOVA SC с полупроводниковой (SC) памятью. Память с гораздо более высокой производительностью позволила ЦП, который был синхронизирован с памятью, еще больше увеличить скорость для работы с временем цикла 300 нс (3,3 МГц). Это сделало его самым быстрым из доступных миникомпьютеров за многие годы. Изначально новая память была очень дорогой и перегревалась, поэтому широко не использовалась.

1200 и 800

Печатная плата CPU Nova 1200 . 74181 ALU - это большая ИС по центру справа.

В 1968 году Fairchild представила прототип 4711, однокристального 4-битного АЛУ, демонстрирующего мощь технологии их вентильных матриц Micromatrix . Конструкция никогда не предназначалась для массового производства и была довольно дорогой в производстве. Появление Signetics 8260 в 1969 году заставило их действовать; и Texas Instruments, и Fairchild представили собственные 4-битные ALU в 1970 году - 74181 и 9341 соответственно. В отличие от 8260, новый дизайн предлагал все общие логические функции и дополнительно сокращал количество микросхем.

Это побудило DG задуматься о разработке нового ЦП с использованием этих более интегрированных ИС. Как минимум, это уменьшило бы использование ЦП до одной карты либо для базовой Nova, либо для SuperNOVA. Появилась новая концепция, согласно которой на одном шасси можно было бы разместить любую машину, просто заменив печатную плату ЦП, что позволило бы клиентам приобрести более дешевую систему и затем обновить ее в любое время.

Пока Селигман работал над SuperNOVA, компания получила письмо от Рона Грюнера, в котором говорилось: «Я читал о вашем продукте, я читал ваши объявления и буду работать на вас. И я буду в вашем офисе через неделю, чтобы поговорить с вами об этом ". Его наняли на месте. Грюнер был назначен ответственным за недорогую машину, в то время как Селигман разработал соответствующую высокопроизводительную версию.

Недорогая модель Gruner была выпущена в 1970 году под названием Nova 1200 , причем модель 1200 была основана на использовании основной памяти оригинальной Nova на 1200 нс. Он имел 4-битный ALU, основанный на единственном чипе 74181, и, таким образом, представлял собой переработанную Nova. Переупакованная модель SuperNOVA с четырьмя ALU Селигмана была выпущена в 1971 году как Nova 800 , что привело к несколько запутанному названию, когда модель с меньшим номером имеет более высокую производительность. Обе модели предлагались в различных корпусах: 1200 с семью слотами, 1210 с четырьмя и 1220 с четырнадцатью.

Более поздние модели

К этому времени PDP-11 наконец была доставлена. Он предлагал гораздо более богатую архитектуру набора команд, чем намеренно простая в Nova. Постоянное совершенствование конструкции ИС, и особенно их соотношения цены и качества, снижало ценность первоначальных упрощенных инструкций. Селигману было поручено разработать новую машину, которая будет совместима с Nova, предлагая при этом гораздо более богатую среду для тех, кто этого хотел. Эта концепция была представлена ​​как серия Data General Eclipse , которая предлагала возможность добавления дополнительных схем для адаптации набора инструкций для научных задач или рабочих нагрузок обработки данных. Eclipse успешно конкурировал с PDP-11 на более высоком уровне рынка.

Примерно в то же время стали появляться слухи о новой 32-битной машине от DEC. DG решил, что у них должен быть аналогичный продукт, и Грюнер был назначен ответственным за то, что стало проектом Fountainhead Project. Учитывая масштаб проекта, они согласились, что все усилия должны выполняться за пределами площадки, и Грюнер выбрал место в парке Research Triangle в Северной Каролине . Этот проект стал очень сложным и в конечном итоге был отменен спустя годы.

Пока эти усилия были в стадии реализации, работы на линии Nova продолжались.

840

Работает Nova 840 (передняя панель заменена на панель от 1220)

840, впервые представленный в 1973 году, также включал новую систему страничной памяти, позволяющую использовать адреса до 17 бит. Индекс смещает базовый адрес в большую память 128 kword. На самом деле установка такого объема памяти потребовала значительного места; 840 поставляется в большом корпусе на 14 слотов.

Нова 2

Следующей версией была Nova 2 , первые версии были выпущены в 1973 году. Nova 2 была, по сути, упрощенной версией более ранних машин, поскольку увеличение плотности микросхем позволило уменьшить размер ЦП. В то время как SuperNOVA использовала три платы 15 × 15 дюймов для реализации ЦП и его памяти, Nova 2 умещала все это на одной плате. ПЗУ использовалось для хранения кода загрузки, который затем копировался в ядро ​​при "загрузке программы". Переключатель был перевернут. Доступны версии с четырьмя («2/4»), семью и десятью («2/10») слотами.

Нова 3

Данные General Nova 3

Нова 3 1975 добавил еще два регистра, используемый для контроля доступа к встроенному в стек. Процессор также был повторно реализован с использованием компонентов TTL , что еще больше повысило производительность системы. Nova 3 предлагалась в версиях с четырьмя (Nova 3/4) и двенадцатью (Nova 3/12) слотами.

Нова 4

Похоже, что компания Data General изначально планировала, что Nova 3 станет последней в своей линейке, планируя заменить Nova более поздними машинами Eclipse. Однако постоянный спрос привел к созданию машины Nova 4 , на этот раз на базе четырех битовых срезов ALU AMD Am2901 . Эта машина с самого начала проектировалась как Nova 4 и Eclipse S / 140, с разными микрокодами для каждой. Также был доступен сопроцессор с плавающей запятой, занимающий отдельный слот. Дополнительная опция позволяла отображать память, позволяя программам получать доступ к памяти объемом до 128 тысяч слов с помощью переключения банков . В отличие от более ранних машин, Nova 4 не имела консоли на передней панели и вместо этого полагалась на терминал для эмуляции консоли при необходимости.

Было три разные версии Nova 4, Nova 4 / C, Nova 4 / S и Nova 4 / X. Nova 4 / C была одноплатной реализацией, которая включала всю память (16 или 32 kword). В Nova 4 / S и 4 / X используются отдельные платы памяти. В Nova 4 / X был включен встроенный блок управления памятью (MMU), позволяющий использовать до 128 тысяч слов памяти (MMU также был установлен в Nova 4 / S, но был отключен прошивкой). И 4 / S, и 4 / X включали «предварительную выборку» для повышения производительности за счет выборки до двух инструкций из памяти до того, как они понадобятся.

microNOVA

Компания Data General также выпустила серию однокристальных реализаций процессора Nova под названием microNOVA . Изменения в архитектуре автобуса резко ограничили скорость до такой степени, что она была примерно вдвое меньше, чем у оригинальной Nova. Первоначальный microNOVA с процессором «mN601» был поставлен в 1977 году. За ним последовал microNOVA MP / 100 в 1979 году, который сократил ЦП до одного чипа СБИС , mN602. В том же году предлагалась и более крупная версия microNOVA MP / 200 .

Позднее microNOVA была переупакована в корпус типа ПК с двумя дискетами под названием Enterprise . Enterprise был выпущен в 1981 году под управлением RDOS , но появление IBM PC в том же году заставило большинство других машин исчезнуть из поля зрения .

Наследие Новы

Nova повлияла на дизайн компьютеров Xerox Alto (1973) и Apple I (1976), а его архитектура легла в основу серии Computervision CGP (Computervision Graphics Processor). Сообщается, что его внешний дизайн послужил прямым источником вдохновения для передней панели микрокомпьютера MITS Altair (1975).

После успеха оригинальной Nova компания Data General разработала серию более быстрых разработок. Позже было представлено семейство систем Eclipse с расширенным набором инструкций, совместимым снизу вверх, а серия MV расширила Eclipse до 32-разрядной архитектуры, чтобы конкурировать с DEC VAX . Развитие серии MV было задокументировано в популярной книге Трейси Киддер 1981 года «Душа новой машины» . Сама компания Data General позже превратилась в поставщика серверов на базе процессоров Intel и массивов хранения, которые в конечном итоге приобрела EMC .

По состоянию на 2004 год 16-битные Novas и Eclipses все еще работают в различных приложениях по всему миру, включая управление воздушным движением. Во всем мире существует разнообразная, но страстная группа людей, которые восстанавливают и сохраняют оригинальные 16-битные системы Data General.

Техническое описание

Дизайн процессора

Регистры данных General Nova
1 5 1 4 1 3 1 2 1 1 1 0 0 9 0 8 0 7 0 6 0 5 0 4 0 3 0 2 0 1 0 0 (битовая позиция)
Регистры аккумулятора
0 Регистр 0
1 Регистр 1
Индексные регистры
2 Индексный регистр 2
3 Индексный регистр 3
Счетчик команд
  ПК     Р rogram С ounter
Регистр статуса
  C С флаг Arry

Nova, в отличие от PDP-8 , представляла собой архитектуру загрузки и хранения . Он имел четыре 16-битных регистра - накопителя , два из которых (2 и 3) могли использоваться в качестве индексных регистров . Был 15-битный программный счетчик и однобитовый регистр переноса . Как и в случае с PDP-8, текущая адресация нулевой страницы была центральной. Регистра стека не было , но в более поздних проектах Eclipse для этой функции использовался выделенный адрес аппаратной памяти.

Самые ранние модели Nova обрабатывали математику последовательно в 4-битных пакетах, используя один 74181 битовый срез ALU . Через год после его появления эта конструкция была улучшена и теперь включает в себя полноценный 16-битный параллельный математический модуль с использованием четырех 74181, эта конструкция получила название SuperNova. В будущих версиях системы добавлены стековый блок и аппаратное умножение / деление.

Nova 4 / Eclipse S / 140 был основан на четырех АЛУ AMD 2901 с битовыми срезами с микрокодом в постоянной памяти и был первым Nova, разработанным только для основной памяти DRAM , без выделения памяти на магнитных ядрах .

Память и ввод / вывод

Первые модели были доступны с 8 K слов о магнитной памяти ядра , как вариант, тот , который практически каждый должен был купить, в результате чего стоимость системы до $ 7995.

Эта плата памяти ядра была организована планарно как четыре группы по четыре банка, каждый из которых содержит два набора ядер в матрице 64 на 64; таким образом, было 64 x 64 = 4096 бит на набор, x 2 набора давали 8192 бит, x 4 банка давали 32 768 бит, x 4 группы давали в сумме 131 072 бит, и это, разделенное на размер машинного слова в 16 бит, дало 8 192 слова памяти.

Ядро на этой плате с памятью 8K слов занимало расположенную в центре «плату на плате», шириной 5,25 дюйма и высотой 6,125 дюйма, и было закрыто защитной пластиной. Он был окружен необходимой схемой чтения-записи-перезаписи драйвера поддержки. Все ядро ​​и соответствующая вспомогательная электроника помещаются на единую стандартную плату размером 15 x 15 дюймов (380 мм). В одном внешнем блоке расширения может поддерживаться до 32 КБ такой оперативной памяти . Полупроводниковые ПЗУ уже были доступны в то время, и системы без ОЗУ (то есть только с ПЗУ) стали популярными во многих промышленных условиях. Оригинальные машины Nova работали на частоте примерно 200 кГц , но SuperNova была разработана для работы на частоте до 3 МГц при использовании со специальной полупроводниковой основной памятью.

Стандартизированная объединительная плата и сигналы ввода-вывода создали простую и эффективную конструкцию ввода-вывода, которая упростила сопряжение запрограммированных устройств ввода-вывода и каналов данных с Nova по сравнению с конкурирующими машинами. В дополнение к специальной структуре шины ввода / вывода на объединительной плате Nova были выводы для проволоки, которые можно было использовать для нестандартных разъемов или других специальных целей.

Модель программирования

Формат команд можно в общих чертах разделить на одну из трех функций: 1) преобразование регистров, 2) обращение к памяти и 3) ввод / вывод. Каждая инструкция содержалась в одном слове. Манипуляция регистр-регистр была почти RISC- подобной по своей битовой эффективности; и инструкция, которая манипулирует данными регистров, также может выполнять тесты, сдвиги и даже отбрасывать результат. Варианты аппаратного обеспечения включают блок целочисленного умножения и деления, блок с плавающей запятой (одинарной и двойной точности) и управление памятью .

Программное обеспечение Data General на перфоленте

Самые ранние Nova поставлялись с интерпретатором BASIC на перфоленте . По мере роста продукта Data General разработала множество языков для компьютеров Nova, работающих под управлением ряда согласованных операционных систем. FORTRAN IV , ALGOL , Extended BASIC, Data General Business Basic , Interactive COBOL и несколько ассемблеров были доступны от Data General. Сторонние поставщики и сообщество пользователей расширили свои предложения с помощью Forth , Lisp , BCPL , C , ALGOL и других проприетарных версий COBOL и BASIC .

Набор инструкций

Реализованные ниже машинные инструкции являются общим набором, реализованным во всех процессорах серии Nova. В определенных моделях часто реализовывались дополнительные инструкции, а некоторые инструкции предоставлялись дополнительным оборудованием.

Арифметические инструкции

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

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

ЦП содержал однобитовый регистр, называемый битом переноса, который после арифметической операции содержал перенос самого старшего бита. Бит переноса может быть установлен в желаемое значение до выполнения операции с использованием двухбитового поля в инструкции. Бит может быть установлен, очищен или дополнен до выполнения инструкции. В ассемблере эти параметры были указаны путем добавления буквы к коду операции: «O» - установить бит переноса; «Z» - очистить бит переноса, «C» - дополнить бит переноса, ничего - оставить бит переноса в покое. Если также был указан бит холостого хода, для вычислений использовалось бы указанное значение переноса, но фактический регистр переноса остался бы неизменным.

Все арифметические инструкции включали двухбитовое поле, которое можно было использовать для указания опции сдвига, которая будет применяться к результату перед его загрузкой в ​​регистр назначения. Можно указать однобитный сдвиг влево или вправо или два байта результата можно поменять местами. Сдвиги были 17-битными круговыми, с битом переноса "слева" от самого старшего бита. Другими словами, когда был выполнен сдвиг влево, старший значащий бит результата был сдвинут в бит переноса, а предыдущее содержимое бита переноса было сдвинуто в младший значащий бит результата. Обмен байтами не влияет на бит переноса. В ассемблере эти параметры задавались добавлением буквы к коду операции: «L» - сдвиг влево; «R» - сдвиг вправо, «S» - перестановка байтов; ничего - не выполнять смену или замену.

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

  • SZR - пропустить нулевой результат
  • SNR - пропуск ненулевого результата
  • SZC - пропуск нулевого переноса
  • SNC - пропуск ненулевого переноса
  • SBN - пропускать, если и перенос, и результат ненулевые
  • SEZ - пропускать, если либо перенос, либо результат, либо и то, и другое равно нулю
  • SKP - всегда пропускать
  • ничего - никогда не пропускай

Фактические арифметические инструкции были:

  • MOV - переместить содержимое исходного аккумулятора в целевой аккумулятор
  • COM - переместить побитовое дополнение исходного аккумулятора в целевой аккумулятор
  • ADD - добавить исходный аккумулятор в целевой аккумулятор
  • ADC - взять побитовое дополнение исходного аккумулятора и добавить его к целевому аккумулятору.
  • NEG - переместить отрицательное значение исходного аккумулятора в целевой аккумулятор.
  • SUB - вычесть исходный аккумулятор содержимого из целевого аккумулятора
  • INC - добавить 1 к содержимому исходного аккумулятора и перейти к целевому аккумулятору.
  • И - выполнить побитовое И двух аккумуляторов и поместить результат в целевой аккумулятор.

Пример арифметических инструкций со всеми использованными опциями:

АДДЗР № 0,2, СНС

Это декодируется как: очистить бит переноса; добавить содержимое AC2 (аккумулятор 2) к AC0; по кругу сдвиньте результат на один бит вправо; проверьте результат, чтобы увидеть, установлен ли бит переноса, и пропустите следующую инструкцию, если это так. Отменить результат после выполнения теста. Фактически, это складывает два числа и проверяет, четный или нечетный результат.

Инструкции по работе с памятью

Набор команд Nova содержал пару инструкций, которые передавали содержимое памяти в накопители и наоборот, две инструкции передачи управления и две инструкции, которые проверяли содержимое ячейки памяти. Все инструкции обращения к памяти содержали восьмибитовое адресное поле и двухбитовое поле, которое определяло режим адресации памяти. Четыре режима были:

  • Режим 0 - абсолютная адресация. Содержимое адресного поля инструкции слева заполняется нулями и используется в качестве целевого адреса.
  • Режим 1 - относительная адресация. Содержимое адресного поля инструкции расширяется знаком влево и добавляется к текущему значению программного счетчика (который к моменту выполнения инструкции указывает на следующую инструкцию). Результат используется как целевой адрес.
  • Режим 2 - индексированная адресация. Содержимое адресного поля инструкции расширяется знаком влево и добавляется к текущему значению аккумулятора 2. Результат используется в качестве целевого адреса.
  • Режим 3 - индексированная адресация. Содержимое адресного поля инструкции расширяется знаком влево и добавляется к текущему значению аккумулятора 3. Результат используется в качестве целевого адреса.

Очевидно, что режим 0 был способен адресовать только первые 256 слов памяти, учитывая восьмибитовое поле адреса. Эта часть памяти называлась «нулевой страницей». Слова с нулевой страницей памяти считались драгоценными для программистов на языке ассемблера Nova из-за их небольшого количества; только адреса нулевых страниц могли быть адресованы из любого места в программе, не прибегая к индексированной адресации, что требовало привязки аккумулятора 2 или 3 для использования в качестве индексного регистра. В языке ассемблера директива ".ZREL" заставляла ассемблер помещать инструкции и слова данных, следующие за ней, на нулевой странице; Директива ".NREL" помещает следующие инструкции и слова данных в "обычную" память. Более поздние модели Nova добавили инструкции с расширенными полями адресации, которые преодолели эту трудность (с потерей производительности).

Ассемблер вычислял относительные смещения для режима 1 автоматически, хотя также можно было записать его явно в исходном коде. Если инструкция обращения к памяти ссылалась на адрес памяти в пространстве .NREL, но не указала спецификатор режима, принимался режим 1, и ассемблер вычислял смещение между текущей инструкцией и указанным местоположением и помещал его в поле адреса инструкции (при условии, что полученный результат значение помещается в 8-битное поле).

Две инструкции по загрузке и сохранению были:

  • LDA - загрузить содержимое ячейки памяти в указанный аккумулятор.
  • STA - сохранить содержимое указанного аккумулятора в ячейку памяти.

Обе эти инструкции включают «косвенный» бит. Если этот бит был установлен (выполняется на языке ассемблера путем добавления символа «@» к коду операции), содержимое целевого адреса предполагалось как сам адрес памяти, и этот адрес использовался для загрузки или сохранения.

Две инструкции по передаче управления были:

  • JMP - передает управление в указанную ячейку памяти
  • JSR («подпрограмма перехода») - выполняет то же самое, что и инструкция JMP, но дополнительно загружает адрес возврата (инструкцию, следующую за инструкцией JSR в строке) в аккумулятор 3 перед переходом.

Как и в случае инструкций загрузки и сохранения, инструкции перехода содержали косвенный бит, который также был указан в сборке с помощью символа '@'. В случае непрямого перехода процессор извлекал содержимое целевого местоположения и использовал это значение в качестве адреса памяти для перехода. Однако, в отличие от инструкций загрузки и сохранения, если бы у косвенного адреса был установлен самый старший бит, он выполнил бы следующий цикл косвенного обращения. В процессорах серии Nova до Nova 3 не было ограничений на количество циклов косвенного обращения; косвенный адрес, на который ссылается сам себя, приведет к бесконечному циклу косвенной адресации, при этом инструкция никогда не будет завершена. (Это могло насторожить пользователей, поскольку в этом состоянии нажатие переключателя STOP на передней панели ничего не дало. Чтобы разорвать петлю, необходимо было перезагрузить машину.)

Две инструкции по тестированию памяти:

  • ISZ - увеличить ячейку памяти и пропустить следующую инструкцию, если результат нулевой.
  • DSZ - уменьшить ячейку памяти и пропустить следующую инструкцию, если результат нулевой.

Как и в случае с инструкциями загрузки и сохранения, был косвенный бит, который выполнял бы один уровень косвенной адресации. Эти инструкции были странными, поскольку на Novas с памятью на магнитных сердечниках команда выполнялась на самой плате памяти. Как было принято в то время, платы памяти содержали схему «обратной записи» для решения проблемы разрушающего чтения, присущей памяти на магнитных сердечниках. Но механизм обратной записи также содержал мини-арифметический блок, который процессор использовал для нескольких целей. Для инструкций ISZ и DSZ приращение или уменьшение происходило между считываемой ячейкой памяти и обратной записью; ЦП просто ждал, когда ему сообщат, был ли результат нулевым или ненулевым. Эти инструкции были полезны, потому что они позволяли использовать ячейку памяти в качестве счетчика циклов без привязки к аккумулятору, но они были медленнее, чем выполнение эквивалентных арифметических инструкций.

Некоторые примеры инструкций по обращению к памяти:

LDA 1, COUNT

Передает содержимое ячейки памяти с меткой COUNT в аккумулятор 1. Предполагая, что COUNT находится в пространстве .NREL, эта инструкция эквивалентна: LDA 1,1, (COUNT - (. + 1)), где '.'. представляет расположение инструкции LDA.

JSR @ 0,17

Косвенный переход к адресу памяти, указанному содержимым ячейки 17 в нулевом пространстве страницы, и сохранение адреса возврата в аккумулятор 3. Это был стандартный метод выполнения системного вызова RDOS на ранних моделях Nova; мнемоника языка ассемблера ".SYSTM" переведена на это.

JMP 0,3

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

СТА 0,3, -1

Сохраните содержимое аккумулятора 0 в месте, которое на единицу меньше адреса аккумулятора 3.

DSZ COUNT

Уменьшите значение в ячейке с меткой COUNT и пропустите следующую инструкцию, если результат равен нулю. Как и в случае выше, если предполагается, что COUNT находится в пространстве .NREL, это эквивалентно: DSZ 1, (COUNT - (. + 1))

Инструкции ввода / вывода

Novas реализовала канальную модель для взаимодействия с устройствами ввода / вывода. В модели ожидалось, что каждое устройство ввода-вывода будет реализовывать два флага, называемых «Занят» и «Готово», и три регистра данных и управления, обозначаемые как A, B и C. Доступны инструкции ввода-вывода. для чтения и записи регистров и для отправки на устройство одного из трех сигналов, называемых «запуск», «очистка» и «импульс». Как правило, отправка сигнала запуска инициирует операцию ввода-вывода, которая была настроена путем загрузки значений в регистры A / B / C. Сигнал очистки останавливает операцию ввода-вывода и очищает возникающие прерывания. Импульсный сигнал использовался для инициирования вспомогательных операций в сложных подсистемах, таких как операции поиска на дисковых накопителях. Опрашиваемые устройства обычно перемещают данные непосредственно между устройством и регистром A. Устройства DMA обычно использовали регистр A для указания адреса памяти, регистр B для указания количества передаваемых слов и регистр C для флагов управления. Канал 63 относился к самому процессору и использовался для различных специальных функций.

Каждая инструкция ввода-вывода содержала шестибитовое поле номера канала, четырехбитное поле для указания того, какой регистр читать или писать, и двухбитовое поле для указания, какой сигнал должен быть отправлен. На ассемблере сигнал указывался добавлением буквы к коду операции: «S» для начала, «C» для очистки, «P» для импульса и ничего для отсутствия сигнала. Коды операций были:

  • DIA - переместить содержимое регистра A устройства в указанный аккумулятор
  • DOA - отправить содержимое указанного аккумулятора в регистр A устройства по указанному каналу
  • DIB - переместить содержимое регистра B устройства в указанный аккумулятор
  • DOB - отправить содержимое указанного аккумулятора в регистр B устройства по указанному каналу
  • DIC - переместить содержимое регистра C устройства в указанный аккумулятор
  • DOC - отправить содержимое указанного аккумулятора в регистр C устройства по указанному каналу
  • НИО - "нет ввода / вывода", неправильное употребление. Инструкция использовалась для отправки сигнала устройству без передачи регистров.

Кроме того, для проверки состояния устройства были доступны четыре инструкции:

  • SKPBN - пропустить следующую инструкцию, если установлен флаг занятости устройства
  • СКПБЗ - пропустить следующую инструкцию, если флаг занятости устройства снят
  • SKPDN - пропустить следующую инструкцию, если на устройстве установлен флаг done
  • SKPDZ - пропустить следующую инструкцию, если флаг готовности устройства снят

Запуск устройства привел к установке флага занятости. Когда запрошенная операция была завершена, обычно устройство сбрасывало свой флаг занятости и устанавливало флаг выполнения; у большинства устройств механизм запроса прерывания был привязан к флагу done, поэтому установка флага done вызвала прерывание (если прерывания были разрешены и устройство не было замаскировано).

Специальные инструкции

Эти инструкции выполняли различные функции управления ЦП и состояния. Все они на самом деле были сокращенной мнемоникой для инструкций ввода-вывода на канале 63, самореферентном канале ввода-вывода ЦП.

  • INTA - подтверждение прерывания. Передал номер канала устройства прерывания в указанный аккумулятор.
  • INTDS - отключены все прерывания
  • INTEN - разрешены все прерывания
  • IORST - сброс ввода / вывода. Отправил сигнал сброса на шину ввода-вывода, который остановил все операции ввода-вывода, отключил прерывания и очистил все ожидающие прерывания.
  • МСКО - маскироваться. Использует содержимое указанного аккумулятора для установки маски прерывания. Интерпретация маски зависела от реализации каждого устройства ввода-вывода. Некоторые устройства нельзя было замаскировать.
  • READS - передал содержимое 16 переключателей данных лицевой панели в указанный аккумулятор.
  • HALT - остановил CPU. После остановки ЦП можно было заставить снова запустить только ручное вмешательство на передней панели.

Прерывания и обработка прерываний

С аппаратной точки зрения механизм прерывания был относительно простым, но также менее гибким, чем текущие архитектуры ЦП. Объединительная плата поддерживает единую линию запроса прерывания, к которой подключены все устройства, способные прерываться. Когда устройству требовалось запросить прерывание, оно поднимало эту строку. ЦП принял прерывание, как только выполнил текущую инструкцию. Как указано выше, ожидалось, что устройство поднимет свой флаг ввода-вывода "готово", когда оно запросит прерывание, и соглашение заключалось в том, что устройство сбрасывает свой запрос прерывания, когда ЦП выполняет инструкцию сброса ввода-вывода на канале устройства. количество.

ЦП ожидал, что операционная система поместит адрес своей подпрограммы обслуживания прерывания в адрес памяти 1. Когда устройство прерывает работу, ЦП выполнял косвенный переход через адрес 1, помещая адрес возврата в адрес памяти 0 и блокируя дальнейшие прерывания. Затем обработчик прерывания выполнит инструкцию INTA, чтобы определить номер канала устройства прерывания. Это работало путем поднятия сигнала подтверждения на объединительной плате. Сигнал подтверждения был подключен в формате гирляндной цепи через объединительную плату, так что он проходил через каждую плату на шине. Ожидалось, что любое устройство, запрашивающее прерывание, заблокирует дальнейшее распространение сигнала подтверждения по шине, так что, если два или более устройств имеют ожидающие прерывания одновременно, только первое из них увидит сигнал подтверждения. Затем это устройство отреагировало, указав номер своего канала на линиях данных на шине. Это означало, что в случае одновременных запросов на прерывание устройство с приоритетом определялось тем, какое из них было физически ближе всего к ЦП в каркасе для карт.

После того, как прерывание было обработано и процедура обслуживания отправила устройству сброс ввода / вывода, оно возобновило нормальную обработку, разрешив прерывания и затем вернувшись через косвенный переход через адрес памяти 0. Чтобы предотвратить прерывание незавершенного прерывания непосредственно перед этим. при переходе на возврат (который приведет к перезаписи адреса возврата) инструкция INTEN имела задержку в один цикл инструкции. При его выполнении прерывания не будут разрешены до тех пор, пока не будет выполнена следующая инструкция, которая должна была быть инструкцией JMP @ 0.

Затем процедура обслуживания прерывания операционной системы обычно выполняет индексированный переход, используя полученный номер канала, чтобы перейти к конкретной программе обработки прерывания для устройства. Было несколько устройств, особенно схема обнаружения сбоя питания ЦП, которые не отвечали на инструкцию INTA. Если INTA вернул нулевой результат, подпрограмма обслуживания прерывания должна была опросить все не отвечающие INTA устройства, используя инструкции SKPDZ / SKPDN, чтобы увидеть, какое из них было прервано.

Операционная система могла в некоторой степени управлять порядком прерываний, задав маску прерывания с помощью инструкции MSKO. Это было предназначено для того, чтобы позволить операционной системе определять, каким устройствам разрешено прерывание в данный момент. Когда была выдана эта инструкция, всем устройствам на объединительной плате была передана 16-битная маска прерывания. Устройство должно было решить, что на самом деле значила для него маска; по соглашению, устройство, которое было замаскировано, не должно было поднимать линию прерывания, но у ЦП не было средств для этого. Большинство устройств, которые были маскируемыми, позволяли выбирать бит маски с помощью перемычки на плате. Были устройства, которые вообще игнорировали маску.

В системах с памятью на магнитных сердечниках (которая сохраняла свое содержимое без питания) восстановление после сбоя питания было возможно. Схема обнаружения сбоя питания в ЦП выдает прерывание, когда обнаруживается потеря основного питания, поступающего на компьютер; с этого момента у ЦП было короткое время, пока конденсатор в блоке питания не разрядился и не отключилось питание ЦП. Этого времени было достаточно, чтобы остановить выполняющийся ввод-вывод, выполнив команду IORST, а затем сохранить в памяти содержимое четырех аккумуляторов и бита переноса. При восстановлении питания, если ключевой переключатель на передней панели ЦП находился в положении LOCK, ЦП запускался и выполнял косвенный переход через адрес памяти 2. Предполагалось, что это будет адрес служебной программы операционной системы, которая перезагрузит аккумуляторы. и бит переноса, а затем возобновить нормальную обработку. Задача сервисной программы - выяснить, как перезапустить операции ввода-вывода, прерванные из-за сбоя питания.

Внешний вид передней панели

Как было принято в то время, большинство моделей Nova оснащалось консолью на передней панели для управления и мониторинга функций процессора. Все модели до Nova 3 использовали каноническую компоновку передней панели, как показано на фото панели Nova 840 выше. Компоновка содержала кнопочный выключатель питания, два ряда индикаторов адреса и данных, ряд переключателей ввода данных и ряд функциональных переключателей, которые при нажатии активируют различные функции ЦП. Индикаторы адреса всегда отображали текущее значение программного счетчика в двоичном формате. Индикаторы отображали различные значения в зависимости от того, какая функция ЦП была активна в данный момент. Слева от крайнего левого индикатора данных дополнительная лампа отображала текущее значение бита переноса. На большинстве моделей лампы были лампами накаливания, припаянными к панели управления; Замена перегоревших ламп была проклятием для инженеров службы технической поддержки Data General.

Каждый из переключателей данных управлял значением одного бита в 16-битном значении, и в соответствии с соглашением Data General они были пронумерованы 0-15 слева направо. Переключатели данных обеспечивают ввод в ЦП для различных функций, а также могут быть прочитаны запущенной программой с помощью инструкции языка ассемблера READS. Чтобы уменьшить беспорядок на панели и сэкономить деньги, функциональные переключатели были реализованы как двусторонние переключатели без фиксации. Когда рычаг переключателя функций был поднят, он запускал функцию, имя которой было напечатано над переключателем на панели; при нажатии на рычаг активируется функция, название которой отображается под переключателем. При отпускании рычаг переключателя возвращается в нейтральное положение.

Ссылаясь на фотографию Nova 840, первые четыре переключателя слева выполняли функции EXAMINE и DEPOSIT для четырех аккумуляторов. Нажатие EXAMINE на одном из них привело к отображению текущего значения аккумулятора в двоичном формате с помощью ламп данных. Нажатие DEPOSIT передает двоичное значение, представленное текущими настройками переключателей данных, в аккумулятор.

Следующим переключателем был переключатель СБРОС / СТОП. Нажатие STOP заставляло CPU останавливаться после выполнения текущей инструкции. Нажатие RESET вызывает немедленную остановку ЦП, очищает ряд внутренних регистров ЦП и отправляет сигнал сброса ввода / вывода всем подключенным устройствам. Переключатель справа от него был переключателем СТАРТ / ПРОДОЛЖЕНИЕ. Нажатие CONTINUE заставило CPU возобновить выполнение инструкции, на которую в данный момент указывает счетчик программ. Нажатие кнопки СТАРТ передает текущее значение, установленное в переключателях данных 1-15, на счетчик программ, а затем начинает выполнение оттуда.

Следующие два переключателя обеспечивали доступ для чтения и записи к памяти с передней панели. Нажатие EXAMINE передает значение, установленное в переключателях данных 1-15, на счетчик программ, извлекает значение в соответствующую ячейку памяти и отображает его значение в индикаторах данных. Нажатие EXAMINE NEXT увеличивает счетчик программы, а затем выполняет операцию проверки в этой ячейке памяти, позволяя пользователю перемещаться по ряду ячеек памяти. Нажатие DEPOSIT записывает значение, содержащееся в переключателях данных, в ячейку памяти, на которую указывает счетчик программы. Нажатие DEPOSIT NEXT сначала увеличивает счетчик программы, а затем депонирует в указанную ячейку памяти.

Функция INST STEP заставила ЦП выполнить одну инструкцию в текущем месте счетчика программ, а затем остановиться. Поскольку счетчик программы будет увеличиваться как часть выполнения инструкции, это позволяет пользователю пошагово выполнять программу. MEMORY STEP, неправильное название, заставляло ЦП проходить один тактовый цикл и останавливаться. Это было мало пользы для пользователей и обычно использовалось только обслуживающим персоналом для диагностики.

ЗАГРУЗКА ПРОГРАММЫ - это механизм, обычно используемый для загрузки Nova. Когда этот переключатель был запущен, он заставлял 32-словное загрузочное ПЗУ отображаться на первые 32 слова памяти, устанавливал счетчик программ на 0 и запускал ЦП. Загрузочное ПЗУ содержало код, который считывал 256 слов (512 байт) кода из выбранного устройства ввода-вывода в память, а затем передавал управление считываемому коду. Переключатели данных 8-15 использовались, чтобы указать загрузочному ПЗУ, с какого канала ввода / вывода загружаться. Если переключатель 0 был выключен, загрузочное ПЗУ предположит, что устройство является опрашиваемым устройством (например, устройством чтения бумажной ленты), и запустит цикл ввода по запросу до тех пор, пока не будут прочитаны 512 байтов. Если переключатель 0 был включен, загрузочное ПЗУ предполагало, что устройство поддерживает DMA, и инициировало передачу данных DMA. Загрузочное ПЗУ было недостаточно интеллектуальным, чтобы расположить устройство до начала передачи. Это была проблема при перезагрузке после сбоя; если загрузочным устройством был дисковод, его головки, вероятно, были оставлены на случайном цилиндре. Их пришлось переместить в цилиндр 0, где RDOS записал загрузочный блок первого уровня, чтобы последовательность загрузки работала. Обычно это делалось путем циклического переключения привода через последовательность загрузки, но пользователи, которых разочаровало время ожидания (до 5 минут в зависимости от модели привода), научились вводить с передней панели код ввода-вывода «перекалибровать». и пошагово выполнить через него ЦП - операция, которая заняла у опытного пользователя всего несколько секунд.

Выключатель питания представлял собой трехпозиционный клавишный переключатель с положениями, обозначенными OFF, ON и LOCK. В положении ВЫКЛ все питание ЦП было отключено. При повороте ключа в положение «ВКЛ.» На ЦП подается питание. Однако, в отличие от современных ЦП, ЦП не запускался автоматически при подаче питания; пользователю приходилось использовать ЗАГРУЗКУ ПРОГРАММЫ или какой-либо другой метод, чтобы запустить ЦП и инициировать последовательность загрузки. При повороте переключателя в положение LOCK отключены функциональные переключатели на передней панели; повернув переключатель в положение LOCK и вынув ключ, пользователь может сделать ЦП устойчивым к взлому. В системах с памятью на магнитных сердечниках положение LOCK также включает функцию автоматического восстановления после сбоя питания. Ключ можно вынуть в положениях OFF или LOCK.

Представление

Nova 1200 выполнила инструкции доступа к основной памяти (LDA и STA) за 2,55 микросекунды (мкс). Использование постоянной памяти позволило сэкономить 0,4 мкс. Инструкции аккумулятора (ADD, SUB, COM, NEG и т. Д.) Занимали 1,55 мкс, MUL 2,55 мкс, DIV 3,75 мкс, ISZ 3,15-4,5 мкс. В более поздних версиях Eclipse MV / 6000 LDA и STA занимали 0,44 мкс, ADD и т. Д. Занимали 0,33 мкс, MUL 2,2 мкс, DIV 3,19 мкс, ISZ 1,32 мкс, FAD 5,17 мкс, FMMD 11,66 мкс.

Примеры языков ассемблера

Привет, мир программа

Это минимальный пример программирования на ассемблере Nova. Он предназначен для работы под управлением RDOS и выводит строку « Hello, world. »На консоли.

    ; a "hello, world" program for Nova running RDOS
    ; uses PCHAR system call
    .titl hello
    .nrel
    .ent start

 start:
 dochar:
    lda    0,@pmsg  ; load ac0 with next character,
    mov#   0,0,snr  ; test ac0; skip if nonzero (don't load result)
    jmp    done
    .systm
    .pchar          ; print first
    jmp    er       ; skipped if OK
    movs   0,0      ; swap bytes
    .systm
    .pchar          ; print second
    jmp    er       ; skipped if OK
    isz    pmsg     ; point to next character
    jmp    dochar   ; go around again

 done:
    .systm          ; normal exit
    .rtn
 er:
    .systm          ; error exit
    .ertn
    halt

 pmsg:
    .+1             ; pointer to first character of string
                    ; note bytes are packed right-to-left by default
                    ; <15><12> denotes a CR LF pair.
    .txt /Hello, world.<15><12>/
    0               ; flag word to end string

    .end start

16-битное умножение

Базовые модели Nova поставлялись без встроенной аппаратной функции умножения и деления, чтобы поддерживать конкурентоспособные цены. Следующая процедура умножает два 16-битных слова для получения результата в 16-битном слове (переполнение игнорируется). Он демонстрирует совместное использование ALU op, shift и test (skip). Обратите внимание, что когда эта подпрограмма вызывается jsr, AC3 содержит адрес возврата . Это используется инструкцией возврата jmp 0,3. Идиоматический способ очистить аккумулятор sub 0,0. Другие отдельные инструкции могут быть настроены для загрузки определенного набора полезных констант (например, -2, -1 или +1).

 mpy:	; multiply AC0 <- AC1 * AC2, by Toby Thain

 	sub 0,0		; clear result
 mbit:	movzr 1,1,szc	; shift multiplier, test lsb
 	add 2,0		; 1: add multiplicand
 	movzl 2,2,szr	; shift and test for zero
 	jmp mbit	; not zero, do another bit
 	jmp 0,3		; return

Аккумулятор двоичной печати

Следующая процедура выводит значение AC1 в виде 16-значного двоичного числа на консоль RDOS. Это раскрывает другие причуды набора инструкций Nova. Например, нет инструкции для загрузки произвольного «немедленного» значения в аккумулятор (хотя инструкции обращения к памяти кодируют такое значение для формирования эффективного адреса). Накопители обычно должны загружаться из инициализированных ячеек памяти (например n16). Другие современные машины, такие как PDP-11 , и практически все современные архитектуры допускают немедленную загрузку, хотя многие, такие как ARM, ограничивают диапазон значений, которые могут быть загружены немедленно.

Поскольку .systmмакрос вызова RDOS реализует a jsr, AC3 перезаписывается адресом возврата .pcharфункции. Следовательно, необходимо временное местоположение, чтобы сохранить адрес возврата вызывающего эту функцию. Для рекурсивной или иным образом реентерабельной процедуры вместо этого должны использоваться стек, оборудование, если оно доступно, или программное обеспечение, если нет. Команда возврата становится, jmp @ retrnкоторая использует режим косвенной адресации Nova для загрузки ПК возврата.

Определения констант в конце показывают две особенности ассемблера: основание ассемблера по умолчанию восьмеричное ( 20= шестнадцать), и символьные константы могут быть закодированы, например, как "0.

 pbin:  ; print AC1 on console as 16 binary digits, by Toby Thain

        sta     3,retrn     ; save return addr
        lda     2,n16       ; set up bit counter
 loop:  lda     0,chr0      ; load ASCII '0'
        movzl   1,1,szc     ; get next bit in carry
        inc     0,0         ; bump to '1'
        .systm
        .pchar              ; AC0-2 preserved
        jmp     err         ; if error
        inc     2,2,szr     ; bump counter
        jmp     loop        ; loop again if not zero
        lda     0,spc       ; output a space
        .systm
        .pchar
        jmp     err         ; if error
        jmp     @retrn

 spc:   " ;that's a space
 chr0:  "0
 n16:   -20
 retrn: 0

Факты

Канадская радиовещательная корпорация в Монреале использовала Nova 1200 для автоматизации воспроизведения каналов до конца 1980-х годов. Затем его заменили отремонтированные апартаменты Nova 4, которые использовались до середины 1990-х годов.

Смотрите также

Примечания

использованная литература

Цитаты

Библиография

внешние ссылки