310 likes | 392 Views
O Z80: Exemplo de um microprocessador de 8 bits. A abordagem ao microprocessador Z80 tem por objectivos principais: Analisar uma arquitectura com boas características pedagógicas e inúmeras aplicações aos longo dos (muitos) anos
E N D
O Z80: Exemplo de um microprocessador de 8 bits • A abordagem ao microprocessador Z80 tem por objectivos principais: • Analisar uma arquitectura com boas características pedagógicas e inúmeras aplicações aos longo dos (muitos) anos • Relacionar a arquitectura do microprocessador com os elementos exteriores necessários à implementação de um pequeno sistema
Arquitectura do Z80 Barramento de dados (8 bit) Descod. e controlo Controlo barr. dados Reg. de instrução Sinais de controlo do CPU e sistema Registos do CPU ALU Sinais de controlo (internos) Controlo de endereços Barramento de endereços (16 bit)
Z80: Configuração de pinos /M1 Barramento de endereços (16) /MREQ Controlo do sistema /IORQ /RD Z80 CPU /WR Barramento de dados (8) /RFSH /HALT Controlo do barramento do CPU Controlo do CPU /WAIT /BUSRQ /BUSAK /INT /NMI Clock /RESET Gnd Vcc
Interrupções no Z80 • Quando o Z80 aceita um pedido de interrupção pára temporariamente o que está a fazer para o atender • /NMI: Permite o pedido de interrupções não mascaráveis • /INT: Os pedidos de interrupção neste pino serão atendidos se o programador o permitir
Pedidos de interrupção em /NMI • O pedido de interrupção em /NMI (activo à transição descendente) força a execução da rotina de atendimento, que terá que começar no endereço 0066H • Esta rotina deverá terminar com a instrução RETN, que garante a manutenção do estado imediatamente anterior ao pedido ser aceite
Pedidos de interrupção em /INT • O pedido em /INT é activo ao nível lógico 0, pode ser atendido nos modos 0, 1 ou 2 (ou ignorado) e o retorno deve ser feito com RETI • No modo 0 deverá ser forçado no barramento de dados uma instrução de restart • No modo 1 tem lugar um salto para a rotina de atendimento com início em 0038H • No modo 2 o endereço será dado pelo registo I (MSB) e pelo barramento de dados (LSB)
Permitir / inibir pedidos em /INT • As instruções EI (enable interrupts) e DI (disable interrupts) permitem / inibem o atendimento de interrupções no pino /INT • O Z80 dispõe de um flip-flop interno (IFF1), onde armazena a informação sobre a permissão ou inibição do atendimento a /INT • Existe ainda um outro flip-flop deste tipo (IFF2), usado durante o atendimento em /NMI
RETN e RETI • Durante o atendimento a /NMI deve suspender-se o atendimento a /INT, para evitar que uma interrupção de baixa prioridade possa sobrepor-se a uma de alta prioridade • O processo de atendimento a /NMI copia IFF1 para IFF2 e coloca IFF1 em 0, pelo que o valor de IFF1 deve ser reposto no fim (e por isso o retorno de /NMI difere do de /INT)
Modelo de programação do Z80 • O modelo de programação do Z80 pode representar-se por um diagrama de blocos que inclui os registos e as flags de um microprocessador • Esta informação permite-nos o desenvolvimento de programas, mesmo que não conheçamos a evolução temporal dos sinais nos pinos ou outros detalhes de funcionamento
Modelo de programação do Z80 8 bit 8 bit 8 bit 8 bit A F A’ F’ B C B’ C’ D E D’ E’ H L H’ L’ 16 bit Alternate register set (conjunto alternativo de registos) Stack pointer Apontador para a pilha Program counter Apontador de programa IY index register IX e IY são usados com endereçamento indexado IX index register I R
O registo das flags 8 bit 8 bit H: half-carry - activa quando há transporte do bit 3 para o 4 A F B C D E S Z H P/V N CY H L S: sign - activa quando o bit mais significativo do resultado é 1 P/V: parity / overflow - conforme o tipo de instrução N: indica se a última operação foi uma adição ou uma subtracção Z: zero - activa quando o resultado da instrução tem o valor 0 CY: activa quando há transporte para além do bit 7
Modos de endereçamento • Imediato (immediate) - LD A,$FF / 3E FF • Imediato estendido (immediate extended) - LD HL,1000H / 21 00 10 • Página zero modificado (modified page zero) - RST 00H / C7 • Relativo (relative) - JR Z,MARCA / 28 05 • Estendido (extended) - LD HL,(1000H) / 2A 00 10
Modos de endereçamento • Indexado (indexed) - LD C,(IX) / DD 4E 00 • Ao registo (register) - LD A,B / 78 • Indirecto por registo (register indirect) - LD A,(BC) / 0A • Implícito (implied) - CPL / 2F • Ao bit (bit) - BIT 3,(IX+7FH) / DD CB 7F 5E
Tipos de instruções • Transferência de dados de 8 bits (8-bit load) - LD A,B / 78 • Transferência de dados de 16 bits (16-bit load) - LD HL,1000H / 21 00 10 • Troca, transferência de blocos e pesquisa em blocos (exchange, block transfer, block search) - EX DE,HL / EB
Tipos de instruções • Aritméticas e lógicas para dados de 8 bits (8-bit arithmetic and logical) - ADD A,(IY+10H) / FD 86 10 • Genéricas do tipo aritmético e para controlo do CPU (general-purpose arithmetic and CPU control) - CCF / 3F • Aritméticas para dados de 16 bits (16-bit arithmetic) - ADC HL,DE / ED 5A
Tipos de instruções • Rotação / deslocamento (rotate / shift)- RLA / 17 • Manipulação ao bit (bit set, reset and test) - BIT 5,A / CB 6F • Salto (jump) - JP 20FFH / C3 FF 20 • Chamada de subrotinas e retorno (call and return) - CALL 1000H / CD 00 10 • Entrada e saída (input and output) - IN A,(7FH) / DB 7F
Descodificação do sistema • Os endereços atribuídos a cada bloco presente estão ilustrados na tabela seguinte:
PAL de descodificação: Equações +L 64 C 1 IAW 123k *d:\palasm\examples\z80jmf.pds + ¦ ¦ ¦ ¦ ¦EQUATIONS ¦ ¦ ¦ ¦/MEM_CS = /MREQ*IORQ*/A15 ¦ ¦DA_CS = MREQ*/IORQ*/WR*RD*/A7*A6 ¦ ¦ ¦ ¦OUT0 := (MREQ*/IORQ*/WR*RD*A7*/A6)*D0 + /(MREQ*/IORQ*/WR*RD*A7*/A6)*OUT0 ¦ ¦OUT1 := (MREQ*/IORQ*/WR*RD*A7*/A6)*D1 + /(MREQ*/IORQ*/WR*RD*A7*/A6)*OUT1 ¦ ¦OUT2 := (MREQ*/IORQ*/WR*RD*A7*/A6)*D2 + /(MREQ*/IORQ*/WR*RD*A7*/A6)*OUT2 ¦ ¦OUT3 := (MREQ*/IORQ*/WR*RD*A7*/A6)*D3 + /(MREQ*/IORQ*/WR*RD*A7*/A6)*OUT3 ¦ ¦ ¦ ¦D0.TRST = MREQ*/IORQ*WR*/RD*A7*A6 ¦ ¦D1.TRST = MREQ*/IORQ*WR*/RD*A7*A6 ¦ ¦D2.TRST = MREQ*/IORQ*WR*/RD*A7*A6 ¦ ¦D3.TRST = MREQ*/IORQ*WR*/RD*A7*A6 ¦ ¦D0 = KEY0 ¦ ¦D1 = KEY1 ¦ ¦D2 = KEY2 ¦ ¦D3 = KEY3 ¦ ¦ ¦ ¦ ¦ ¦ ¦ +------------------------------------------------------------------------------+
Exemplo de aplicação • O exemplo de aplicação que aqui se ilustra corresponde a uma situação simples que gera uma onda em dente de serra inicio .org 0h ; posiciona o codigo a partir de 0000 saida .equ 40h ; endereco do conversor D/A inicio ld a,$00 ; comeca com o valor minimo ciclo out (saida),a ; escreve no D/A (saida analogica) inc a ; incrementa o valor para o D/A jp ciclo ; repete o ciclo escreve / incrementa .end
Geração do código objecto • A passagem deste código em assembly pelo cross-assembler gera o seguinte ficheiro .lst: 0001 0000 0002 0000 inicio .org 0h 0003 0000 0004 0000 saida .equ 40h 0005 0000 0006 0000 3E 00 inicio ld a,$00 0007 0002 D3 40 ciclo out (saida),a 0008 0004 3C inc a 0009 0005 C3 02 00 jp ciclo 0010 0008 0011 0008 .end 0012 0008 tasm: Number of errors = 0
Execução do código • A execução do código objecto gerado produz a seguinte forma de onda: