Minhas aventuras com o Z80 - Mapeando entradas e saídas

 

Dando sequencia nos estudos com Z80 e com o gravador pronto foi hora de iniciar fazer o primeiro programa. A ideia foi montar um circuito com entradas e saídas que utilizam o mesmo barramento 8 bits e assim ter o controle sobre o barramento. Como os pinos do Z80 de D0 a D7 trabalham como entrada e saída existe pinos de controle para que os valores de uma instrução não colida com outra. Utilizando circuitos combinacionais, é possível mapear as entradas e as saídas para que cada uma delas trabalhe no momento certo. Coloquei no circuito duas entradas e duas saídas onde ao acionar uma entrada uma das saídas é acionada sequenciando os bits. Foi utilizado 8 leds para cada saída para a visualização.


Na figura abaixo é possível ver o ciclo de trabalho para entrada e saída:

Além da utilização do barramento de dados (D0-D7) para entrada e saída, ele é utilizado para acesso ao programa na memoria EPROM. O ciclo de trabalho para leitura e gravação de memoria pode ser visto abaixo. No caso utilizaremos apenas a leitura já que não temos RAM ainda para gravação.

Para a leitura da EPROM foram utilizados os controles MREQ e RD. Para mapeamento das saídas foram utilizados através de circuito combinacional o WR em conjunto com o mapeamento de endereços (A0 e A1) de acordo com o programa mostrado abaixo. E por fim para a entrada, também utilizando circuito combinacional, foram utilizados IORQ, RD e o mapeamento de endereço A0.

O circuito completo pode ser visto na figura abaixo:

No circuito não coloquei nenhuma fonte de clock mas esta pode ser facilmente obtida com um oscilador 555 ou qualquer outra fonte de oscilação de onda quadrada.

Os circuitos combinacionais foram construídos com componentes que eu tinha facilmente em mãos, mas podem ser construídos de formas variadas.

Para um melhor entendimento do código é preciso entender que para cada um dos endereços do Z80 pode-se ter entradas ou saídas de valores diferente. Exemplo para os quatro primeiros endereços:

Segue abaixo o código utilizado, onde:

  • Quando uma entrada ou saída é mapeada no endereço A0 por exemplo, significa que o pino A0 irá para 1 no momento correto do ciclo de trabalho;
  • A instrução bit testa se um bit especifico entre os 8 que estão no acumulador está em 0. Ao pressionar um dos switchs a entrada (D0 ou D1) irá para 0 e este será o bit testado.
  • As instruções rlca e rrca rotacionam os bits do acumulador "a" no sentido esquerdo ou direito. Exemplo: 0000 0001 no próximo loop será 0000 0010 se for rlca e assim por diante.
  • A instrução CP 1 testa se o primeiro bit do acumulador "a" é 1 (0000 0001)

Abaixo um vídeo do funcionamento:


Referencias:

Datasheet Z80: http://z80.info/zip/z80cpu_um.pdf

WRKits: https://www.youtube.com/playlist?list=PLHppzkT1AYj9dvEnUVjgsyXXKrLNK1RcK

Comentários