Data General Nova — серия 16-битных мини-компьютеров, выпущенных американской компанией Data General . Семейство Nova было очень популярно в 1970-х годах и в конечном итоге было продано десятками тысяч единиц.
Первая модель, известная просто как «Nova», была выпущена в 1969 году. [1] Nova была упакована в один корпус для монтажа в стойку 3U и имела достаточную вычислительную мощность для выполнения большинства простых задач. Nova стала популярной в научных лабораториях по всему миру. За ней в следующем году последовала SuperNOVA , которая работала примерно в четыре раза быстрее, что сделало ее самой быстрой мини-машиной на несколько лет.
Представленная в период быстрого прогресса в разработке интегральных схем (или «микрочипов»), линейка прошла через несколько обновлений в течение следующих пяти лет, представив 800 и 1200, Nova 2, Nova 3 и, в конечном итоге, Nova 4. Однокристальная реализация также была представлена как microNOVA в 1977 году, но не получила широкого распространения, поскольку рынок перешел на новые конструкции микропроцессоров. Fairchild Semiconductor также представила микропроцессорную версию Nova в 1977 году, Fairchild 9440 , но она также получила ограниченное распространение на рынке.
Линия Nova была заменена Data General Eclipse , которая была похожа во многих отношениях, но добавила поддержку виртуальной памяти и другие функции, требуемые современными операционными системами . 32-битное обновление Eclipse привело к появлению серии Eclipse MV 1980-х годов.
Эдсон де Кастро был менеджером по продукции пионерской компании Digital Equipment Corporation (DEC) PDP-8 , 12-битного компьютера, широко известного как первый настоящий мини-компьютер. [2] Он также руководил проектированием модернизированного PDP-8/I, в котором использовались ранние интегральные схемы вместо отдельных транзисторов. [3]
Во время процесса PDP-8/I де Кастро посещал производителей печатных плат , которые быстро продвигались вперед в плане сложности плат, которые они могли собирать. Де Кастро пришел к выводу, что 8/I можно производить с использованием полностью автоматизированной сборки на больших платах, что было бы невозможно всего лишь годом ранее. Другие в DEC привыкли к меньшим платам, используемым в более ранних машинах, и были обеспокоены отслеживанием проблем, когда на одной плате было много компонентов. [a] Для 8/I было принято решение остаться с небольшими платами, используя новую упаковку « flip-chip » для скромного улучшения плотности. [3]
В период разработки PDP-8 введение ASCII и его крупное обновление в 1967 году привело к новому поколению проектов с длиной слова, кратной 8 битам, а не кратной 6 битам, как в большинстве предыдущих проектов. Это привело к тому, что проекты среднего уровня работали с длиной слова 16 бит вместо текущих 12- и 18-битных линеек DEC. Де Кастро был убежден, что можно улучшить PDP-8, построив 16-битный процессор мини-компьютера на одной 15-дюймовой квадратной плате. [4] [5]
В 1967 году де Кастро начал новую разработку, известную как «PDP-X», которая включала несколько расширенных функций. Среди них был единый базовый дизайн, который мог использоваться для создания 8-, 16- и 32-битных платформ. [6] Это достигло точки создания нескольких подробных архитектурных документов. Кен Олсен не поддерживал этот проект, считая, что он не предлагал достаточных преимуществ по сравнению с 12-битным PDP-8 и 18-битным PDP-9 . В конечном итоге он был отменен весной 1968 года. [4]
Отмена PDP-X побудила де Кастро рассмотреть возможность ухода из DEC, чтобы построить систему самостоятельно. Он был не одинок; в конце 1967 года группа инженеров-единомышленников сформировалась для рассмотрения такой машины. В группу вошли Пэт Грин, менеджер подразделения; Ричард Согге, другой инженер по оборудованию; и Генри Буркхардт III, инженер по программному обеспечению. [7] В отличие от PDP-X, новые усилия были сосредоточены на одной машине, которую можно было бы быстро вывести на рынок, поскольку де Кастро считал, что концепция PDP-X была слишком амбициозной для небольшой стартап-компании . [8]
Обсуждая это с другими в DEC, первоначальная концепция привела к 8-битной машине, реализация которой была бы менее затратной. [9] Группа начала переговоры с Гербертом Ричманом, продавцом Fairchild Semiconductor , который знал остальных через свои контакты в DEC. В то время Fairchild боролся с Texas Instruments и Signetics на быстрорастущем рынке TTL и представлял новые фабрики , которые позволяли создавать более сложные конструкции. Последняя серия Fairchild 9300 позволяла до 96 вентилей на чип, и они использовали это для реализации ряда 4-битных чипов, таких как двоичные счетчики и сдвиговые регистры . [10]
Использование этих ИС уменьшило общее количество ИС, необходимое для реализации полного арифметико-логического устройства (АЛУ), основного математического компонента ЦП, что позволило расширить конструкцию с 8-битной до 16-битной. Это потребовало расширения ЦП с одной печатной платы размером 15 на 15 дюймов (38 см × 38 см) до двух, но такая конструкция все равно была бы значительно дешевле в производстве, чем 8/I, оставаясь при этом более мощной и основанной на ASCII. Третья плата содержала схему ввода/вывода , а полная система обычно включала еще одну плату с 4 КБ памяти с произвольным доступом . Полная система из четырех карт помещалась в одно шасси для монтажа в стойку. [5]
Платы были разработаны таким образом, чтобы их можно было соединить вместе с помощью печатной платы с минимальной ручной проводкой, что позволило собрать все платы в автоматическом режиме. Это значительно снизило затраты по сравнению с 8/I, которая состояла из множества меньших плат, которые нужно было соединить вместе на плате, которая сама была соединена вместе с помощью накрутки проводов . Конструкция с более крупной платой также сделала Nova более надежной, что сделало ее особенно привлекательной для промышленных или лабораторных установок. [5]
В новой конструкции использовалась простая архитектура загрузки-хранения [4] , которая вновь появилась в конструкциях RISC в 1980-х годах. Поскольку сложность триггера быстро снижалась по мере их внедрения в микросхемы, конструкция компенсировала отсутствие режимов адресации конструкции загрузки-хранения путем добавления четырех аккумуляторов общего назначения вместо одного регистра, который можно было бы найти в подобных недорогих предложениях, таких как серия PDP. [4]
В конце 1967 года Ричман познакомил группу с нью-йоркским юристом Фредом Адлером, который начал искать различные источники финансирования для стартового капитала. К 1968 году Адлер заключил крупную сделку по финансированию с консорциумом венчурных фондов из Бостона, которые согласились предоставить первоначальные инвестиции в размере 400 000 долларов США со вторыми 400 000 долларов США для наращивания производства. Де Кастро, Беркхарт и Согге покинули DEC и основали Data General (DG) 15 апреля 1968 года. Грин не присоединился к ним, посчитав предприятие слишком рискованным, а Ричман не присоединился, пока продукт не был запущен и запущен позже в том же году. [5]
Работа над первой системой заняла около девяти месяцев, и первые попытки продаж начались в ноябре. Им немного повезло, потому что конференция Fall Joint Computer Conference была отложена до декабря того года, поэтому они смогли привезти работающее устройство в Сан-Франциско, где они запустили версию Spacewar! . [11] DG официально выпустила Nova в 1969 году по базовой цене 3995 долларов США (что эквивалентно 33 193 долларам в 2023 году), рекламируя ее как «лучший маленький компьютер в мире». [12] Базовая модель была не очень полезной из коробки, и добавление8 кВт (16 кБ ) ОЗУ в виде основной памяти обычно поднимало цену до 7995 долларов США . [13] Напротив, 8/I с4 кВт (6 кБ ) стоил 12 800 долларов США . [14]
Первая продажа была в университет в Техасе, где команда вручную собрала образец, который был отправлен в феврале. Однако это было в разгар забастовки в авиационной отрасли, и машина так и не была доставлена. Они отправили второй образец, который прибыл быстро, поскольку забастовка к тому моменту уже закончилась, а в мае был наконец доставлен и оригинальный. [15]
Система была успешной с самого начала: 100-я была продана через шесть месяцев, [16] а 500-я — через 15 месяцев. [13] Продажи ускорялись по мере появления новых версий, и к 1975 году годовой объем продаж компании составил 100 миллионов долларов США . [17]
Кен Олсен публично предсказал, что DG потерпит неудачу, но с выпуском Nova стало ясно, что этого не произойдет. К этому времени ряд других компаний также говорили о внедрении 16-битных проектов. Олсен решил, что они представляют угрозу для их 18-битной линейки, а также для 12-битной, и начал новую работу над 16-битным проектом. [18] Это появилось в 1970 году как PDP-11 , гораздо более сложный проект, который отличался от PDP-X так же, как и Nova. Эти два проекта серьезно конкурировали на рынке. [4]
Слухи о новой системе от DEC достигли DG вскоре после начала поставок Nova. Весной 1970 года они наняли нового конструктора, Ларри Селигмана, чтобы перепрыгнуть через любую возможную машину в процессе разработки. С момента разработки Nova произошло два крупных изменения; одно из них заключалось в том, что Signetics представила 8260, 4-битную ИС, которая объединяла сумматор, XNOR и AND, что означало, что количество микросхем, необходимых для реализации базовой логики, было сокращено примерно в три раза. Другое заключалось в том, что Intel агрессивно рекламировала полупроводниковую память, обещая 1024 бита на одном чипе и работу на гораздо более высоких скоростях, чем основная память. [18]
Новый дизайн Селигмана воспользовался преимуществами обоих этих усовершенствований. Для начала, новые ИС позволили расширить ALU до полной 16-битной ширины на тех же двух картах, что позволило ему выполнять математические и логические операции за один цикл и, таким образом, сделать новый дизайн в четыре раза быстрее оригинала. Кроме того, была использована новая меньшая сердечниковая память, что улучшило время цикла с 1200 нс оригинала до 800 нс, что дало еще 1/3 улучшение. Производительность может быть дополнительно улучшена путем замены ядра на память только для чтения ; при отсутствии цикла чтения-записи ядра доступ к нему может быть осуществлен за 300 нс для значительного повышения производительности. [16]
Получившаяся машина, известная как SuperNOVA , была выпущена в 1970 году. Хотя первоначальные модели все еще использовали ядро, вся конструкция была основана на предпосылке, что более быстрая полупроводниковая память станет доступной, и платформа сможет в полной мере использовать ее. Она была представлена позже в том же году, что и SuperNOVA SC , с полупроводниковой (SC) памятью. Гораздо более производительная память позволила ЦП, который был синхронен с памятью, еще больше увеличить скорость работы до 300 нс цикла (3,3 МГц). Это сделало его самым быстрым доступным мини-компьютером на многие годы. [19] Первоначально новая память также была очень дорогой и сильно нагревалась, поэтому она не получила широкого распространения. [20]
В качестве демонстрации мощи своей технологии вентильных матриц Micromatrix в 1968 году Fairchild создала прототип 4711, однокристального 4-битного АЛУ. [10] [21] Конструкция никогда не предназначалась для массового производства и была довольно дорогой в производстве. Появление Signetics 8260 в 1969 году заставило их это сделать; и Texas Instruments, и Fairchild представили собственные 4-битные АЛУ в 1970 году, 74181 и 9341 соответственно. В отличие от 8260, новые конструкции предлагали все общие логические функции и еще больше сократили количество чипов. [10]
Это привело DG к рассмотрению конструкции нового ЦП с использованием этих более интегрированных ИС. Как минимум, это сократило бы ЦП до одной карты для базовой Nova или SuperNOVA. Возникла новая концепция, в которой одно шасси могло бы разместить любую машину, просто заменив плату ЦП. Это позволило бы клиентам приобрести более дешевую систему, а затем обновить ее в любое время. [22]
Пока Селигман работал над SuperNOVA, компания получила письмо от Рона Грюнера, в котором говорилось: «Я прочитал о вашем продукте, я прочитал вашу рекламу, и я собираюсь работать на вас. И я буду в вашем офисе через неделю, чтобы поговорить с вами об этом». [22] Его наняли на месте. Грюнер был назначен ответственным за недорогую машину, в то время как Селигман спроектировал соответствующую высокопроизводительную версию. [22]
Недорогая модель Gruner была выпущена в 1970 году как Nova 1200 , причем 1200 ссылалось на использование 1200-нс основной памяти оригинальной Nova. Она имела 4-битный ALU на основе одного чипа 74181 и, таким образом, по сути, была переупакованной Nova. Переупакованная четырьмя ALU SuperNOVA Селигмана была выпущена в 1971 году как Nova 800 , что привело к несколько запутанному наименованию, где модель с меньшим номером имела более высокую производительность. [22] Обе модели предлагались в различных корпусах: 1200 с семью слотами, 1210 с четырьмя и 1220 с четырнадцатью.
К этому времени PDP-11 наконец-то поступил в продажу. Он предлагал гораздо более богатую архитектуру набора инструкций , чем намеренно простая архитектура в Nova. Продолжающееся совершенствование конструкций ИС, и особенно их соотношение цена-качество , подрывало ценность первоначальных упрощенных инструкций. Селигману было поручено разработать новую машину, которая была бы совместима с Nova, предлагая при этом гораздо более богатую среду для тех, кто этого хотел. Эта концепция поставлялась как серия Data General Eclipse , которая предлагала возможность добавлять дополнительные схемы для адаптации набора инструкций для научных или обрабатывающих данные рабочих нагрузок. Eclipse успешно конкурировал с PDP-11 в более высоком сегменте рынка. [23]
Примерно в то же время начали появляться слухи о новой 32-битной машине от DEC. DG решила, что им нужен аналогичный продукт, и Грюнер был назначен ответственным за то, что стало проектом Fountainhead. Учитывая масштаб проекта, они согласились, что все усилия должны осуществляться вне его, и Грюнер выбрал место в Research Triangle Park в Северной Каролине . Этот проект стал очень сложным [24] и был в конечном итоге отменен много лет спустя.
Пока велись эти работы, продолжались работы на линии Нова.
840, впервые представленный в 1973 году, также включал новую страничную систему памяти, допускающую адреса до 17 бит. Индекс смещал базовый адрес в большую память объемом 128 килослов. На самом деле установка такого объема памяти требовала значительного пространства; 840 поставлялся в большом 14-слотовом корпусе.
Следующей версией стала Nova 2 , первые версии которой поступили в продажу в 1973 году. Nova 2 по сути была упрощенной версией более ранних машин, поскольку увеличение плотности чипов позволило уменьшить размер ЦП. В то время как SuperNOVA использовала три платы 15×15" для реализации ЦП и его памяти, Nova 2 поместила все это на одной плате. ПЗУ использовалось для хранения загрузочного кода, который затем копировался в ядро при переключении переключателя «загрузка программы». Были доступны версии с четырьмя («2/4»), семью и десятью («2/10») слотами.
Nova 3 1975 года добавила еще два регистра, используемых для управления доступом к встроенному стеку. Процессор также был переработан с использованием компонентов TTL , что еще больше увеличило производительность системы. Nova 3 предлагалась в четырехслотовой (Nova 3/4) и двенадцатислотовой (Nova 3/12) версиях.
Похоже, что Data General изначально планировала, что Nova 3 станет последней в своей линейке, планируя заменить Nova более поздними машинами Eclipse. [ необходима цитата ] Однако постоянный спрос привел к появлению машины Nova 4 в 1978 году, на этот раз на базе четырех бит-слайсовых АЛУ AMD Am2901 . Эта машина была разработана с самого начала как Nova 4 и Eclipse S/140, с различным микрокодом для каждой. Также был доступен сопроцессор с плавающей точкой, занимающий отдельный слот. Дополнительная опция позволяла отображать память, позволяя программам получать доступ к 128 килословам памяти с помощью переключения банков . В отличие от более ранних машин, Nova 4 не включала консоль на передней панели , а вместо этого включала ПЗУ, содержащее машинный код, который позволяет терминалу эмулировать консоль при необходимости. [25] : 87
Существовало три различных версии Nova 4: Nova 4/C, Nova 4/S и Nova 4/X. Nova 4/C представляла собой одноплатную реализацию, которая включала всю память (16 или 32 килослова). Nova 4/S и 4/X использовали отдельные платы памяти. Nova 4/X имела встроенный блок управления памятью (MMU), позволяющий использовать до 128 килослов памяти. MMU также был установлен в Nova 4/S, но был отключен прошивкой. И 4/S, и 4/X включали «предвыборку» для повышения производительности путем извлечения до 11 инструкций из памяти до того, как они понадобятся. [25] : 5
Data General также выпустила серию однокристальных реализаций процессора Nova microNOVA . Чтобы он мог поместиться в 40-контактный двухрядный корпус (DIP), адресная шина и шина данных совместно использовали набор из 16 контактов. Это означало, что чтение и запись в память требовали двух циклов, и в результате машина работала примерно в два раза медленнее оригинальной Nova. [26]
Первым чипом в серии был mN601 1977 года. Он продавался и как ЦП для других пользователей, и как полный набор микросхем для тех, кто хотел реализовать компьютер, и как полный компьютер на одной плате с 4 КБ ОЗУ, и как полная бюджетная модель Nova. [26] Модернизированная версия дизайна, mN602 1979 года , сократила весь набор микросхем до одной СБИС . Это предлагалось в двух машинах, microNOVA MP/100 и более крупной microNOVA MP/200 .
microNOVA позже был переупакован с монитором в корпусе в стиле ПК с двумя дискетами как Enterprise . Enterprise был отправлен в 1981 году, работая под управлением RDOS , но появление IBM PC в том же году заставило большинство других машин исчезнуть из поля зрения. [27]
Nova повлияла на дизайн компьютеров Xerox Alto (1973) [28] и Apple I (1976) [29] , а ее архитектура легла в основу серии Computervision CGP (Computervision Graphics Processor). Сообщается, что ее внешний дизайн стал прямым вдохновением для передней панели микрокомпьютера MITS Altair (1975).
Data General продолжила успех оригинальной Nova серией более быстрых проектов. Семейство систем Eclipse было позже представлено с расширенным набором инструкций, совместимым снизу вверх, а серия MV еще больше расширила Eclipse до 32-битной архитектуры, чтобы конкурировать с DEC VAX . Разработка серии MV была задокументирована в популярной книге Трейси Киддера 1981 года «Душа новой машины» . Сама Data General позже превратилась в поставщика серверов и массивов хранения на базе процессоров Intel, в конечном итоге была куплена EMC .
Во всем мире существует разнообразная, но ревностная группа людей, которые восстанавливают и сохраняют оригинальные 16-битные системы Data General. [30] [31]
Nova, в отличие от PDP-8 , имела архитектуру загрузки-хранения . Она имела четыре 16-битных регистра -аккумулятора , два из которых (2 и 3) могли использоваться как индексные регистры . Был 15-битный счетчик программ и однобитный регистр переноса . Как и в PDP-8, текущая + нулевая адресация страниц была центральной. Регистр стека отсутствовал , но более поздние разработки Eclipse использовали выделенный адрес аппаратной памяти для этой функции.
Самые ранние модели Nova обрабатывали математические данные последовательно в 4-битных пакетах, используя один битовый ALU 74181. Через год после своего появления эта конструкция была улучшена, чтобы включить полный 16-битный параллельный математический блок, используя четыре 74181, эта конструкция была названа SuperNova. Будущие версии системы добавили стековый блок и аппаратное умножение/деление.
Nova 4 / Eclipse S/140 был основан на четырех бит-слайсовых АЛУ AMD 2901 с микрокодом в постоянной памяти и был первым Nova, разработанным только для основной памяти DRAM , без возможности использования памяти на магнитных сердечниках .
Первые модели были доступны с памятью на магнитных сердечниках объемом 8 К слов в качестве опции, которую практически всем приходилось покупать, в результате чего стоимость системы достигала 7995 долларов.
Эта плата памяти на сердечниках была организована планарно в виде четырех групп по четыре банка, каждый банк содержал два набора сердечников в матрице 64 на 64; таким образом, в каждом наборе было 64 x 64 = 4096 бит, x 2 набора давали 8192 бита, x 4 банка давали 32 768 бит, x 4 группы давали в общей сложности 131 072 бита, и это, деленное на размер машинного слова 16 бит, давало 8192 слова памяти.
Ядро на этой плате памяти объемом 8 К слов занимало центрально расположенную «плату на плате» шириной 5,25 дюйма и высотой 6,125 дюйма и было закрыто защитной пластиной. Оно было окружено необходимой схемой чтения-записи-перезаписи драйвера поддержки. Все ядро и соответствующая вспомогательная электроника помещались на одной стандартной плате размером 15 x 15 дюймов (380 мм). До 32 К такого ОЗУ ядра можно было поддерживать в одном внешнем блоке расширения. Полупроводниковое ПЗУ уже было доступно в то время, и системы без ОЗУ (т. е. только с ПЗУ) стали популярными во многих промышленных установках. Оригинальные машины Nova работали на частоте приблизительно 200 кГц , но ее SuperNova была разработана для работы на частоте до 3 МГц при использовании со специальной полупроводниковой основной памятью.
Стандартизированная задняя панель и сигналы ввода-вывода создали простую и эффективную конструкцию ввода-вывода, которая сделала интерфейс запрограммированных устройств ввода-вывода и каналов данных с Nova простым по сравнению с конкурирующими машинами. В дополнение к своей выделенной структуре шины ввода-вывода задняя панель Nova имела контакты для накрутки проводов , которые можно было использовать для нестандартных разъемов или других специальных целей.
Формат инструкций можно было бы в целом отнести к одной из трех функций: 1) манипуляция регистр-регистр, 2) обращение к памяти и 3) ввод/вывод. Каждая инструкция содержалась в одном слове. Манипуляция регистр-регистр была почти RISC -подобной по своей битовой эффективности; а инструкция, которая манипулировала данными регистра, могла также выполнять тесты, сдвиги и даже выбирать отбрасывание результата. Аппаратные опции включали блок целочисленного умножения и деления, блок с плавающей точкой (одинарной и двойной точности) и управление памятью .
Самая ранняя 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. Конкретные модели часто реализовывали дополнительные инструкции, а некоторые инструкции предоставлялись дополнительным оборудованием.
Все арифметические инструкции работали между аккумуляторами. Для операций, требующих двух операндов, один брался из исходного аккумулятора, а другой — из целевого аккумулятора, а результат помещался в целевой аккумулятор. Для операций с одним операндом операнд брался из исходного регистра, а результат заменял целевой регистр. Для всех кодов операций с одним операндом допускалось, чтобы исходный и целевой аккумуляторы были одинаковыми, и операция функционировала так, как и ожидалось.
Все арифметические инструкции включали бит «no-load», который при установке подавлял передачу результата в регистр назначения; это использовалось в сочетании с опциями теста для выполнения теста без потери существующего содержимого регистра назначения. На языке ассемблера добавление «#» к коду операции устанавливало бит no-load.
В процессоре содержался однобитный регистр, называемый битом переноса, который после арифметической операции содержал бы перенос самого значимого бита. Бит переноса можно было установить в желаемое значение до выполнения операции с помощью двухбитного поля в инструкции. Бит можно было установить, очистить или дополнить до выполнения инструкции. На языке ассемблера эти опции задавались путем добавления буквы к коду операции: «O» — установить бит переноса; «Z» — очистить бит переноса, «C» — дополнить бит переноса, ничего — оставить бит переноса в покое. Если также был указан бит без нагрузки, указанное значение переноса использовалось бы для вычисления, но фактический регистр переноса оставался бы неизменным.
Все арифметические инструкции включали двухбитное поле, которое можно было использовать для указания опции сдвига, которая применялась к результату до его загрузки в регистр назначения. Можно было указать однобитный сдвиг влево или вправо или поменять местами два байта результата. Сдвиги были 17-битными циклическими, с битом переноса «слева» от самого старшего бита. Другими словами, когда выполнялся сдвиг влево, самый старший бит результата сдвигался в бит переноса, а предыдущее содержимое бита переноса сдвигалось в самый младший бит результата. Обмен байтами не влиял на бит переноса. На языке ассемблера эти опции задавались путем добавления буквы к коду операции: «L» — сдвиг влево; «R» — сдвиг вправо, «S» — обмен байтами; ничего — не выполнять сдвиг или обмен.
Все арифметические инструкции включали трехбитное поле, которое могло указывать тест, который должен был применяться к результату операции. Если тест оценивался как истинный, следующая инструкция в строке пропускалась. На языке ассемблера опция теста указывалась как третий операнд инструкции. Доступные тесты были:
Фактические арифметические инструкции были следующими:
Пример арифметических инструкций со всеми используемыми опциями:
ADDZR# 0 , 2 , SNC
Это расшифровывается как: очистить бит переноса; добавить содержимое AC2 (аккумулятор 2) к AC0; циклически сместить результат на один бит вправо; проверить результат, чтобы увидеть, установлен ли бит переноса, и пропустить следующую инструкцию, если это так. Отбросить результат после выполнения теста. По сути, это складывает два числа и проверяет, является ли результат четным или нечетным.
Набор инструкций Nova содержал пару инструкций, которые передавали содержимое памяти в аккумуляторы и наоборот, две инструкции передачи управления и две инструкции, которые проверяли содержимое ячейки памяти. Все инструкции обращения к памяти содержали восьмибитное адресное поле и двухбитное поле, которое указывало режим адресации памяти. Четыре режима были:
Очевидно, что режим 0 был способен адресовать только первые 256 слов памяти, учитывая восьмибитное адресное поле. Эта часть памяти называлась «страницей ноль». Слова памяти страницы ноль считались драгоценными для программистов на языке ассемблера Nova из-за небольшого доступного числа; только ячейки страницы ноль могли быть адресованы из любого места программы без обращения к индексной адресации, которая требовала связывания аккумулятора 2 или 3 для использования в качестве индексного регистра. В языке ассемблера директива «.ZREL» заставляла ассемблер помещать инструкции и слова данных, которые следовали за ней, на страницу ноль; директива «.NREL» помещала следующие инструкции и слова данных в «нормальную» память. Более поздние модели Nova добавляли инструкции с расширенными полями адресации, что преодолевало эту трудность (со снижением производительности).
Ассемблер автоматически вычислял относительные смещения для режима 1, хотя его также можно было явно записать в исходном коде. Если инструкция ссылки на память ссылалась на адрес памяти в пространстве .NREL, но не имела спецификатора режима, предполагался режим 1, и ассемблер вычислял смещение между текущей инструкцией и указанным местоположением и помещал его в поле адреса инструкции (при условии, что полученное значение помещалось в 8-битное поле).
Две инструкции по загрузке и сохранению были следующими:
Обе эти инструкции включали «косвенный» бит. Если этот бит был установлен (на языке ассемблера это делается путем добавления '@' к коду операции), содержимое целевого адреса считалось адресом памяти, и на этот адрес ссылались для загрузки или сохранения.
Две инструкции по передаче контроля были следующими:
Как и в случае с инструкциями загрузки и сохранения, инструкции перехода содержали косвенный бит, который также был указан в ассемблере с помощью символа «@». В случае косвенного перехода процессор извлекал содержимое целевого местоположения и использовал значение в качестве адреса памяти для перехода. Однако, в отличие от инструкций загрузки и сохранения, если косвенный адрес имел установленный старший бит, он выполнял еще один цикл косвенного обращения. В процессорах серии Nova до Nova 3 не было ограничений на количество циклов косвенного обращения; косвенный адрес, который ссылался сам на себя, приводил к бесконечному циклу косвенного обращения, при этом инструкция никогда не завершалась. (Это могло насторожить пользователей, поскольку в этом состоянии нажатие переключателя STOP на передней панели ничего не делало. Чтобы разорвать цикл, требовалось сбросить машину.)
Две инструкции по тестированию памяти были следующими:
Как и в случае с инструкциями загрузки и сохранения, был косвенный бит, который выполнял один уровень косвенной адресации. Эти инструкции были странными в том смысле, что на Nova с памятью на магнитных сердечниках инструкция выполнялась внутри самой платы памяти. Как было принято в то время, платы памяти содержали схему «обратной записи» для решения проблемы деструктивного чтения, присущей памяти на магнитных сердечниках. Но механизм обратной записи также содержал мини-арифметический блок, который процессор использовал для нескольких целей. Для инструкций ISZ и DSZ приращение или уменьшение происходило между считыванием ячейки памяти и обратной записью; ЦП просто ждал, пока ему сообщат, был ли результат нулевым или ненулевым. Эти инструкции были полезны, поскольку они позволяли использовать ячейку памяти в качестве счетчика цикла без связывания аккумулятора, но они были медленнее, чем выполнение эквивалентных арифметических инструкций.
Некоторые примеры инструкций по обращению к памяти:
LDA 1 , СЧЕТЧИК
Переносит содержимое ячейки памяти с меткой COUNT в аккумулятор 1. Если предположить, что COUNT находится в пространстве .NREL, эта инструкция эквивалентна: LDA 1,1,(COUNT-(.+1)), где «.» представляет местоположение инструкции LDA.
JSR@ 0 , 17
Косвенный переход к адресу памяти, указанному содержимым ячейки 17 в пространстве нулевой страницы, и помещение адреса возврата в аккумулятор 3. Это был стандартный метод выполнения системного вызова RDOS на ранних моделях Nova; мнемоника языка ассемблера «.SYSTM» транслировалась в это.
СПМ 0 , 3
Переход к ячейке памяти, адрес которой содержится в аккумуляторе 3. Это был распространенный способ возврата из вызова функции или подпрограммы, поскольку инструкция JSR оставляла адрес возврата в аккумуляторе 3.
СТА 0 , 3 , - 1
Сохраните содержимое аккумулятора 0 в месте, которое на единицу меньше адреса, содержащегося в аккумуляторе 3.
DSZ COUNT
Уменьшить значение в месте, обозначенном COUNT, и пропустить следующую инструкцию, если результат равен нулю. Как и в случае выше, если предполагается, что COUNT находится в пространстве .NREL, это эквивалентно: DSZ 1,(COUNT-(.+1))
Novas реализовали канализированную модель для взаимодействия с устройствами ввода-вывода. В этой модели каждое устройство ввода-вывода должно было реализовать два флага, называемых «Busy» и «Done», и три регистра данных и управления, называемых A, B и C. Инструкции ввода-вывода были доступны для чтения и записи регистров, а также для отправки одного из трех сигналов устройству, называемых «start», «clear» и «pulse». В общем, отправка сигнала запуска инициировала операцию ввода-вывода, которая была настроена путем загрузки значений в регистры A/B/C. Сигнал очистки останавливал операцию ввода-вывода и очищал любое результирующее прерывание. Импульсный сигнал использовался для инициирования вспомогательных операций в сложных подсистемах, таких как операции поиска на дисковых накопителях. Опрашиваемые устройства обычно перемещали данные напрямую между устройством и регистром A. Устройства DMA обычно использовали регистр A для указания адреса памяти, регистр B для указания количества слов для передачи и регистр C для флагов управления. Канал 63 относился к самому ЦП и использовался для различных специальных функций.
Каждая инструкция ввода-вывода содержала шестибитное поле номера канала, четырехбитное поле для указания регистра для чтения или записи и двухбитное поле для указания сигнала, который должен быть отправлен. На языке ассемблера сигнал задавался путем добавления буквы к коду операции: «S» для запуска, «C» для очистки, «P» для импульса и ничего для отсутствия сигнала. Коды операций были следующими:
Кроме того, для проверки состояния устройства были доступны четыре инструкции:
Запуск устройства приводил к установке им флага занятости. Когда запрошенная операция завершалась, устройство обычно сбрасывало свой флаг занятости и устанавливало флаг готовности; у большинства устройств механизм запроса прерывания был подключен к флагу готовности, поэтому установка флага готовности вызывала прерывание (если прерывания были включены и устройство не было замаскировано).
Эти инструкции выполняли различные функции управления и состояния ЦП. Все они фактически были мнемоническими сокращениями для инструкций ввода-вывода на канале 63, канале ввода-вывода ЦП с самоссылкой.
С точки зрения оборудования механизм прерывания был относительно простым, но и менее гибким, чем современные архитектуры ЦП. Объединительная плата поддерживала одну линию запроса прерывания, к которой подключались все устройства, способные прерывать. Когда устройству требовалось запросить прерывание, оно поднимало эту линию. ЦП принимал прерывание, как только завершал текущую инструкцию. Как указано выше, ожидалось, что устройство поднимет свой флаг ввода-вывода «done» при запросе прерывания, и соглашение заключалось в том, что устройство очищало свой запрос прерывания, когда ЦП выполнял инструкцию очистки ввода-вывода на номере канала устройства.
Процессор ожидал, что операционная система поместит адрес своей процедуры обслуживания прерываний в адрес памяти 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 переносило двоичное значение, представленное текущими настройками переключателей данных, в аккумулятор.
Двигаясь вправо, следующим переключателем был переключатель RESET/STOP. Нажатие STOP приводило к остановке ЦП после завершения текущей инструкции. Нажатие RESET приводило к немедленной остановке ЦП, очистке ряда внутренних регистров ЦП и отправке сигнала сброса ввода-вывода на все подключенные устройства. Переключатель справа от него был переключателем START/CONTINUE. Нажатие CONTINUE приводило к возобновлению выполнения ЦП инструкции, на которую в данный момент указывает счетчик программ. Нажатие START переносило значение, установленное в переключателях данных 1–15, на счетчик программ, а затем начинало выполнение оттуда.
Следующие два переключателя обеспечивали доступ к чтению и записи в память с передней панели. Нажатие EXAMINE передавало значение, установленное в переключателях данных 1–15, в счетчик программ, извлекало значение из соответствующей ячейки памяти и отображало его значение в индикаторах данных. Нажатие EXAMINE NEXT увеличивало счетчик программ, а затем выполняло операцию проверки в этой ячейке памяти, позволяя пользователю пошагово проходить по ряду ячеек памяти. Нажатие DEPOSIT записывало значение, содержащееся в переключателях данных, в ячейку памяти, на которую указывал счетчик программ. Нажатие DEPOSIT NEXT сначала увеличивало счетчик программ, а затем помещало его в указанную ячейку памяти.
Функция INST STEP заставляла ЦП выполнять одну инструкцию в текущем месте счетчика программ, а затем останавливаться. Поскольку счетчик программ увеличивался в ходе выполнения инструкций, это позволяло пользователю выполнять программу пошагово. MEMORY STEP, неправильное название, заставляло ЦП проходить один такт и останавливаться. Это было малополезно для пользователей и обычно использовалось только персоналом полевого обслуживания для диагностики.
PROGRAM LOAD был механизмом, который обычно использовался для загрузки Nova. При срабатывании этого переключателя загрузочное ПЗУ из 32 слов отображалось на первые 32 слова памяти, счетчик программ устанавливался на 0 и запускался ЦП. Загрузочное ПЗУ содержало код, который считывал 256 слов (512 байт) кода с выбранного устройства ввода-вывода в память, а затем передавал управление считанному коду. Переключатели данных 8-15 использовались для указания загрузочному ПЗУ, с какого канала ввода-вывода следует производить загрузку. Если переключатель 0 был выключен, загрузочное ПЗУ предполагало, что устройство является опрашиваемым устройством (например, считывателем перфоленты) и запускало цикл опрашиваемого ввода, пока не будут считаны 512 байт. Если переключатель 0 был включен, загрузочное ПЗУ предполагало, что устройство является устройством с поддержкой DMA, и инициировало передачу данных DMA. Загрузочное ПЗУ было недостаточно умным, чтобы позиционировать устройство до начала передачи. Это было проблемой при перезагрузке после сбоя; если загрузочное устройство было диском, его головки, вероятно, были оставлены на случайном цилиндре. Их нужно было переместить на цилиндр 0, где RDOS записывала загрузочный блок первого уровня, чтобы последовательность загрузки сработала. Обычно это делалось путем циклического прохождения накопителем последовательности загрузки, но пользователи, которых раздражало время ожидания (до 5 минут в зависимости от модели накопителя), научились вводить с передней панели код ввода-вывода «перекалибровки» накопителя и пошагово выполнять его через ЦП, операция, которая у опытного пользователя занимала всего несколько секунд.
Выключатель питания представлял собой 3-позиционный ключевой переключатель с позициями OFF, ON и LOCK. В положении OFF все питание отключалось от ЦП. Поворот ключа в положение ON подавал питание на ЦП. Однако, в отличие от современных ЦП, ЦП не запускался автоматически при подаче питания; пользователь должен был использовать PROGRAM LOAD или какой-либо другой метод для запуска ЦП и инициирования последовательности загрузки. Поворот переключателя в положение 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 мкс. [32] На более позднем 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 мкс. [33]
Это минимальный пример программирования на языке ассемблера Nova. Он предназначен для работы под RDOS и выводит строку « Hello, world. » на консоль.
; программа "hello, world" для Nova под управлением RDOS ; использует системный вызов PCHAR .titl hello .nrel .ent start start: dochar: lda 0 , @ pmsg ; загрузить ac0 следующим символом, mov# 0 , 0 , snr ; проверить ac0; пропустить, если ненулевое значение (не загружать результат) jmp done .systm .pchar ; вывести первый jmp er ; пропущено, если все в порядке movs 0 , 0 ; поменять местами байты .systm .pchar ; вывести второй jmp er ; пропущено, если все в порядке isz pmsg ; указать на следующий символ jmp dochar ; пройти еще раз done: .systm ; нормальный выход .rtn er: .systm ; ошибка выхода .ertn halt pmsg: . + 1 ; указатель на первый символ строки ; обратите внимание, что байты по умолчанию упакованы справа налево ; <15><12> обозначает пару CR LF. .txt / Привет , мир. < 15 >< 12 >/ 0 ; флаговое слово для конца строки .конец начало
Базовые модели Nova поставлялись без встроенной аппаратной возможности умножения и деления, чтобы поддерживать конкурентоспособные цены. Следующая процедура умножает два 16-битных слова для получения результата в виде 16-битного слова (переполнение игнорируется). Она демонстрирует комбинированное использование ALU op, shift и test (skip). Обратите внимание, что когда эта процедура вызывается jsr
, AC3 удерживает адрес возврата . Это используется инструкцией return jmp 0,3
. Идиоматическим способом очистки аккумулятора является sub 0,0
. Другие одиночные инструкции могут быть организованы для загрузки определенного набора полезных констант (например, -2, -1 или +1).
mpy: ; умножить AC0 <- AC1 * AC2, Тоби Тейн sub 0 , 0 ; очистить результат mbit: movzr 1 , 1 , szc ; сдвинуть множитель, проверить младший бит add 2 , 0 ; 1: сложить множимое movzl 2 , 2 , szr ; сдвинуть и проверить на ноль jmp mbit ; не ноль, сделать еще один бит jmp 0 , 3 ; возврат
Следующая процедура выводит значение AC1 как 16-значное двоичное число на консоль RDOS. Она раскрывает дополнительные странности набора инструкций Nova. Например, нет инструкции для загрузки произвольного «немедленного» значения в аккумулятор (хотя инструкции обращения к памяти кодируют такое значение для формирования эффективного адреса). Аккумуляторы обычно должны загружаться из инициализированных ячеек памяти (например, n16
). Другие современные машины, такие как PDP-11 , и практически все современные архитектуры, допускают немедленную загрузку, хотя многие, такие как ARM, ограничивают диапазон значений, которые могут быть загружены немедленно.
Поскольку макрос вызова RDOS .systm
реализует jsr
, AC3 перезаписывается адресом возврата для .pchar
функции. Поэтому требуется временное расположение для сохранения адреса возврата вызывающей функции. Для рекурсивной или иной реентерабельной процедуры вместо этого должен использоваться стек, аппаратный, если доступен, и программный, если нет. Инструкция возврата становится , jmp @ retrn
которая использует режим косвенной адресации Nova для загрузки возвратного ПК.
Определения констант в конце демонстрируют две особенности ассемблера: основание ассемблера по умолчанию восьмеричное20
( = шестнадцать), а символьные константы могут быть закодированы, например, как "0
.
pbin: ; вывести AC1 на консоль в виде 16 двоичных цифр, Тоби Тейн sta 3 , retrn ; сохранить return addr lda 2 , n16 ; настроить цикл счетчика бит: lda 0 , chr0 ; загрузить ASCII '0' movzl 1 , 1 , szc ; получить следующий бит в переносе inc 0 , 0 ; увеличить до '1' .systm .pchar ; AC0-2 сохранен jmp err ; если ошибка inc 2 , 2 , szr ; увеличить счетчик jmp loop ; повторить цикл, если не ноль lda 0 , spc ; вывести пробел .systm .pchar jmp err ; если ошибка jmp @ retrn spc: " ;это пробел chr0: "0 n16: -20 retrn: 0
Канадская вещательная корпорация в Монреале использовала Nova 1200 для автоматизации воспроизведения каналов вплоть до конца 1980-х годов. Затем ее заменили на отремонтированные устройства Nova 4, которые использовались до середины 1990-х годов.