Datos Generales Nova
La Data General Nova es una serie de minicomputadoras de 16 bits lanzadas por la empresa estadounidense Data General. La familia Nova fue muy popular en la década de 1970 y finalmente vendió decenas de miles de unidades.
El primer modelo, conocido simplemente como "Nova", se lanzó en 1969. El Nova se empaquetó en una sola caja de montaje en rack de 3U y tenía suficiente potencia informática para manejar la mayoría de las tareas simples. El Nova se hizo popular en los laboratorios de ciencias de todo el mundo. Fue seguido al año siguiente por el SuperNOVA, que corrió aproximadamente cuatro veces más rápido.
Introducida durante un período de rápido progreso en el diseño de circuitos integrados (o "microchip"), la línea pasó por varias actualizaciones durante los siguientes cinco años, presentando el 800 y 1200, Nova 2, Nova 3, y finalmente el Nova 4. También se introdujo una implementación de un solo chip como microNOVA en 1977, pero no tuvo un uso generalizado ya que el mercado se movió hacia nuevos diseños de microprocesadores. Fairchild Semiconductor también introdujo una versión de microprocesador de Nova en 1977, el Fairchild 9440, pero también tuvo un uso limitado en el mercado.
La línea Nova fue reemplazada por Data General Eclipse, que era similar en la mayoría de los aspectos, pero agregaba compatibilidad con memoria virtual y otras características requeridas por los sistemas operativos modernos. Una actualización de 32 bits del Eclipse resultó en la serie Eclipse MV de la década de 1980.
Historia
Edson de Castro y la PDP-X
(feminine)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. También dirigió el diseño del PDP-8/I actualizado, que utilizó los primeros circuitos integrados en lugar de transistores individuales.
Durante el proceso de PDP-8/I, de Castro visitó a los fabricantes de placas de circuitos que estaban logrando rápidos avances en la complejidad de las placas que podían ensamblar. de Castro llegó a la conclusión de que el 8/I podría producirse utilizando un ensamblaje totalmente automatizado en tableros grandes, lo que habría sido imposible 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 estaban preocupados por detectar problemas cuando había muchos componentes en una sola placa. Para el 8/I, se tomó la decisión de quedarse con tableros pequeños, usando el nuevo "flip-chip" embalaje para una modesta mejora en la densidad.
Durante el período en que se estaba desarrollando el PDP-8, la introducción de ASCII y su importante actualización en 1967 dio 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 diseños anteriores. Esto llevó a que los diseños de rango medio funcionaran con longitudes de palabra de 16 bits en lugar de las alineaciones actuales de 12 y 18 bits de DEC. de Castro estaba convencido de que era posible mejorar el PDP-8 construyendo una CPU de minicomputadora de 16 bits en una sola placa cuadrada de 15 pulgadas.
En 1967, de Castro inició un nuevo esfuerzo de diseño conocido como "PDP-X" que incluía varias funciones avanzadas. Entre estos había un único diseño subyacente que podía usarse para construir plataformas de 8, 16 y 32 bits. Esto progresó hasta el punto de producir varios documentos de arquitectura detallados. Ken Olsen no apoyó este proyecto, sintiendo 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.
Diseño de la Nova
La cancelación del PDP-X llevó a De Castro a considerar dejar DEC para construir un sistema por su cuenta. No estaba solo; a fines de 1967, se formó un grupo de ingenieros de ideas afines para considerar 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. A diferencia de la PDP-X, el nuevo esfuerzo se centró en una sola máquina que pudiera lanzarse al mercado rápidamente, ya que de Castro sintió que el concepto de la PDP-X era demasiado ambicioso para una pequeña empresa emergente.
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. 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 con DEC. En ese momento, Fairchild estaba luchando 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 habían usado esto para implementar una serie de chips de 4 bits como contadores binarios y registros de desplazamiento.
El uso de estos circuitos integrados redujo el número total de circuitos integrados necesarios para implementar una unidad lógica aritmética (ALU) completa, el componente matemático central de una CPU, lo que permitió la expansión de un diseño de 8 bits a 16 bits. Esto requirió la expansión de la CPU de una sola placa de circuito impreso de 15 x 15 pulgadas (38 cm × 38 cm) a dos, pero tal diseño aún sería significativamente más barato de producir que el 8/I sin dejar de ser más potente y basado en ASCII. Una tercera placa contenía el circuito 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 cabe en un solo chasis de montaje en rack.
Las placas se diseñaron para que pudieran conectarse entre sí mediante un backplane de circuito impreso, con un cableado manual mínimo, lo que permitía construir todas las placas de manera automatizada. Esto redujo en gran medida los costos con respecto al 8/I, que consistía en muchas placas más pequeñas que tenían que cablearse juntas en la placa posterior, que a su vez estaba conectada entre sí mediante una envoltura de alambre. La construcción de placa más grande también hizo que el Nova fuera más confiable, lo que lo hizo especialmente atractivo para entornos industriales o de laboratorio.
El nuevo diseño utilizaba una arquitectura simple de carga y almacenamiento que resurgiría en los diseños de 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 almacenamiento de carga agregando cuatro acumuladores de propósito general, en lugar del registro único que se encontraría en ofertas similares de bajo costo como la serie PDP.
Introducción a Nova
A fines de 1967, Richman presentó al grupo al abogado Fred Adler, con sede en Nueva York, quien comenzó a buscar varias fuentes de financiamiento para capital inicial. En 1968, Adler había concertado un importante acuerdo de financiación con un consorcio de fondos de capital de riesgo del área de Boston, que acordó proporcionar una inversión inicial de 400 000 USD con una segunda US$400,000 disponibles para aumentar la producción. de Castro, Burkhart y Sogge abandonaron DEC y comenzaron 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 unió hasta que el producto estuvo en funcionamiento más tarde ese año.
El trabajo en el primer sistema tomó alrededor de nueve meses y los primeros esfuerzos de ventas comenzaron en noviembre. Tuvieron un poco de suerte porque la Conferencia de Informática Conjunta de Otoño se retrasó hasta diciembre de ese año, por lo que pudieron traer una unidad de trabajo al Centro Moscone donde ejecutaron una versión de Spacewar!. DG lanzó oficialmente el Nova en 1969 a un precio base de 3995 USD (equivalente a 29 520 $ en 2021), publicitándolo como "el mejor ordenador pequeño del el mundo." El modelo básico no fue muy útil de inmediato, y al agregar 8 kW (16 kB) La memoria RAM en forma de memoria central normalmente elevaba el precio a USD 7995. Por el contrario, un 8/I con 4 kW (6 kB) tenía un precio de 12 800 USD.
La primera venta fue a una universidad en Texas, con el equipo construyendo a mano un ejemplo que se envió en febrero. Sin embargo, esto fue en medio de una huelga en la industria aérea y la máquina nunca llegó. Enviaron un segundo ejemplo, que llegó puntualmente ya que la huelga había terminado en ese momento, y en mayo finalmente se entregó también el original.
El sistema fue un éxito desde el principio, con el número 100 vendido después de seis meses y el número 500 después de 15 meses. Las ventas se aceleraron a medida que se introdujeron nuevas versiones y, en 1975, la empresa tenía ventas anuales de 100 millones de dólares.
SuperNOVA
Ken Olsen había predicho públicamente que DG fallaría, pero con el lanzamiento de Nova quedó claro que eso no sucedería. En ese momento, varias otras empresas también estaban hablando de introducir diseños de 16 bits. Olsen decidió que estos presentaban una amenaza para su línea de 18 bits, así como para la de 12 bits, y comenzó un nuevo esfuerzo de diseño de 16 bits. Este surgió 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 competían fuertemente en el mercado.
Los rumores sobre el nuevo sistema de DEC llegaron a DG poco después de que Nova comenzara a enviarse. En la primavera de 1970 contrataron a un nuevo diseñador, Larry Seligman, para superar cualquier posible máquina en construcción. Se habían producido dos cambios importantes desde que se diseñó el Nova; una era que Signetics había introducido el 8260, un circuito integrado de 4 bits que combinaba un sumador, XNOR y AND, lo que significaba que la cantidad de chips necesarios para implementar la lógica básica se reducía unas tres veces. Otro fue que Intel estaba hablando agresivamente de memorias basadas en semiconductores, prometiendo 1024 bits en un solo chip y funcionando a velocidades mucho más altas que la memoria central.
El nuevo diseño de Seligman aprovechó estas dos mejoras. Para empezar, los nuevos circuitos integrados permitieron que la ALU se expandiera a un ancho completo de 16 bits en las mismas dos tarjetas, lo que le permitía realizar operaciones matemáticas y lógicas en un solo ciclo y, por lo tanto, hacer que el nuevo diseño fuera cuatro veces más rápido que el original.. Además, se utilizó una nueva memoria central más pequeña que mejoró el tiempo de ciclo de los 1200 ns originales a 800 ns, lo que ofrece una 1/3 mejora. El rendimiento podría mejorarse aún más reemplazando el núcleo con memoria de solo lectura; al carecer del ciclo de lectura y escritura del núcleo, se puede acceder a él en 300 ns para obtener un aumento espectacular del rendimiento.
La máquina resultante, conocida como SuperNOVA, se lanzó en 1970. Aunque los modelos iniciales todavía usaban núcleo, todo el diseño se basó en la premisa de que estarían disponibles memorias de semiconductores más rápidas y la plataforma podría hacer un uso completo de ellos. Este se introdujo más tarde el mismo año que el SuperNOVA SC, con memoria de semiconductores (SC). El rendimiento mucho mayor de la memoria permitió que la CPU, que estaba sincronizada con la memoria, aumentara aún más su velocidad para ejecutarse 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. Inicialmente, la nueva memoria también era muy costosa y se recalentaba, por lo que no se usaba mucho.
1200 y 800
Como demostración del poder de su tecnología de matriz de puertas Micromatrix, en 1968 Fairchild prototipó el 4711, una ALU de 4 bits de un solo chip. El diseño nunca fue pensado para la producción en masa y era bastante costoso de producir. La introducción de Signetics 8260 en 1969 les obligó; tanto Texas Instruments como Fairchild introdujeron sus propias ALU de 4 bits en 1970, la 74181 y la 9341, respectivamente. A diferencia del 8260, los nuevos diseños ofrecían todas las funciones lógicas comunes y reducían aún más la cantidad de chips.
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 para la Nova básica o la SuperNOVA. Surgió un nuevo concepto en el que un solo chasis podría albergar cualquiera de las 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.
Mientras Seligman estaba trabajando en 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 para trabajar para ti. Y voy a estar en sus oficinas en una semana para hablar con ustedes sobre eso." Fue contratado en el acto. Gruner estuvo a cargo de la máquina de bajo costo, mientras que Seligman diseñó una versión de alto rendimiento a juego.
El modelo de bajo costo de Gruner se lanzó en 1970 como Nova 1200, el 1200 se refiere al uso de la memoria central 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 Nova 800, lo que resultó en una denominación un tanto confusa donde el modelo con el número más bajo tiene un mayor rendimiento. Ambos modelos se ofrecieron en una variedad de cajas, la 1200 con siete ranuras, la 1210 con cuatro y la 1220 con catorce.
Modelos posteriores
Para entonces, el PDP-11 finalmente se estaba enviando. Ofrecía una arquitectura de conjunto de instrucciones mucho más rica que la deliberadamente simple del Nova. La mejora continua 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 se encargó de diseñar una nueva máquina que fuera compatible con Nova y ofreciera un entorno mucho más rico para quienes lo desearan. Este concepto se envió como la serie Data General Eclipse, que ofrecía la capacidad de agregar circuitos adicionales para adaptar el conjunto de instrucciones para cargas de trabajo científicas o de procesamiento de datos. El Eclipse tuvo éxito al competir con el PDP-11 en el extremo superior del mercado.
Casi al mismo tiempo, comenzaron a surgir rumores de una nueva máquina de 32 bits de DEC. DG decidió que tenían que tener un producto similar, y Gruner se puso a cargo de lo que se convirtió en el Proyecto Fountainhead. Dado el alcance del proyecto, acordaron que todo el esfuerzo debería manejarse fuera del sitio y Gruner seleccionó una ubicación en Research Triangle Park en Carolina del Norte. Este diseño se volvió muy complejo y finalmente fue cancelado años después.
Mientras estos esfuerzos estaban en marcha, el trabajo en la línea Nova continuó.
840
El 840, ofrecido 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 compensa la dirección base en la memoria más grande de 128 kpalabras. En realidad, instalar tanta memoria requería un espacio considerable; el 840 se envió en una caja grande de 14 ranuras.
Nova 2
La siguiente versión fue la Nova 2, y las primeras versiones se enviaron 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 el SuperNOVA usó tres 15×15" placas para implementar la CPU y su memoria, el Nova 2 instaló todo esto en una sola placa. La ROM se usó para almacenar el código de inicio, que luego se copió en el núcleo cuando la "carga del programa" se activó el interruptor. Las versiones estaban disponibles con cuatro ("2/4"), siete y diez ("2/10") ranuras.
Nova 3
El Nova 3 de 1975 agregó dos registros más, utilizados para controlar el acceso a una pila integrada. El procesador también se volvió a implementar utilizando componentes TTL, lo que aumentó 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 que Data General originalmente pretendía que el Nova 3 fuera el último de su línea, planeando reemplazar el Nova con las últimas máquinas Eclipse. Sin embargo, la demanda continua condujo a una máquina Nova 4, esta vez basada en cuatro ALU AMD Am2901 bit-slice. Esta máquina fue diseñada desde el principio para ser Nova 4 y Eclipse S/140, con un microcódigo diferente para cada una. También estaba disponible un coprocesador de coma flotante, que ocupaba una ranura separada. Una opción adicional permitía el mapeo de memoria, lo que permitía que los programas accedieran a hasta 128 kpalabras de memoria mediante el cambio de banco. A diferencia de las máquinas anteriores, Nova 4 no incluía una consola en el panel frontal y, en cambio, dependía de la terminal para emular una consola cuando fuera necesario.
Había tres versiones diferentes de Nova 4, Nova 4/C, Nova 4/S y Nova 4/X. El Nova 4/C era una implementación de placa única que incluía toda la memoria (16 o 32 kpalabras). El Nova 4/S y 4/X usaban tarjetas de memoria separadas. El Nova 4/X tenía habilitada la unidad de administración de memoria (MMU) integrada para permitir el uso de hasta 128 kpalabras de memoria. La MMU también se instaló en el Nova 4/S, pero el firmware la deshabilitó. Tanto el 4/S como el 4/X incluían un "buscador previo" para aumentar el rendimiento obteniendo hasta dos instrucciones de la memoria antes de que fueran necesarias.
MicroNOVA
Data General también produjo una serie de implementaciones de un solo chip microNOVA del procesador Nova. Para permitir que encaje en un chip de paquete dual en línea (DIP) 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, como resultado, la máquina funcionaba aproximadamente a la mitad de la velocidad del Nova original.
El primer chip de la serie fue el mN601, de 1977. Este se vendía tanto como CPU para otros usuarios, como chipset completo para quienes querían implementar una computadora, una computadora completa en un placa única con 4 kB de RAM y como un modelo completo de gama baja de Nova. Una versión mejorada del diseño, el mN602 de 1979, redujo todo el conjunto de chips a un solo VLSI. Esto se ofreció en dos máquinas, la microNOVA MP/100 y la microNOVA MP/200 más grande.
El microNOVA se volvió a empaquetar más tarde con un monitor en una caja estilo PC con dos disquetes como Enterprise. Enterprise se lanzó en 1981, con RDOS, pero la introducción de IBM PC el mismo año hizo que la mayoría de las otras máquinas desaparecieran bajo el radar.
El legado de Nova
La Nova influyó en el diseño de las computadoras Xerox Alto (1973) y Apple I (1976), y su arquitectura fue la base de la serie Computervision CGP (Computervision Graphics Processor). Se ha informado que su diseño externo es la inspiración directa para el panel frontal de la microcomputadora MITS Altair (1975).
Data General siguió el éxito del Nova original con una serie de diseños más rápidos. La familia de sistemas Eclipse se introdujo más tarde con un conjunto de instrucciones ampliado compatible hacia arriba, y la serie MV amplió aún más el Eclipse a una arquitectura de 32 bits para competir con el DEC VAX. El desarrollo de la serie MV se documentó en el popular libro de 1981 de Tracy Kidder, The Soul of a New Machine. Más tarde, Data General se convertiría en un proveedor de servidores y arreglos de almacenamiento basados en procesadores Intel, y EMC finalmente lo compraría.
A partir de 2004, todavía hay Novas y Eclipses de 16 bits que se ejecutan en una variedad de aplicaciones en todo el mundo, incluido el control del tráfico aéreo. Hay un grupo diverso pero apasionado de personas en todo el mundo que restauran y preservan los sistemas de datos generales originales de 16 bits.
Descripción técnica
Diseño del procesador
El Nova, a diferencia del PDP-8, era una arquitectura de almacenamiento de carga. Tenía cuatro registros acumuladores de 16 bits, dos de los cuales (2 y 3) podían usarse como registros de índice. Había un contador de programa de 15 bits y un registro de acarreo de un solo bit. Al igual que con el PDP-8, el direccionamiento de página actual + cero era central. No había registro de pila, pero los diseños posteriores de Eclipse utilizarían una dirección de memoria de hardware dedicada para esta función.
Los primeros modelos de Nova procesaban matemáticas en serie en paquetes de 4 bits, usando una única ALU de 74181 bits. Un año después de su presentación, este diseño se mejoró para incluir una unidad matemática paralela completa de 16 bits utilizando cuatro 74181, este diseño se conoce como SuperNova. Las versiones futuras del sistema agregaron una unidad de pila y multiplicación/división de hardware.
El Nova 4/Eclipse S/140 se basó en cuatro ALU de segmento 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
Los primeros modelos estaban disponibles con 8 K palabras de memoria de núcleo magnético como opción, una opción que prácticamente todo el mundo tenía que comprar, lo que elevó el costo del sistema a $7995.
Esta placa de memoria central se organizó de forma plana en cuatro grupos de cuatro bancos, cada banco con dos conjuntos de núcleo en una matriz de 64 por 64; por lo tanto, había 64 x 64 = 4096 bits por conjunto, x 2 conjuntos dieron 8192 bits, x 4 bancos dieron 32 768 bits, x 4 grupos dieron un total de 131 072 bits, y esto dividido por el tamaño de palabra de la máquina de 16 bits dio 8192 palabras de la memoria
El núcleo de esta placa de memoria de 8 000 palabras ocupaba un "tablero sobre tablero" ubicado en el centro, de 5,25 " de ancho por 6.125" de altura, y estaba cubierto por una placa protectora. Estaba rodeado por el circuito de lectura-escritura-reescritura del controlador de soporte necesario. Todo el núcleo y los componentes electrónicos de soporte correspondientes encajan en una sola placa estándar de 15 x 15 pulgadas (380 mm). Se pueden admitir hasta 32 K de dicha memoria RAM central 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 hicieron populares en muchos entornos industriales. Las máquinas Nova originales funcionaban a aproximadamente 200 kHz, pero su SuperNova se diseñó para funcionar hasta a 3 MHz cuando se usa con una memoria principal de semiconductor especial.
La placa posterior estandarizada y las señales de E/S crearon un diseño de E/S simple y eficiente que facilitó la interconexión de dispositivos de E/S y canales de datos programados con el Nova en comparación con las máquinas de la competencia. Además de su estructura de bus de E/S dedicada, la placa posterior de Nova tenía pines de envoltura de cables que podían usarse para conectores no estándar u otros fines especiales.
Modelo de programación
El formato de instrucción podría clasificarse ampliamente en una de tres funciones: 1) manipulación de registro a registro, 2) referencia de memoria y 3) entrada/salida. Cada instrucción estaba contenida en una palabra. La manipulación de registro a registro era casi como RISC en su eficiencia de bits; y una instrucción que manipulara datos de registro también podría realizar pruebas, cambios e incluso optar por descartar el resultado. Las opciones de hardware incluían una unidad de multiplicación y división de enteros, una unidad de punto flotante (precisión simple y doble) y administración de memoria.
El primer Nova vino con un intérprete BASIC en cinta perforada. A medida que el producto crecía, Data General desarrolló muchos lenguajes para las computadoras Nova, que se ejecutaban en una variedad de sistemas operativos consistentes. FORTRAN IV, ALGOL, Extended BASIC, Data General Business Basic, Interactive COBOL y varios ensambladores estaban disponibles en Data General. Los proveedores externos y la comunidad de usuarios ampliaron las ofertas con Forth, Lisp, BCPL, C, ALGOL y otras versiones propietarias de COBOL y BASIC.
Conjunto de instrucciones
Las instrucciones de máquina implementadas a continuación son el conjunto común implementado por todos los procesadores de la serie Nova. Los modelos específicos a menudo implementaron instrucciones adicionales, y algunas instrucciones fueron proporcionadas por hardware opcional.
Instrucciones aritméticas
Todas las instrucciones aritméticas operadas entre acumuladores. Para las operaciones que requerían dos operandos, uno se tomaba del acumulador de origen y otro del acumulador de destino, y el resultado se depositaba en el acumulador de destino. Para operaciones de un solo operando, el operando se tomó del registro de origen y el resultado reemplazó el registro de destino. Para todos los códigos de operación de un solo operando, estaba permitido que los acumuladores de origen y de destino fueran los mismos, y la operación funcionó como se esperaba.
Todas las instrucciones aritméticas incluían un "sin carga" bit que, cuando se activa, suprime la transferencia del resultado al registro de destino; esto se usó junto con las opciones de prueba para realizar una prueba sin perder el contenido existente del registro de destino. En lenguaje ensamblador, agregar un '#' al código de operación establezca el bit sin carga.
La CPU contenía un registro de un solo bit llamado bit de acarreo, que después de una operación aritmética contendría el acarreo del bit más significativo. El bit de acarreo podría establecerse en un valor deseado antes de realizar la operación usando un campo de dos bits en la instrucción. El bit podría establecerse, borrarse o complementarse antes de ejecutar la instrucción. En lenguaje ensamblador, estas opciones se especificaron agregando una letra al código de operación: 'O' — establecer el bit de acarreo; 'Z' — borre el bit de acarreo, 'C' — complementar el bit de acarreo, nada — dejar el bit de acarreo en paz. Si también se especificó el bit sin carga, el valor de acarreo especificado se usaría para el cálculo, pero el registro de acarreo real permanecería inalterado.
Todas las instrucciones aritméticas incluían un campo de dos bits que podía usarse para especificar una opción de cambio, que se aplicaría al resultado antes de cargarlo en el registro de destino. Se puede especificar un desplazamiento a la izquierda o a la derecha de un solo bit, o se pueden intercambiar los dos bytes del resultado. Los cambios eran circulares de 17 bits, con el bit de acarreo 'a la izquierda'. del bit más significativo. En otras palabras, cuando se realizaba un desplazamiento a la izquierda, el bit más significativo del resultado se desplazaba al bit de acarreo y el contenido anterior del bit de acarreo se desplazaba al bit menos significativo del resultado. Los intercambios de bytes no afectaron el bit de acarreo. En lenguaje ensamblador, estas opciones se especificaron agregando una letra al código de operación: 'L' — desplazar a la izquierda; 'R' — desplazamiento a la derecha, 'S' — intercambiar bytes; nada: no realice un cambio o 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 se evaluó como verdadera, se omitió la siguiente instrucción en línea. En lenguaje ensamblador, la opción de prueba se especificaba como un tercer operando de la instrucción. Las pruebas disponibles eran:
- SZR - saltar en cero resultado
- SNR - saltar sobre el resultado no cero
- SZC - saltar en cero carga
- SNC - saltar en el port no cero
- SBN - saltar si ambos port y resultado no son cero
- SEZ - saltar si lleva o da resultado, o ambos, es cero
- SKP Siempre salta
- Nada - nunca saltar
Las instrucciones aritméticas reales eran:
- MOVIMIENTO — mover el contenido del acumulador fuente al acumulador de destino
- COM — mover el complemento bitwise del acumulador fuente al acumulador de destino
- ADD — añadir acumulador de fuentes al acumulador de destino
- ADC — tomar el complemento bitwise del acumulador fuente y añadirlo al acumulador de destino
- NEG — mover el negativo del acumulador fuente al acumulador de destino
- SUB — restar el acumulador fuente de contenidos del acumulador de destino
- INC — añadir 1 al contenido del acumulador fuente y pasar al acumulador de destino
- Y — realizar el bitwise AND de los dos acumuladores y colocar el resultado en el acumulador de destino
Un ejemplo de instrucciones aritméticas, con todas las opciones utilizadas, es:
ADDZR# 0,2,SNC
Esto se decodifica como: borrar el bit de acarreo; agregue el contenido de AC2 (acumulador 2) a AC0; desplazar circularmente el resultado un bit a la derecha; pruebe el resultado para ver si el bit de acarreo está activado y salte la siguiente instrucción si es así. Deseche el resultado después de realizar la prueba. En efecto, esto suma dos números y prueba para ver si el resultado es par o impar.
Instrucciones de referencia de memoria
El conjunto de instrucciones de 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 probaban el contenido de una ubicación de memoria. Todas las instrucciones de referencia a la memoria contenían un campo de dirección de ocho bits y un campo de dos bits que especificaba el modo de direccionamiento de la memoria. Los cuatro modos eran:
- Modo 0 - dirección absoluta. El contenido del campo de la dirección de la instrucción está lleno de cero en la izquierda y se utiliza como dirección de destino.
- Modo 1 - abordaje relativo. El contenido del campo de dirección de la instrucción es signo extendido a la izquierda y añadido al valor actual del contador del programa (que, para el momento en que la instrucción se ejecuta, apunta a la siguiente instrucción). El resultado se utiliza como la dirección de destino.
- Modo 2 - abordaje indexado. El contenido del campo de dirección de la instrucción es signo extendido a la izquierda y añadido al valor actual del acumulador 2. El resultado se utiliza como dirección de destino.
- Modo 3 - abordaje indexado. El contenido del campo de dirección de la instrucción es signo extendido a la izquierda y añadido al valor actual del acumulador 3. El resultado se utiliza como la dirección de destino.
Obviamente, el modo 0 solo era capaz de direccionar las primeras 256 palabras de memoria, dado el campo de dirección de ocho bits. Esta parte de la memoria se denominó "página cero". Las palabras de memoria de la página cero se consideraban preciosas para los programadores del lenguaje ensamblador de Nova debido al pequeño número disponible; solo las ubicaciones de la página cero podrían direccionarse desde cualquier parte del programa sin recurrir al direccionamiento indexado, lo que requería vincular el acumulador 2 o 3 para usarlo como registro de índice. En lenguaje ensamblador, un ".ZREL" La directiva hizo que el ensamblador colocara las instrucciones y las palabras de datos que la seguían en la página cero; un ".NREL" directiva colocó las siguientes instrucciones y palabras de datos en "normal" memoria. Los modelos Nova posteriores agregaron instrucciones con campos de direccionamiento extendidos, lo que superó esta dificultad (con una penalización de rendimiento).
El ensamblador calculó las compensaciones relativas para el modo 1 automáticamente, aunque también fue posible escribirlo explícitamente en el código fuente. Si una instrucción de referencia de 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 a la que se hace referencia, y lo colocaba en el campo de dirección de la instrucción (siempre que el valor resultante se ajuste al campo de 8 bits).
Las dos instrucciones de carga y almacenamiento fueron:
- LDA — cargar el contenido de una ubicación de memoria en el acumulador especificado.
- STA — almacenar el contenido del acumulador especificado en una ubicación de memoria.
Estas dos instrucciones incluían un mensaje "indirecto" bit. Si se establecía este bit (hecho en lenguaje ensamblador agregando un '@' al código de operación), se suponía que el contenido de la dirección de destino era una dirección de memoria en sí misma, y se haría referencia a esa dirección para hacer la carga o almacén.
Las dos instrucciones de transferencia de control fueron:
- JMP — transferencia de control a la ubicación de memoria especificada
- JSR ("subroutina de salto") — Hace lo mismo que la instrucción JMP, pero además carga la dirección de retorno (la instrucción siguiendo la instrucción JSR en línea) en 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 ensamblador usando el '@' personaje. En el caso de un salto indirecto, el procesador recuperó el contenido de la ubicación de destino y usó el valor como la dirección de memoria para saltar. Sin embargo, a diferencia de las instrucciones de carga y almacenamiento, si la dirección indirecta tuviera establecido el bit más significativo, realizaría un ciclo adicional de direccionamiento indirecto. En los procesadores de la serie Nova anteriores al Nova 3, no había límite en la cantidad de ciclos de direccionamiento indirecto; una dirección indirecta que se hiciera referencia a sí misma daría como resultado un ciclo de direccionamiento indirecto infinito, sin que la instrucción se completara nunca. (Esto podría ser alarmante para los usuarios, ya que en esta condición, presionar el interruptor STOP en el panel frontal no hizo nada. Fue necesario reiniciar la máquina para romper el ciclo).
Las dos instrucciones de prueba de memoria fueron:
- ISZ — aumentar la ubicación de la memoria, y saltar la siguiente instrucción si el resultado es cero.
- DSZ — decrementar la ubicación de la memoria, y saltar la siguiente instrucción si el resultado es cero.
Como en el caso de las instrucciones de carga y almacenamiento, había un bit indirecto que realizaría un único nivel de direccionamiento indirecto. Estas instrucciones eran extrañas porque, 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 ese momento, las tarjetas de memoria contenían un "write-back" circuito para resolver el problema de lectura destructiva inherente a la memoria de núcleo magnético. Pero el mecanismo de reescritura también contenía una mini unidad aritmética, que el procesador usaba para varios propósitos. Para las instrucciones ISZ y DSZ, el incremento o la disminución se produjo entre la ubicación de la memoria que se lee y la reescritura; la CPU simplemente esperó a que le dijeran si el resultado era cero o distinto de cero. Estas instrucciones eran útiles porque permitían usar una ubicación de memoria como contador de bucles sin inmovilizar un acumulador, pero eran más lentas que ejecutar las instrucciones aritméticas equivalentes.
Algunos ejemplos de instrucciones de referencia de memoria:
LDA 1,COUNT
Transfiere el contenido de la ubicación de memoria etiquetada COUNT al acumulador 1. Suponiendo que COUNT está 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,17
Salte indirectamente a la dirección de memoria especificada por el contenido de la ubicación 17, en el espacio de la página cero, y deposite 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 de Nova; el nemotécnico del lenguaje ensamblador ".SYSTM" traducido a esto.
JMP 0,3
Saltar a la ubicación de la memoria cuya dirección está contenida en el acumulador 3. Esta era una forma común de 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,-1
Almacene el contenido del acumulador 0 en la ubicación que es uno menos que la dirección contenida en el acumulador 3.
DSZ COUNT
Disminuya el valor en la ubicación etiquetada CONTAR y omita la siguiente instrucción si el resultado es cero. Como en el caso anterior, si se supone que COUNT está en el espacio.NREL, esto es equivalente a: DSZ 1,(COUNT-(.+1))
Instrucciones de E/S
Los Nova implementaron un modelo canalizado para interactuar con dispositivos de E/S. En el modelo, se esperaba que cada dispositivo de E/S implementara dos indicadores, denominados "Ocupado" y "Terminado", y tres registros de datos y control, denominados A, B y C. Las instrucciones de E/S estaban disponibles para leer y escribir los registros, y para enviar una de las tres señales al dispositivo., denominado "inicio", "borrado" y "pulso". En general, el envío de una señal de inicio iniciaba una operación de E/S que se había configurado cargando valores en los registros A/B/C. La señal clara detuvo una operación de E/S y borró cualquier interrupción resultante. La señal de pulso se utilizó para iniciar operaciones auxiliares en subsistemas complejos, como operaciones de búsqueda en unidades de disco. Los dispositivos encuestados normalmente movían datos directamente entre el dispositivo y el registro A. Los dispositivos DMA generalmente usaban 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 las banderas de control. El canal 63 se refería a la propia CPU y se usaba para varias funciones especiales.
Cada instrucción de E/S contenía un campo de número de canal de seis bits, uno de cuatro bits para especificar qué registro leer o escribir y un campo de dos bits para especificar qué señal se enviaría. En lenguaje ensamblador, la señal se especificaba agregando una letra al código de operación: 'S' para inicio, 'C' para claro, 'P' para pulso, y nada para ninguna señal. Los códigos de operación fueron:
- DIA — mover el contenido del registro A del dispositivo al acumulador especificado
- DOA — enviar el contenido del acumulador especificado al registro A del dispositivo en el canal especificado
- DIB — mover el contenido del registro B del dispositivo al acumulador especificado
- DOB — enviar el contenido del acumulador especificado al registro B del dispositivo en el canal especificado
- DIC — mover el contenido del registro C del dispositivo al acumulador especificado
- DOC — enviar el contenido del acumulador especificado al registro C del dispositivo en el canal especificado
- NIO - "no I/O", un misnomer. La instrucción se utilizó para enviar una señal a un dispositivo sin hacer una transferencia de registro.
Además, había cuatro instrucciones disponibles para probar el estado de un dispositivo:
- SKPBN — saltar la siguiente instrucción si se establece la bandera ocupada del dispositivo
- SKPBZ — saltar la siguiente instrucción si la bandera ocupada del dispositivo está clara
- SKPDN - saltar la siguiente instrucción si el dispositivo está en juego
- SKPDZ - saltar la siguiente instrucción si el dispositivo ha hecho la bandera está claro
Iniciar un dispositivo provocó que estableciera su indicador de ocupado. Cuando se completó la operación solicitada, convencionalmente el dispositivo borró su indicador de ocupado y estableció su indicador de hecho; la mayoría de los dispositivos tenían su mecanismo de solicitud de interrupción conectado al indicador de hecho, por lo que establecer el indicador de hecho provocó una interrupción (si las interrupciones estaban habilitadas y el dispositivo no estaba enmascarado).
Instrucciones especiales
Estas instrucciones realizaban varias funciones de control y estado de la CPU. Todos ellos eran en realidad mnemónicos abreviados para las instrucciones de E/S en el canal 63, el canal de E/S autorreferencial de la CPU.
- INTA - interrumpir el reconocimiento. Transfirió el número de canal del dispositivo interrumpido al acumulador especificado.
- INTDS - todas las interrupciones
- INTENIDO - todas las interrupciones
- IORST - I/O reseteo. Envió una señal de reinicio en el autobús I/O, que detuvo todas las interrupciones de I/O, interrumpió y despejó todas las interrupciones pendientes.
- MSKO - Enmascarar. Usaba el contenido del acumulador especificado para configurar la máscara de interrupción. La forma en que se interpretó la máscara dependía de la implementación de cada dispositivo I/O. Algunos dispositivos no podían enmascararse.
- READS — transfirió el contenido de los 16 conmutadores de datos del panel frontal al acumulador especificado.
- HALT - detuvo la CPU. Una vez detenido, la CPU podría comenzar de nuevo sólo por intervención manual en el panel frontal.
Interrupciones y manejo 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 sola línea de solicitud de interrupción, a la que se conectaban todos los dispositivos capaces de interrumpir. Cuando un dispositivo necesitaba solicitar una interrupción, generaba esta línea. La CPU tomó la interrupción tan pronto como completó la instrucción actual. Como se indicó anteriormente, se esperaba que un dispositivo aumentara su "hecho" indicador de E/S cuando solicitaba una interrupción, y la convención era que el dispositivo borraría su solicitud de interrupción cuando la CPU ejecutara una instrucción de borrado de E/S en el número de 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 se interrumpía, la CPU saltaba indirectamente a través de la dirección 1, colocaba la dirección de retorno en la dirección de memoria 0 y deshabilitaba más interrumpe El controlador de interrupciones luego ejecutaría una instrucción INTA para descubrir el número de canal del dispositivo de interrupción. Esto funcionó al generar un "reconocimiento" señal en el backplane. La señal de reconocimiento se conectó en un formato de cadena tipo margarita a través de la placa posterior, de modo que recorrió cada placa del bus. Se esperaba que cualquier dispositivo que solicitara una interrupción bloqueara la propagación adicional de la señal de reconocimiento por el bus, de modo que si dos o más dispositivos tenían interrupciones pendientes simultáneamente, solo el primero vería la señal de reconocimiento. Ese dispositivo luego respondió colocando su número de canal en las líneas de datos del bus. Esto significaba que, en el caso de solicitudes de interrupción simultáneas, el dispositivo que tenía prioridad estaba determinado por cuál estaba físicamente más cerca de la CPU en la jaula de tarjetas.
Después de que se procesó la interrupción 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. Para evitar que se produzca una interrupción pendiente. interrumpiendo inmediatamente antes del salto de retorno (lo que haría que se sobrescribiera la dirección de retorno), la instrucción INTEN tuvo un retraso de un ciclo de instrucción. Cuando se ejecutaba, las interrupciones no se habilitaban hasta que se ejecutaba la siguiente instrucción, que se esperaba que fuera la instrucción JMP@ 0.
La rutina de servicio de interrupción del sistema operativo normalmente realizaba un salto indexado usando el número de canal recibido, para saltar a la rutina de manejo de interrupción específica para el dispositivo. Hubo algunos dispositivos, en particular el circuito de detección de fallas de energía de la CPU, que no respondieron a la instrucción INTA. Si INTA devolvía un resultado de cero, la rutina de servicio de interrupción tenía que sondear todos los dispositivos que no respondían a INTA utilizando las instrucciones SKPDZ/SKPDN para ver cuál interrumpía.
El sistema operativo podría administrar de alguna manera el orden de las interrupciones configurando una máscara de interrupción mediante la instrucción MSKO. Esto tenía la intención de permitir que el sistema operativo determinara qué dispositivos podían interrumpir en un momento dado. Cuando se emitió esta instrucción, se transmitió una máscara de interrupción de 16 bits a todos los dispositivos en el backplane. Dependía del dispositivo decidir qué significaba realmente la máscara para él; por convención, se suponía que un dispositivo que estaba enmascarado no activaría la línea de interrupción, pero la CPU no tenía medios para hacer cumplir esto. La mayoría de los dispositivos que eran enmascarables permitían seleccionar el bit de máscara a través de un puente en la placa. Había dispositivos que ignoraban la máscara por completo.
En los sistemas que tenían memoria de núcleo magnético (que conservaba su contenido sin energía), era posible recuperarse de una falla de energía. Un circuito de detección de falla de energía en la CPU emitió una interrupción cuando se detectó la pérdida de la energía principal que ingresaba a la computadora; desde este punto, la CPU tuvo un corto período de tiempo hasta que un capacitor en la fuente de alimentación perdió su carga y falló la alimentación a la CPU. Este fue tiempo suficiente para detener la E/S en curso mediante la emisión de una instrucción IORST y luego guardar el contenido de los cuatro acumuladores y el bit de acarreo en la memoria. Cuando volvió la energía, si el interruptor de llave del panel frontal de la CPU estaba en la posición LOCK, la CPU se iniciaría y realizaría 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 llevaría el bit, y luego reanudaría el procesamiento normal. Correspondía a la rutina de servicio descubrir cómo reiniciar las operaciones de E/S que fueron abortadas por la falla de energía.
Diseño del panel frontal
Como era la convención del día, la mayoría de los modelos Nova proporcionaron una consola en el panel frontal para controlar y monitorear las funciones de la CPU. Todos los modelos anteriores al Nova 3 se basaban en un diseño de panel frontal canónico, como se muestra en la foto del panel Nova 840 arriba. El diseño contenía un interruptor de encendido con llave, dos filas de luces de visualización de datos y direcciones, una fila de interruptores de entrada de datos y una fila de interruptores de función que activaban varias funciones de la CPU cuando se presionaban. Las luces de dirección siempre mostraban el valor actual del contador de programa, en binario. Las lámparas de datos mostraban varios valores dependiendo de qué función de la CPU estaba activa en ese momento. A la izquierda de la lámpara de datos más a la izquierda, una lámpara adicional mostraba el valor actual del bit de acarreo. En la mayoría de los modelos, las lámparas eran lámparas incandescentes que estaban soldadas al tablero del panel; reemplazar las lámparas quemadas fue una pesadilla para los ingenieros de servicio de campo de Data General.
Cada uno de los conmutadores de datos controlaba el valor de un bit en un valor de 16 bits y, según la convención general de datos, se numeraron del 0 al 15 de izquierda a derecha. Los interruptores de datos proporcionaron entrada a la CPU para varias funciones y también podrían ser leídos por un programa en ejecución utilizando la instrucción de lenguaje ensamblador READS. Para reducir el desorden del panel y ahorrar dinero, los interruptores de función se implementaron como interruptores momentáneos de dos vías. Cuando se levantó la palanca de un interruptor de función, activó la función cuyo nombre estaba impreso sobre el interruptor en el panel; cuando se presionaba la palanca hacia abajo, activaba la función cuyo nombre aparecía debajo del interruptor. La palanca del interruptor volvió a la posición neutral cuando se soltó.
Haciendo referencia a la foto de Nova 840, los primeros cuatro interruptores de la izquierda realizaron las funciones EXAMINAR y DEPOSITAR para los cuatro acumuladores. Al presionar EXAMINAR en uno de estos, las lámparas de datos mostraban el valor actual del acumulador en binario. Presionar DEPÓSITO transfirió el valor binario representado por la configuración actual de los interruptores de datos al acumulador.
Yendo a la derecha, el siguiente interruptor era el interruptor RESET/STOP. Presionar STOP hizo que la CPU se detuviera después de completar la instrucción actual. Al presionar RESET, la CPU se detuvo de inmediato, borró varios registros internos de la CPU y envió una señal de reinicio de E/S a todos los dispositivos conectados. El interruptor a la derecha de eso era el interruptor START/CONTINUE. Presionar CONTINUAR hizo que la CPU reanudara la ejecución en la instrucción actualmente señalada por el contador del programa. Presionar INICIO transfirió el valor establecido actualmente en los interruptores de datos 1-15 al contador de programa, y luego comenzó a ejecutarse desde allí.
Los siguientes dos conmutadores proporcionaron acceso de lectura y escritura a la memoria desde el panel frontal. Al presionar EXAMINAR, se transfirió el valor establecido en los interruptores de datos 1-15 al contador de programa, se buscó el valor en la ubicación de memoria correspondiente y se mostró su valor en las luces de datos. Al presionar EXAMINAR SIGUIENTE se incrementó el contador del programa y luego se realizó una operación de examen en esa ubicación de memoria, lo que permitió al usuario recorrer una serie de ubicaciones de memoria. Al presionar DEPÓSITO, se escribió el valor contenido en los interruptores de datos en la ubicación de memoria señalada por el contador del programa. Presionar DEPOSIT NEXT primero incrementó el contador del programa y luego lo depositó en la ubicación de memoria señalada.
La función INST STEP hizo que la CPU ejecutara una instrucción, en la ubicación actual del contador del programa, y luego se detuviera. Dado que el contador del programa se incrementaría como parte de la ejecución de la instrucción, esto permitía al usuario realizar un solo paso a través de un programa. PASO DE MEMORIA, un nombre inapropiado, hizo que la CPU ejecutara un solo ciclo de reloj y se detuviera. Esto era de poca utilidad para los usuarios y, en general, solo lo usaba el personal de servicio de campo para realizar diagnósticos.
PROGRAM LOAD era el mecanismo que normalmente se usaba para arrancar un Nova. Cuando se activó este interruptor, provocó que la ROM de arranque de 32 palabras se asignara a las primeras 32 palabras de la memoria, estableciera el contador del programa en 0 e iniciara la CPU. La ROM de arranque contenía un código que leía 256 palabras (512 bytes) de código de un dispositivo de E/S seleccionado a la memoria y luego transfería el control al código de lectura. Los interruptores de datos 8-15 se usaron para decirle a la ROM de arranque desde qué canal de E/S arrancar. Si el interruptor 0 estaba apagado, la ROM de arranque asumiría que el dispositivo era un dispositivo sondeado (por ejemplo, el lector de cinta de papel) y ejecutaría un bucle de entrada sondeado hasta que se leyeran 512 bytes. Si el interruptor 0 estaba activado, la ROM de arranque asumía que el dispositivo era compatible con DMA e iniciaba una transferencia de datos DMA. La ROM de arranque no era lo suficientemente inteligente como para colocar el dispositivo antes de iniciar la transferencia. Este fue un problema al reiniciar después de un bloqueo; si el dispositivo de arranque era una unidad de disco, sus cabezas probablemente se habían dejado en un cilindro aleatorio. Tuvieron que reposicionarse en el cilindro 0, donde RDOS escribió el bloque de arranque de primer nivel, para que funcionara la secuencia de arranque. Convencionalmente, esto se hacía ciclando la unidad a través de su secuencia de carga, pero los usuarios que se frustraron con el tiempo de espera (hasta 5 minutos según el modelo de la unidad) aprendieron cómo ingresar desde el panel frontal una unidad 'recalibrar'; código de E/S y un solo paso de la CPU a través de él, una operación que tomó solo unos segundos para un usuario experimentado.
El interruptor de encendido era un interruptor con llave de 3 posiciones con las posiciones marcadas APAGADO, ENCENDIDO y BLOQUEADO. En la posición APAGADO, se eliminó toda la energía de la CPU. Al girar la llave a la posición ON, se aplica energía a la CPU. Sin embargo, a diferencia de las CPU actuales, la CPU no se iniciaba automáticamente cuando se aplicaba energía; el usuario tenía que usar PROGRAM LOAD o algún otro método para iniciar la CPU e iniciar la secuencia de arranque. Girar el interruptor a LOCK deshabilitó los interruptores de función del panel frontal; girando el interruptor a LOCK y quitando la llave, el usuario podría hacer que la CPU sea resistente a la manipulación. En los sistemas con memoria de núcleo magnético, la posición LOCK también habilita la función de recuperación automática de fallas de energía. La llave podría retirarse en las posiciones APAGADO o BLOQUEADO.
Rendimiento
El Nova 1200 ejecutó las instrucciones de acceso a la memoria central (LDA y STA) en 2,55 microsegundos (μs). El uso de la memoria de solo lectura ahorró 0,4 μs. Las instrucciones del acumulador (ADD, SUB, COM, NEG, etc.) tardaron 1,55 μs, MUL 2,55 μs, DIV 3,75 μs, ISZ 3,15-4,5 μs. En el último Eclipse MV/6000, LDA y STA tomaron 0,44 μs, ADD, etc. tomaron 0,33 μs, MUL 2,2 μs, DIV 3,19 μs, ISZ 1,32 μs, FAD 5,17 μs, FMMD 11,66 μs.
Ejemplos de 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 ejecuta RDOS ; utiliza la llamada del sistema PCHAR .titl Hola. .nrel .ent Empieza empezar: dochar: lda 0,@pmsg ; carga ac0 con el siguiente personaje, mov 0,0,snr ; test ac0; skip if nonzero (don't load result) jmp hecho .systm .pchar ; imprimir primero jmp er ; saltó si está bien movs 0,0 ; intercambio de bytes .systm .pchar ; imprimir segundo jmp er ; saltó si está bien isz pmsg ; punto al siguiente carácter jmp dochar ; ir de nuevo hecho: .systm ; salida normal .rtn er: .systm ; salida de error .ertn Stop P: .+1 ; puntero a primer carácter de cuerda ; los bytes de notas son empaquetados de derecha a izquierda por defecto ; <15 contactos obtenidos12 título denota un par CR LF. .txt /Hola., mundo..15■.12ñ 0 ; palabra bandera a cadena final .end Empieza
Multiplicación de 16 bits
Los modelos básicos de Nova venían sin la capacidad de multiplicar y dividir de hardware incorporada, para mantener los precios competitivos. La siguiente rutina multiplica dos palabras de 16 bits para producir un resultado de palabra de 16 bits (se ignora el desbordamiento). Demuestra el uso combinado de ALU op, shift y test (skip). Tenga en cuenta que cuando jsr
llama a esta rutina, AC3 contiene la dirección de retorno. Esto es utilizado 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 Thain sub 0,0; resultado claro mbit:movzr 1,1,szc; multiplicador de cambio, test lsb añadir 2,0; 1: añadir multiplicand movzl 2,2,szr; cambio y prueba para cero jmp mbit; no cero, hacer otro poco jmp 0,3; retorno
Acumulador de impresión binario
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 de Nova. Por ejemplo, no hay ninguna instrucción para cargar un "inmediato" valor en un acumulador (aunque las instrucciones de referencia de memoria codifican tal 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 la 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 macro de llamada RDOS .systm
implementa un jsr
, AC3 se sobrescribe con la dirección de retorno de la función .pchar
. Por lo tanto, se necesita una ubicación temporal para conservar la dirección de retorno de la persona que llama a esta función. Para una rutina recursiva o de reingreso, en su lugar se debe usar una pila, hardware si está disponible, software si no. La instrucción de retorno se convierte en jmp @ retrn
, que aprovecha el modo de direccionamiento indirecto de Nova para cargar la PC de retorno.
Las definiciones constantes al final muestran dos características del ensamblador: la raíz del ensamblador es octal por defecto (20
= dieciséis), y las constantes de caracteres se pueden codificar como p. "0.
pbin: ; imprimir AC1 en consola como 16 dígitos binarios, por Toby Thain sta. 3,Retrn ; guardar el addr de retorno lda 2,n16 ; configurar el contador de bits Loop: lda 0,chr0 ; cargar ASCII '0' movzl 1,1,szc ; conseguir el siguiente bit en carga inc 0,0 ; golpe a '1' .systm .pchar ; AC0-2 conservado jmp err ; si error inc 2,2,szr ; contragolpes jmp bucle ; vuelta de nuevo si no cero lda 0,spc ; producir un espacio .systm .pchar jmp err ; si error jmp @Retrn spc: " ; ese es un espacio chr0: "0 n16: -20 Retrn: 0
Hechos
La Canadian Broadcasting Corporation en Montreal usó el Nova 1200 para la automatización de la reproducción de canales hasta finales de la década de 1980. Luego fue reemplazado por unidades Nova 4 renovadas y estuvieron en uso hasta mediados de la década de 1990.
Contenido relacionado
Blohm+Voss
Llave inglesa
Bioterrorismo