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:
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:
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
Postar um comentário