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:
- ler um valor;
- escrever na memória;
- incrementar um contador;
- decrementar outro contador;
- checar se o valor chegou a zero, antes de repetir a instrução "IN";
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:
Postar um comentário