

La Nova es una serie de minicomputadoras de 16 bits lanzadas por la compañía estadounidense Data General . La familia Nova fue muy popular en la década de 1970 y llegó a vender decenas de miles de unidades.
El primer modelo, conocido simplemente como "Nova", se lanzó en 1969. [ 1 ] El Nova venía en una única carcasa de montaje en rack de 3U y tenía suficiente potencia de cálculo para realizar la mayoría de las tareas sencillas. El Nova se popularizó en laboratorios científicos de todo el mundo. Al año siguiente le siguió el SuperNOVA , que era aproximadamente cuatro veces más rápido, convirtiéndose en el miniordenador más rápido durante varios años.
Lanzada durante un período de rápido progreso en el diseño de circuitos integrados (o microchips), la línea experimentó varias actualizaciones en los siguientes cinco años, introduciendo los modelos 800 y 1200, el Nova 2, el Nova 3 y, finalmente, el Nova 4. También se presentó una implementación de un solo chip, el microNOVA, en 1977, pero no tuvo una gran acogida, ya que el mercado se decantó por nuevos diseños de microprocesadores. Fairchild Semiconductor también presentó una versión con microprocesador del Nova en 1977, el Fairchild 9440 , pero su uso en el mercado también fue limitado.
La línea Nova fue sucedida por la Data General Eclipse , que era similar en la mayoría de los aspectos, pero añadía compatibilidad con memoria virtual y otras características necesarias para los sistemas operativos modernos . Una actualización a 32 bits de la Eclipse dio como resultado la serie Eclipse MV de la década de 1980.
Historia
Edson de Castro y el PDP-X
Edson de Castro fue el gerente de producto de la pionera Digital Equipment Corporation (DEC) PDP-8 , una computadora de 12 bits ampliamente conocida como la primera minicomputadora verdadera. [ 2 ] También lideró el diseño de la versión mejorada PDP-8/I, que utilizaba circuitos integrados primitivos en lugar de transistores individuales. [ 3 ]
Durante el proceso del PDP-8/I, de Castro visitó a fabricantes de placas de circuitos que estaban logrando rápidos avances en la complejidad de las placas que podían ensamblar. De Castro concluyó que el 8/I podría producirse utilizando ensamblaje totalmente automatizado en placas grandes, lo que habría sido imposible tan solo un año antes. Otros dentro de DEC se habían acostumbrado a las placas más pequeñas utilizadas en máquinas anteriores y les preocupaba la dificultad de detectar problemas cuando había muchos componentes en una sola placa. [ a ] Para el 8/I, se decidió mantener las placas pequeñas, utilizando el nuevo encapsulado " flip-chip " para una modesta mejora en la densidad. [ 3 ]
Durante el período de desarrollo del PDP-8, la introducción del ASCII y su importante actualización en 1967 dieron lugar a una nueva generación de diseños con longitudes de palabra que eran múltiplos de 8 bits en lugar de múltiplos de 6 bits, como en la mayoría de los diseños anteriores. Esto llevó a que los diseños de gama media funcionaran con longitudes de palabra de 16 bits en lugar de las líneas de 12 y 18 bits que DEC utilizaba en ese momento. De Castro estaba convencido de que era posible mejorar el PDP-8 construyendo una CPU de minicomputadora de 16 bits en una única placa cuadrada de 15 pulgadas. [ 4 ] [ 5 ]
En 1967, de Castro inició un nuevo proyecto de diseño conocido como "PDP-X", que incluía varias características avanzadas. Entre ellas, un único diseño subyacente que podía utilizarse para construir plataformas de 8, 16 y 32 bits. [ 6 ] Este proyecto avanzó hasta generar varios documentos de arquitectura detallados. Ken Olsen no apoyó este proyecto, pues consideraba que no ofrecía suficientes ventajas sobre el PDP-8 de 12 bits y el PDP-9 de 18 bits . Finalmente, se canceló en la primavera de 1968. [ 4 ]
Diseño
La cancelación del PDP-X llevó a de Castro a considerar la posibilidad de dejar DEC para construir un sistema por su cuenta. No estaba solo; a finales de 1967, varios ingenieros con ideas afines formaron un grupo para estudiar una máquina de este tipo. El grupo incluía a Pat Green, gerente de división; Richard Sogge, otro ingeniero de hardware; y Henry Burkhardt III, ingeniero de software. [ 7 ] A diferencia del PDP-X, el nuevo proyecto se centró en una sola máquina que pudiera lanzarse rápidamente al mercado, ya que de Castro consideraba que el concepto del PDP-X era demasiado ambicioso para una pequeña empresa emergente . [ 8 ]
Al discutirlo con los demás en DEC, el concepto inicial condujo a una máquina de 8 bits que sería menos costosa de implementar. [ 9 ] El grupo comenzó a hablar con Herbert Richman, un vendedor de Fairchild Semiconductor que conocía a los demás a través de sus contactos en DEC. En ese momento, Fairchild estaba compitiendo con Texas Instruments y Signetics en el mercado TTL de rápido crecimiento y estaba introduciendo nuevas fábricas que permitían diseños más complejos. La última serie 9300 de Fairchild permitía hasta 96 puertas por chip, y la habían utilizado para implementar varios chips de 4 bits, como contadores binarios y registros de desplazamiento . [ 10 ]
El uso de estos circuitos integrados redujo la cantidad total de circuitos integrados necesarios para implementar una unidad aritmético-lógica (ALU) completa, el componente matemático central de una CPU, lo que permitió la expansión de un diseño de 8 bits a uno de 16 bits. Esto requirió la expansión de la CPU de una sola placa de circuito impreso de 38 cm × 38 cm (15 × 15 pulgadas ) a dos, pero dicho diseño seguiría siendo significativamente más económico de producir que el PDP-8/I, además de ser más potente y estar basado en ASCII. Una tercera placa contenía los circuitos de entrada/salida y un sistema completo normalmente incluía otra placa con 4 kB de memoria de acceso aleatorio . Un sistema completo de cuatro tarjetas cabía en un único chasis de montaje en rack. [ 5 ]
Las placas se diseñaron para que pudieran conectarse entre sí mediante un plano posterior de circuito impreso , con un cableado manual mínimo, lo que permitió que todas las placas se ensamblaran de forma automatizada. Esto redujo considerablemente los costos en comparación con el PDP-8/I, que constaba de muchas placas más pequeñas que debían conectarse entre sí en el plano posterior, el cual a su vez se conectaba mediante envoltura de cables . La construcción de placas más grandes también hizo que el Nova fuera más fiable, lo que lo hizo especialmente atractivo para entornos industriales o de laboratorio. [ 5 ]
El nuevo diseño empleó una arquitectura simple de carga y almacenamiento [ 4 ] que resurgiría en los diseños RISC en la década de 1980. Debido a que la complejidad de un flip-flop se reducía rápidamente a medida que se implementaban en chips, el diseño compensó la falta de modos de direccionamiento del diseño de carga y almacenamiento agregando cuatro acumuladores de propósito general , en lugar del único registro que se encontraría en ofertas similares de bajo costo como la serie PDP. [ 4 ]
Introducción
A finales de 1967, Richman presentó al grupo al abogado neoyorquino Fred Adler, quien comenzó a buscar diversas fuentes de financiación para capital semilla. En 1968, Adler había cerrado un importante acuerdo de financiación con un consorcio de fondos de capital riesgo del área de Boston, que accedió a proporcionar una inversión inicial de 400 000 dólares estadounidenses, con otros 400 000 dólares disponibles para la puesta en marcha de la producción. De Castro, Burkhart y Sogge dejaron DEC y fundaron Data General (DG) el 15 de abril de 1968. Green no se unió a ellos, considerando que la empresa era demasiado arriesgada, y Richman no se incorporó hasta que el producto estuvo en pleno funcionamiento a finales de ese año. [ 5 ]
El trabajo en el primer sistema duró aproximadamente nueve meses, y los primeros esfuerzos de venta comenzaron en noviembre de ese año. Tuvieron algo de suerte porque la Conferencia Conjunta de Computación de Otoño se había retrasado hasta diciembre de ese año, por lo que pudieron llevar una unidad funcional a San Francisco donde ejecutaron una versión de Spacewar!. [ 11 ] DG lanzó oficialmente el Nova en 1969 a un precio base de US$3,995 (equivalente a US$35,074 en 2025) , anunciándolo como "la mejor computadora pequeña del mundo". [ 12 ] El modelo básico no era muy útil de fábrica, y agregar8 kW (16 kB ) RAM en forma de memoria de núcleo normalmente elevaba el precio a US$7,995 . [ 13 ] En contraste, un PDP-8/I con4 kW (6 kB ) tenía un precio de US$12.800 . [ 14 ]
La primera venta se realizó a una universidad de Texas, y el equipo fabricó a mano un ejemplar que se envió en febrero. Sin embargo, esto ocurrió en medio de una huelga en la industria aérea y la máquina nunca llegó. Enviaron un segundo ejemplar, que llegó rápidamente, ya que la huelga había terminado para entonces, y en mayo finalmente se entregó también el original. [ 15 ]
El sistema fue un éxito desde el principio, vendiéndose la unidad número 100 a los seis meses [ 16 ] y la número 500 a los 15 meses [ 13 ] . Las ventas se aceleraron con la introducción de nuevas versiones, y en 1975 la empresa tenía ventas anuales de 100 millones de dólares estadounidenses [ 17 ] .
Supernova
Ken Olsen había predicho públicamente que DG fracasaría, pero con el lanzamiento del Nova quedó claro que eso no iba a suceder. Para entonces, varias otras compañías también estaban considerando introducir diseños de 16 bits. Olsen decidió que estos representaban una amenaza tanto para su línea de 18 bits como para la de 12 bits, y comenzó un nuevo proyecto de diseño de 16 bits. [ 18 ] Este se materializó en 1970 como el PDP-11 , un diseño mucho más complejo que era tan diferente del PDP-X como lo era el Nova. Los dos diseños compitieron intensamente en el mercado. [ 4 ]
Los rumores sobre el nuevo sistema de DEC llegaron a DG poco después de que comenzara el envío del Nova. En la primavera de 1970, contrataron a un nuevo diseñador, Larry Seligman, para adelantarse a cualquier posible máquina en desarrollo. Dos cambios importantes habían ocurrido desde el diseño del Nova: uno fue que Signetics había presentado el 8260, un circuito integrado de 4 bits que combinaba un sumador, una compuerta XNOR y una compuerta AND, lo que significaba que la cantidad de chips necesarios para implementar la lógica básica se redujo aproximadamente a la tercera parte. Otro fue que Intel estaba promocionando agresivamente las memorias basadas en semiconductores, prometiendo 1024 bits en un solo chip y funcionando a velocidades mucho mayores que la memoria de núcleo. [ 18 ]
El nuevo diseño de Seligman aprovechó ambas mejoras. Para empezar, los nuevos circuitos integrados permitieron ampliar la ALU a un ancho completo de 16 bits en las mismas dos tarjetas, lo que le permitió realizar operaciones matemáticas y lógicas en un solo ciclo, haciendo que el nuevo diseño fuera cuatro veces más rápido que el original. Además, se utilizó una nueva memoria de núcleo más pequeña que mejoró el tiempo de ciclo de los 1200 ns del original a 800 ns, ofreciendo una mejora adicional de 1/3 . El rendimiento podría mejorarse aún más reemplazando el núcleo con memoria de solo lectura ; al carecer del ciclo de lectura-escritura del núcleo, se podría acceder a ella en 300 ns para un aumento drástico del rendimiento. [ 16 ]
La máquina resultante, conocida como SuperNOVA , se lanzó en 1970. Aunque los modelos iniciales todavía usaban núcleos, todo el diseño se basaba en la premisa de que estarían disponibles memorias semiconductoras más rápidas y la plataforma podría aprovecharlas al máximo. Esto se presentó más tarde ese mismo año como SuperNOVA SC , que incorporaba memoria semiconductora (SC). La memoria de rendimiento mucho mayor permitió aumentar aún más la velocidad de la CPU, que era síncrona con la memoria, para funcionar a un tiempo de ciclo de 300 ns (3,3 MHz). Esto la convirtió en la minicomputadora más rápida disponible durante muchos años. [ 19 ] Inicialmente, la nueva memoria también era muy cara y se calentaba mucho, por lo que no se utilizó ampliamente. [ 20 ]
1200 y 800

Como demostración del poder de su tecnología de matriz de puertas Micromatrix , en 1968 Fairchild creó el prototipo 4711, una ALU de 4 bits de un solo chip. [ 10 ] [ 21 ] El diseño nunca se concibió para la producción en masa y su fabricación era bastante costosa. La introducción del Signetics 8260 en 1969 los obligó a cambiar de estrategia; tanto Texas Instruments como Fairchild introdujeron sus propias ALU de 4 bits en 1970, la 74181 y la 9341, respectivamente. A diferencia de la 8260, los nuevos diseños ofrecían todas las funciones lógicas comunes y reducían aún más el número de chips. [ 10 ]
Esto llevó a DG a considerar el diseño de una nueva CPU utilizando estos circuitos integrados más integrados. Como mínimo, esto reduciría la CPU a una sola tarjeta tanto para el Nova básico como para el SuperNOVA. Surgió un nuevo concepto en el que un solo chasis podría albergar cualquiera de las dos máquinas simplemente cambiando la placa de circuito de la CPU. Esto permitiría a los clientes comprar el sistema de menor costo y luego actualizarlo en cualquier momento. [ 22 ]
Mientras Seligman trabajaba en la SuperNOVA, la empresa recibió una carta de Ron Gruner que decía: «He leído sobre su producto, he leído sus anuncios y voy a trabajar para ustedes. Estaré en sus oficinas dentro de una semana para hablarles de ello». [ 22 ] Fue contratado de inmediato. Gruner se hizo cargo de la máquina de bajo coste, mientras que Seligman diseñó una versión de alto rendimiento similar. [ 22 ]
El modelo de bajo costo de Gruner se lanzó en 1970 como el Nova 1200 , donde el 1200 hacía referencia al uso de la memoria de núcleo de 1200 ns del Nova original. Presentaba una ALU de 4 bits basada en un solo chip 74181, y por lo tanto era esencialmente un Nova reempaquetado. El SuperNOVA de cuatro ALU reempaquetado de Seligman se lanzó en 1971 como el Nova 800 , lo que resultó en una nomenclatura algo confusa donde el modelo con número más bajo tiene un rendimiento superior. [ 22 ] Ambos modelos se ofrecieron en una variedad de carcasas, el 1200 con siete ranuras, el 1210 con cuatro y el 1220 con catorce.
Modelos posteriores
Para entonces, el PDP-11 finalmente se estaba comercializando. Ofrecía una arquitectura de conjunto de instrucciones mucho más completa que la deliberadamente simple del Nova. La continua mejora en los diseños de circuitos integrados, y especialmente en su relación precio-rendimiento , estaba erosionando el valor de las instrucciones simplificadas originales. Seligman fue el encargado de diseñar una nueva máquina que fuera compatible con el Nova y que, a la vez, ofreciera un entorno mucho más completo para quienes lo desearan. Este concepto se comercializó como la serie Data General Eclipse , que ofrecía la posibilidad de añadir circuitos adicionales para adaptar el conjunto de instrucciones a cargas de trabajo científicas o de procesamiento de datos . El Eclipse logró competir con éxito con el PDP-11 en la gama alta del mercado. [ 23 ]
Por esa misma época, comenzaron a circular rumores sobre una nueva máquina de 32 bits de DEC. DG decidió que necesitaban un producto similar, y Gruner fue puesto al frente de lo que se convertiría en el Proyecto Fountainhead. Dado el alcance del proyecto, acordaron que todo el trabajo se realizaría fuera de las instalaciones, y Gruner seleccionó una ubicación en Research Triangle Park en Carolina del Norte . Este diseño se volvió muy complejo [ 24 ] y finalmente fue cancelado años después.
Mientras se llevaban a cabo estos esfuerzos, continuaban las obras en la línea Nova.
840
El modelo 840, lanzado por primera vez en 1973, también incluía un nuevo sistema de memoria paginada que permitía direcciones de hasta 17 bits. Un índice desplazaba la dirección base hacia la memoria de mayor capacidad, de 128 kwords. Instalar tanta memoria requería un espacio considerable; el 840 se enviaba en una carcasa grande de 14 ranuras.
Nova 2
La siguiente versión fue la Nova 2 , cuyas primeras unidades se lanzaron en 1973. La Nova 2 era esencialmente una versión simplificada de las máquinas anteriores, ya que el aumento de la densidad de chips permitió reducir el tamaño de la CPU. Mientras que la SuperNOVA utilizaba tres placas de 15 × 15 pulgadas para implementar la CPU y su memoria, la Nova 2 lo integraba todo en una sola placa. La ROM se utilizaba para almacenar el código de arranque, que luego se copiaba en el núcleo cuando se activaba el interruptor de "carga de programa". Existían versiones con cuatro ("2/4"), siete y diez ranuras ("2/10").
Nova 3

