Mostrando o Endereço da Instrução
Os meus LEDs de endereço estavam mostrando diretamente o barramento, o que misturava endereços de busca de instrução (fetch), acesso a dados e refresh. Embora isto tenha sido bastante instrutivo, para acompanhar a execução seria interessante observar somente os endereços de busca de instrução.
Para isto basta mudar o clock que comanda o registro do barramento nos flip flops do CI 74HC574. Anteriormente estava usando o sinal MREQ, obtido invertendo o sinal do pino -MREQ do Z80. Para pegar apenas os endereços de busca de instrução é preciso fazer um E de MREQ com M1 (que é a inversão do sinal no pino -M1 do Z80).
Aplicando um pouco de álgebra booleana, MREQ & M1 = -(-MREQ | -M1) onde - é a inversão, & corresponde a E e | a OU. Esta identidade não é totalmente obvia, o que já gerou muitos erros de lógica em programas. Uma forma um pouco mais conhecida é -(A & B) = -A | -B (ou seja, a negação do E é o OU das negações).
Ótimo, basta um NOR dos dois sinais que saem do Z80. Só que eu não tinha um NOR à mão. Olhando o que eu tinha de TTL, a solução foi combinar um decoder 74HC139 com um NAND 74HC00 (mais uma vez trabalhando como inversor):
Está na lista de compras comprar CIs de inversor e NOR, eles teriam reduzido bem a contagem de integrados no circuito.
Implementando uma Porta de Saída
O meu display de dados era ainda mais inútil que o de endereços. No lugar dele, resolvi implementar uma porta de saída, usando um segundo 74HC574. Para simplificar, os LEDs recebem o sinal da via de dados quando é feita uma escrita em dispositivo (instrução OUT), qualquer que seja o endereço. Para isto basta usar como clock o E dos sinais IORQ e WR. É claro que estes sinais saem negados do Z80 e portanto eu teria que usar um NOR. Resultado: usar o segundo decodificador do 74HC139 e uma segunda porta do 74HC00. O circuito é idêntico ao do display de endereços, exceto pelos sinais de entrada no 74HC139.
Ligando a Ram
Ligar a Ram é semelhante a ligar a Rom, exceto que vamos ligar o sinal de escrita e o sinal de seleção é outro:
Testando Tudo
Para ver tudo em funcionamento precisamos de um pequeno programinha:
1 0000 ORG $0 2 0000 3 0000 start: 4 0000 21 00 20 ld hl,$2000 5 0003 F9 ld sp,hl ; pilha no final da Ram 6 0004 loop1: 7 0004 AF xor a ; n = 0 8 0005 loop2: 9 0005 F5 push af 10 0006 CD 13 00 call fibo 11 0009 D3 55 out ($55),a ; mostrar fibo(n) 12 000B F1 pop af 13 000C 3C inc a 14 000D FE 0E cp 14 15 000F 20 F4 jr nZ,loop2 ; repetir até n = 13 16 0011 18 F1 jr loop1 ; depois voltar para n = 0 17 0013 18 0013 fibo: 19 0013 FE 02 cp 2 20 0015 D8 ret c ; fibo(0) = 0, fibo(1) = 1 21 0016 3D dec a 22 0017 F5 push af 23 0018 CD 13 00 call fibo 24 001B 47 ld b,a ; b = fibo(n-1) 25 001C F1 pop af 26 001D 3D dec a 27 001E C5 push bc 28 001F CD 13 00 call fibo ; a = fibo(n-2) 29 0022 C1 pop bc 30 0023 80 add b ; fibo(n) = fibo(n-1)+fibo(n-2) 31 0024 C9 ret 32 0025O vídeo abaixo mostra o resultado (peço desculpas pela iluminação ruim).
Um comentário:
Lembrei desta série (Z80) quando vi isto no fórum ASM51.
http://smithsonianchips.si.edu/ice/OCR_ScanPE125/PE125(10379-K).pdf
Postar um comentário