segunda-feira, 2 de outubro de 2006

Leitor de MMC/SD rápido: Registradores de Deslocamento

Para suportar a transferência simultânea de dados numa única instrução, foi utilizado um recurso do Z80 normalmente ignorado na maioria dos projetos: O comportamento das linhas [A8..A15] durante o endereçamento de I/O.

O Manual do Z80 (ref [1]) informa que durante as operações de I/O, que utilizam normalmente as linhas [A0..A7], as linhas [A8..A15] também seguem um comportamento bem definido. Por exemplo, durante a instrução:

IN A,(C)

As linhas [A0..A7] assumem o valor definido pelo registrador C, enquanto as linhas [A8..A15] assumem o valor definido pelo registrador B.

No circuito do leitor de cartões, as linhas [A8..A15] foram utilizadas para carregar o "latch" do registrador de deslocamento, ou seja, o byte a ser enviado serialmente.

É por isso que o circuito não utiliza a linha /WR (escrita), vide diagrama de blocos abaixo.




O circuito gerador de Clock faz o resto do trabalho, enviando serialmente o byte a ser transmitido, ao mesmo tempo em que recebe o byte a ser lido na próxima instrução. O único cuidado a ser tomado é que não se efetue duas instruções "IN" seguidas, pois são necessários 8 ciclos de clock para a transferência acontecer; mas como a maioria das aplicações consiste em:
  1. ler um valor;
  2. escrever na memória;
  3. incrementar um contador;
  4. decrementar outro contador;
  5. checar se o valor chegou a zero, antes de repetir a instrução "IN";
todas estas operações dão tempo suficiente para os dados sererm transmitidos. Isso também é válido para a instrução INIR, pois apesar de ser uma única instrução, sua execução implica na realização da sequência de eventos acima, gastando, segundo o Manual do Z80 (ref [1]), 21 ciclos de clock, equivalentes a uma velocidade máxima de leitura de bloco de 170,3Kbytes/segundo de taxa máxima de leitora de bloco para um Z80 rodando a 3,578MHz.

Uma observação importante é que a implementação do circuito desta forma otimizou a operação de leitura ao mínimo possível (21 ciclos), mas obrigou a operação de escrita a utilizar instruções convencionais como o bloco abaixo:

LOOP:
LD A,(HL) [7]
IN A,(BASE) [11]
INC HL [6]
DJNZ LOOP [13]


Que totaliza 37 instruções, ou o equivalente a 96,7Kbytes/segundo de taxa máxima de escrita de bloco para um Z80 rodando a 3,578MHz.

Nenhum comentário: