Instruções do Z-80

O conjunto de instruções do Z-80 reúne aproximadamente 700 instruções, podemos dividi-las nos seguintes grupos: Lógicas e Aritméticas, Transferência de Dados, Movimentação, Controle do fluxo do programa, Entrada e Saída (E/S) e controle interno.

As instruções do Z-80 podem ser constituídas de um a quarto bytes, dependendo da sua complexidade e, cada uma dela, é completada em um número variável de períodos de relógio.

 

Instruções Lógicas e Aritméticas

Estas instruções se destinam à execução das operações de soma e subtração e as operações lógicas And, Or, OU exclusivo e complementação. Incluiremos neste grupo as instruções de comparação.

As operações aritméticas podem ser de precisão simples ou dupla, a primeira envolve números de um byte de comprimento e a Segunda de dois bytes. Em todas operação de simples precisão um dos operandos deve estar no acumulador e o resultado ficará no acumulador. Os flags são afetados de acordo com a natureza e o resultado da operação.

ADD A,r

Esta instrução é para somar o conteúdo do acumulador com o conteúdo do registrador indicado. (r está indicando qualquer registrador de A até L). O resultado ficará armazenado em A, desta forma um dos operandos é perdido.

ADC A,r

Esta é similar à anterior, apenas ao resultado é somado o bit de Carry que resulta do transporte (Vai um) da operação anterior.

INC r

Incrementa de um o número contido no registrador indicado. É praticamente a adição com um dos operandos iguais a 1.

ADC HL, BC

Este é um exemplo de uma adição de dupla precisão envolvendo os registradores HL e BC (16 bits) o resultado fica no par de registradores HL.

SUB A

É uma instrução de subtração e funciona de modo análogo à soma, subtraindo o conteúdo do registrador indicado do conteúdo do acumulador. Do mesmo modo o comando SBC A, r subtrai o flag C do resultado. DEC r decrementa o registrador indicado de 1, analogamente ao INC r.

  AND r

Este comando executa a função AND entre o número no acumulador e o número em um registrador, o resultado fica no acumulador. Os flag s afetados. O And é efetuado bit a bit. Por exemplo: se no acumulador tiver o numero 142 (8EH) e no registrador B o número 201 (C9H), após o comando AND B obteremos:

Acumulador 1000 1110

Resgistrador B 1100 1001

Resultado 1000 1000

 

OR r

Executa a lógica OR, XOR (ou exclusivo) nos mesmos, moldes que o AND.

 

Transferência de Dados

A instrução que representa esta classe é LOAD (Carregue), abreviando para LD, ela permite colocar um número em um registrador ou em uma posição de memória. Forma básica é:

LD [Destino], [Origem]

Onde Destino é o lugar onde o dado será colocado Origem de onde ele será obtido. O endereço de destino e origem podem ser fornecido diretamente, indiretamente, por ponteiro, por registrador etc.

LD B, 15H

Coloca o número 15 (hexadecimal) no registrador B

LD A, (HL)

Coloca no acumulador o número que está no endereço de memória indicado por HL (Observe os parênteses).

LD C, B

Coloca no registrador C o número contido no registrador B

 

PUSH (par de registradores)

Esta instrução coloca o conteúdo do par de registradores na pilha, O bit mais significativo primeiro e o menos significativo depois. Pilha é um espaço reservado da memória usado principalmente para armazenar os endereços de retorno das chamadas às subrotinas e interrupções. Formalmente a pilha é uma lista linear com acesso apenas a um lado da lista. O SP (Stack Pointer) aponta sempre para o último endereço preenchido, que é o lado de acesso, a colocação e retirada de elementos só é possível a partir do endereço apontado pelo SP.

Por exemplo, se no par HL estiver o número 4AF6 e a posição do SP for FFFC, ao executar PUSH HL, no endereço FFFB ficará o 4A, no endereço FFFA será colocado o valor F6 e o SP apontará para FFF9.

A instrução POP (par de registradores), executa a operação inversa do PUSH, coloca nos registradores indicados os valores encontrados nos endereços SP e SP-1 e coloca o SP apontando para SP-2.

 

Movimentação de Dados

Consideremos neste grupo a movimentação do byte e a manipulação de bits.

 

C <- R7 R6 R5 R4 R3 R2 R1 R0 <-/

|->---------------------------/

RL r

 

