terça-feira, maio 09, 2017

Z80 na Protoboard: Revisão dos LEDs e Ram

Para completar as minhas experiências falta conectar a Ram. Vou aproveitar e revisar o acionamento dos meus LEDs, para ter informações mais úteis.


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  0025              

O vídeo abaixo mostra o resultado (peço desculpas pela iluminação ruim).


Um comentário:

Richard disse...

Lembrei desta série (Z80) quando vi isto no fórum ASM51.
http://smithsonianchips.si.edu/ice/OCR_ScanPE125/PE125(10379-K).pdf