El Nova 3 de 1975 incorporó dos registros adicionales para controlar el acceso a una pila integrada. El procesador también se rediseñó utilizando componentes TTL , lo que mejoró aún más el rendimiento del sistema. El Nova 3 se ofreció en versiones de cuatro ranuras (Nova 3/4) y doce ranuras (Nova 3/12).
Nova 4
Parece ser que Data General originalmente pretendía que la Nova 3 fuera la última de su línea, planeando reemplazarla con las máquinas Eclipse posteriores. Sin embargo, la continua demanda llevó a la introducción de la máquina Nova 4 en 1978, esta vez basada en cuatro ALU de división de bits AMD Am2901 . Esta máquina fue diseñada desde el principio para ser tanto la Nova 4 como la Eclipse S/140, con un microcódigo diferente para cada una. También estaba disponible un coprocesador de punto flotante, que ocupaba una ranura separada. Una opción adicional permitía el mapeo de memoria, lo que permitía a los programas acceder hasta 128 kwords de memoria mediante conmutación de bancos . A diferencia de las máquinas anteriores, la Nova 4 no incluía una consola en el panel frontal , sino una ROM con código máquina que permitía a un terminal emular una consola cuando fuera necesario. [ 25 ] : 87
Existían tres versiones diferentes del Nova 4: el Nova 4/C, el Nova 4/S y el Nova 4/X. El Nova 4/C era una implementación de placa única que incluía toda la memoria (16 o 32 kwords). El Nova 4/S y el 4/X utilizaban placas de memoria separadas. El Nova 4/X tenía habilitada la unidad de gestión de memoria (MMU) integrada para permitir el uso de hasta 128 kwords de memoria. La MMU también estaba instalada en el Nova 4/S, pero estaba deshabilitada por firmware . Tanto el 4/S como el 4/X incluían un "prefetcher" para aumentar el rendimiento al obtener hasta 11 instrucciones de la memoria antes de que fueran necesarias. [ 25 ] : 5
microNOVA

Data General también produjo una serie de implementaciones de un solo chip microNOVA del procesador Nova. Para que cupiera en un chip DIP ( Dual In-line Package ) de 40 pines, el bus de direcciones y el bus de datos compartían un conjunto de 16 pines. Esto significaba que las lecturas y escrituras en la memoria requerían dos ciclos, y que, como resultado, la máquina funcionaba aproximadamente a la mitad de la velocidad del Nova original. [ 26 ]
El primer chip de la serie fue el mN601 , de 1977. Este se vendió como CPU para otros usuarios, como un chipset completo para quienes querían implementar una computadora, como una computadora completa en una sola placa con 4 kB de RAM y como un modelo completo de gama baja del Nova. [ 26 ] Una versión mejorada del diseño, el mN602 de 1979 , redujo todo el chipset a un único VLSI . Este se ofreció en dos máquinas, el microNOVA MP/100 y el microNOVA MP/200 de mayor tamaño .
El microNOVA fue posteriormente rediseñado con un monitor en una carcasa estilo PC con dos disqueteras como Enterprise . Enterprise se lanzó en 1981, ejecutando RDOS , pero la introducción del IBM PC ese mismo año hizo que la mayoría de las demás máquinas pasaran desapercibidas. [ 27 ]
Legado
El Nova influyó en el diseño de los ordenadores Xerox Alto (1973) [ 28 ] y Apple I (1976) [ 29 ] , y su arquitectura fue la base de la serie Computervision CGP (Computervision Graphics Processor). El diseño externo del Nova 2 inspiró el panel frontal del microordenador MITS Altair (1975) , según Ed Roberts , uno de sus diseñadores.
Data General continuó el éxito del Nova original con una serie de diseños más rápidos. Posteriormente, se presentó la familia de sistemas Eclipse con un conjunto de instrucciones extendido y compatible con versiones anteriores, y la serie MV extendió aún más el Eclipse a una arquitectura de 32 bits para competir con el DEC VAX . El desarrollo de la serie MV quedó documentado en el popular libro de Tracy Kidder de 1981, The Soul of a New Machine . Data General evolucionaría más tarde hasta convertirse en un proveedor de servidores y sistemas de almacenamiento basados en procesadores Intel, siendo finalmente adquirida por EMC .
Existe un grupo diverso pero entusiasta de personas en todo el mundo que restauran y preservan sistemas Data General originales de 16 bits. [ 30 ] [ 31 ]
Descripción técnica
Diseño de procesadores
A diferencia del PDP-8 , el Nova tenía una arquitectura de carga y almacenamiento . Contaba con cuatro registros acumuladores de 16 bits , dos de los cuales (2 y 3) podían utilizarse como registros de índice . Tenía un contador de programa de 15 bits y un registro de acarreo de un bit . Al igual que en el PDP-8, el direccionamiento de página actual + cero era fundamental. No disponía de registro de pila , pero los diseños posteriores de Eclipse utilizarían una dirección de memoria de hardware dedicada para esta función.
El Nova original procesaba operaciones matemáticas en serie en paquetes de 4 bits, utilizando un único sumador Texas Instruments 7483 y circuitos adicionales para realizar otras operaciones. [ 32 ] Un año después de su lanzamiento, el SuperNova incluyó un sumador paralelo bit-sliced de 16 bits completo que utilizaba cuatro circuitos integrados Signetics 8260. El Nova 1200 también procesaba operaciones matemáticas en serie en paquetes de 4 bits, utilizando una única ALU 74181 ; el Nova 800 era un SuperNova rediseñado.
Las versiones posteriores del Nova añadieron una unidad de apilamiento y multiplicación/división por hardware.
El Nova 4 / Eclipse S/140 se basaba en cuatro ALU de división de bits AMD 2901 , con microcódigo en memoria de solo lectura , y fue el primer Nova diseñado solo para memoria principal DRAM , sin provisión para memoria de núcleo magnético .
Memoria y E/S
La unidad más pequeña de memoria direccionable y grabable es la palabra de 16 bits; no se admite el direccionamiento por bytes. Los primeros modelos ofrecían como opción 8 K palabras de memoria de núcleo magnético , una opción que prácticamente todos debían adquirir, lo que elevaba el costo del sistema a 7995 dólares.
Esta placa de memoria principal estaba organizada de forma planar en cuatro grupos de cuatro bancos, cada banco contenía dos conjuntos de núcleos en una matriz de 64 por 64; por lo tanto, había 64 x 64 = 4096 bits por conjunto, x 2 conjuntos daban 8192 bits, x 4 bancos daban 32768 bits, x 4 grupos daban un total de 131072 bits, y esto dividido por el tamaño de palabra de la máquina de 16 bits daba 8192 palabras de memoria.
El núcleo de esta placa de memoria de 8K palabras ocupaba una placa central de 5,25" de ancho por 6,125" de alto, y estaba cubierto por una placa protectora. Estaba rodeado por los circuitos de lectura, escritura y reescritura del controlador de soporte necesarios. Todo el núcleo y la electrónica de soporte correspondiente cabían en una única placa estándar de 15 x 15 pulgadas (380 mm) . Se podían admitir hasta 32K de dicha RAM de núcleo en una caja de expansión externa. La ROM de semiconductores ya estaba disponible en ese momento, y los sistemas sin RAM (es decir, solo con ROM) se popularizaron en muchos entornos industriales. Las máquinas Nova originales funcionaban a aproximadamente 200 kHz , pero su SuperNova fue diseñada para funcionar a hasta 3 MHz cuando se utilizaba con una memoria principal de semiconductores especial.
La estandarización del bus de E/S y del plano posterior creó un diseño de E/S sencillo y eficiente que facilitó la conexión de dispositivos de E/S programados y de canal de datos al Nova, en comparación con las máquinas de la competencia. Además de su estructura de bus de E/S dedicada, el plano posterior del Nova contaba con pines de conexión que podían utilizarse para conectores no estándar u otros fines especiales.
Modelo de programación
El formato de las instrucciones se podía clasificar en tres funciones principales: 1) manipulación de registros, 2) referencia a memoria y 3) entrada/salida. Cada instrucción ocupaba una palabra. La manipulación de registros era casi tan eficiente como la de una arquitectura RISC en cuanto a su uso de bits; además, una instrucción que manipulaba datos de registro podía realizar comprobaciones, desplazamientos e incluso descartar el resultado. Las opciones de hardware incluían una unidad de multiplicación y división de enteros, una unidad de coma flotante (precisión simple y doble) y gestión de memoria .

