Instrucoes de Entrada/Saida
Para comunicar com os portos de entrada e saída o
microprocessador Z80 possui uma série de instruções que permitem o endereçamento
absoluto e indirecto dos portos.
Quando o endereçamento é absoluto o endereço do
porto encontra-se no byte imediatamente a seguir ao código de instrução. Este
endereço é colocado no barramento de endereços nas linhas AO a A7. A transferência
dá-se entre o porto seleccionado e o acumulador.
Se o endereçamento for indirecto, a transferência
de dados pode dar-se entre um porto e qualquer dos registos, de uso geral (A, B,
C, D, E, H, L). 0 conteúdo do registo C identifica o porto que será fonte, ou
destino, de transferência e é colocado, como no endereçamento absoluto, nas
oito primeiras linhas do barramento de endereço (AO-A7).
À semelhança das instruções de transferência de
blocos na memória o Z80 permite também a transferência de blocos de dados
entre um porto, endereçado pelo registo C, e a memória. 0 par de registos HL
é utilizado como um ponteiro da posição de memória que será fonte ou
destino da transferência consoante se esteja a executar uma operação de saída
(output) ou de entrada (input) respectivamente. No final da operação de
transferência o par HL e o registo B são incrementados ou decrementados,
consoante se pretenda percorrer a memória num sentido ou noutro.
Instruções de lnput (Entrada)
Transferência de dados entre portos de entrada
e registos
A instrução IN A, (n) coloca o conteúdo de um
porto, endereçado pelo seu segundo byte (n), no acumulador.

Nesta instrução o byte de valor n é colocado nas
oito primeiras linhas do barramento de endereços (AO-A7). 0 registo de flags não
é alterado.
A instrução IN r, (C) transfere o conteúdo do
porto cujo endereço se encontra no registo C, para o registo GPR (general
purpose register) designado por r.

0 registo de flags sofre alterações de acordo
com o seguinte esquema:

0 significado dos símbolos presentes no registo F não
sofreu alteração.
Transferência de dados entre portos de entrada e células
de memória
A transferência de dados entre portos e posições
de memória pode ser dividida em dois conjuntos.
No primeiro conjunto podem-se englobar as instruções
INI e IND que realizam o processo de transferência de blocos de uma forma passo
a passo, isto é, a acção da instrução termina logo que se realize o envio
de um byte para a memória. 0 par de registos HL, aponta a posição de memória
destino da transferência, enquanto o registo C continua a endereçar o porto de
entrada. 0 registo B é utilizado como contador e é sempre decrementado
(B<-B-1) após a execução das instruções INI e IND. A instrução INI
provoca o incremento do par HL (HL<--HL+1) permitindo percorrer a memória
desde uma determinada posição para outra mais elevada (de maior endereço). A
instrução IND permite exactamente o contrário, ou seja, partir de posições
com maior endereço para posições de menor endereço, visto que o par HL é
decrementado (HL<--HL-1).
As instruções INI e IND têm o seguinte código:

No caso da instrução INIR, de cada vez que um byte
é transferido para a célula de memória apontada pelo par HL, o registo B é
decrementado (B<-B-1) e o par HL sofre um incremento (HL<--HL+1). Esta
operação continua até o conteúdo do registo B ser zero, permitindo deste
modo a transferência de um bloco de bytes para a memória partindo de um
determinado endereço para outro mais elevado (fig. 34).
A flag Z toma o valor «1» se o resultado de B- 1
for zero.
No segundo conjunto podem-se inserir as instruções
INIR e INDR que executam a transferência de um bloco de dados de um porto,
identificado pelo registo C, para a memória, isto é, com uma só instrução
consegue se mover um determinado número de bytes. 0 par HL é utilizado para
endereçar as posições de memória, enquanto o registo B é usado como
contador de bytes do bloco.

A instrução INDR é idêntica à INIR com a
diferença de que agora a memória é percorrida em sentido contrário, isto é,
parte-se de posições com endereços mais altos para se terminar em posições
com endereços mais baixos. A fig. 34-b) ilustra este processo.
0 código das instruções INIR e INDR tem o seguinte
formato:

Obviamente, a flag de zero apresenta o valor «1»
uma vez que a operação de transferência só termina quando o registo B
contiver o valor zero.
Em todas as instruções de input, com excepção da
instrução IN A,(n), o conteúdo do registo B é colocado nas linhas A8-Al5 do
barramento de endereço. Assim, a lógica externa, se o desejar, pode determinar
a extensão da transferência.
Os códigos hexadecimais das instruções de INPUT
encontram-se representados na tabela 30.
Instruções de Output (Saída)
As instruções que permitem a saída de
resultados para os portos são formalmente idênticas às instruções de INPUT.
Efectivamente, para cada instrução de INPUT existe a instrução recíproca de
OUTPUT, em que a única diferença está no sentido do fluxo da informação: da
CPU e da memória para os portos.
Devido à reciprocidade das instruções vamos apresentar apenas os seus
códigos.
Transferência de dados entre registos e portos de saída.

Estas instruções não afectam o registo de flags.
Transferência de dados em bloco entre células
de memória e portos de saída.

0 registo de flags é alterado do mesmo modo
que nas instruções recíprocas de input (INI, IND, INIR, INDR).
Igualmente o conteúdo do registo C é colocado nas
linhas AO-A7 do barramento de endereço e o conteúdo do registo B nas linhas
A8-Al5 do mesmo barramento. Na tabela 31 encontram-se resumidos os códigos
hexadecimais das instruções de OUTPUT.
