Flags
Cada um dos dois registos de flags do
microprocessador Z80 contém seis bits de informação que são colocados a «0»
ou a «1», pelas várias instruções que a CPU executa. Quatro destes bits
podem-se testar de modo a serem utilizados como condição para a execução de
instruções de JUMP (salto condicional), CALL (chamada de sub-rotinas) ou
RETURN (retorno de sub-rotinas). Por exemplo, um salto no programa (JUMP) pode
unicamente ser desejado se um determinado bit do registo de flags tiver o valor
«1 ».
Os quatro bits do registo de flags que se podem
testar são:
1) Carry Flag (C) - Esta flag representa o transporte
do bit de maior ordem do acumulador. Por exemplo, a flag de carry será colocada
a 1 durante uma instrução de adição se for gerado um transporte do oitavo
bit do acumulador.
A flag C também será iguala 1 se durante uma
subtracção o diminuidor for superior ao diminuendo.
2) Zero Flag (Z - Esta flag é colocada a 1 sempre
que o resultado de uma operação preenche inteiramente com zeros o acumulador.
De outro modo terá o valor 0 .
3) Sign Flag (S) - Esta flag é utilizada sempre que
se opere com números com sinal e é colocada a 1 se o resultado da operação
for negativo. Uma vez que o bit 7 (MSB) representa o sinal do número (um número
negativo terá um 1 no bit 7), esta flag contém o estado do bit 7 do
acumulador.
4) Parity/0verflow Flag (P/V) - Esta flag, com duplo
significado, indica a paridade do resultado no acumulador quando são efectuadas
operações lógicas (por exemplo: AND A,B) e assinala overflow quando se
executam operações aritméticas entre números com sinal e, por isso, em
complemento para dois.
A flag de overflow do microprocessador Z80 indica um
erro quando um número em complemento para dois, no acumulador, excede o máximo
possível (+127) ou é menor do que o mínimo permitido (-128) pela representação
em complemento para dois. Por exemplo considere-se a adição:

A flag C é igual a 0 e a flag P/V é colocada
a 1 indicando a ocorrência de overflow. Repare-se que se não estivéssemos a
utilizar a notação em complemento para dois (bit 7 para o sinal) o resultado
estaria correcto. Isto só é possível quando se opera exclusivamente com números
positivos.
Considere-se agora a adição de dois números
negativos:

Durante as operações lógicas AND, OR e XOR esta
flag é colocada a 1 se a paridade do resultado for par, sendo colocada a 0 se
for ímpar.
Quando se efectuam operações de subtracção os
resultados têm de ser interpretados com base nas flags de sinal (S), de
overflow (P/V e de carry (C).
Vamos apresentar alguns exemplos de subtracções e
respectivas flags.
Subtracções de Dígitos com Sinal
Neste caso os números são entendidos na forma de
complemento para dois, estando limitados à gama +127, -128.

0 diminuendo é superior ao diminuidor pelo que
C = 0, o resultado é positivo, S = 0, e encontra-se dentro da gama +127, -128.

0 diminuendo é inferior ao diminuidor (existência
de borrow), o que implica C = 1. S = 1 indica um resultado negativo em
complemento para dois o que está de acordo com C = 1. Mais uma vez o resultado
está dentro da gama +127, -128 (-128(10) = FF em complemento para dois).

S = 1 porque o bit nº 7 do resultado é «1 ». No
entanto não se pode concluir que o resultado é um número negativo, em
complemento para dois, porque a flag de overflow foi activada a P/V = 1. A flag
C toma o valor «1 » pois, de facto, o diminuidor é superior ao diminuendo. Na
realidade o valor introduzido no computador para diminuidor é o complemento
para dois de OA H : F6 H. Então, a operação realmente efectuada pelo
microcomputador é:
78 H - F6 H = 82 H (F6
H>78 H)
Neste caso os números são entendidos sem sinal,
podendo utilizar os oito bits do acumulador. A gama neste caso é de 0 a 255.

S = 1 indica que o bit 7 do resultado é «1», no
entanto não indica um resultado negativo. Não existe overflow, visto não
estarmos a operar em complemento para dois e, finalmente, C = 0 porque o
diminuendo é superior ao diminuidor.

A flag S indica um resultado positivo porque o bit
n.o 7 do resultado tem o valor «0». No entanto, este resultado tem de ser
entendido na forma de complemento para dois uma vez que a flag C toma o valor «1
». Isto significa que o resultado terá de ser negativo pois o diminuendo é
inferior ao diminuidor. Este caso é, no entanto, uma situação pouco clara,
pois considerámos operações de números sem sinal e obtivemos um resultado
negativo. Tanto quanto possível é preferível evitar situações desta
natureza, isto é, deve-se definir o mesmo tipo de números para os operandos e
para os resultados.
Estes exemplos demonstraram a necessidade de se
entender um resultado à luz das três flags principais (mais a flag 2) e não
apenas baseado numa delas.
Existem também dois bits no registo de flags
que não podem ser testados. Estas flags são utilizadas pela CPU quando se
efectuam operações aritméticas em BCD.
1)
Half Carry (H). Esta
flag indica um transporte dos primeiros quatro bits para os seguintes. Quando se
usa a instrução DAA (Decimal Adjust Accumulator) esta flag é utilizada na
correcção de resultados de adições ou subtracções em que se utilizou uma
forma compactada (em BCD) para os operandos.