Los primeros modelos de Nova incluían un intérprete BASIC en cinta perforada . A medida que el producto crecía, Data General desarrolló numerosos lenguajes para los ordenadores Nova, que se ejecutaban bajo una variedad de sistemas operativos consistentes. Data General ofrecía FORTRAN IV , ALGOL , Extended BASIC, Data General Business Basic , Interactive COBOL y varios ensambladores. Proveedores externos y la comunidad de usuarios ampliaron la oferta con Forth , Lisp , BCPL , C , ALGOL y otras versiones propietarias de COBOL y BASIC .
Conjunto de instrucciones
Las instrucciones de máquina que se muestran a continuación constituyen el conjunto común implementado por todos los procesadores de la serie Nova. Algunos modelos específicos implementaban instrucciones adicionales, y otras instrucciones eran proporcionadas por hardware opcional.
Instrucciones aritméticas
Todas las instrucciones aritméticas operaban entre acumuladores. Para las operaciones que requerían dos operandos, uno se tomaba del acumulador de origen y el otro del acumulador de destino, y el resultado se almacenaba en este último. Para las operaciones con un solo operando, el operando se tomaba del registro de origen y el resultado reemplazaba el registro de destino. Para todos los códigos de operación con un solo operando, era posible que los acumuladores de origen y destino fueran iguales, y la operación funcionaba según lo previsto.
Todas las instrucciones aritméticas incluían un bit de "no carga" que, al activarse, impedía la transferencia del resultado al registro de destino. Esto se utilizaba junto con las opciones de prueba para realizar una comprobación sin perder el contenido existente del registro de destino. En lenguaje ensamblador , añadir un '#' al código de operación activaba el bit de no carga.
La CPU contenía un registro de un bit llamado bit de acarreo, que después de una operación aritmética almacenaba el acarreo del bit más significativo. El bit de acarreo podía configurarse con el valor deseado antes de realizar la operación mediante un campo de dos bits en la instrucción. El bit podía configurarse, borrarse o complementarse antes de ejecutar la instrucción. En lenguaje ensamblador, estas opciones se especificaban añadiendo una letra al código de operación: 'O' — configurar el bit de acarreo; 'Z' — borrar el bit de acarreo; 'C' — complementar el bit de acarreo; nada — dejar el bit de acarreo sin modificar. Si también se especificaba el bit de no carga, se utilizaba el valor de acarreo especificado para el cálculo, pero el registro de acarreo real permanecía inalterado.
Todas las instrucciones aritméticas incluían un campo de dos bits que permitía especificar una opción de desplazamiento, la cual se aplicaba al resultado antes de cargarlo en el registro de destino. Se podía especificar un desplazamiento de un bit a la izquierda o a la derecha, o bien intercambiar los dos bytes del resultado. Los desplazamientos eran circulares de 17 bits, con el bit de acarreo situado a la izquierda del bit más significativo. En otras palabras, al realizar un desplazamiento a la izquierda, el bit más significativo del resultado se desplazaba al bit de acarreo, y el contenido anterior de este bit se desplazaba al bit menos significativo del resultado. El intercambio de bytes no afectaba al bit de acarreo. En lenguaje ensamblador, estas opciones se especificaban añadiendo una letra al código de operación: 'L' — desplazamiento a la izquierda; 'R' — desplazamiento a la derecha; 'S' — intercambio de bytes; nada — no realizar desplazamiento ni intercambio.
Todas las instrucciones aritméticas incluían un campo de tres bits que podía especificar una prueba que se aplicaría al resultado de la operación. Si la prueba resultaba verdadera, se omitía la siguiente instrucción. En lenguaje ensamblador, la opción de prueba se especificaba como un tercer operando de la instrucción. Las pruebas disponibles eran:
- SZR — omitir en caso de resultado cero
- SNR : omitir si el resultado no es cero.
- SZC — saltar en carga cero
- SNC — omitir en acarreo distinto de cero
- SBN — saltar si tanto el acarreo como el resultado son distintos de cero
- SEZ : omitir si el acarreo, el resultado o ambos son cero.
- SKP — siempre saltar
- Nada — nunca te saltes
Las instrucciones aritméticas reales fueron:
- MOV : mueve el contenido del acumulador de origen al acumulador de destino.
- COM — mueve el complemento bit a bit del acumulador de origen al acumulador de destino.
- ADD — agregar acumulador de origen al acumulador de destino
- ADC : toma el complemento bit a bit del acumulador de origen y súmalo al acumulador de destino.
- NEG : mueve el negativo del acumulador de origen al acumulador de destino.
- SUB — resta el acumulador de origen del acumulador de destino
- INC — suma 1 al contenido del acumulador de origen y pasa al acumulador de destino.
- AND : realiza la operación AND bit a bit de los dos acumuladores y coloca el resultado en el acumulador de destino.
Un ejemplo de instrucciones aritméticas, con todas las opciones utilizadas, es:
ADDZR# 0 , 2 , SNCEsto se decodifica como: borrar el bit de acarreo; sumar el contenido de AC2 (acumulador 2) a AC0; desplazar circularmente el resultado un bit a la derecha; comprobar si el bit de acarreo está activado y, de ser así, saltarse la siguiente instrucción. Descartar el resultado tras la comprobación. En resumen, esto suma dos números y comprueba si el resultado es par o impar.
Instrucciones de referencia de memoria
El conjunto de instrucciones Nova contenía un par de instrucciones que transferían el contenido de la memoria a los acumuladores y viceversa, dos instrucciones de transferencia de control y dos instrucciones que comprobaban el contenido de una ubicación de memoria. Todas las instrucciones de referencia a memoria contenían un campo de dirección de ocho bits y un campo de dos bits que especificaba el modo de direccionamiento de memoria. Los cuatro modos eran:
- Modo 0: direccionamiento absoluto. El contenido del campo de dirección de la instrucción se rellena con ceros a la izquierda y se utiliza como dirección de destino.
- Modo 1: direccionamiento relativo. El contenido del campo de dirección de la instrucción se extiende hacia la izquierda y se suma al valor actual del contador de programa (que, cuando se ejecuta la instrucción, apunta a la siguiente). El resultado se utiliza como dirección de destino.
- Modo 2: direccionamiento indexado. El contenido del campo de dirección de la instrucción se extiende hacia la izquierda y se suma al valor actual del acumulador 2. El resultado se utiliza como dirección de destino.
- Modo 3: direccionamiento indexado. El contenido del campo de dirección de la instrucción se extiende hacia la izquierda y se suma al valor actual del acumulador 3. El resultado se utiliza como dirección de destino.
Obviamente, el modo 0 solo podía acceder a las primeras 256 palabras de memoria, dado el campo de dirección de ocho bits. Esta porción de memoria se denominaba "página cero". Las palabras de memoria de la página cero eran muy valiosas para los programadores de lenguaje ensamblador de Nova debido a su escaso número; solo se podía acceder a las ubicaciones de la página cero desde cualquier parte del programa sin recurrir al direccionamiento indexado, que requería ocupar el acumulador 2 o 3 para usarlo como registro de índice. En lenguaje ensamblador, una .ZRELdirectiva hacía que el ensamblador colocara las instrucciones y palabras de datos que la seguían en la página cero; una .NRELdirectiva colocaba las siguientes instrucciones y palabras de datos en la memoria "normal". Los modelos Nova posteriores añadieron instrucciones con campos de direccionamiento extendidos, lo que superó esta dificultad (aunque con una penalización en el rendimiento).
El ensamblador calculaba automáticamente los desplazamientos relativos para el modo 1, aunque también era posible escribirlos explícitamente en el código fuente. Si una instrucción de referencia a memoria hacía referencia a una dirección de memoria en el espacio .NREL pero no especificaba el modo, se asumía el modo 1 y el ensamblador calculaba el desplazamiento entre la instrucción actual y la ubicación referenciada, y lo colocaba en el campo de dirección de la instrucción (siempre que el valor resultante cupiera en el campo de 8 bits).
Las dos instrucciones de carga y almacenamiento fueron:
LDA— Carga el contenido de una ubicación de memoria en el acumulador especificado.STA— Almacena el contenido del acumulador especificado en una ubicación de memoria.
Ambas instrucciones incluían un bit "indirecto". Si este bit estaba activado (en lenguaje ensamblador, se añadía un símbolo @al código de operación), se asumía que el contenido de la dirección de destino era una dirección de memoria, y se hacía referencia a esa dirección para realizar la carga o el almacenamiento.
Las dos instrucciones de transferencia de control fueron:
JMP— transfiere el control a la ubicación de memoria especificadaJSR("subrutina de salto") — Hace lo mismo que laJMPinstrucción, pero además carga la dirección de retorno (la instrucción que sigue a laJSRinstrucción en línea) en el acumulador 3 antes de saltar.
Al igual que en el caso de las instrucciones de carga y almacenamiento, las instrucciones de salto contenían un bit indirecto, que también se especificaba en lenguaje ensamblador mediante el @carácter. En el caso de un salto indirecto, el procesador recuperaba el contenido de la ubicación de destino y utilizaba su valor como dirección de memoria para saltar. Sin embargo, a diferencia de las instrucciones de carga y almacenamiento, si la dirección indirecta tenía el bit más significativo activado, se realizaba un ciclo adicional de indirección. En los procesadores de la serie Nova anteriores al Nova 3, no existía límite en el número de ciclos de indirección; una dirección indirecta que se referenciaba a sí misma generaba un bucle infinito de direccionamiento indirecto, sin que la instrucción se completara jamás. (Esto podía resultar alarmante para los usuarios, ya que en esta situación, pulsar el interruptor STOP del panel frontal no tenía ningún efecto. Era necesario reiniciar el equipo para romper el bucle).
Las dos instrucciones para la prueba de memoria fueron:
ISZ— incrementa la ubicación de memoria y omite la siguiente instrucción si el resultado es cero.DSZ— decrementa la ubicación de memoria y omite la siguiente instrucción si el resultado es cero.
Al igual que en el caso de las instrucciones de carga y almacenamiento, existía un bit indirecto que realizaba un único nivel de direccionamiento indirecto. Estas instrucciones eran peculiares, ya que en los Novas con memoria de núcleo magnético, la instrucción se ejecutaba dentro de la propia placa de memoria. Como era común en la época, las placas de memoria contenían un circuito de "escritura diferida" para resolver el problema de lectura destructiva inherente a la memoria de núcleo magnético. Pero el mecanismo de escritura diferida también contenía una mini unidad aritmética, que el procesador utilizaba para varios fines. Para las ISZinstrucciones DSZde lectura y escritura, el incremento o decremento se producía entre la ubicación de memoria que se leía y la escritura diferida; la CPU simplemente esperaba a que se le indicara si el resultado era cero o distinto de cero. Estas instrucciones eran útiles porque permitían utilizar una ubicación de memoria como contador de bucle sin ocupar un acumulador, pero eran más lentas que la ejecución de las instrucciones aritméticas equivalentes.
Algunos ejemplos de instrucciones de referencia a memoria:
LDA 1 , CONTEOTransfiere el contenido de la ubicación de memoria etiquetada COUNTal acumulador 1. Suponiendo que COUNTse encuentra en el espacio .NREL, esta instrucción es equivalente a
LDA 1 , 1 ,( COUNT - ( . + 1 ))donde '.' representa la ubicación de la instrucción LDA.
JSR@ 0 , 17Saltar indirectamente a la dirección de memoria especificada por el contenido de la ubicación 17, en el espacio de página cero, y depositar la dirección de retorno en el acumulador 3. Este era el método estándar para realizar una llamada al sistema RDOS en los primeros modelos Nova; el mnemónico en lenguaje ensamblador .SYSTMse traducía a esto.
JMP 0 , 3Saltar a la ubicación de memoria cuya dirección está contenida en el acumulador 3. Este era un método común para regresar de una llamada a una función o subrutina, ya que la instrucción JSR dejaba la dirección de retorno en el acumulador 3.
STA 0 , 3 , -1Almacena el contenido del acumulador 0 en la ubicación que sea una posición menor que la dirección contenida en el acumulador 3.
DSZ COUNTDecrementa el valor en la ubicación etiquetada COUNTy omite la siguiente instrucción si el resultado es cero. Como en el caso anterior, si COUNTse supone que está en el espacio .NREL, esto es equivalente a:
DSZ 1 , ( CONTEO - ( . + 1 ))Instrucciones de E/S
Los Novas implementaron un modelo canalizado para la interfaz con dispositivos de E/S. En este modelo, se esperaba que cada dispositivo de E/S implementara dos indicadores, denominados "Ocupado" y "Listo", y tres registros de datos y control, denominados A, B y C. Las instrucciones de E/S permitían leer y escribir en los registros, así como enviar una de tres señales al dispositivo: "inicio", "borrado" y "pulso". En general, el envío de una señal de inicio activaba una operación de E/S previamente configurada mediante la carga de valores en los registros A, B y C. La señal de borrado detenía una operación de E/S y eliminaba cualquier interrupción resultante. La señal de pulso se utilizaba para iniciar operaciones auxiliares en subsistemas complejos, como operaciones de búsqueda en unidades de disco. Los dispositivos de sondeo generalmente movían los datos directamente entre el dispositivo y el registro A. Los dispositivos DMA generalmente utilizaban el registro A para especificar la dirección de memoria, el registro B para especificar el número de palabras a transferir y el registro C para los indicadores de control. El canal 63 hacía referencia a la propia CPU y se utilizaba para diversas funciones especiales.
Cada instrucción de E/S contenía un campo de seis bits para el número de canal, un campo de cuatro bits para especificar qué registro leer o escribir, y un campo de dos bits para especificar qué señal enviar. En lenguaje ensamblador, la señal se especificaba añadiendo una letra al código de operación: 'S' para inicio, 'C' para borrar, 'P' para pulso y nada para ninguna señal. Los códigos de operación eran:
DIA— mover el contenido del registro A del dispositivo al acumulador especificadoDOA— enviar el contenido del acumulador especificado al registro A del dispositivo en el canal especificadoDIB— mover el contenido del registro B del dispositivo al acumulador especificadoDOB— enviar el contenido del acumulador especificado al registro B del dispositivo en el canal especificadoDIC— mover el contenido del registro C del dispositivo al acumulador especificadoDOC— enviar el contenido del acumulador especificado al registro C del dispositivo en el canal especificadoNIO— "sin E/S", un término inapropiado. La instrucción se utilizaba para enviar una señal a un dispositivo sin realizar una transferencia de registro.
Además, se disponía de cuatro instrucciones para comprobar el estado de un dispositivo:
SKPBN— omita la siguiente instrucción si el indicador de ocupado del dispositivo está activado.SKPBZ— omita la siguiente instrucción si el indicador de ocupado del dispositivo está desactivado.SKPDN— omitir la siguiente instrucción si el indicador de finalización del dispositivo está activado.SKPDZ— omita la siguiente instrucción si el indicador de finalización del dispositivo está desactivado.
El arranque de un dispositivo provocaba que este activara su indicador de ocupado. Cuando se completaba la operación solicitada, el dispositivo desactivaba su indicador de ocupado y activaba su indicador de finalización; la mayoría de los dispositivos tenían su mecanismo de solicitud de interrupción conectado al indicador de finalización, por lo que activar este último provocaba una interrupción (si las interrupciones estaban habilitadas y el dispositivo no estaba enmascarado).
Instrucciones especiales
Estas instrucciones realizaban diversas funciones de control y estado de la CPU. En realidad, todas ellas eran abreviaturas de instrucciones de E/S en el canal 63, el canal de E/S autorreferencial de la CPU.
INTA— Reconocimiento de interrupción. Se transfirió el número de canal del dispositivo que generó la interrupción al acumulador especificado.INTDS— Se deshabilitaron todas las interrupcionesINTEN— Se habilitaron todas las interrupcionesIORST— Reinicio de E/S. Se envió una señal de reinicio al bus de E/S, lo que detuvo todas las operaciones de E/S, deshabilitó las interrupciones y borró todas las interrupciones pendientes.MSKO— Desactivación de la máscara. Se utilizó el contenido del acumulador especificado para configurar la máscara de interrupción. La interpretación de la máscara dependía de la implementación de cada dispositivo de E/S. Algunos dispositivos no podían enmascararse.READS— transfirió el contenido de los 16 interruptores de datos del panel frontal al acumulador especificado.HALT— detuvo la CPU. Una vez detenida, la CPU solo podía reiniciarse mediante intervención manual en el panel frontal.
Interrupciones y gestión de interrupciones
Desde el punto de vista del hardware, el mecanismo de interrupción era relativamente simple, pero también menos flexible que las arquitecturas de CPU actuales. El backplane admitía una única línea de solicitud de interrupción, a la que se conectaban todos los dispositivos capaces de generar interrupciones. Cuando un dispositivo necesitaba solicitar una interrupción, activaba esta línea. La CPU recibía la interrupción tan pronto como completaba la instrucción actual. Como se mencionó anteriormente, se esperaba que un dispositivo activara su indicador de E/S "done" al solicitar una interrupción, y la convención era que el dispositivo borrara su solicitud de interrupción cuando la CPU ejecutara una instrucción de borrado de E/S en el canal del dispositivo.
La CPU esperaba que el sistema operativo colocara la dirección de su rutina de servicio de interrupción en la dirección de memoria 1. Cuando un dispositivo generaba una interrupción, la CPU realizaba un salto indirecto a través de la dirección 1, colocando la dirección de retorno en la dirección de memoria 0 y deshabilitando las interrupciones posteriores. El controlador de interrupciones ejecutaba entonces una INTAinstrucción para descubrir el número de canal del dispositivo que generaba la interrupción. Esto funcionaba mediante la generación de una señal de "reconocimiento" en el plano posterior. La señal de reconocimiento estaba cableada en cadena a través del plano posterior, de modo que recorría cada tarjeta del bus. Se esperaba que cualquier dispositivo que solicitara una interrupción bloqueara la propagación de la señal de reconocimiento por el bus, de manera que si dos o más dispositivos tenían interrupciones pendientes simultáneamente, solo el primero vería la señal de reconocimiento. Dicho dispositivo respondía colocando su número de canal en las líneas de datos del bus. Esto significaba que, en caso de solicitudes de interrupción simultáneas, el dispositivo con prioridad se determinaba por cuál estaba físicamente más cerca de la CPU en el chasis de tarjetas.
La rutina de servicio de interrupción del sistema operativo normalmente realizaba un salto indexado utilizando el número de canal recibido para saltar a la rutina de manejo de interrupciones específica para el dispositivo. Algunos dispositivos, en particular el circuito de detección de fallas de energía de la CPU, no respondían a la INTAinstrucción. Si el INTAresultado era cero, la rutina de servicio de interrupción tenía que consultar todos los dispositivos que no respondían a la instrucción INTA utilizando las instrucciones SKPDZ/ SKPDNpara determinar cuál había generado la interrupción.
Después de que la interrupción fue procesada y la rutina de servicio envió al dispositivo un borrado de E/S, reanudó el procesamiento normal habilitando las interrupciones y luego regresando a través de un salto indirecto a través de la dirección de memoria 0, JMP@ 0. Para evitar que una interrupción pendiente interrumpiera inmediatamente antes del salto de retorno (lo que causaría que la dirección de retorno fuera sobrescrita), la INTENinstrucción tenía un retardo de un ciclo de instrucción. Cuando INTENse ejecutaba, las interrupciones no se habilitarían hasta después de que se ejecutara la siguiente instrucción; se esperaba que esa instrucción fuera la JMP@ 0instrucción.
El sistema operativo podía gestionar parcialmente el orden de las interrupciones mediante una máscara de interrupción MSKO. Esto permitía al sistema operativo determinar qué dispositivos podían generar interrupciones en un momento dado. Al ejecutar esta instrucción, se transmitía una máscara de interrupción de 16 bits a todos los dispositivos de la placa base. Cada dispositivo decidía qué significaba la máscara; por convención, un dispositivo enmascarado no debía activar la línea de interrupción, pero la CPU no tenía forma de garantizarlo. La mayoría de los dispositivos compatibles con máscara permitían seleccionar el bit de la máscara mediante un puente en la placa. Algunos dispositivos ignoraban la máscara por completo.
En los sistemas con memoria de núcleo magnético (que conservaba su contenido sin alimentación), era posible recuperarse de un fallo de alimentación. Un circuito de detección de fallos de alimentación en la CPU generaba una interrupción al detectarse la pérdida de la alimentación principal del ordenador. A partir de ese momento, la CPU disponía de un breve lapso de tiempo hasta que un condensador de la fuente de alimentación se descargara y se interrumpiera la alimentación de la CPU. Este tiempo era suficiente para detener las operaciones de E/S en curso mediante la emisión de una IORSTinstrucción y, a continuación, guardar el contenido de los cuatro acumuladores y el bit de acarreo en la memoria. Al restablecerse la alimentación, si el interruptor de la llave del panel frontal de la CPU estaba en la posición de BLOQUEO, la CPU arrancaba y realizaba un salto indirecto a través de la dirección de memoria 2. Se esperaba que esta fuera la dirección de una rutina de servicio del sistema operativo que recargaría los acumuladores y el bit de acarreo, y reanudaría el procesamiento normal. La rutina de servicio era la encargada de determinar cómo reiniciar las operaciones de E/S que se habían interrumpido por el fallo de alimentación.
Disposición del panel frontal

