Instrucoes Especiais
Do conjunto de instruções do microprocessador Z80
fazem parte cinco instruções que actuam exclusivamente sobre o conteúdo do
acumulador e sobre a flag de carry, CY.
DAA: Decimal Adjust Accumulator
Quando se pretende realizar adições ou
subtracções com números codificados em BCD (Binary Coded Decimal) é natural
obterem-se resultados inválidos visto que o acumulador realiza as operações
em binário, isto é, na forma em que os dígitos foram introduzidos.
Para ilustrar este facto, a adição de 4(10) a
99(10) dá como resultado o número 103(10). A representação em BCD de 99(10)
é 1001 1001 e a de 4(10) o) é 0100. Então.

Como se pode confirmar, o resultado obtido não
é válido para uma representação em BCD uma vez que 1101 não faz parte do código
BCD. Sabemos que o resultado deve ter 12 bits de comprimento (103(10)=00011 0000
0011 BCD).
A instrução DAA desenvolve um conjunto de acções
de modo a dar ao resultado no acumulador uma codificação em BCD:
a) se o valor dos quatro bits menos
significativos do acumulador é maior do que nove (9), ou se a flag H é
colocada em «1» adiciona-se seis (6) ao conteúdo do acumulador;
b) se o valor dos quatro bits mais
significativos do acumulador é maior do que nove (9), ou se a flag C tem o
valor «1» adiciona-se seis (6) aos quatro bits mais significativos.
No exemplo em estudo a instrução DAA efectua
as seguintes operações:

Conteúdo final do registo de flags:

A flag C=1 indica o transporte para um
terceiro conjunto de quatro bits, única maneira de codificar 103(10) em BCD
(0001 0000 0011).
A instrução DAA é composta por um único byte e
actua exclusivamente sobre o acumulador. Tem o seguinte código de instrução:

0 registo de flags é alterado pela instrução
DAA da seguinte forma:

↕ - flag alterada de acordo com o resultado da
operação;
P - flag colocada a 1 se a paridade for par;
● - flag não afectada;
X - valor desconhecido.
CPL:
Complementação do Acumulador (A)
Esta instrução executa a complementação para um
do conteúdo do acumulador. Todos os bits com o valor 1 passam a ter o valor 0 e
todos os bits a 0 mudam para 1:

As flags H e N são colocadas a 1, as outras não
são alteradas.
NEG:
Complementação para Dois do Acumulador (A)
Esta instrução executa a complementação para dois
do conteúdo do acumulador. Depois de se complementar (para 1) o conteúdo do
acumulador, a complementação para dois obtém-se adicionando 1 ao resultado.
A instrução NEG é composta por dois bytes:

0 registo de flags é modificado do seguinte modo:

A flag V tomará o valor «1 » no caso de o
conteúdo do acumulador ser 80 H antes da complementação para dois.
Exemplifiquemos calculando o complemento para dois de 80 H.

Seja, por exemplo, a subtracção do byte 54 H ao
conteúdo do acumulador que é 40 H. Uma vez que o byte subtractor é maior do
que o conteúdo do acumulador o resultado virá negativo e em complemento para
dois. Para obter o resultado numa forma inteligível efectua-se de seguida uma
complementação para dois:

Programa a efectuar:
SUB A, 54 H; subtrai 54 H ao conteúdo do acumulador
NEG ● ; complementa para dois o resultado
Memória de programa:

O resultado obtido depois da subtracção em binário
é:
1 1 1 0 1 1 0 0 - EC H
O 1 no oitavo bit é sinónimo de que o
resultado é negativo. Por isso, depois da instrução NEG o valor hexadecimal
14 H tem de ser entendido como um resultado negativo.
CCF: Complement Carry Flag
Esta instrução complementa a flag de carry, isto é,
se o seu valor for 0 colocará a flag C igual a 1; se o valor de C for 1 então
será colocada a 0. 0 código binário desta instrução é o seguinte:

SCF: Set Carry Flag
A instrução SFC coloca a flag C com o valor «1»
qualquer que seja o valor anterior desta flag.
A instrução SCF tem o seguinte código binário:

No registo de flags C é colocada a , 1 », N e H
recebem o valor «0» Todas as outras flags se mantêm inalteradas.