C -> R7 R6 R5 R4 R3 R2 R1 R0 ->-/

^---------------------------<-/

RR r

As instruções RL e RR r fazem a rotação dos bits do conteúdo dos registradores r indicado, respectivamente para esquerda ou para direita.

 

C <- R7 R6 R5 R4 R3 R2 R1 R0 <-/

|-> ---------------------/

RLC r

 

C <- R7 R6 R5 R4 R3 R2 R1 R0 ->-/

^----------------------<-/

RRC r

As instruções RLC e RRC r fazem a rotação dos bits para esquerda ou para direita.

 

Controle de Fluxo

A CPU foi projetada para executar uma lista de instruções, ou seja, seqüencialmente. Quando é necessário alterar este fluxo contínuo temos a disposição comando de saltos e de chamada às subrotinas.

O comando básico para o salto é o JUMP, abreviado como JP. Os saltos podem ser de 4 tipos: Incondicionais Absolutos, Incondicionais Relativos, Condicionais Absolutos e Condicionais Relativos.

Quando a CPU encontra um comando de salto incondicional salta para o endereço indicado. O endereço é indicado com um número de 16 bits e, neste caso, o alto é absoluto, o PC é carregado com este número de modo que busca da próxima instrução se dará neste endereço ou pode ser indicado com um número de 8 bits e neste caso o salto é chamado de relativo e o endereço é obtido somando-se ao PC o número indicado. A vantagem do salto relativo é que ele gasta um byte a menos na instrução, porém fica limitado a um intervalo de endereços de –128 a + 127 bytes a partir da posição atual do PC. As instruções básicas são:

JP [Endereço ABS. 16 bits]

JR [Endereço Rel. 8 Bits]

JP [Condição], [Endereço ABS. 16 bits]

JR [Condição], [Endereço Rel. 8 Bits]

Os endereços podem ser dados de maneira direta ou indireta por registrador. As condições são estabelecidas em função dos flags e a CPU as verifica comparando a condição dos flags.

Uma instrução poderosa de controle de fluxo é:

DJNZ [Endereço Rel.]

A CPU decrementa o registrador B de uma unidade, verifica o seu valor e se for diferente de 0 pala para o endereço relativo indicado, se for 0 continua o processamento na próxima instrução. Isso permite repetir determinadas operações tantas vezes quantas forem indicadas no registrador B, que neste caso funciona como contador. Este tipo de programa que repete várias vezes é chamado de LOOP.

CALL

É a chamada para desativar o fluxo do programa para uma subrotina, ou seja para uma parte do programa. A diferença entre o Jump e o Call é que o primeiro desvia para uma parte de um programa e continua seqüencialmente a partir deste ponto até encontrar outro desvio ou o fim do programa, o Call desvia para o endereço indicado mas deve necessariamente voltar ao ponto de onde foi chamado em algum momento. Como o jump o call pode ser incondicional ou condicional, mas seu endereço será sempre absoluto.

CALL [Endereço]

CALL [Condição], [Endereço]

O fim da subrotina deve ser indicado como uma instrução de retorno que pode ser condicional ou incondicional

RET

RET [Condição]

 

Entrada e Saída

Estes comandos servem para possibilitar a comunicação entre a CPU e dispositivos externos, são os comando para entrada e saída de dados. Os comandos básicos são IN, para entrada e OUT para a saída. Junto com o comando é necessário fornecer o endereço do dispositivo. Este deve ser um número de 8 bits e, normalmente é fornecido pelo registrador C.

IN A, (n)

Os dados fornecidos pelo dispositivo que está na porta n são colocados no acumulador.

IN r, (C)

Os dados fornecidos pelo dispositivo que está na porta endereçada pelo registrador C são colocados no registrador r.

OUT (n),A ou

OUT (C),r

Modo semelhante aos comandos de entrada.

Controle Interno

Estes comando configuram a CPU para determinados modos de execução das operações.

 

Halt – Encontrado esta instrução a CPU para o processamento, todos os registradores permanecem inalterados e a única atividade será o Refresh da memória dinâmica. A CPU pode sair deste estado somente com um RESET ou com um pedido de interrupção.

NOP – No Operation – não faz nada, somente passa para a próxima instraução.

DI, EI – Disable Interrupt, Enable Interrupt – Habilita ou desabilita as interrupções.

 

 

Voltar