sexta-feira, 30 de março de 2007

BUSDIR

Em conversa com o Igor, discutindo a utilização do sinal BUSDIR, chegamos às seguintes conclusões:
  • O MSX não utiliza a linha BUSDIR para fazer DMA (ao contrário do que eu imaginava);
  • O sinal BUSDIR serve para mudar a direção dos 'buffers' de saída colocados no barramento do MSX em três duas situações:
  1. Leitura em memória num SLOT via sinais /RD e /SLTSL;
  2. Leitura de uma porta de I/O via instruçaõ IN/INI/INIR (ou INP do Basic);
  3. Colocação de um vetor de interrupção no barramento, em modo de interrupção 2 do Z80, pois nesta situação o sinal /RD fica em nível alto;
Estas informações podem ser encontradas na página 36 do "MSX Technical Data Book".

Só que em nossa discussão, encontramos um problema no circuito de controlde de busdir da página 35 do 'Data Book'.



O problema desse circuito é que quando DOIS ou mais de um expansores com 'buffer' interno forem ligados ao mesmo tempo, todos os buffers serão acionados, causando assim um conflito que pode inclusive queimar os 'buffers' (isso sem contar que a porta NOR teria que ser 'open collector'). Isso ocorre porque a linha /BUSDIR está ligada diretamente ao controle de habilitação do 'buffer'

Tudo bem que o esquema no 'Data Book' seja mais um 'guideline' do que um esquema propriamente dito, mas uma possível soluão para este problema pode ser "comparando" o comando para habilitar o 'buffer' com o sinal da linha /BUSDIR. Se o sinal /BUSDIR_INTERNO baixar, então o 'buffer tristate' força a linha /BUSDIR a baixar, e na saída da porta OR, o sinal vai zer 'ZERO', acionando assim o 'buffer' do expansor.

Por outro lado, se nenhuma operação deste expansor estiver ativando a linha /BUSDIR_INTERNO, e porventura o outro expansor ativar a linha /BUSDIR, então o sinal na saída da port OR vai ser 'UM', o que não habilita o buffer de saída.




Modificando um pouco o circuito do 'Data Book', e adaptando para usar um 'buffer' bidirecional 'tristate' (LS245), em vez de dois unidirecionais, temos:



Note que foi necessário envolver o sinal de /WR para escolher a direção do 'buffer', e para habililá-lo numa operação de escrita.

Simplificando a lógica, usando apenas um CHIP para fazer as funções das portas AND e OR, e substituindo o 'buffer' tristate por um MOSFET, temos:

Nenhum comentário: