Zilog Z80
El Z80 es un microprocesador de 8 bits presentado por Zilog como el primer producto de la empresa emergente. El Z80 fue concebido por Federico Faggin a fines de 1974 y desarrollado por él y sus 11 empleados a partir de principios de 1975. Las primeras muestras de trabajo se entregaron en marzo de 1976 y se introdujo oficialmente en el mercado en julio de 1976. Con los ingresos de la Z80, la empresa construyó sus propias fábricas de chips y creció a más de mil empleados en los dos años siguientes.
El Zilog Z80 es una extensión compatible con el software y una mejora del Intel 8080 y, al igual que este, estaba destinado principalmente a sistemas integrados. Aunque se usó en esa función, el Z80 también se convirtió en una de las CPU más utilizadas en computadoras de escritorio y computadoras domésticas desde la década de 1970 hasta mediados de la década de 1980. También era común en aplicaciones militares, equipos musicales como sintetizadores (como el Roland Jupiter-8) y juegos de arcade que funcionan con monedas de finales de la década de 1970 y principios de la de 1980, incluido Pac-Man.
Zilog otorgó la licencia del Z80 a Synertek y Mostek con sede en EE. UU., que los habían ayudado con la producción inicial, así como a un fabricante europeo de segunda fuente, SGS. El diseño también fue copiado por varios fabricantes japoneses, de Europa del Este y soviéticos. Esto ganó la aceptación del Z80 en el mercado mundial desde que grandes empresas como NEC, Toshiba, Sharp e Hitachi comenzaron a fabricar el dispositivo (o sus propios clones o diseños compatibles con Z80).
En las últimas décadas, Zilog se ha vuelto a centrar en el mercado cada vez mayor de sistemas integrados, y la familia de microcontroladores compatibles con Z80 más reciente, el eZ80 de 24 bits completamente canalizado con un rango de direcciones lineal de 16 MB, se ha presentado con éxito junto con el productos Z80 y Z180 más simples.
Historia
Historia temprana
El físico e ingeniero Federico Faggin trabajó en Intel en el diseño de microprocesadores. En Fairchild Semiconductor, y más tarde en Intel, Faggin había estado trabajando en la tecnología fundamental de fabricación de transistores y semiconductores. También desarrolló la metodología de diseño básica utilizada para memorias y microprocesadores en Intel y dirigió el trabajo en Intel 4004, Intel 8080 y varios otros circuitos integrados. Masatoshi Shima fue el diseñador principal de lógica y nivel de transistores del 4004 y el 8080 bajo la supervisión de Faggin, mientras que Ralph Ungermann estuvo a cargo del diseño de circuitos integrados personalizados.
A principios de 1974, Intel consideraba que sus microprocesadores no eran tanto productos que se vendieran solos, sino una forma de vender más de sus productos principales, RAM y ROM estáticas. Una reorganización colocó muchas de las secciones anteriormente independientes bajo la dirección de Les Vadasz, y se creó un nuevo grupo para comercializar directamente los microprocesadores. Ese año, la recesión de 1973-1975 alcanzó su punto máximo e Intel despidió a varios empleados. Todo esto hizo que Faggin se sintiera inquieto e invitó a Ungermann a tomar algo y le preguntó si estaría interesado en iniciar su propia empresa. Ungermann accedió de inmediato y, como tenía menos cosas que hacer en Intel, se fue en agosto o septiembre, seguido de Faggin, cuyo último día en Intel fue Halloween de 1974. Cuando Shima se enteró, pidió venir también a la nueva empresa, pero al tener sin diseño de producto real o dinero, le dijeron que esperara.
La empresa recién formada y sin nombre inicialmente comenzó a diseñar un microcontrolador de un solo chip llamado 2001. Se reunieron con Synertek para discutir la fabricación en sus líneas, y cuando Faggin comenzó a comprender los costos involucrados, quedó claro que un bajo costo producto como este no podría competir con un diseño de una empresa con sus propias líneas de producción, como Intel. Luego, comenzaron a considerar un microprocesador más complejo, inicialmente conocido como Super 80, cuya característica principal era el uso de un bus de +5 V en lugar de los más comunes -5, +5 y 12 V utilizados por diseños como el 8080. El nuevo diseño estaba destinado a ser compatible con el 8080, pero agrega muchas de las características agradables del Motorola 6800, incluidos los registros de índice y las interrupciones mejoradas.
Inversión de Exxon, comienza el desarrollo detallado
Mientras aún se estaba configurando, el boletín de la industria Electronic News se enteró de ellos y publicó una historia sobre la empresa recién formada. Esto atrajo la atención de Exxon Enterprises, el brazo de inversión en alta tecnología de Exxon. En ese momento, en medio de la recesión, había muy poco capital de riesgo disponible, con un total de $ 10 millones para toda la industria que se gastó en todo 1975. Alguien de Exxon se puso en contacto con la empresa aún sin nombre y organizó una reunión. eso eventualmente los llevó a proporcionar una financiación inicial de $ 500,000 en junio de 1975.
Después de discutir la financiación y construir un diseño, Shima se unió en febrero de 1975. Shima inmediatamente se dedicó a producir un diseño de alto nivel, agregando varios conceptos propios. En particular, usó su experiencia con las minicomputadoras NEC para agregar el concepto de dos conjuntos de registros de procesador para que pudieran responder rápidamente a las interrupciones. Ungerman comenzó el desarrollo de una serie de controladores y chips periféricos relacionados que complementarían el diseño.
Durante este período, Shima desarrolló una reputación legendaria por ser capaz de convertir conceptos lógicos en diseño físico en tiempo real; mientras discutía una característica propuesta, a menudo interrumpía y decía cuánto espacio ocuparía en el chip y vetaba su adición si era demasiado grande. El primer paso en el diseño se completó en abril de 1975. Shima había completado un diseño lógico a principios de mayo. El 7 de agosto se emitió una segunda versión del diseño lógico y los detalles del autobús el 16 de septiembre. La cinta se completó en noviembre y la conversión de la cinta en una máscara de producción requirió dos meses más.
Faggin ya había comenzado a buscar un socio de producción. En ese momento, Synertek y Mostek habían establecido las líneas de producción en modo de agotamiento que podrían usarse para producir el diseño. Habiendo hablado previamente con Synertek, Faggin se acercó a ellos primero. Sin embargo, el presidente de Synertek exigió que se otorgara a la empresa una licencia de segunda fuente, que les permitiera vender el diseño directamente. Faggin pensó que esto significaría que nunca podrían competir incluso si establecieran sus propias líneas, y el acuerdo fracasó. Luego recurrió a Mostek, quien aceptó un término de exclusividad mientras Zilog configuraba sus líneas y, finalmente, se le otorgó el acuerdo de segunda fuente.
Después de considerar muchos nombres para la nueva empresa y encontrarlos tan poco memorables que no podían recordarlos ni siquiera un día después, Faggin y Ungermann estaban dando vueltas a ideas basadas en la "lógica integrada" cuando Ungermann dijo "¿qué tal Zilog?" Faggin estuvo de acuerdo de inmediato, afirmando que podían decir que era la "última palabra en lógica integrada". Cuando se encontraron al día siguiente y ambos lo recordaron de inmediato, la empresa tenía su nombre.
En producción
Mostek devolvió las primeras muestras el 9 de marzo de 1976. A finales de mes, también habían completado un sistema de desarrollo basado en ensamblador. Algunos de los circuitos integrados periféricos y de soporte de Z80 estaban en desarrollo en este momento, y muchos de ellos se lanzaron durante el año siguiente. Entre ellos estaban el Z80 CTC (contador/temporizador), Z80 DMA (acceso directo a la memoria), Z80 DART (receptor-transmisor asíncrono dual), Z80 SIO (controlador de comunicación síncrona) y Z80 PIO (entrada/salida paralela).
El Z80 se lanzó oficialmente en julio de 1976. Uno de los primeros clientes fue un comprador que, sin que Zilog lo supiera, trabajaba para NEC. En ese momento, las empresas japonesas de electrónica eran bien conocidas por tomar diseños de chips estadounidenses y producirlos sin licencia. El equipo de Zilog estaba preocupado por esto, y a Faggin se le ocurrió la idea de agregar transistores que se modificarían sutilmente para operar de manera diferente a lo que sugeriría una inspección visual. Shima agregó seis de estas "trampas" alrededor del diseño. Algún tiempo después, un ingeniero de NEC le dijo a Shima que las trampas habían retrasado sus esfuerzos de copia por seis meses.
El lanzamiento exitoso permitió a Faggin y Ungermann acercarse a Exxon en busca de financiamiento para construir su propia fábrica. La empresa estuvo de acuerdo y Zilog construyó una línea de producción muy rápidamente. Esto les permitió capturar alrededor del 60 al 70% del mercado total para las ventas de Z80. Con su propia línea en funcionamiento, Mostek recibió el visto bueno para comenzar las ventas de sus propias versiones, la MK3880, que proporcionó una segunda fuente para los clientes de la que carecía Intel. En ese momento, una segunda fuente se consideraba extremadamente importante ya que una empresa nueva como Zilog podría cerrar y dejar a los clientes potenciales varados.
Comparación con el 8080
Faggin diseñó el conjunto de instrucciones para que fuera compatible en binario con el 8080, de modo que la mayoría del código 8080, en particular el sistema operativo CP/M y el compilador PL/M de Intel para 8080 (así como su código generado), ejecutar sin modificaciones en la nueva CPU Z80. Masatoshi Shima diseñó la mayor parte de la microarquitectura, así como los niveles de compuerta y transistor de la CPU Z80, con la ayuda de un pequeño número de ingenieros y diseñadores. El CEO Federico Faggin estuvo muy involucrado en el trabajo de diseño del chip, junto con dos personas dedicadas al diseño. Según Faggin, trabajaba 80 horas a la semana para cumplir con el apretado calendario que le dieron los inversores financieros.
El Z80 ofreció muchas mejoras sobre el 8080:
- An enhanced instruction set including:
- un sistema más lógico, comprensible y legible de instrucción ensambladora mnemonics
- instrucciones más flexibles de movimiento de datos de 16 bits (carga, o LD), incluyendo crucialmente el puntero de pila SP
- modos de manejo más flexibles para entrada/salida a puertos periféricos externos
- de todos los registros y memoria, incluyendo pruebas de bits
- cambios/rota en la memoria y registros aparte del acumulador
- mejorada y más precisa (que la anterior 8080)
- rotar instrucciones para cadenas de números BCD en memoria
- Sustracción de 16 bits y negación de 8 bits
- programa bucleing
- programa contador (PC) saltos relativos
- copia de bloques, entrada de bloque/salida (I/O), y instrucciones de búsqueda byte.
- Una bandera de desbordamiento con mejor apoyo para los aritméticos firmados de 8 y 16 bits.
- Nuevos registros de índice IX e IY con instrucciones para directo base+offset abordaje
- Un mejor sistema de interrupción:
- Un sistema de interrupción vectorial más automático y general, Modo 2, destinado principalmente a la línea de contra-intimadores de Zilog, DMA y controladores de comunicaciones, así como un sistema de interrupción de vectores fijo, Modo 1, para sistemas simples con hardware mínimo (con Modo 0 siendo el modo 8080-compatible).
- Interrupción no visible (NMI), que se puede utilizar para responder a situaciones de descarga eléctrica u otros eventos de alta prioridad (y permitir que un sistema Z80 minimalista implemente fácilmente un esquema de interrupción de dos niveles en Modo 1).
- Un archivo de registro duplicado completo, que se puede cambiar rápidamente, para acelerar la respuesta a interrupciones como los manipuladores de eventos asincrónicos rápidos o un despachador multitarea. Aunque no estaban destinados como registros adicionales para el código general, se utilizaron de esa manera en algunas aplicaciones.
- Menos hardware necesario para alimentación, generación de relojes e interfaz a la memoria y I/O
- Fuente de alimentación única de 5 voltios (el 8080 necesitaba −5 V, +5 V y +12 V).
- Reloj monofásico de 5 voltios (el 8080 necesitaba una alta amplitud (9 a 12 voltios) reloj de dos fases sin superposición).
- Refrigerio DRAM incorporado, que de otro modo requeriría circuitos externos, a menos que se utilizara SRAM, más caro y menos denso (pero más rápido).
- Los autobuses no complejos (los 8080 tenían señales de estado multiplexadas en el autobús de datos).
- Una función de ajuste especial que sólo aclara el contador del programa, para que una única CPU Z80 pueda ser utilizada en un sistema de desarrollo como un emulador de circuito.
Éxito en el mercado
El Z80 reemplazó al 8080 y su descendiente, el 8085, en el mercado de procesadores y se convirtió en una de las CPU de 8 bits más populares y utilizadas. Algunas organizaciones, como British Telecom, se mantuvieron fieles al 8085 para aplicaciones integradas, debido a su familiaridad con él y su interfaz serie en chip y su arquitectura de interrupción. Asimismo, Zenith Data Systems combinó el 8085 con el Intel 8088 de 16 bits en su primera computadora MS-DOS, la Zenith Z-100, a pesar de tener experiencia previa con sus productos pioneros Heathkit H89 y Zenith Z-89 basados en Z80. Sin embargo, se fabricaron otras computadoras integrando el Z80 con otras CPU: el Radio Shack TRS-80 Model 16 con un Motorola 68000, el DEC Rainbow con un 8088 y el Commodore 128 con un MOS 8502.
Más tarde, Zilog produjo un Z80 de bajo consumo adecuado para el creciente mercado de computadoras portátiles de principios de la década de 1980. Intel produjo un CMOS 8085 (80C85) que se usa en computadoras portátiles que funcionan con baterías, como la computadora portátil diseñada por Kyocera de abril de 1983, también vendida por Tandy (como TRS-80 Model 100), Olivetti y NEC. Sin embargo, en los años siguientes, las versiones CMOS del Z80 (tanto de Zilog como de los fabricantes japoneses) también dominarían este mercado, en productos como el Amstrad NC100, el Cambridge Z88 y el propio WP-2 de Tandy.
Quizás una de las claves del éxito inicial del Z80 fue la actualización de la DRAM integrada, al menos en mercados como CP/M y otros ordenadores domésticos y de oficina. (La mayoría de los sistemas integrados Z80 usan RAM estática que no necesita actualización). También puede haber sido su sistema de interrupción minimalista de dos niveles o, por el contrario, su sistema general de interrupción en cadena de múltiples niveles útil para dar servicio a múltiples chips Z80 IO. Estas características permitieron construir sistemas con menos hardware de soporte y diseños de placa de circuito más simples.
Sin embargo, otros afirman que su popularidad se debió a los registros duplicados que permitieron cambios de contexto rápidos o un procesamiento más eficiente de cosas como matemáticas de coma flotante en comparación con las CPU de 8 bits con menos registros. (El Z80 puede mantener varios de estos números internamente, usando HL'HL, DE'DE y BC'BC como registros de 32 bits, evitando tener que acceder a ellos desde una memoria RAM más lenta durante el cálculo).
Para el diseño NMOS original, el límite de frecuencia de reloj superior especificado aumentó sucesivamente desde los 2,5 MHz iniciales, pasando por los conocidos 4 MHz (Z80A), hasta 6 (Z80B) y 8 MHz (Z80H). La versión NMOS se ha producido como una pieza de 10 MHz desde finales de la década de 1980. Las versiones CMOS se desarrollaron con límites de frecuencia superiores especificados que van desde 4 MHz hasta 20 MHz para la versión que se vende hoy. Las versiones CMOS permitían el modo de espera de bajo consumo con el estado interno retenido, sin límite de frecuencia inferior. Los derivados totalmente compatibles HD64180/Z180 y eZ80 se especifican actualmente para hasta 33 y 50 MHz respectivamente.
Diseño
Modelo de programación y conjunto de registros

El modelo de programación y el conjunto de registros del Z80 son bastante convencionales y, en última instancia, se basan en la estructura de registro del Datapoint 2200. El Z80 fue diseñado como una extensión del Intel 8080, creado por los mismos ingenieros, que a su vez era un extensión del 8008. El 8008 era básicamente una implementación PMOS de la CPU basada en TTL del Datapoint 2200.
El diseño del 2200 permitía emparejar los registros H y L (alto y bajo) de 8 bits en un registro de dirección HL de 16 bits. En el 8080, este emparejamiento también se agregó a los pares BC y DE, mientras que HL se generalizó para permitir su uso como un acumulador de 16 bits, no solo como un registro de direcciones. El 8080 también introdujo el importante modo de datos inmediatos de 8 bits para operaciones de acumulador y datos inmediatos de 16 bits para cargas HL, BC y DE. Además, ahora era posible la copia directa de 16 bits entre HL y la memoria, utilizando una dirección directa.
El Z80 ortogonalizó esto aún más al hacer que todos los pares de registros de 16 bits, incluidos IX e IY, tuvieran un propósito más general, además de permitir la copia de 16 bits directamente hacia y desde la memoria para todos estos pares. Los registros IX e IY de 16 bits en el Z80 están pensados principalmente como registros de direcciones base, donde una instrucción particular proporciona un desplazamiento constante que se suma a los valores anteriores, pero también se pueden usar como acumuladores de 16 bits, entre otras cosas.. Una limitación es que todas las referencias de operandos que involucran IX o IY requieren un byte de prefijo de instrucción adicional, agregando al menos cuatro ciclos de reloj sobre el tiempo de una instrucción que usa HL en su lugar; esto a veces hace que usar IX o IY sea menos eficiente que un método que usa solo los registros del modelo 8080. El Z80 también introdujo una nueva bandera de desbordamiento firmada y complementó la aritmética bastante simple de 16 bits del 8080 con instrucciones dedicadas para la aritmética firmada de 16 bits.
Los registros compatibles con 8080 AF, BC, DE, HL se duplican como un archivo de registro separado en el Z80, donde el procesador puede cambiar rápidamente (cuatro estados t, el menor tiempo de ejecución posible para cualquier instrucción Z80) de uno banco al otro; una función útil para acelerar las respuestas a interrupciones de un solo nivel y de alta prioridad. Una característica similar estaba presente en el 2200, pero nunca se implementó en Intel. El conjunto de registros duales es muy útil en la función integrada, ya que mejora el rendimiento del manejo de interrupciones, pero encontró un uso generalizado en la función de computadora personal como un conjunto adicional de registros generales para código complejo como aritmética de punto flotante o juegos de computadora domésticos.
El archivo de registro duplicado suele denominarse "conjunto de registros alternativos" (algunos, el archivo de registro "preparado" ya que el carácter de apóstrofo se usa para indicarlos en el código fuente del ensamblador y la documentación de Zilog). Esto enfatiza que solo un conjunto es direccionable en cualquier momento. Sin embargo, el acumulador A de 8 bits con su registro de bandera F está bifurcado del "propósito general" pares de registros HL, DE y BC. Esto se logra con dos instrucciones separadas que se usan para intercambiar sus accesibilidades: EX AF,AF'
intercambia solo el par de registros AF con AF', mientras que la instrucción EXX
intercambia los tres pares de registros de propósito general HL, DE y BC con sus suplentes HL', DE' y BC'. Por lo tanto, el acumulador A puede interactuar independientemente con cualquiera de los registros de 8 bits de propósito general en el archivo de registro alternativo (o primado), o, si HL' contiene un puntero a la memoria, algún byte allí (DE' y BC' también pueden transferir datos de 8 bits entre la memoria y el acumulador A).
Esto puede volverse confuso para los programadores porque después de ejecutar EX AF,AF'
o EXX
, lo que antes eran registros alternativos (primados) ahora son los registros principales, y viceversa. La única manera de que el programador sepa qué conjunto(s) están en contexto (mientras "juega con la computadora" mientras escudriña el texto fuente del ensamblador, o peor aún, examina detenidamente el código con un depurador) es rastrear dónde se encuentra cada registro. El intercambio se realiza en cada punto del programa. Obviamente, si se realizan muchos saltos y llamadas dentro de estos segmentos de código, rápidamente puede volverse difícil saber qué archivo de registro está en contexto a menos que se comente cuidadosamente. Por lo tanto, es recomendable que las instrucciones de intercambio se utilicen directamente y en segmentos de código discretos cortos. El conjunto de instrucciones de Zilog Z280 incluye instrucciones JAF
y JAR
que saltan a una dirección de destino si los registros alternativos están en contexto (reconociendo así oficialmente esta complicación de programación).
Registros
Al igual que en el 8080, los registros de 8 bits suelen emparejarse para proporcionar versiones de 16 bits. Los registros compatibles con 8080 son:
AF
: Acumulador de 8 bits (A) y bits de bandera (F) llevan, cero, menos, paridad/reflujo, medio carry (utilizado para BCD), y una bandera Add/Subtract (generalmente llamada N) también para BCDBC
: registro de datos de 16 bits o dos registros de 8 bitsDE
: registro de datos de 16 bits o dos registros de 8 bitsHL
: registro de 16 bits/acumulador de direcciones o dos registros de 8 bitsSP
: puntero de pila, 16 bitsPC
: contador de programas, 16 bits
Los nuevos registros introducidos con el Z80 son:
IX
: índice de 16 bits o registro base para offsets inmediatos de 8 bitsIY
: índice de 16 bits o registro base para offsets inmediatos de 8 bitsI
: registro de base vectorial interrumpido, 8 bitsR
: Refrigerio DRAM, 8 bits (msb no cuenta)AF'
: suplente (o sombra) acumulador y banderas (en y fuera con EX AF, FA )BC'
,DE'
yHL'
: registro alternativo (o sombra)toggled in and out with EXX)- Cuatro bits de estado de interrupción y estado de interrupción
El registro de actualización, R
, se incrementa cada vez que la CPU obtiene un código de operación (o un prefijo de código de operación, que se ejecuta internamente como una instrucción de 1 byte) y no tiene relación simple con la ejecución del programa. Esto a veces se ha utilizado para generar números pseudoaleatorios en juegos y también en esquemas de protección de software. También se ha empleado como "hardware" contador en algunos diseños; un ejemplo de esto es el ZX81, que le permite realizar un seguimiento de las posiciones de los caracteres en la pantalla del televisor activando una interrupción en el ajuste (conectando INT a A6).
El registro de vector de interrupción, I
, se usa para las interrupciones específicas del modo 2 de Z80 (seleccionadas por la instrucción IM 2
). Suministra el byte alto de la dirección base para una tabla de 128 entradas de direcciones de rutinas de servicio que se seleccionan a través de un índice enviado a la CPU durante un ciclo de reconocimiento de interrupción; este índice es simplemente la parte del byte bajo del puntero a la dirección indirecta tabulada que apunta a la rutina de servicio. El puntero identifica un chip periférico particular o una función o evento periférico, donde los chips están normalmente conectados en una llamada cadena de margarita para resolución de prioridad. Al igual que el registro de actualización, este registro también se ha utilizado a veces de forma creativa; en los modos de interrupción 0 y 1 (o en un sistema que no usa interrupciones) puede usarse simplemente como otro registro de datos de 8 bits.
Las instrucciones LD A,R
y LD A,I
afectan al registro de banderas Z80, a diferencia de todas las demás instrucciones LD
(carga). Los indicadores Signo (bit 7) y Cero (bit 6) se configuran de acuerdo con los datos cargados desde los registros de origen de actualización o interrupción. Para ambas instrucciones, el indicador de paridad/desbordamiento (bit 2) se establece de acuerdo con el estado actual del flip-flop IFF2.
Microarquitectura
Aunque el Z80 generalmente se considera una CPU de ocho bits, tiene una ALU de cuatro bits, por lo que los cálculos se realizaron en dos ciclos.
Lenguaje ensamblador Z80
Punto de datos 2200 e Intel 8008
El primer lenguaje ensamblador de Intel 8008 se basó en una sintaxis muy simple (pero sistemática) heredada del diseño de Datapoint 2200. Esta sintaxis original se transformó más tarde en una nueva forma de lenguaje ensamblador, algo más tradicional, para este mismo chip 8008 original. Aproximadamente al mismo tiempo, el nuevo lenguaje ensamblador también se amplió para adaptarse a los modos de direccionamiento adicionales en el chip Intel 8080 más avanzado (el 8008 y el 8080 compartían un subconjunto de lenguaje sin ser compatible con binario; sin embargo, el 8008 era compatible con el binario Datapoint 2200).
En este proceso, el mnemotécnico L
, para LOAD, fue reemplazado por varias abreviaturas de las palabras LOAD, STORE< /i> y MOVER, entremezcladas con otras letras simbólicas. La letra mnemotécnica M
, para memoria (a la que hace referencia HL), se eliminó de la instrucción mnemotécnica para convertirse en un operando independiente sintácticamente, mientras que los registros y las combinaciones de registros se denotaron de manera muy inconsistente; ya sea por operandos abreviados (MVI D, LXI H, etc.), dentro de la propia instrucción mnemotécnica (LDA, LHLD, etc.), o ambos a la vez (LDAX B, STAX D, etc.).
Intel 8008 Datapoint 2200 | Intel 8080 Intel 8085 | Zilog Z80 | Intel 8086/ Intel 8088 |
---|---|---|---|
antes del ca. 1973 | ca. 1974 | 1976 | 1978 |
LBC | MOV B,C | LD B,C | MOV CH,CL |
-- | LDAX B | LD A,(BC) | -- |
LAM | MOV A,M | LD A,(HL) | MOV AL,[BX] |
LBM | MOV B,M | LD B,(HL) | MOV CH,[BX] |
-- | STAX D | LD (DE),A | -- |
LMA | MOV M,A | LD (HL),A | MOV [BX],AL |
LMC | MOV M,C | LD (HL),C | MOV [BX],CL |
LDI 56 | MVI D,56 | LD D,56 | MOV DL,56 |
LMI 56 | MVI M,56 | LD (HL),56 | MOV byte ptr [BX],56 |
-- | LDA 1234 | LD A,(1234) | MOV AL,[1234] |
-- | STA 1234 | LD (1234),A | MOV [1234],AL |
-- | -- | LD B,(IX+56) | MOV CH,[SI+56] |
-- | -- | LD (IX+56),C | MOV [SI+56],CL |
-- | -- | LD (IY+56),78 | MOV byte ptr [DI+56],78 |
-- | LXI B,1234 | LD BC,1234 | MOV CX,1234 |
-- | LXI H,1234 | LD HL,1234 | MOV BX,1234 |
-- | SHLD 1234 | LD (1234),HL | MOV [1234],BX |
-- | LHLD 1234 | LD HL,(1234) | MOV BX,[1234] |
-- | -- | LD BC,(1234) | MOV CX,[1234] |
-- | -- | LD IX,(1234) | MOV SI,[1234] |
Ilustración de cuatro sintaxis, utilizando ejemplos de instrucciones de carga y almacenamiento equivalentes o (para 8086) muy similares. La sintaxis Z80 usa paréntesis alrededor de una expresión para indicar que el valor debe usarse como una dirección de memoria (como se menciona a continuación), mientras que la sintaxis 8086 usa corchetes en lugar de paréntesis ordinarios para este propósito. Tanto Z80 como 8086 usan el signo + para indicar que se agrega una constante a un registro base para formar una dirección. Tenga en cuenta que el 8086 no es un superconjunto completo del Z80. BX es el único par de registros 8086 que se puede usar como puntero.
Nueva sintaxis
Debido a que Intel reclamó los derechos de autor sobre sus mnemónicos de ensamblado, se tuvo que desarrollar una nueva sintaxis de ensamblado para el Z80. Esta vez se utilizó un enfoque más sistemático:
- Todos los registros y pares de registro son explícitamente denotados por sus nombres completos
- Los paréntesis se utilizan consistentemente para indicar "el contenido de memoria en" (dirección constante o dereferencia de puntero variable) con la excepción de una instrucción de salto JP (HL). JP (XY) es simplemente una variación de JP (HL) cargando la nueva dirección PC.
- Todas las instrucciones de carga y almacenamiento utilizan el mismo nombre mnemónico, LD, para LOAD (un retorno al vocabulario simplista Datapoint 2200); otras instrucciones comunes, como ADD e INC, utilizan el mismo mnemónico sin importar el modo de dirección o el tamaño de operación. Esto es posible porque los mismos operarios llevan suficiente información.
Estos principios simplificaron la búsqueda de nombres y formas para todas las instrucciones Z80 nuevas, así como ortogonalizaciones de las antiguas, como LD BC,(1234)
.
Además de las diferencias de nombres, ya pesar de cierta discrepancia en la estructura básica de registros, la sintaxis de Z80 y 8086 es prácticamente isomorfa para una gran parte de las instrucciones. Solo existen similitudes bastante superficiales (como la palabra MOV, o la letra X, para registro extendido) entre los lenguajes ensambladores 8080 y 8086, aunque los programas 8080 pueden traducirse al lenguaje ensamblador 8086 mediante programas traductores.
Conjunto de instrucciones y codificación
El Z80 usa 252 de los 256 códigos disponibles como códigos de operación de un solo byte ("instrucción raíz" que se heredan del 8080); los cuatro códigos restantes se utilizan ampliamente como prefijos de código de operación: CB y ED habilitan instrucciones adicionales, y DD o FD seleccionan IX+d o IY+d respectivamente (en algunos casos sin desplazamiento d) en lugar de HL. Este esquema le da al Z80 una gran cantidad de permutaciones de instrucciones y registros; Zilog los clasifica en 158 "tipos de instrucción" diferentes, 78 de los cuales son los mismos que los del Intel 8080 (permitiendo el funcionamiento de todos los programas del 8080 en un Z80). La documentación de Zilog agrupa aún más las instrucciones en las siguientes categorías (la mayoría del 8080, otras completamente nuevas como las instrucciones de bloque y bit, y otras instrucciones del 8080 con modos de direccionamiento más versátiles, como las cargas de 16 bits, E/S, rotaciones/cambios y saltos relativos):
- Carga e intercambio
- Transferencia de bloques y búsqueda
- Aritmética y lógica
- Girar y cambiar
- Manipulación de bits (set, reset, test)
- Jump, call and return
- Input/output
- Control básico de CPU
No hay instrucciones de multiplicación explícitas disponibles en el Z80 original, aunque los registros A y HL se pueden multiplicar por potencias de dos con las instrucciones ADD A,A y ADD HL,HL (también IX e IY). Las instrucciones de cambio también pueden multiplicar o dividir por potencias de dos.
Diferentes tamaños y variantes de adiciones, cambios y rotaciones tienen efectos algo diferentes en las banderas porque la mayoría de las propiedades de cambio de bandera del 8080 fueron copiadas. Sin embargo, el bit de bandera de paridad P del 8080 (bit 2) se llama P/V (paridad/desbordamiento) en el Z80, ya que cumple el propósito adicional de un indicador de desbordamiento de complemento a dos, una característica que falta en el 8080. Instrucciones aritméticas en el Z80 lo configuró para indicar desbordamiento en lugar de paridad, mientras que las instrucciones bit a bit aún lo usan como indicador de paridad. (Esto introduce una incompatibilidad sutil del Z80 con el código escrito para el 8080, ya que el Z80 a veces indica un desbordamiento firmado donde el 8080 indicaría paridad, lo que posiblemente provoque que la lógica de algún software práctico del 8080 falle en el Z80). Esta nueva bandera de desbordamiento se usa para todas las nuevas operaciones de 16 bits específicas de Z80 (ADC< /code>,
SBC
), así como para 8 operaciones aritméticas de -bit, mientras que las operaciones de 16 bits heredadas del 8080 (AGREGAR
, INC
, DEC
) no lo afectan. Además, el bit 1 del registro de banderas (un bit de repuesto en el 8080) se usa como una bandera N que indica si la última instrucción aritmética ejecutada fue una resta o una suma. La versión Z80 de la instrucción DAA
(acumulador de ajuste decimal para aritmética BCD) comprueba el indicador N y se comporta en consecuencia, por lo que una resta (hipotética) seguida más tarde por DAA
producirá un resultado diferente en un viejo 8080 que en el Z80. Sin embargo, esto probablemente sería un código erróneo en el 8080, como DAA< /code> se definió para agregar solo en ese procesador.
El Z80 tiene seis nuevas instrucciones LD
que puede cargar los pares de registros DE, BC y SP desde la memoria, y cargar la memoria desde estos tres pares de registros, a diferencia del 8080. Al igual que en el 8080, las instrucciones de carga no afectan las banderas (excepto para el registro I y R de propósito especial). cargas). Un resultado de una codificación regular (común con el 8080) es que cada uno de los registros de 8 bits se puede cargar desde sí mismo (por ejemplo, LD A,A
). Esto es efectivamente un NOP
.
Las nuevas instrucciones de transferencia en bloque pueden mover hasta 64 kilobytes de memoria a memoria o entre la memoria y los puertos periféricos de E/S. Instrucciones de bloque LDIR
y LDDR
(load, increment/decrement, repeat) utilizan HL para apuntar a la dirección de origen, DE a la dirección de destino y BC como un contador de bytes. Los bytes se copian del origen al destino, los punteros se incrementan o disminuyen y el contador de bytes se reduce hasta que BC llega a cero. Versiones no repetitivas LDI
y LDD
mueva un solo byte y golpee los punteros y el contador de bytes, que si se convierte en cero restablece el indicador P/V. Instrucciones de memoria a E/S correspondientes INIR
, INDR
, OTIR
, OTDR
, INI
, IND
, OUTI
y OUTD
funcionan de manera similar. El Z80 puede ingresar y enviar cualquier registro a un puerto de E/S usando el registro C para designar el puerto. (El 8080 solo realiza operaciones de E/S a través del acumulador A, usando una dirección de puerto directo especificada en las instrucciones; se requiere una técnica de código automodificable para usar una dirección de puerto 8080 variable).
El último grupo de instrucciones de bloque realiza un CP
operación de comparación entre el byte en (HL) y el acumulador A. No se utiliza el par de registros DE. Las versiones repetidas CPIR
y CPDR
solo termina si BC llega a cero o se encuentra una coincidencia. HL se deja apuntando al byte después de (CPIR
) o antes (CPDR
) el byte correspondiente. Si no se encuentra ninguna coincidencia, se restablece el indicador Z. Hay versiones que no se repiten CPI
y CPD
.
A diferencia del 8080, el Z80 puede saltar a una dirección relativa (JR
en lugar de JP
) usando un desplazamiento firmado de 8 bits. Solo se pueden probar los indicadores cero y de acarreo para estos nuevos JR
instrucciones. (Todos los saltos y llamadas del 8080, condicionales o no, son instrucciones de tres bytes). Una instrucción de dos bytes especializada para bucles de programas también es nueva en el Z80: DJNZ
(decremento jump si n b>on-zero) toma un desplazamiento de 8 bits con signo como operando inmediato. El registro B se decrementa y, si el resultado es distinto de cero, la ejecución del programa salta en relación con la PC; las banderas permanecen inalteradas. Para realizar un bucle equivalente en un 8080, se requiere DEC
e instrucciones de salto condicional (a una dirección absoluta de dos bytes) (un total de cuatro bytes) y DEC
altera el registro de banderas.
Las instrucciones de registro de índice (IX/IY, a menudo abreviado XY) pueden ser útiles para acceder a datos organizados en estructuras heterogéneas fijas (como registros) o en compensaciones fijas relativas a una dirección base variable (como en marcos de pila recursivos) y pueden también reduce el tamaño del código al eliminar la necesidad de múltiples instrucciones cortas utilizando registros no indexados. Sin embargo, aunque pueden ahorrar velocidad en algunos contextos en comparación con "equivalentes" largos/complejos; secuencias de operaciones más simples, requieren mucho tiempo de CPU adicional (por ejemplo, 19 estados T para acceder a una ubicación de memoria indexada frente a tan solo 11 para acceder a la misma memoria usando HL y INC
para apuntar al siguiente). Así, para accesos de datos simples o lineales, el uso de IX e IY tiende a ser más lento y ocupa más memoria. Aún así, pueden ser útiles en los casos en que el "principal" todos los registros están ocupados, eliminando la necesidad de guardar/restaurar registros. Sus mitades de 8 bits oficialmente no documentadas (ver más abajo) pueden ser especialmente útiles en este contexto, ya que incurren en menos ralentización que sus padres de 16 bits. Del mismo modo, las instrucciones para adiciones de 16 bits no son particularmente rápidas (11 relojes) en el Z80 original (siendo 1 reloj más lento que en el 8080/8085); sin embargo, son aproximadamente el doble de rápidos que realizar los mismos cálculos utilizando operaciones de 8 bits y, de igual importancia, reducen el uso de registros. No era raro que los programadores "empujaran" diferentes bytes de desplazamiento de desplazamiento (que normalmente se calculaban dinámicamente) en instrucciones indexadas; este es un ejemplo de código automodificable, que era una práctica habitual en casi todos los primeros procesadores de 8 bits con unidades de ejecución no canalizadas.
Los registros de índice tienen una instrucción paralela a JP (HL)
, que es JP (XY)
. Esto se ve a menudo en lenguajes orientados a la pila como Forth, que al final de cada palabra Forth (subrutinas atómicas que componen el lenguaje) deben volver incondicionalmente a sus rutinas de interpretación de subprocesos. Por lo general, esta instrucción de salto aparece cientos de veces en una aplicación y se usa JP (XY)
en lugar de JP THREAD
guarda un byte y dos estados T para cada aparición. Naturalmente, esto hace que el registro de índice no esté disponible para ningún otro uso o, de lo contrario, la necesidad de recargarlo constantemente anularía su eficiencia.
El diseño Z180 microcodificado, 10 años más nuevo, inicialmente podría ofrecer más 'área de chip', lo que permitiría una implementación un poco más eficiente (usando una ALU más amplia, entre otras cosas); Se pueden decir cosas similares para el Z800, Z280 y Z380. Sin embargo, no fue hasta que se lanzó el eZ80 completamente canalizado en 2001 que esas instrucciones finalmente se volvieron aproximadamente tan eficientes en ciclo como técnicamente es posible hacerlas, es decir, dadas las codificaciones Z80 combinadas con la capacidad de hacer una lectura de 8 bits o escribir cada ciclo de reloj.
Instrucciones no documentadas
Los registros de índice, IX e IY, fueron pensados como punteros flexibles de 16 bits, mejorando la capacidad de manipular la memoria, apilar marcos y estructuras de datos. Oficialmente, fueron tratados solo como de 16 bits. En realidad, se implementaron como un par de registros de 8 bits, de la misma manera que el registro HL, al que se puede acceder como 16 bits o por separado como Hhigh y L i>ow registros. Los códigos de operación binarios (lenguaje de máquina) eran idénticos, pero estaban precedidos por un nuevo prefijo de código de operación. Zilog publicó los códigos de operación y los mnemotécnicos relacionados para las funciones previstas, pero no documentó el hecho de que cada código de operación que permitía la manipulación de los registros H y L era igualmente válido para las porciones de 8 bits de los registros IX e IY. Por ejemplo, el código de operación 26h seguido de un valor de byte inmediato (LD H,n)
cargará ese valor en el registro H. Precediendo a esta instrucción de dos bytes con el prefijo de código de operación del registro IX, DD, en su lugar, los 8 bits más significativos del registro IX se cargarían con el mismo valor. Una excepción notable a esto serían instrucciones similares a LD H,(IX +d)
que hacen uso de los registros HL y IX o IY en la misma instrucción; en este caso, el prefijo DD solo se aplica a la parte (IX+d) de la instrucción. Las mitades de los registros XY también podrían contener operandos para instrucciones aritméticas, lógicas y de comparación de 8 bits, ahorrando los registros normales de 8 bits para otros usos. La capacidad no documentada de incrementar y disminuir la mitad superior de un registro de índice facilitó la expansión del rango de las instrucciones indexadas normales, sin tener que recurrir al ADD/SBC XY,DE
o AÑADIR/SBC XY,BC.
También hay otras instrucciones no documentadas. Los códigos de operación no documentados o ilegales no son detectados por el Z80 y tienen varios efectos, algunos de los cuales son útiles. Sin embargo, dado que no forman parte de la definición formal del conjunto de instrucciones, no se garantiza (o es especialmente probable) que las diferentes implementaciones del Z80 funcionen de la misma manera para cada código de operación no documentado.
Errores
La instrucción OTDR
no se ajusta a la Documentación Z80. Tanto el OTDR
como OTIR
se supone que las instrucciones dejan la bandera de llevar (C) sin modificar. La instrucción OTIR
funciona correctamente; sin embargo, durante la ejecución de la instrucción OTDR
, el carry flag toma los resultados de una comparación falsa entre el acumulador (A) y la última salida del OTDR
.
Código de ejemplo
EJEMPLO 1:
El siguiente código fuente del ensamblador Z80 es para una subrutina llamada HELLO_WORLD. Este es un programa introductorio que imprimirá un mensaje en la pantalla de video y luego saldrá. Aunque simple, demuestra cómo se formatea un código fuente ensamblador e interactúa con el hardware de visualización a través de un sistema operativo de computadora. Esto es necesariamente específico para un hardware de computadora, sistema operativo y software ensamblador en particular. El ejemplo utilizado es el
TRS-80 Modelo 4 que ejecuta TRSDOS/LS-DOS 6.x, producido por Tandy/Radio Shack y Logical Systems, con la mayoría de los ensambladores vendidos por Radio Shack o Misosys Inc. (Serie I/ EDTASM, ALDS, EDAS o MRAS con interruptor -GC). Las características principales de esta configuración son universales para los ensambladores Z80, incluso bajo CP/M.
3000 3E 69
3002 EF
3003 21 14 30
3006 3E 0A
3008 EF
3009 0E 0D
300B 3E 02
300D EF
300E 21 00 00
3011 3E 16
3013 EF
3014 48 65 6C 6C
3018 6F 2C 20 77
301C 6F 72 6C 64
3020 21 0D 0D
3023
| ; hola_world_TRS-80 Modelo 4 ; Imprimir "¡Hola, mundo!" y luego salir a TRSDOS Listo ; ; Registros de entrada: ninguno ; Registros de retorno: ninguno ; ; los valores a continuación son decimales a menos que se sufijan por H ; el término "pseudo-op" significa igual que "directriz assembler", no es código Z80 ; @CLS EQU 105 ; EQU pseudo-op sets @CLS text label = TRSDOS Supervisor Code @DSP EQU 2 ; conjunto @DSP etiqueta de texto = TRSDOS SVC para enviar a char para mostrar @DSPLY EQU 10 ; conjunto @DSPLY etiqueta de texto = SVC para la pantalla de cadena de texto @EXIT EQU 22 ; conjunto @EXIT etiqueta de texto = SVC para regresar a TRSDOS Listo; ORG 3000 H ; ORG pseudo-op establece la dirección de inicio estándar bajo TRSDOS 6.xSTART LD A,@CLS ; CLS = Pantalla clara, visualización borrada y cursor casero RST 40 ; Z80 Instrucciones de reinicio para el procesador SVC del sistema, ejecutar @CLS LD HL,MSG ; punto a cadena de mensajes con HL (requerido por @DSPLY SVC) LD A,@DSPLY ; enviar cadena de texto a *DO dispositivo de salida de pantalla (video screen) RST 40 ; ejecutar @DSPLY SVC (13d byte needed to terminate string) LD C,13 ; ahora enviar otro retorno de carro, necesario en el registro C LD A,@DSP ; para despegar Hola mensaje de TRSDOS RST 40 ; una vez que salimos al sistema LD HL,0 ; no indicar ninguna condición de error al intérprete del comando LD A,@EXIT ; volver a TRSDOS listo RST 40 ; (Mantenimiento de la integridad del personal, también podría haber utilizado un RET!) MSG DB ¡Hola, mundo! ',13 ; DB = Define Byte pseudo-op monta la cadena ASCII a la memoria Z80 CR DB 13 ; 13d byte is ASCII carro return char, moves cursor down FIN START ; END pseudo-op requerido por ensamblador ; para producir el registro de transferencia al punto de entrada del programa |
EJEMPLO 2:
El siguiente código fuente de ensamblaje Z80 es para una subrutina llamada memcpy
que copia un bloque de bytes de datos de un tamaño determinado de una ubicación a otra. Importante: el código de ejemplo no maneja el caso en el que el bloque de destino se superpone al de origen; una limitación seria, pero que es irrelevante para algunas aplicaciones, como, especialmente, cuando la fuente está en ROM y el destino en RAM, por lo que nunca pueden superponerse. El código de muestra es extremadamente ineficiente, está destinado a ilustrar varios tipos de instrucciones, en lugar de las mejores prácticas para la velocidad. El bloque de datos se copia byte a byte, y el movimiento de datos y la lógica de bucle utilizan operaciones de 16 bits. Además, el Z80 tiene una única instrucción que ejecutará todo el ciclo (LDIR
). Tenga en cuenta que el código ensamblado es compatible con los binarios de las CPU Intel 8080 y 8085.
1000
1000
1000 78
1001 B1
1002 C8
1003 1A
1004 77
1005 13
1006 23
1007 0B
1008 C3 00 10
100B
| ; memcpy... ; Copiar un bloque de memoria de un lugar a otro. ; ; Registros de entrada ; BC - Número de bytes para copiar ; DE - Dirección del bloque de datos de origen ; HL - Dirección del bloque de datos de destino ; ; Registros de retorno ; BC - Zero org 1000h ;Origin at 1000h memcpy público bucle ld a,b ;Test BC, o c ; Si BC = 0, Ret z ; Retorno ld a,(de) ; Carga A de (DE) ld ()hl),a ;Store A into (HL) inc de ; Incremento DE inc hl ; Incremento HL dec bc ; Decreto BC jp bucle ; Repetir el bucle final |
Ejecución de instrucciones
Cada instrucción se ejecuta en pasos que generalmente se denominan ciclos de máquina (ciclos M), cada uno de los cuales puede tomar entre tres y seis períodos de reloj (estados T). Cada ciclo M corresponde aproximadamente a un acceso a la memoria o una operación interna. Muchas instrucciones terminan realmente durante el M1 de la instrucción siguiente, lo que se conoce como superposición de búsqueda/ejecución.
Total
M-ciclos | T-states | instrucción | M1 | M2 | M3 | M4 | M5 | M6 |
---|---|---|---|---|---|---|---|---|
1 | 4 | INC B | opcode | |||||
2 | 7 | ADD A,n | opcode | n | ||||
3 | 11 | ADD HL,DE | opcode | interna | interna | |||
4 | 15 | SET b,(HL) | prefijo | opcode | R(HL), set | W(HL) | ||
5 | 19 | LD (IX+d),n | prefijo | opcode | d | n,add | W(IX+d) | |
6 | 23 | INC (IY+d) | prefijo | opcode | d | añadir | R(IY+d),inc | W(IY+d) |
Los ciclos de la máquina Z80 están secuenciados por una máquina de estado interna que crea cada ciclo M a partir de 3, 4, 5 o 6 estados T, según el contexto. Esto evita la engorrosa lógica asíncrona y hace que las señales de control se comporten de manera consistente en una amplia gama de frecuencias de reloj. También significa que se debe usar un cristal de frecuencia más alta que sin esta subdivisión de ciclos de máquina (aproximadamente 2 o 3 veces más alta). No implica requisitos más estrictos en los tiempos de acceso a la memoria, ya que un reloj de alta resolución permite un control más preciso de los tiempos de la memoria y, por lo tanto, la memoria puede estar activa en paralelo con la CPU en mayor medida, lo que permite un uso más eficiente del ancho de banda de la memoria disponible.
Un ejemplo central de esto es que, para obtener el código de operación, el Z80 combina dos ciclos de reloj completos en un período de acceso a la memoria (la señal M1). En el Z80, esta señal dura una parte relativamente mayor del tiempo típico de ejecución de la instrucción que en un diseño como el 6800, 6502 o similar, donde este período suele durar entre el 30 y el 40 % de un ciclo de reloj. Dado que la asequibilidad del chip de memoria (es decir, tiempos de acceso de alrededor de 450-250 ns en la década de 1980) generalmente determinaba el tiempo de acceso más rápido posible, esto significaba que dichos diseños estaban bloqueados en un ciclo de reloj significativamente más largo (es decir, menor velocidad de reloj interno) que el Z80.
La memoria era generalmente lenta en comparación con los subciclos de la máquina de estado (ciclos de reloj) utilizados en los microprocesadores contemporáneos. Por lo tanto, el ciclo de máquina más corto que podría usarse de manera segura en diseños integrados a menudo se ha visto limitado por los tiempos de acceso a la memoria, no por la frecuencia máxima de la CPU (especialmente durante la era de la computadora doméstica). Sin embargo, esta relación ha cambiado lentamente durante las últimas décadas, particularmente en lo que respecta a SRAM; Por lo tanto, los diseños de un solo ciclo sin caché, como el eZ80, se han vuelto mucho más significativos recientemente.
El contenido del registro de actualización R se envía a la mitad inferior del bus de direcciones junto con una señal de control de actualización mientras la CPU decodifica y ejecuta la instrucción obtenida. Durante la actualización, el contenido del registro de interrupción I se envía a la mitad superior del bus de direcciones.
Periféricos compatibles
Zilog introdujo una serie de piezas periféricas para el Z80, todas compatibles con el sistema de manejo de interrupciones y el espacio de direcciones de E/S del Z80. Estos incluyen el canal de contador/temporizador (CTC), el SIO (entrada/salida en serie), el DMA (acceso directo a la memoria), el PIO (entrada/salida en paralelo) y el DART (receptor-transmisor asíncrono dual). A medida que se desarrolló la línea de productos, se introdujeron versiones CMOS de bajo consumo y alta velocidad de estos chips.
Al igual que los procesadores 8080, 8085 y 8086, pero a diferencia de procesadores como Motorola 6800 y MOS Technology 6502, el Z80 y el 8080 tienen una línea de control y un espacio de direcciones independientes para las instrucciones de E/S. Mientras que algunas computadoras basadas en Z80, como la Osborne 1, usaban "estilo Motorola" dispositivos de entrada/salida asignados a la memoria, por lo general, el espacio de E/S se usaba para abordar uno de los muchos chips periféricos Zilog compatibles con el Z80. Los chips de E/S de Zilog admitieron las nuevas interrupciones de modo 2 del Z80, lo que simplificó el manejo de interrupciones para una gran cantidad de periféricos.
El Z80 se describió oficialmente como compatible con direccionamiento de memoria de 16 bits (64 KB) y direccionamiento de E/S de 8 bits (256 puertos). Todas las instrucciones de E/S en realidad afirman todo el bus de direcciones de 16 bits. OUT (C),reg y IN reg,(C) coloca el contenido de todo el registro BC de 16 bits en el bus de direcciones; OUT (n),A and IN A,(n) coloca el contenido del registro A en b8–b15 del bus de direcciones y n en b0–b7 del bus de direcciones. Un diseñador podría optar por decodificar todo el bus de direcciones de 16 bits en las operaciones de E/S para aprovechar esta característica, o usar la mitad superior del bus de direcciones para seleccionar subcaracterísticas del dispositivo de E/S. Esta función también se ha utilizado para minimizar los requisitos de hardware de decodificación, como en Amstrad CPC/PCW y ZX81.
Segundas fuentes y derivadas
(feminine)Segundas fuentes
Mostek, que produjo el primer Z80 para Zilog, lo ofreció como segunda fuente como MK3880. SGS-Thomson (ahora STMicroelectronics) también fue una segunda fuente con su Z8400. Sharp y NEC desarrollaron segundas fuentes para NMOS Z80, LH0080 y μPD780C, respectivamente. El LH0080 se usó en varias computadoras domésticas y computadoras personales fabricadas por Sharp y otros fabricantes japoneses, incluidas las computadoras Sony MSX y varias computadoras de la serie Sharp MZ.
Toshiba fabricó una versión CMOS, la TMPZ84C00, que se cree (pero no se ha verificado) que es el mismo diseño que también utiliza Zilog para su propia CMOS Z84C00. También había chips Z80 fabricados por GoldStar (ahora LG) y la serie BU18400 de clones Z80 (incluidos DMA, PIO, CTC, DART y SIO) en NMOS y CMOS fabricados por ROHM Electronics.
En Alemania Oriental, se fabricó un clon sin licencia del Z80, conocido como U880. Se utilizó ampliamente en los sistemas informáticos de Robotron y VEB Mikroelektronik Mühlhausen (como la serie KC85) y también en muchos sistemas informáticos de fabricación propia. En Rumania se pudo encontrar otro clon sin licencia, llamado MMN80CPU y producido por Microelectronica, utilizado en computadoras domésticas como TIM-S, HC, COBRA.
Además, se crearon varios clones de Z80 en la Unión Soviética, entre los que destaca el T34BM1, también llamado КР1858ВМ1 (paralelo al clon soviético 8080 KR580VM80A). El primer marcado se usó en la serie de preproducción, mientras que el segundo tuvo que usarse para una producción más grande. Sin embargo, debido al colapso de la microelectrónica soviética a fines de la década de 1980, hay muchos más T34BM1 que КР1858ВМ1.
Derivados
- Compatible con el Z80 original
- Hitachi desarrolló el HD64180, un Z80 microcodificado y parcialmente dinámico en CMOS, con periféricos chip y un MMU simple que da un espacio de dirección de 1 MB. Más tarde fue segunda fuente de Zilog, inicialmente como el Z64180, y luego en la forma de la Z180 ligeramente modificada que tiene protocolo de autobús y los tiempos mejor adaptados a los chips periféricos Z80. Z180 se ha mantenido y desarrollado bajo el nombre de Zilog, las versiones más recientes se basan en el núcleo S180/L180 totalmente estático con muy baja potencia y EMI (noise).
- Toshiba desarrolló la serie 84 pin Z84013 / Z84C13 y la serie 100 pin Z84015 / Z84C15 de "controladores periféricos inteligentes", básicamente núcleos NMOS y CMOS Z80 con periféricos Z80, temporizador de reloj, potencia en reset, y esperar generador de estado en el mismo chip. Fabricado por Sharp y Toshiba. Estos productos son hoy la segunda fuente de Zilog.
- El Zilog Z380 compatible con 32 bits, introducido en 1994, se utiliza principalmente en equipos de telecomunicaciones.
- El Z80 compatible con Zilog tiene una longitud de palabra de 8/16/24 bits y un espacio de dirección lineal de 16 MB fue introducido en 2001. Existe en versiones con chip SRAM o memoria flash, así como con periféricos integrados. Una variante tiene en chip MAC (controlador de acceso multimedia), y el software disponible incluye una pila TCP/IP. En contraste con los Z800 y Z280, sólo hay algunas instrucciones agregadas (principalmente LEAs, PEAs y cargas de 16/24 bits de dirección variable), pero las instrucciones se ejecutan entre 2 y 11 veces como ciclo de reloj eficiente como en el Z80 original (con un valor medio alrededor de 3-5 veces). Actualmente se especifica para frecuencias de reloj hasta 50 MHz.
- Kawasaki desarrolló el compatible binario KL5C8400 que es aproximadamente 1,2-1.3 veces como el ciclo de reloj eficiente como el Z80 original y puede ser relojeado hasta 33 MHz. Kawasaki también produce la familia KL5C80A1x, que tiene periféricos, así como una pequeña RAM en chip; es aproximadamente como el ciclo del reloj eficiente como el eZ80 y puede ser relojeado hasta 10 MHz (2006).
- El NEC μPD9002 era un CPU híbrido compatible con las familias Z80 y x86.
- La familia de procesadores de audio de Semiconductor de Acciones Chinas (ATJ2085 y otros) contiene un MCU compatible con Z80 junto con un procesador DSP dedicado de 24 bits. Estos chips se utilizan en muchos productos MP3 y reproductores multimedia.
- Los núcleos suaves sintetibles T80 (VHDL) y TV80 (Verilog) están disponibles en OpenCores.org.
- El Semiconductor Nacional NSC800 anunció en 1980 se utiliza en muchas máquinas de cifer electrónicas TeleSecurity Timmann (TST) y el Canon X-07. El NSC800 es totalmente compatible con el conjunto de instrucciones Z-80. El NSC800 utiliza un bus multiplexado como el 8085 pero tiene un pinout diferente al Z80.
- No compatible
- Los microcontroladores Toshiba TLCS 900 serie de alto volumen (principalmente OTP) se basan en el Z80; comparten la misma estructura básica BC,DE,HL,IX, IY, y en gran parte las mismas instrucciones, pero no son compatibles binarios, mientras que el anterior TLCS 90 es compatible con Z80.
- Los microcontroladores de la serie NEC 78K se basan en el Z80; comparten la misma estructura básica de registro BC,DE, HL, y tiene instrucciones similares (pero diferentes).
- Parcialmente compatible
- Rabbit Semiconductor's Rabbit 2000/3000/4000 microprocesadores/microcontroladores se basan en la arquitectura HD64180/Z180, aunque no son totalmente compatibles.
- Ya no se ha producido
- La ASCII Corporation R800 fue un procesador rápido de 16 bits utilizado en ordenadores MSX TurboR; era software, pero no compatible con el Z80 (tiempo de firma, función de pinout " de pines difieren del Z80).
- Los NMOS Z800 y CMOS Z280 de Zilog fueron implementaciones Z80 de 16 bits (antes de HD64180 / Z180) con un espacio de direcciones MMU de 16 MB de página; agregaron muchas ortogonalizaciones y modos de dirección al conjunto de instrucciones Z80. Las funciones de Minicomputer, como modos de usuario y sistema, soporte multiprocesador, en chip MMU, en instrucciones de chip y caché de datos y así sucesivamente, se consideraron más bien como más complejidad que como funcionalidad y soporte para el diseñador de sistemas integrados (generalmente orientados por electrónica), también hizo muy difícil predecir los tiempos de ejecución de instrucciones.
- Ciertos juegos de arcade como Pang/Buster Bros utilizan una CPU encriptada "Kabuki" Z80 fabricada por VLSI Technology, donde las claves de descifrado se almacenan en su memoria interna respaldada por baterías, para evitar la piratería y los juegos ilegales de botín.
Usos destacados
Ordenadores de escritorio
A fines de la década de 1970 y principios de la de 1980, el Z80 se usó en una gran cantidad de máquinas bastante anónimas orientadas a los negocios con el sistema operativo CP/M, una combinación que dominaba el mercado en ese momento. Cuatro ejemplos bien conocidos de computadoras comerciales Z80 que ejecutan CP/M son el Heathkit H89, el portátil Osborne 1, la serie Kaypro y el Epson QX-10. Menos conocido fue el caro Otrona Attache de gama alta. Algunos sistemas usaban software de sistema operativo multitarea (como MP/M o Micronix de Morrow) para compartir un procesador entre varios usuarios simultáneos.
Se introdujeron varias computadoras domésticas que usaban el Z80 como procesador principal o como una opción de complemento para permitir el acceso al software escrito para el Z80. Son notables la serie TRS-80, incluido el modelo original (posteriormente llamado "Modelo I"), el Modelo II, el Modelo III y el Modelo 4, que estaban equipados con un Z80 como procesador principal, y algunos (pero no todos) otros modelos TRS-80 que usaban el Z80 como procesador principal o secundario. Otras máquinas notables fueron la DEC Rainbow 100 y la Seequa Chameleon, ambas con una CPU Intel 8088 y una Z80, para admitir aplicaciones CP/M-80 de 8 bits que se ejecutan en la Z80 o un MS-DOS personalizado. eso no era totalmente compatible con las aplicaciones de PC DOS que se ejecutan en el 8088.
En 1981, Multitech (que luego se convertiría en Acer) presentó el Microprofessor I, un sistema de capacitación simple y económico para el microprocesador Z80. Actualmente, todavía lo fabrica y vende Flite Electronics International Limited en Southampton, Inglaterra.
En 1984, Toshiba presentó el Toshiba MSX HX-10 en Japón y Australia.
En 1985, Sharp presentó Hotbit y Gradiente, Expert, que se convirtió en la computadora doméstica de 8 bits dominante en Brasil hasta fines de la década de 1980.
Ordenadores portátiles y de mano
El uso del Z80 en dispositivos más livianos que funcionan con baterías se generalizó con la disponibilidad de versiones CMOS del procesador. También inspiró el desarrollo de otros procesadores basados en CMOS, como el LH5801 de Sharp. El Sharp PC-1500, una computadora de bolsillo programable BASIC, fue lanzado en 1981, seguido por el Sharp PC-1600 mejorado en 1986 y el Sharp PC-E220 en 1991. Los modelos posteriores de la serie de organizadores personales Sharp Wizard también estaban basados en Z80. Las computadoras portátiles que podían ejecutar el sistema operativo CP / M al igual que las máquinas de escritorio siguieron con Epson PX-8 Ginebra en 1984, y en 1985 Epson PX-4 y Bondwell-2. Si bien el mercado de computadoras portátiles en los años siguientes se movió hacia los procesadores Intel 8086 más potentes y el sistema operativo MS-DOS, todavía se estaban introduciendo sistemas livianos basados en Z80 con una batería de mayor duración, como el Cambridge Z88 en 1988 y el Amstrad NC100 en 1992. El Z8S180 derivado del Z80 también se convirtió en uno de los primeros asistentes digitales personales operados por lápiz, el Amstrad PenPad PDA600 en 1993. VTech, con sede en Hong Kong, produjo una línea de computadoras portátiles pequeñas llamadas 'Lasers' basado en un Z80. Los dos últimos fueron el Laser PC5 y PC6. El Cidco MailStation Mivo 100, lanzado por primera vez en 1999, era un dispositivo de correo electrónico portátil independiente, con un microcontrolador basado en Z80. Texas Instruments produjo una línea de organizadores de bolsillo (que finalizó en 2000) utilizando procesadores Toshiba construidos alrededor de un núcleo Z80; el primero de ellos fue el TI PS-6200 y, después de una larga producción de una docena de modelos, culminó en su serie PocketMate.
Sistemas empotrados y electrónica de consumo
El Zilog Z80 ha sido durante mucho tiempo un microprocesador popular en sistemas integrados y núcleos de microcontroladores, donde sigue siendo de uso generalizado en la actualidad. Las aplicaciones del Z80 incluyen usos en electrónica de consumo, productos industriales e instrumentos musicales electrónicos. Por ejemplo, el Z80 se usó en el innovador sintetizador de música Prophet-5, así como en el primer sintetizador MIDI Prophet 600. Casio usó el Z80A en su consola de videojuegos PV-1000.
Una buena cantidad de videojuegos de arcade de principios de la década de 1980, incluido el juego de arcade Pac-Man, contienen CPU Z80.
El Z80 se usó en las consolas Sega Master System y Sega Game Gear. El Sega Genesis contiene un Z80, con sus propios 8 KB de RAM, que se ejecuta en paralelo con la CPU principal MC68000, tiene acceso directo a los chips de sonido del sistema y a los puertos de E/S (controlador), y tiene un ruta de datos al bus de memoria principal del 68000 (que brinda acceso a la RAM principal de 64 KB, el cartucho de software y todo el chip de video); Además de proporcionar compatibilidad con versiones anteriores de los juegos Master System, el Z80 se usa a menudo para controlar y reproducir audio en el software Genesis.
Las CPU Z80 también se utilizaron en la innovadora y popular serie TI-8x de calculadoras gráficas de Texas Instruments, que comenzó en 1990 con la TI-81, que cuenta con una Z80 con frecuencia de 2 MHz. La mayoría de las calculadoras de línea superior de la serie, comenzando con la TI-82 y la TI-85, registran sus CPU Z80 a 6 MHz o más. (Algunos modelos con nombres TI-8x usan otras CPU, como la M68000, pero la gran mayoría están basadas en Z80. En ellas, es posible ejecutar programas de usuario ensamblados o compilados en forma de código de lenguaje de máquina Z80.) La serie TI-84 Plus, presentada en 2004, todavía está en producción a partir de 2020. La serie TI-84 Plus CE, presentada en 2015, utiliza el procesador Zilog eZ80 derivado de Z80 y también sigue en producción a partir de 2020.
A fines de la década de 1980, una serie de teléfonos fijos soviéticos llamados "AON" presentó el Z80; estos teléfonos ampliaron el conjunto de funciones de la línea fija con identificador de llamadas, diferentes tonos de llamada según la persona que llama, marcación rápida, etc. En la segunda mitad de la década de los noventa, los fabricantes de estos teléfonos cambiaron a MCU compatibles con 8051 para reducir el consumo de energía y evitar el sobrecalentamiento de las paredes compactas.
Contenido relacionado
Plan 9 de Bell Labs
I386
ANSI C