terça-feira, 19 de setembro de 2006

Leitor de MMC/SD rápido: Decodificador de I/O

O padrão MSX estipula que os endereços de I/O acima de 03FH são reservados (ref [1]), portanto, o nosso decodificador tem que ser capaz de decodificar endereços abaixo desse valor.

Outro fator de escolha do endereço a ser utilizado, é que muitos periféricos "consagrados" utilizam portas dentro dessa área (ref [2]). Portanto, foi escolhida uma área livre, cuja base começa em 0Ch (12) e ocupa 4 endereços, terminando portanto, em 0Fh (15).

Para decodificar um endereço de I/O do MSX, deve-se levar em conta as linhas de endreço [A0..A7] (tradicionalmente), o sinail IORQ (requisição de I/O) e também o sinal M1 (ciclo de máquina). Este último costuma ser esquecido, mas é importante para não conflitar com o processo de reconhecimento de interrupções do Z80.

A figura abaixo, retirada do Manual do Z80 (ref [3]), mostra que após o Z80 reconhecer uma interrupçãom, ele gera um ciclo M1 especial, e durante esse ciclo o sinal IORQ toma o lugar do MREQ, de forma que o periférico possa colocar seu vetor de interrupção no barramento de dados. Por isso, nossa decodificação de endereços tem que levar em conta o sinal M1 inativo (nível 1).


clique na imagem para ampliar

Mais detalhes sobre o mecanismo de interrupção são encontrados no parágrafo "Interrupt Request/Acknowledge Cycle" do manual do Z80 (ref [3]).

Além da decodificação de endereço, é necessário levar ainda em conta a operação a natureza da operação de I/O, ou se estamos fazendo uma leitura (sinal RD) ou escrita (sinal WR).

Dados os requisitos acima, temos definidos os seguintes níveis para os sinais do Z80:

clique na imagem para ampliar

Onde A0 e A1 definem o endereço de acesso:


clique na imagem para ampliar


Assim, chegamos ao seguinte diagrama:

clique na imagem para ampliar

Nenhum comentário: