El CP1600 es un microprocesador de 16 bits creado en colaboración entre General Instrument y Honeywell , presentado en febrero de 1975. [1] [2] Es uno de los primeros procesadores de 16 bits de un solo chip. El diseño general tiene un gran parecido con el PDP-11 .
Honeywell utilizó el CP1600 en una serie de ordenadores de control de procesos y sistemas relacionados, pero su uso más extendido fue la versión CP1610 en la consola de videojuegos Intellivision . El sistema tuvo pocos usos adicionales debido a la filosofía de marketing de General Instruments de buscar clientes solo con pedidos muy grandes e ignorar a los clientes más pequeños. Tampoco buscaron un acuerdo de segunda fuente , que en los primeros días de los diseños de microprocesadores era un requisito para la mayoría de los clientes potenciales. [3]
El CP1600 se implementó en modo de mejora nMOS y requería fuentes de alimentación de +12, +5 y −3 V; las conexiones de E/S, excepto las de los relojes, eran compatibles con TTL (5 V). [a] Cada microestado o ciclo de procesador utiliza cuatro intervalos de tiempo internos generados por dos relojes no superpuestos. Un reloj de dos fases de 3,3 MHz produce un microciclo de 600 nanosegundos. Un reloj de dos fases de 5 MHz produce un microciclo de 400 nanosegundos. Debido a los requisitos de voltaje de las señales de reloj, estas debían generarse con circuitos externos, como era común en esta era del diseño de microprocesadores. [3]
Para poder instalar un procesador de 16 bits en un diseño de chip de encapsulado dual en línea (DIP) de 40 pines, el CP1600 multiplexó sus pines de datos y dirección. Esto permitió utilizar un conjunto de 16 pines tanto para la selección de dirección como para la lectura y escritura de datos, pero para ello se requerían dos ciclos de bus. También complicó el diseño general de la máquina, ya que se necesitaban búferes en el bus de memoria para bloquear la dirección mientras el procesador cambiaba los pines al modo de datos. La interfaz con el sistema también era compleja, ya que requería tres pines, BDIR
, BC1
y BC2
, que debían decodificarse para comprender en qué estado se encontraba el bus de memoria. [4]
Una característica relativamente poco común del CP1600 era su concepto de "rama externa". Esto se implementó como cuatro pines en el chip, EBCA0
a través de EBCA3
, que contenían los cuatro bits inferiores del BEXT
código de operación de la instrucción. Cuando se ejecuta esta instrucción, los pines se activan y se utilizan para indicar cuál de hasta dieciséis sistemas externos debe muestrearse. Esos dispositivos responderían a la consulta estableciendo EBCI
pin, y el estado de este pin determinaría si la rama se tomó o no. [4] Esto podría usarse, por ejemplo, para probar si un dispositivo externo tenía datos de entrada que necesitaban ser procesados; el procesador podría expresar el valor "2" en el EBCA
para muestrear el dispositivo 2, llamar al BEXT
, y ese dispositivo respondería estableciéndose EBCI
en verdadero si había datos, lo que haría que el procesador saltara al código para leer los datos de ese dispositivo.
Esto contrasta con la solución típica para manejar dispositivos externos; la mayoría de los sistemas hacen que los dispositivos generen una interrupción que hace que el procesador llame a un código especial, el manejador de interrupciones , que luego lee datos adicionales para determinar qué dispositivo llamó a la interrupción. Estos datos adicionales pueden presentarse utilizando pines dedicados en la CPU, pero a menudo se presentan como un valor en el bus de datos . El código del manejador de interrupciones luego decide qué controlador de dispositivo llamar para procesar los datos. El CP1600 puede implementar esto en menos instrucciones; el manejador de interrupciones es simplemente una serie de BEXT
instrucciones que apuntan a los controladores asociados que ejecuta uno a la vez hasta que el dispositivo en cuestión establece el EBCI
y hace que el código se ramifique automáticamente.
En total, la implementación de un sistema que utilizara el CP1600 requería a menudo chips de soporte y lógica adicionales. Esto incluía un sistema para multiplexar dieciséis señales en un solo pin si se utilizaba la ramificación externa y un convertidor de tres bits a ocho líneas para evitar tener que decodificar las señales de estado del bus en partes externas. [3]
De los 16 bits disponibles en un código de operación de instrucción , el CP1600 utilizó solo 10. Los 6 bits restantes estaban marcados como "Uso futuro". [5] Las instrucciones de 10 bits significaban que el código almacenado en una ROM orientada a bytes típica desperdiciaría seis bits por instrucción. En la era de la memoria costosa, este era un problema importante. Para abordar esto, General Instrument también produjo ROM especiales de 10 bits que almacenaban las instrucciones de manera eficiente. Como los datos y las direcciones aún requerirían valores de 16 bits, el 1600 incluyó una instrucción SDBD especial que unía un argumento de 16 bits a partir de dos lecturas de ROM de 10 bits.
Los 6 bits no utilizados estaban destinados a ser utilizados con coprocesadores, lo que confirmaba la PCIT
línea que estancó la CPU hasta su lanzamiento. La documentación inicial muestra dos chips planificados en la serie, el 1616 que agregó el "conjunto de instrucciones extendido" y el 1618 "expansor de prioridad". [6]
El sistema incluía 87 instrucciones básicas. Las instrucciones podían tener de una a tres palabras de 16 bits de longitud, dependiendo del formato de direccionamiento que se utilizara. [4] El CP1600 no admitía direccionamiento indirecto memoria-memoria (desplazamientos), y el bucle se implementaba utilizando un sumador dedicado que realizaba cambios de un solo ciclo en las direcciones de la memoria. La unidad lógica aritmética (ALU) tenía 16 bits de ancho y podía sumar dos registros internos de 16 bits en 2,4 microsegundos, y la suma de números de 16 bits de memoria a registro en 3,2 microsegundos. [7]
Al igual que el PDP-11, el CP1600 utilizaba ocho registros de procesador de "propósito general" de 16 bits , aunque no eran verdaderamente de propósito general como en los diseños modernos. Solo R0 no tenía un propósito predefinido y se lo ha descrito como "el acumulador primario". [8] R1 a R3 podían usarse como punteros de datos, generalmente utilizados para direccionamiento basado en registros ("direccionamiento implícito"). R4 y R5 se incrementaban automáticamente después de ser accedidos, lo que los hacía útiles para recorrer colecciones de datos.
R6 era el puntero de pila , R7 el contador de programa. Dado que ambos registros eran visibles para el programador, podían utilizarse para implementar múltiples pilas o admitir ramificaciones más complejas, entre otras cosas. No había instrucciones de pila implícitas; cuando se utilizaba R6 en una operación de "lectura", decrementaba la dirección y luego devolvía los datos a los que se apuntaba, simulando un POP
, y cuando se utilizaba en una "escritura", escribía y luego realizaba un incremento posterior (como R4/R5), simulando un PUSH
.
Como era común en la época, el CP1600 utilizaba E/S mapeadas en memoria , en lugar de pines de E/S separados como los que se veían en los sistemas Intel . El uso de un bus multiplexado y un estado de bus multiestado hizo que la implementación de E/S fuera más difícil de lo que normalmente sería el caso en sistemas mapeados en memoria. Esto significaba que las implementaciones tenían que usar pestillos o búferes para poder interactuar con la CPU a medida que cambiaba el bus de indicar una dirección a datos. [8] Esto afectó negativamente al rendimiento de E/S y aumentó la complejidad de los dispositivos de E/S.
Para solucionar este problema, GI suministró una serie de chips de E/S dedicados 164x que implementaban la lógica de bus requerida. Estos incluían, por ejemplo, el controlador de teclado 1641, el controlador de cinta de casete 1643 y el control de pantalla 1647. [6] El más famoso de ellos es el "Controlador de interfaz programable" 1640 , o PIC, que fue diseñado para funcionar en conjunto con el CP1600 y actuar como un controlador de canal para la CPU. Al igual que con los otros chips de la serie 1640, el PIC decodificaba internamente la lógica del bus, pero también agregaba un procesador muy simple que podía ejecutar sus propios programas para realizar E/S y acceso directo a la memoria . Por ejemplo, uno podría enviar una instrucción a un PIC en una tarjeta de disquete para leer datos de un sector dado en el disco. El PIC luego leería los datos en su propio búfer interno, vigilaría el bus en busca de tiempo no utilizado cuando los pines de estado del bus estuvieran todos a cero y luego enviaría los datos a la memoria principal. [6]
General Instrument proporcionó ensambladores cruzados y simuladores/depuradores compatibles con minicomputadoras de 16 bits o más grandes . [9] GI también proporcionó un sistema de microcomputadora independiente basado en CP1600 en el GIC1600. [10]
El CP1610, utilizado en consolas de juegos como la Champion 2711 [11] y, más notablemente, la Intellivision , es un miembro compatible de la familia de microprocesadores 1600. Utiliza un reloj de dos fases de 2 MHz que produce un ciclo de procesador de 1 microsegundo. El CP1610 en las Intellivisions NTSC utiliza un reloj de dos fases de 1,7897725 MHz. Aunque los usuarios del CP1600 en el papel tradicional de la computadora eran relativamente raros, se produjeron más de 3 millones de Intellivisions desde 1980 hasta que la crisis de los videojuegos de 1983 provocó el cierre de las líneas de producción de Intellivision en 1984. [12]
La producción del CP1600 finalizó en 1985, cuando General Instrument escindió su división de microelectrónica para crear Microchip Technology . En ese momento, ya existían varios diseños de 32 bits, como el MC68000, que limitaban el interés en un diseño de 16 bits como el CP1600, y su principal cliente, Intellivision, ya no estaba en producción. Muchos otros productos también llegaron al final de su vida útil al mismo tiempo, y su producto principal era el PIC.