Como era habitual en la época, la mayoría de los modelos Nova incluían una consola en el panel frontal para controlar y monitorizar las funciones de la CPU. Los modelos anteriores al Nova 3 utilizaban una disposición estándar del panel frontal, como se muestra en la foto del panel del Nova 840 a la derecha. Esta disposición incluía un interruptor de encendido con llave, dos filas de indicadores luminosos de dirección y datos, una fila de interruptores de entrada de datos y una fila de interruptores de función que activaban diversas funciones de la CPU al pulsarlos. Los indicadores de dirección siempre mostraban el valor actual del contador de programa en binario. Los indicadores de datos mostraban diferentes valores según la función de la CPU que estuviera activa en ese momento. A la izquierda del indicador de datos situado más a la izquierda, otro indicador mostraba el valor actual del bit de acarreo. En la mayoría de los modelos, los indicadores eran incandescentes y estaban soldados a la placa del panel; sustituir los indicadores fundidos era un verdadero quebradero de cabeza para los técnicos de servicio de Data General.
Cada uno de los interruptores de datos controlaba el valor de un bit en un valor de 16 bits y, según la convención de Data General, estaban numerados del 0 al 15 de izquierda a derecha. Los interruptores de datos proporcionaban información a la CPU para diversas funciones y también podían ser leídos por un programa en ejecución mediante la instrucción de lenguaje ensamblador READS. Para reducir el desorden en el panel y ahorrar dinero, los interruptores de función se implementaron como interruptores momentáneos bidireccionales. Al levantar la palanca de un interruptor de función, se activaba la función cuyo nombre estaba impreso encima del interruptor en el panel; al presionar la palanca hacia abajo, se activaba la función cuyo nombre aparecía debajo del interruptor. La palanca del interruptor volvía a la posición neutral al soltarse.
En la foto del Nova 840, los cuatro primeros interruptores de la izquierda realizaban las funciones de EXAMINAR y DEPOSITAR para los cuatro acumuladores. Al pulsar EXAMINAR en uno de ellos, los indicadores luminosos mostraban el valor actual del acumulador en binario. Al pulsar DEPOSITAR, se transfería al acumulador el valor binario representado por la configuración actual de los interruptores.
A la derecha, el siguiente interruptor era el de REINICIO/PARADA. Al pulsar PARADA, la CPU se detenía tras completar la instrucción actual. Al pulsar REINICIO, la CPU se detenía inmediatamente, borraba varios registros internos y enviaba una señal de reinicio de E/S a todos los dispositivos conectados. El interruptor a la derecha era el de INICIO/CONTINUACIÓN. Al pulsar CONTINUACIÓN, la CPU reanudaba la ejecución de la instrucción que apuntaba el contador de programa. Al pulsar INICIO, se transfería el valor de los interruptores de datos 1 a 15 al contador de programa y, a partir de ahí, se iniciaba la ejecución.
Los dos interruptores siguientes proporcionaban acceso de lectura y escritura a la memoria desde el panel frontal. Al pulsar EXAMINE, se transfería el valor establecido en los interruptores de datos 1 a 15 al contador de programa, se obtenía el valor de la ubicación de memoria correspondiente y se mostraba en los indicadores luminosos de datos. Al pulsar EXAMINE NEXT, se incrementaba el contador de programa y, a continuación, se realizaba una operación de examen en esa ubicación de memoria, lo que permitía al usuario recorrer una serie de ubicaciones de memoria. Al pulsar DEPOSIT, se escribía el valor contenido en los interruptores de datos en la ubicación de memoria a la que apuntaba el contador de programa. Al pulsar DEPOSIT NEXT, primero se incrementaba el contador de programa y, a continuación, se depositaba el valor en la ubicación de memoria a la que apuntaba.
La función INST STEP hacía que la CPU ejecutara una instrucción, en la posición actual del contador de programa, y luego se detuviera. Dado que el contador de programa se incrementaba durante la ejecución de la instrucción, esto permitía al usuario ejecutar un programa paso a paso. MEMORY STEP, un nombre inapropiado, hacía que la CPU ejecutara un solo ciclo de reloj y se detuviera. Esto resultaba de poca utilidad para los usuarios y, por lo general, solo lo utilizaba el personal de servicio técnico para diagnósticos.
PROGRAM LOAD era el mecanismo que se usaba habitualmente para arrancar un Nova. Cuando se activaba este interruptor, la ROM de arranque de 32 palabras se mapeaba sobre las primeras 32 palabras de memoria, el contador de programa se ponía en 0 y la CPU arrancaba. La ROM de arranque contenía código que leía 256 palabras (512 bytes) de código de un dispositivo de E/S seleccionado en la memoria y luego transfería el control al código leído. Los interruptores de datos 8-15 se usaban para indicarle a la ROM de arranque qué canal de E/S arrancar. Si el interruptor 0 estaba apagado, la ROM de arranque asumía que el dispositivo era un dispositivo de sondeo (por ejemplo, el lector de cinta de papel) y ejecutaba un bucle de entrada de sondeo hasta que se hubieran leído 512 bytes. Si el interruptor 0 estaba encendido, la ROM de arranque asumía que el dispositivo era un dispositivo con capacidad DMA e iniciaba una transferencia de datos DMA. La ROM de arranque no era lo suficientemente inteligente como para posicionar el dispositivo antes de iniciar la transferencia. Esto era un problema al reiniciar después de un fallo; Si el dispositivo de arranque era una unidad de disco, probablemente sus cabezales se habían quedado en un cilindro al azar. Era necesario reposicionarlos en el cilindro 0, donde RDOS escribía el bloque de arranque de primer nivel, para que la secuencia de arranque funcionara. Tradicionalmente, esto se hacía repitiendo la secuencia de carga de la unidad, pero los usuarios que se frustraban con el tiempo de espera (hasta 5 minutos, según el modelo de la unidad) aprendieron a introducir desde el panel frontal un código de E/S para "recalibrar" la unidad y ejecutarlo paso a paso en la CPU, una operación que a un usuario experimentado le llevaba solo unos segundos.
El interruptor de encendido era un interruptor de llave de tres posiciones: APAGADO, ENCENDIDO y BLOQUEO. En la posición APAGADO, se cortaba la alimentación de la CPU. Al girar la llave a ENCENDIDO, se alimentaba la CPU. Sin embargo, a diferencia de las CPU actuales, la CPU no se iniciaba automáticamente al recibir alimentación; el usuario debía usar CARGA DE PROGRAMA u otro método para iniciar la CPU y la secuencia de arranque. Al girar el interruptor a BLOQUEO, se desactivaban los interruptores de función del panel frontal; al girar el interruptor a BLOQUEO y retirar la llave, el usuario podía hacer que la CPU fuera a prueba de manipulaciones. En sistemas con memoria de núcleo magnético, la posición BLOQUEO también activaba la función de recuperación automática ante fallos de alimentación. La llave podía retirarse en las posiciones APAGADO o BLOQUEO.
Actuación
El Nova 1200 ejecutaba las instrucciones de acceso a la memoria principal (LDA y STA) en 2,55 microsegundos (μs). El uso de memoria de solo lectura ahorraba 0,4 μs. Las instrucciones del acumulador (ADD, SUB, COM, NEG, etc.) tardaban 1,55 μs, MUL 2,55 μs, DIV 3,75 μs, ISZ 3,15-4,5 μs. [ 33 ] En el Eclipse MV/6000 posterior, LDA y STA tardaban 0,44 μs, ADD, etc. tardaban 0,33 μs, MUL 2,2 μs, DIV 3,19 μs, ISZ 1,32 μs, FAD 5,17 μs, FMMD 11,66 μs. [ 34 ]
Ejemplos en lenguaje ensamblador
Programa Hola mundo
Este es un ejemplo mínimo de programación en lenguaje ensamblador Nova. Está diseñado para ejecutarse bajo RDOS e imprime la cadena " Hola, mundo " en la consola.
; un programa "hola, mundo" para Nova ejecutándose en RDOS ; utiliza la llamada al sistema PCHAR .titl hello .nrel .ent startinicio: dochar: lda 0 , @ pmsg ; cargar ac0 con el siguiente carácter, mov# 0 , 0 , snr ; probar ac0; saltar si no es cero (no cargar el resultado) jmp done .systm .pchar ; imprimir el primer jmp er ; saltado si OK movs 0 , 0 ; intercambiar bytes .systm .pchar ; imprimir el segundo jmp er ; saltado si OK isz pmsg ; apuntar al siguiente carácter jmp dochar ; volver a recorrerhecho: .systm ; salida normal .rtn er: .systm ; salida de error .ertn haltpmsg: . + 1 ; puntero al primer carácter de la cadena ; nota: los bytes se empaquetan de derecha a izquierda por defecto ; <15><12> denota un par CR LF. .txt / Hola , mundo. < 15 >< 12 >/ 0 ; palabra indicadora para finalizar la cadena.fin inicioMultiplicación de 16 bits
Los modelos básicos del Nova no incluían capacidades de multiplicación y división por hardware integradas para mantener precios competitivos. La siguiente rutina multiplica dos palabras de 16 bits para producir un resultado de una palabra de 16 bits (se ignora el desbordamiento). Demuestra el uso combinado de la operación ALU, desplazamiento y prueba (salto). Tenga en cuenta que cuando se llama a esta rutina mediante jsr, AC3 contiene la dirección de retorno . Esta es utilizada por la instrucción de retorno jmp 0,3. Una forma idiomática de borrar un acumulador es sub 0,0. Se pueden organizar otras instrucciones individuales para cargar un conjunto específico de constantes útiles (por ejemplo, -2, -1 o +1).
mpy: ; multiplicar AC0 <- AC1 * AC2, por Toby Thainsub 0 , 0 ; borrar resultado mbit: movzr 1 , 1 , szc ; desplazar multiplicador, probar lsb add 2 , 0 ; 1: sumar multiplicando movzl 2 , 2 , szr ; desplazar y probar cero jmp mbit ; no es cero, hacer otro bit jmp 0 , 3 ; retornaracumulador de impresión binaria
La siguiente rutina imprime el valor de AC1 como un número binario de 16 dígitos en la consola RDOS. Revela otras peculiaridades del conjunto de instrucciones Nova. Por ejemplo, no hay ninguna instrucción para cargar un valor "inmediato" arbitrario en un acumulador (aunque las instrucciones de referencia de memoria sí codifican dicho valor para formar una dirección efectiva). Los acumuladores generalmente deben cargarse desde ubicaciones de memoria inicializadas (por ejemplo, n16). Otras máquinas contemporáneas como el PDP-11 y prácticamente todas las arquitecturas modernas permiten cargas inmediatas, aunque muchas como ARM restringen el rango de valores que se pueden cargar inmediatamente.
Debido a que la .systmmacro de llamada RDOS implementa una jsr, AC3 se sobrescribe con la dirección de retorno de la .pcharfunción. Por lo tanto, se necesita una ubicación temporal para preservar la dirección de retorno de quien llama a esta función. Para una rutina recursiva o reentrante, se debe usar una pila, de hardware si está disponible, de software si no. La instrucción de retorno se convierte en jmp @ retrnque aprovecha el modo de direccionamiento indirecto de Nova para cargar el PC de retorno.
Las definiciones de constantes al final muestran dos características del ensamblador: la base del ensamblador es octal por defecto ( 20= dieciséis), y las constantes de caracteres podrían codificarse como, por ejemplo "0, .
pbin: ; imprime AC1 en la consola como 16 dígitos binarios, por Toby Thainsta 3 , retrn ; guardar dirección de retorno lda 2 , n16 ; configurar bucle de contador de bits: lda 0 , chr0 ; cargar ASCII '0' movzl 1 , 1 , szc ; obtener el siguiente bit en acarreo inc 0 , 0 ; aumentar a '1' .systm .pchar ; AC0-2 preservado jmp err ; si hay error inc 2 , 2 , szr ; aumentar contador jmp loop ; repetir si no es cero lda 0 , spc ; imprimir un espacio .systm .pchar jmp err ; si hay error jmp @ retrnspc: " ;eso es un espacio chr0: "0 n16: -20 retrn: 0Aplicaciones
La Canadian Broadcasting Corporation en Montreal utilizó el Nova 1200 para la automatización de la emisión de canales hasta finales de la década de 1980. Posteriormente, fue reemplazado por unidades Nova 4 reacondicionadas, que estuvieron en uso hasta mediados de la década de 1990.
Véase también
- Fairchild 9440 : una implementación en un solo chip de los Nova 2 y 3.
- National Semiconductor IMP-16 : procesador PMOS de 5 chips inspirado en el Nova original.
- National Semiconductor PACE e INS8900 : implementaciones de un solo chip del IMP-16 con capacidad para manejar bytes .
Notas
Referencias
Citas
- ↑ "Museo de Historia de la Computación - Data General Corporation (DG) - El mejor ordenador pequeño del mundo" .
- ↑ Hola, Tony; Hola, Anthony; Pápay, Gyuri (2014). El universo de la computación: Un viaje a través de una revolución . Cambridge University Press. pág. 165. ISBN 9780521766456.
- 1 2 Hendrie 2002 , pág. 40.
- 1 2 3 4 5 Supnik 2004 .
- 1 2 3 4 Hendrie 2002 , pág. 48.
- ↑ Hendrie 2002 , pág. 42.
- ↑ "Cuando un miniordenador se convierte en un microordenador: los DGC microNOVA mN601 y 602" . El Museo CPU Shack . 21 de noviembre de 2014.
- ↑ Hendrie 2002 , pág. 43.
- ↑ Hendrie 2002 , págs. 43-44.
- 1 2 3 Gianluca G. (2017). "Historia de la ALU 74181 en minicomputadoras comerciales" . Archivado del original el 7 de octubre de 2018. Recuperado el 1 de enero de 2023 .
- ↑ Hendrie 2002 , pág. 49.
- ↑ "El mejor ordenador pequeño del mundo" (PDF) . Noviembre de 1968. Archivado (PDF) del original el 11 de diciembre de 2019.
- 1 2 "Frustrados en DEC, prosperando en Data General" . Museo de Historia de la Computación .
- ↑ Jones, Douglas. "The Digital Equipment Corporation PDP-8" . Departamento de Ciencias de la Computación de la Universidad de Iowa .
- ↑ Hendrie 2002 , pág. 50.
- 1 2 "SUPER NOVA" (PDF) . Museo de Historia de la Computación . 1970. Archivado (PDF) del original el 11 de diciembre de 2019.
- ↑ "El negocio que el tiempo olvidó: Data General ha desaparecido. ¿Pero eso convierte a su fundador en un fracaso?" . money.cnn.com . 1 de abril de 2003. Archivado del original el 26 de julio de 2014. Consultado el 27 de julio de 2016 .
- 1 2 Hendrie 2002 , pág. 53.
- ↑ "Historial general de datos / Antecedentes" . Universidad de Clemson .
- ↑ Hendrie 2002 , pág. 54.
- ↑ Hendrie 2002 , pág. 44.
- 1 2 3 4 Hendrie 2002 , pág. 55.
- ↑ Hendrie 2002 , pág. 58.
- ↑ Hendrie 2002 , pág. 60.
- 1 2 Nova 4/S y 4/X (PDF) . Serie de referencia para ingenieros de campo. Datos generales . Junio de 1981.
- 1 2 microNOVA . Datos generales. 1977.
- ↑ "Enterprise: un ordenador empresarial de 16 bits por solo 2300 libras" . Personal Computer World . Octubre de 1983.
- ↑ Charles P. Thacker; Edward M. McCreight (diciembre de 1974). "Alto: Un sistema informático personal" (PDF) . pág. 13. Archivado (PDF) del original el 6 de junio de 2011.
- ↑ Tom Owad (2005). Creación de una réplica del Apple I: De vuelta al garaje . pág. xxi. ISBN 1-931836-40-X.
- ↑ "Restauración general de datos" . Datos generales Nova, Eclipse, MV y AV . Consultado el 20 de agosto de 2021 .
- ↑ "Las grandes y hermosas minicomputadoras generales de datos" . www.chookfest.net . Consultado el 20 de agosto de 2021 .
- ↑ "Cómo mantener el Nova" (PDF) . Data General. 1969.
- ↑ Manual técnico para la Nova 1200 (PDF) . Vol. I. Datos generales. 1971. págs. 1-4 . 015-000002.
- ↑ Principios de funcionamiento del Eclipse MV/6000 (PDF) . Data General. 1980. Apéndice F, Tiempos de ejecución de instrucciones. 014-000648.
Bibliografía
- Hendrie, Gardner (22 de noviembre de 2002). "Historia oral de Edson (Ed) D. de Castro" (PDF) (Entrevista). Archivado (PDF) del original el 27 de diciembre de 2014.
- Supnik, Bob (10 de enero de 2004). "¿Qué era la PDP-X?" (PDF) . Archivado (PDF) del original el 10 de diciembre de 2004.
Enlaces externos
- El proyecto SimH de Bob Supnik incluye un emulador básico de Nova en un paquete modificable por el usuario.
- El compilador C portátil (pcc) incluye un objetivo NOVA ( repositorio de GitHub con una copia de las fuentes originales; otro repositorio de GitHub tiene una copia más actualizada ).
- El sitio web de Novas Are Forever (SimuLogic) intenta archivar todo lo relacionado con DG y ofrecer productos gratuitos y comerciales.
- Un ensamblador cruzado portátil PDP-8 y DG Nova
- Museo de Minicomputadoras de Carl Friend : describe en detalle el conjunto de instrucciones Nova.
- Ordenadores Data General
- computadoras de 16 bits
- Minicomputadoras
- Computadoras que utilizan diseños de segmentación de bits
- Introducciones relacionadas con la informática en 1969