Zilog Z80
Este artigo ou secção contém uma lista de referências no fim do texto, mas as suas fontes não são claras porque não são citadas no corpo do artigo, o que compromete a confiabilidade das informações. (Agosto de 2016) |
O Zilog Z80 é um microprocessador de 8 bits projetado e vendido pela Zilog a partir de julho de 1976. Foi amplamente usado, tanto em microcomputadores desktop quanto em sistemas embarcados, centrais telefônicas e para fins militares. O Z80, seus derivados e clones constituem uma das famílias de UCPs mais usadas em todos os tempos e, juntamente com a família MOS Technology 6502 dominou o mercado de microcomputadores de 8 bits de fins da década de 1970 até meados dos anos 1980.
Este componente que tem largura do barramento (bus) de dados de 8 bits, capaz transferir 1 byte de cada vez, e do barramento de endereços de 16 bits, que lhe permite endereçar 65536 posições de memória, é responsável pelo processamento no TK90X, um computador de 8 bits fabricado no Brasil, pela Microdigital Eletrônica, que utilizava a versão Z80A, que operava com frequência de clock de até 4MHz, em encapsulamento DIP de 40 pinos.
Embora a Zilog tenha feito tentativas precoces com versões avançadas da arquitetura Z80 para minicomputadores (Z800 e Z280), estes chips nunca obtiveram sucesso. A empresa também tentou entrar no mercado de workstations com seus Z8000 e Z80000 de 32 bits (não relacionados com o Z80). Nos últimos anos, a Zilog mudou seu foco para o crescente mercado de sistemas embarcados (para o qual o Z80 original e o Z180 foram projetados) e a mais recente família de microcontroladores Z80-compatível, a totalmente pipelined eZ80 de 24 bits com uma faixa de endereçamento linear de 16 MiB, tem sido introduzida com sucesso juntamente com o os produtos Z180 e Z80 menos sofisticados.
A Zilog licenciou o núcleo do Z80 para qualquer empresa desejosa de produzir o dispositivo sem cobrança de royalties, embora muitos fabricantes do Leste Europeu e da Rússia tenham feito cópias não-autorizadas. Isto permitiu que o produto de uma pequena empresa conquistasse aceitação no mercado mundial, visto que empresas muito maiores, como a Toshiba, começaram a fabricar os chips. Consequentemente, a Zilog tem produzido menos de 50% dos Z80s desde sua criação.
Breve história e visão geral
editarO Z80 surgiu quando Federico Faggin, depois de trabalhar no projeto do 8080, deixou a Intel no final de 1974 para fundar a Zilog com Ralph Ungermann, e por volta de julho de 1976, já tinham o Z80 à venda no mercado. Foi projetado para ser binariamente compatível com o Intel 8080, de forma que a maior parte do código 8080 podia ser executado sem alterações nele, principalmente o SO CP/M. Quem também contribuiu para o desenvolvimento do Z80 foi Masatoshi Shima, co-criador dos microprocessadores 4004 e 8080 fabricados pela Intel.
A Intel tentou superar o Z80 lançando uma versão melhorada do microprocessador de 8-bits, o 8085, mas a superioridade do Z80 fez com que a Intel desistisse do projeto. Sendo assim, o 6502 e o Z80, acompanhados pelo 6800, mantiveram-se como os mais representativos microprocessadores de 8-bits do período. Restou à empresa trabalhar no lançamento do primeiro microprocessador de 16-bits, o 8086.
Melhorias que o Z80 ofereceu com relação ao 8080
editar- Um conjunto de instruções reforçadas, incluindo manipulação de bits, mover bloco, bloco de entrada / saída (I/0), instruções de busca de byte;
- Novos Registradores de índices IX e IY com instruções para base direta + deslocamento de endereçamento;
- Um melhor sistema de interrupção;
- Um sistema de interrupção vetorizado mais automático e geral, modo 2, bem como um sistema de vetor de interrupção fixo, modo 1, para sistemas simples com hardware mínimo (modo 0 compatível com o 8080);
- Uma interrupção (NMI), que pode ser utilizado para responder a desligar situações e / ou outros eventos de alta prioridade (e permitindo um sistema Z80 minimalista para aplicar facilmente um esquema de interrupção de dois níveis no modo 1);
- Dois arquivos de registrador separados, que poderiam ser rapidamente transferidos, para acelerar a resposta a interrupções;
- Única fonte de alimentação de 5 volts;
- Uma função de reposição especial que limpa apenas o contador de programa de modo a que uma única CPU Z80 pode ser utilizada em um sistema de desenvolvimento, tais como um emulador de circuitos.
Registradores
editarO Z80 possui 208 bits de memória interna acessível ao programador, que são organizados na forma de registradores. Existem 2 conjuntos (principal e alternativo) de registradores acumulador (A, A') e de flags (F, F'), 2 conjuntos (principal e alternativo) de registradores de uso geral (B, B', C, C', D, D', E, E', H, H', L e L') e 6 registradores especiais (I, R, IX, IY, SP e PC). A Tabela 1 mostra de forma resumida os registradores do Z80. Apesar de ser possível criar uma arquitetura em que todos os registradores possam ser envolvidas em qualquer operação e instrução, nos microprocessadores mais antigos isto não era feito para economizar o número de transistores na pastilha de silício. Assim, certas instruções são específicas para alguns registradores, ou até a um único especificamente.
O acumulador ou A é um registrador que, além de poder ser usado de forma geral, é especializado em armazenar resultados de operações lógicas e aritméticas de 8 bits. O registrador de flags ou F serve para sinalizar os estados decorrentes de uma instrução executada; cada bit deste registrador tem uma finalidade específica. Os dois registradores são tratados como par AF somente no armazenamento da pilha do Z80 ou na troca com conjunto alternativo AF'.
Os registradores de uso geral B, C, D, E, H e L podem ser usados separadamente como registradores de 8 bits, ou em pares (BC, DE e HL) de 16 bits. Apesar de serem de uso geral, cada registrador ou par desempenham certas tarefas peculiares em algumas instruções. O registrador B e o par BC são usados como contadores, e o par BC é empregado também para selecionar porta de entrada e saída. O par DE é empregado como ponteiro para transferência de blocos de bytes da memória. O par HL é empregado em um grande número de instruções como ponteiro, são usados em instruções aritméticas de 16 bits, além de poder armazenar endereço para um salto incondicional.
Os registradores alternativos não são diretamente acessíveis pelas instruções, exceto por EX AF, AF' e EXX, que fazem as trocas entre os registradores principais e os alternativos. Esta era uma forma mais rápida de preservar os valores dos registradores, quando se compara com armazenamento na pilha.
O registrador especial I é empregado em interrupção, quando no modo IM 2. O registrador especial R é empregado no refrescamento de RAM dinâmica. O PC ou contador de programa aponta para o próximo endereço em que o Z80 deve buscar o código de operação da instrução a executar. O SP é o ponteiro que aponta para o endereço do topo da pilha do Z80. E os registradores de indexação IX e IY fazem praticamente as mesmas operações de HL, mas podem apontar para uma posição de memória com a adição de uma constante (índice), o que é útil para construção de matrizes e tabelas.
Além destes registradores, que são mais explícitos ao programador, há ainda alguns flip-flops que armazenam o modo de interrupção ou se as interrupções mascaráveis estão habilitadas (IFF).
Conjunto de instruções
editarO Z80 conta com um conjunto de 178 tipos diferentes de instruções, divididas nas seguintes categorias:
- instruções de controle do Z80;
- entrada e saída;
- carga e de troca;
- aritméticas e lógicas;
- transferência e pesquisa de bloco;
- rotação e deslocamento de bits;
- manipulação de bit;
- salto e sub-rotina.
O código de operação de uma instrução constitui-se de um ou mais bytes, podendo incluir os operandos. Dentro de 8 bits é possível haver 256 instruções, entretanto 252 correspondem propriamente a instruções reais; as demais são usados como prefixos, que obrigam o Z80 buscar no próximo byte qual instrução deve ser executada. Os prefixos são #CB (203), #DD (221), #ED (237) e #FD (253). Em teoria isso permitiria a inclusão de mais 4 conjuntos de 256 instruções, isto é, mais 1 024 instruções, porém na prática isto não ocorre pois nem todas as combinações de opcodes são funcionais. Algumas dessas combinações não são oficialmente reconhecidas, isto é, são omitidas da documentação da Zilog, entretanto são funcionais e tem sido usadas por muitos programadores.
Linguagem assembly
editarIlustração de quatro sintaxes usando amostras equivalentes ou semelhantes, como armazenar e carregar instruções.
Datapoint 2200 & i8008 |
i8080 |
Z80 |
i8086/i8088 |
|
Antes ~1973 |
~1974 |
1976 |
1978 |
Significado |
LBC |
MOV B,C |
LD B,C |
MOV BL,CL |
colocar o valor do registrador C no registrador B |
-- |
LDAX B |
LD A,(BC) |
MOV AL,[BX] |
colocar o valor no endereço apontado pelo registrador no BC no registrador A |
LAM |
MOV A,M |
LD A,(HL) |
MOV AL,[BP] |
colocar o valor no endereço apontado pelo registrador HL no registrador A |
LBM |
MOV B,M |
LD B,(HL) |
MOV BL,[BP] |
colocar o valor no endereço apontado pelo registrador HL no registrador B |
-- |
STAX D |
LD (DE),A |
MOV [DX],AL |
colocar o valor do registrador A no endereço apontado pelo registrador DE |
LMA |
MOV M,A |
LD (HL),A |
MOV [BP],AL |
colocar o valor do registrador A no endereço apontado pelo registrador HL |
LMC |
MOV M,C |
LD (HL),C |
MOV [BP],CL |
colocar o valor do registrador C no endereço apontado pelo registrador HL |
LDI 56 |
MVI D,56 |
LD D,56 |
MOV DL,56 |
colocar o valor 56 no registrador D |
LMI 56 |
MVI M,56 |
LD (HL),56 |
MOV byte ptr [BP],56 |
colocar o valor 56 no endereço apontado pelo registrador HL |
-- |
LDA 1234 |
LD A,(1234) |
MOV AL,[1234] |
colocar o valor do endereço 1234 no registrador A |
-- |
STA 1234 |
LD (1234),A |
MOV [1234],AL |
colocar o valor do registrador A no endereço 1234 |
-- |
-- |
LD B,(IX+56) |
MOV BL,[SI+56] |
colocar o valor no endereço(base)apontado pelo registrador IX+56(offset) no registrador B |
-- |
-- |
LD (IX+56),C |
MOV [SI+56],CL |
colocar o valor do registrador C no endereço apontado pelo registrador S +56 (offset) |
-- |
-- |
LD (IY+56),78 |
MOV byte ptr [DI+56],78 |
colocar o valor 78 no endereço apontado pelo registrador IY +56 (offset) |
-- |
LXI B,1234 |
LD BC,1234 |
MOV BX,1234 |
colocar o valor 1234 no registrador BC |
-- |
LXI H,1234 |
LD HL,1234 |
MOV BP,1234 |
colocar o valor 1234 no registrador HL |
-- |
SHLD 1234 |
LD (1234),HL |
MOV [1234],BP |
colocar o valor do registrador HL no endereço 1234 |
-- |
LHLD 1234 |
LD HL,(1234) |
MOV BP,[1234] |
colocar o valor do endereço 1234 no registrador HL |
-- |
-- |
LD BC,(1234) |
MOV BX,[1234] |
colocar o valor no endereço 1234 no registrador BC |
-- |
-- |
LD IX,(1234) |
MOV SI,[1234] |
colocar o valor no endereço 1234 no registrador IX |
Sinais
editarAlém da alimentação de +5 V (pino 11) e 0 V (pino 29), os pinos do Z80 fornece ou recebe os sinais necessários para o seu funcionamento e para se comunicar com os periféricos. Estes sinais são o clock, os barramentos (bus) de dados e de endereços e os sinais de controle do Z80.
- Clock: sinal de entrada de ondas quadradas que sincroniza todas as operações do Z80;
- Barramento de dados (D0-D7): consiste em 8 linhas bidirecionais para trocar informações com os periféricos;
- Barramento de endereços (A0-A15): consiste em 16 linhas de saída para endereçamento de memória ou de dispositivos de entrada e saída;
- /MREQ: abreviatura de MEMORY REQUEST, é uma saída em nível baixo indica que o barramento contém endereço válido para leitura ou escrita da memória;
- /IORQ: abreviatura de IO REQUEST, é uma saída em nível baixo indica que o barramento contém endereço válido para leitura ou escrita de dispositivos de entrada e saída;
- /RD: abreviatura de READ, é uma saída em nível baixo indica que o barramento aguarda dados da memória ou de dispositivos de entrada e saída;
- /WR: abreviatura de WRITE, é uma saída em nível baixo indica que o barramento tem dados disponíveis para escrita na memória ou em dispositivos de entrada e saída;
- /WAIT: é uma entrada que em nível baixo, indica ao Z80 que a memória ou um dispositivo de entrada e saída não está pronto para leitura ou escrita;
- /RFSH: abreviatura de REFRESH, é uma saída em nível baixo junto com /MREQ indica que os bits A0-A7 do barramento contém endereço de RAM dinâmica a ser refrescada;
- /M1: abreviatura de MACHINE CYCLE 1, é uma saída ativa em nível baixo; junto com /MREQ, indica que o Z80 está no ciclo de busca de código de operação da instrução; junto com /IORQ, indica ciclo de aceitação de interrupção;
- /INT: abreviatura de INTERRUPT, é uma entrada ativa em nível baixo, um dispositivo pode requisitar interrupção ao Z80 que pode ser aceito ou não, dependendo do IFF1;
- /NMI: abreviatura de NON-MASKABLE INTERRUPT, é uma entrada ativa em nível baixo, um dispositivo pode requisitar interrupção ao Z80 que sempre será aceito;
- /HALT: saída ativa em nível baixo, indica que o Z80 está executando instrução HALT, e só sairá deste estado quando aceitar uma interrupção;
- /BUSREQ: abreviatura de BUS REQUEST, é uma entrada ativa em nível baixo, um dispositivo pode requisitar que o Z80 libere os barramentos de dados e de endereços, /MREQ, /IORQ, /RD e /WR, entrando em estado de alta impedância;
- /BUSACK: abreviatura de BUS ACKNOWLEDGE, é uma saída ativa em nível baixo, indica que o Z80 está em alta impedância nos barramentos de dados e de endereços e os sinais /MREQ, /IORQ, /RD e /WR, deixando-os livres para que um periférico possa fazer uso deles;
- /RESET: entrada ativa em nível baixo, reinicializa o Z80 zerando os registradores PC, I e R e os IFF1 e IFF2, entrando no modo IM 0, deixando os barramentos em alta impedância e tornando todos os sinais de controle de saída em estado inativo; para que o reset seja completo, este sinal deve ser ativo durante no mínimo 3 ciclos T completos.
Periféricos
editarO microprocessador comunica-se com os periféricos através do barramento de dados, do barramento de endereço e dos sinais de controle. No Z80, os periféricos são divididos em dois tipos:
- memórias;
- dispositivos de entrada e saída.
Durante as operações com memória, o endereço da memória a ser acessada está no barramento de endereços, na faixa entre 0 a 65535 ou #0000 a #FFFF (64 kb), o barramento de dados contém 1 byte (8 bits) a ser transferido e o sinal /MREQ fica em nível baixo.
Segundo a Zilog, os 8 bits menos significativos do barramento de endereços (A0-A7) especifica uma das 256 portas nas operações com dispositivos de entrada e saída. Entretanto todos os 16 bits ficam disponíveis no barramento de endereços, o que permite teoricamente selecionar 65536 dispositivos. Assim, do ponto de vista dos sinais do Z80, uma operação de entrada (IN) e saída (OUT) é muito semelhante a um acesso à memória, exceto por /IORQ ficar em nível baixo ao invés do /MREQ.
O fluxo do dado é especificado pelo sinal /RD que, em nível baixo, implica transferência do periférico para o Z80 (operação de leitura) e pelo sinal /WR que, em nível baixo, implica transferência do Z80 para o periférico (operação de escrita).
Alguns equipamentos com o Z80
editar- Radio Shack TRS-80;
- Sinclair ZX-80, ZX-81 e ZX-Spectrum;
- Amstrad CPC;
- Commodore 128 (modo de compatibilidade com CP/M);
- MSX;
- Naja Micro;
- Texas Instruments modelos TI-73, TI-81, TI-82, TI-83, TI-84, TI-85 e TI-86;
- Players de MP3, de marca genérica;
- Várias placas de arcade, como a CPS-1 e CPS-2;
- Sega Master System;
- Nintendo Game Boy (LR35902 - baseado em 8080, com algumas instruções de Z80);
Ver também
editarBibliografia
editar- Zilog Components Data Book. Zilog, Campbell, Califórnia, 1985. Sem ISBN
Referências
editarLigações externas
editar- «Família de produtos ZiLOG Z80» (em inglês). – Página oficial da Zilog
- «Página oficial de suporte da família Z80». – Criada por Thomas Scherrer, mantida por Gaby Chaudry (em inglês)
- «Emuladores (software) do Z80» (em inglês). – Listada no website Zophar's Domain
- «Código livre UCP Z80 (código VHDL)». (em inglês)