El abuelo de todos los X86
El 8 de Junio de 1978, Intel presentó al público el chip 8086 (también conocido como iAPX86), procesador que se convertiría en la base para el actual conjunto de instrucciones de arquitectura x86, dando inicio a la historia moderna de las CPUs de propósito general. Con frecuencias que bordeaban los 5 MHz en un principio, ese número se logró duplicar para 1990, año en que el chip fue descontinuado por la compañia.
Cerca de dos años de desarrollo tomó al equipo liderado por Bill Pohlman diseñar el chip Intel 8086 de 40 pines y extensión completa de 16-bit, siendo el sucesor directo de 8080, microprocesador de 8-bit construido en 1974 y que empezaba a bosquejar los primeros intentos de un procesador de propósito general por parte de Intel. Curiosamente, la producción del chip 8086 era subcontratada, y en la siguiente imagen podemos ver dos modelos hechos por AMD y Fujitsu respectivamente:
Historia
Durante los años 70, Intel era una compañía que prácticamente se dedicaba a la producción DRAM en lugar de procesadores, pero gracias al chip 8008, lograron un éxito que les permitió seguir en competencia con los grandes de la época como: Motorola, National Semiconductor o ZiLog, esta última empresa se volvió muy popular gracias a su chip Z80, el cuál había sido diseñado por exs empleados de Intel utilizando una microarquitectura e instrucciones muy similares al chip 8085 (versión con compatibilidad binaria de 8080).
El diseño de Intel 8086 tenía como principal objetivo seguir la línea y mantener retrocompatibilidad con los chips 8008, 8080 y 8085, de este modo los programadores (machos que hacían todo el aseembler) no debían editar o rehacer código, pero a diferencia de sus hermanos menores, 8086 incluiría soporte completo para el procesamiento de 16-bit.
Stephen P. Morse, principal arquitecto del proyecto 8086, comentó que las instrucciones en el nuevo diseño de Intel tendrían mejor relación con algunos lenguajes de más alto nivel de la época (Pascal, PL/M) y no tanta implicancia con el compilador. La contratación de Morse en el proyecto dio bastante que hablar, ya que era un Ingeniero de Software que tenía una visión totalmente distinta sobre el diseño de CPUs, la que había estado dominada por Ingenieros de Hardware:
Junto a las nuevas instrucciones agregadas al procesador como: soporte completo para enteros con signo, direccionamiento base-offset, y operaciones repetitivas con una perspectiva de computó general, diferenciaron a Intel del diseño de Z80.
El chip 8086 finalizó con 20.000 transistores activos (29.000 contando todos los ROM y PLA), mientras la construccion del procesador fue hecha bajo el proceso llamado HMOS (High performance MOS) y utilizado por Intel para fabricar de manera más rápida sus productos SRAM.
Bus, registros y otras hierbas
La verdadera identidad de 8086 se establecen en sus registros y buses (interno, externo) de 16-bit, lo que permite un direccionamiento I/O de 64 KB (216 = 65.536), mientras el bus externo de 20-bit permitía un direccionamiento físico de 1 MB.
Los registros del 8086 estaban divididos en dos secciones principales, de propósito general y de índice.
AX: Registro acumulador, dividido en AH / AL. Su principales funciones eran generar código de máquina, operaciones de aritmética, lógica y transferencia de datos, multiplicación y división, salidas y entradas.
BX: Registro base de direccionamiento, dividido en BH / BL.
CX: Registro contador, dividido en CH / CL. Su objetivo era iterar segmentos de código, repetir operaciones y contar bits
DX: Registro de datos, dividido en DH y DL. Junto con AX se concatenan operaciones MUL y DIV en un registro de 32-bit, también especificaba puertos en algunas operaciones de entrada/salida.
SI: Registro indice. Usado de puntero para ciertos datos y como fuente para ciertas instrucciones de procesamiento.
DI: Indice destino. Cumple el mismo objetivo de SI con un offset distinto (SS).
BP: Puntero base. Usado para acceder a parámetros pasados vía pila.
SP: Puntero de Pila. Siempre apunta al primer item de una pila (a FFFEh si está vacía)
Luego tenemos los registros bandera, de segmentos y apuntador de instrucciones especial; Cada uno de ellos cumplía funciones muy específicas, como conocer el estado del procesador luego de haber realizado una operación (banderas) o acceder a los valores alojados en memoria (segmentos) aunque también se podían almacenar en aquellos registros (64KB) pero no era la idea para aquella época donde un KB más o menos marcaba la diferencia.
Uno de los inconvenientes del bus de datos del 8086, era que estaba multiplexado (dividido en varias señales) con el bus de direccionamiento, limitando el rendimiento final especialmente en aquellos procesos de 8-bit, que corrían ligeramente más lentos que los procesadores de 8-bit de aquellos tiempos. Otros problemas que afligían al recién nacido 8086 eran la lentitud con la que se realizaban operaciones aritméticas, por lo que Intel decidió agregar un segundo chip (8087) encargado de realizar operaciones matemáticas con números de 80-bits, éste es el denominado co-procesador matemático.
Pines
El sistema de entradas y salidas del microprocesador 8086 está diseñado en el formato DIP (Dual Inline Package), que consiste en 40 patas (o pines) en total -20 en el lado izquierdo, 20 en el derecho- separadas entre sí por 2,54 milímetros.
Cada uno de los pines cumple con una función específica y están enumerados del 1 al 40. Para identificar cada pin es necesario fijarnos en la muesca semicircular que marca el comienzo de la numeración de los pines, siempre desde el lado izquierdo hacia abajo y luego desde abajo hacia arriba por el lado derecho. Esto último es muy importante tener en cuenta antes de conectar los pines a sus respectivas entradas/salidas, porque no faltará el descuidado que conecte la entrada de 5V (Vcc) a la salida GND (tierra/masa).
Las funciones de los pines son las siguientes:
- GND (Masa)
- AD14 (Bus de direcciones)
- AD13 (Bus de direcciones)
- AD12 (Bus de direcciones)
- AD11 (Bus de direcciones)
- AD10 (Bus de direcciones)
- AD9 (Bus de direcciones)
- AD8 (Bus de direcciones)
- AD7 (Bus de direcciones y datos)
- AD6 (Bus de direcciones y datos)
- AD5 (Bus de direcciones y datos)
- AD4 (Bus de direcciones y datos)
- AD3 (Bus de direcciones y datos)
- AD2 (Bus de direcciones y datos)
- AD1 (Bus de direcciones y datos)
- AD0 (Bus de direcciones y datos)
- NMI (Entrada de interrupción no enmascarable)
- INTR (Entrada de interrupción enmascarable)
- CLK (Entrada de reloj generada por el 8284)
- GND (Masa)
- RESET (Para inicializar el 8088)
- READY (Para sincronizar periféricos y memorias lentas)
- /TEST
- /INTA (El 8088 indica que reconoció la interrupción)
- ALE (Cuando está uno indica que salen direcciones por AD, en caso contrario, es el bus de datos)
- /DEN (Data enable: cuando vale cero debe habilitar los transceptores 8286 y 8287 (se conecta al pin de “output enable”), esto sirve para que no se mezclen los datos y las direcciones).
- DT/R (Data transmit/receive: se conecta al pin de dirección de los chips recién indicados).
- IO/M (Si vale 1: operaciones con ports, si vale 0: operaciones con la memoria)
- /WR (Cuando vale cero hay una escritura)
- HLDA (Hold Acknowledge: el 8088 reconoce el HOLD)
- HOLD (Indica que otro integrado quiere adueñarse del control de los buses, generalmente se usa para DMA o acceso directo a memoria).
- /RD (Cuando vale cero hay una lectura)
- MN/MX (Cuando esta entrada está en estado alto, el 8088 está en modo mínimo, en caso contrario está en modo máximo)
- /SSO (Junto con IO/M y DT/R esta salida sirve para determinar estados del 8088)
- A19/S6 (Bus de direcciones/bit de estado)
- A18/S5 (Bus de direcciones/bit de estado)
- A17/S4 (Bus de direcciones/bit de estado)
- A16/S3 (Bus de direcciones/bit de estado)
- A15 (Bus de direcciones)
- Vcc (+5V)
Esta es la configuración del 8086 en modo mínimo, cuando se le aplica más de 5V al pin 33 (MN/MX) automáticamente el microprocesador entra a funcionar en modo máximo y algunos de los pines cambiaban su significado:
- Pin 24, QS1: Estado de la cola de instrucciones (bit 1).
- Pin 25, QS0: Estado de la cola de instrucciones (bit 0).
- Pin 26, S0: Bit de estado 0.
- Pin 27, S1: Bit de estado 1.
- Pin 28, S2: Bit de estado 2.
- Pin 29, /LOCK: Cuando vale cero indica a otros controladores del bus (otros microprocesadores o un dispositivo de DMA) que no deben ganar el control del bus. Se activa poniéndose a cero cuando una instrucción tiene el prefijo LOCK.
- Pin 30, RQ/GT1: Es bidireccional y tiene la misma función que HOLD/HLDA en modo mínimo.
- Pin 31, RQ/GT0: Como RQ/GT1 pero tiene mayor prioridad.
- Pin 34, Esta salida siempre está a uno.
Micro-computadores con 8086 y clones
Uno de los primeros computadores en incorporar la tecnología del chip Intel 8086, fue el famoso IBM PC, modelo que utilizaba el chip 8088 -una versión de 8086 con un bus de datos de 8-bit- y marcó el comienzo de un estándar para el resto de la industria de computadores. Luego de IBM PC, vinieron los modelos IBM PS/2 que incorporaron el verdadero 8086 con una frecuencia de 8 MHz. Sin embargo, el primer micro-computador en comercializar el procesador 8086 fue el fabricante noruego Mycron y el su modelo Mycron 2000, que utilizaba el sistema operativo CP/M-86. Otros micro-computadores que adoptador el procesador de Intel fueron:
- Compaq Deskpro, con el chip 8086 a 7,14MHz, además fue el primer IBM PC clon que permitía tarjetas diseñadas para el IBM PC XT.
- IBM Displaywriter, máquina de procesamiento de texto diseñada en los Laboratorios Wang
- Tandy 1000 serie SL
- Amstrad PC1512, PC1640 y PC2086, todos utilizaban el chip 8086 corriendo a 8MHz
- FLT86, fabricado en Inglaterra
En los años 80, Intel no disponía de sus propias fabricas para proveer de sus chips a todo el mundo, por lo que muchas unidades eran encargadas a otras compañías como: Fujitsu, Harris/Intersil, OKI, Siemens AG, TI, USSR, NEC o Mitsubishi, las que aprovechaban de hacer versiones compatibles. En algunos casos, el 8086 no sólo era copiado, sino que también mejorado para diversos propósitos, esto sucedió con los modelos V20 y V30 de NEC, los que agregaban el set de instrucciones de los 80186 y una frecuencia ligeramente mayor, aunque en esos tiempos tener 2 MHz extras podía significar hasta un 30% más de rendimiento.
Sin embargo, también existieron clones de 8086, estos nacieron en la ex Union Soviética gracias el espionaje industrial y la ingeniería inversa. El clon ruso de Intel 8086 era denominado K1810BM86, que además -patudamente- era compatible con los 40 pines y set de instrucciones del original. La necesidad de proveer de procesadores a los computadores de la Union Soviética los llevó a implementar su propia solución de chip, diseño de circuitos y bus de datos independientes al producto original de Intel.
Conclusión
El éxito logrado por Intel y sus microprocesadores 8086 y 8088 no sólo tuvo un fuerte impacto en la computación de hoy en día, en los años setenta fue catalogado por la revista “Fortune” como uno de los mejores negocios de la época gracias a la inclusión del microchip en soluciones de computación económicas como fueron los IBM PC, aunque originalmente fue pensado para sistemas embebidos.
Al mismo tiempo que se iba masificando el chip 8086 y sus hermanos, nacía un nuevo termino, x86, y que hace referencia al conjunto de instrucciones de arquitectura que se estaba formando. Desde aquellos tiempos hasta la fecha, x86 se ha vuelto en la arquitectura más popular entre PCs de escritorio como portátiles gracias a que varias marcas como HP, Sanyo, Toshiba y otros, imitaron los pasos de IBM con productos clones.
Las siguiente iteraciones de la arquitectura fueron mejorando considerablemente en características, por ejemplo: La segunda generación x86 estuvo liderada por los chips Intel 80186 y 80286 comenzó a ofrecer un espacio de direccionamiento físico de 24-bit y paginamiento de memoria, la tercera y cuarta generación estuvo marcada por la evolución a un direccionamiento lineal y físico de 32-bit, la transición más larga de la computación personal moderna.
Han pasado más de 32 años desde la aparición del histórico Intel 8086 y hoy nos encontramos en la denominada décimo tercera generación de la arquitectura x86, que nos ofrece un direccionamiento lineal/físico de 64-bit y todo un nuevo conjunto de instrucciones y características como SSE5/AVX, virtualización, controladores de memoria en el mismo die de la CPU, FPU superescalar y por supuesto un diseño totalmente modular. Todo esto no habría sido posible sin 8086.