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.

 

<-- Voltar

Hosted by www.Geocities.ws

1