sexta-feira, 15 de dezembro de 2006

Mais dificuldades.

Fiz mais alguns testes. O "glitch" apareceu de novo, mesmo com o "buffer"!!

Consegui reproduzir a situação em que eu lia 255 sem dar glitch, que era um loop infinito, em Basic:

10 print inp(12)
20 goto 10

Se eu usasse essa instrução, e forçasse a entrada de dados a nível 1, conseguia ler o valor 255 sem o menor problema.

Olhando o codigo desta função (via um disassembly do basic), deu pra notar que o que ela faz é avaliar o operando que foi passado, e retornar o valor do operando no par HL. Em seguida o registrador B é carregado com H e o registrador C é carregado com L. Detalhe importante, é que o registrador B sempre vai conter 0, pois o valor da porta está entre 0 e 255

Em seguida o MSX executa a instrução

IN A,(C)

e devolve ao Basic o valor lido.

O que acontece nesse caso é que as linhas A8-A15 vão sempre conter 0 (valor de B), quando é utilizada a instrução INP do basic.

Uma segunda experiência mostrou que utilizando a instrução acima, e variando o valor de B, é possível fazer o "glitch" aparecer.

A conclusão estava na, mas eu não tinha percebido: O aparecimento do "glitch" depende do valor que aparece nas linhas A8-A15!!! Talvez por algum gato do Z80, talvez por algum gato do meu HotBit...

Mas o problema é que isso compromete todo o projeto, pois pretende-se fazer uso da instrução INIR, que usa o registrador B como contador (decremental), e internamente a instrução coloca nas linhas A8..A15 o valor atual de B

Por enquanto o problema está sem solução.

Nenhum comentário: