quinta-feira, 21 de março de 2013

Descoberto segundo bug na Explorer

Wesley Camargo (autor desta mod) alertou da incompatibilidade da Explorer dele com os programas Sokoban e New Wave. No equipamento dele, um bug descoberto anteriormente já teria sido consertado. 


O Sokoban nem rodava, resultando em reset, e o demo New Wave travava.  Ele atribuiu este comportamento à alteração na Explorer para consertar o primeiro bug. Ao desfazer a modificação, constatou que os programas rodavam sem problemas. O vídeo de sua autoria demonstrando este fato encontra-se em: http://youtu.be/ZGo7xCzUfYo http://youtu.be/apR685uwx54.

Este comportamento não fazia sentido,  pois a mod descrito no site do Victor Trucco é para tornar a Explorer III e IV mais compatível com o ZX Spectrum 128. Como um programa para Spectrum não poderia rodar nela? Entretanto era fato que, sem esta mod, os programas rodavam.
 
Olhando o esquema da Melodik, encontrei finalmente a explicação. O problema é que havia mais um bug, que não era exposto porque ficava "atrás" do primeiro bug. Explicando rapidamente, as Explorer I, III e IV não possuem a porta de entrada 65533. No caso da Explorer III e IV, existe a porta de entrada 49149, que pode ser movida para 65533 com  poucas modificações. A decodificação da porta de entrada não faz uso da linha /RD do Z80, mas aparentemente isso não seria problema, pois bastaria interpretar de forma invertida o sinal /WR; se /IORQ estiver ativo e /WR desativado, com certeza estar-se-ia lendo o periférico, não escrevendo nele.

O raciocínio acima é bastante inteligente, porém deixou passar um fato que quase é nota de rodapé do manual do Z80. No modo de interrupção 2 (IM 2), o microprocessador espera que algum periférico passe 8 bits no barramento, para definir o vetor de interrupção (isto é, o endereço do elemento de uma tabela de sub-rotinas). Neste estado, o /RD não é ativado e nem /WR, porém /IORQ é  ativado (e /M1 também, mas não vem ao caso na discussão).

O que acontece com a Explorer "consertada"? Ela vê que /IORQ está ativada mas /WR não; pensa então que se está solicitando um dado no barramento e... pimba! Tasca um byte que é recolhido pelo Z80.

Se o programador é mais cuidadoso ou conhece melhor o Spectrum, teria feito uma tabela em que não é necessário que este byte seja 255 (#FF); mas não é o caso do Sokoban, pelo que vi no disassembly. Portanto se o valor deste byte é qualquer outro, o vetor de interrupção está completamente errado e a sub-rotina chamada pode ir para qualquer endereço (no Sokoban, #0000, que inicializa o TK).

Existem duas soluções possíveis:

1) alteração de software, isto é, construir uma tabela de sub-rotinas mais robusta;
2) alteração de hardware, isto é, fazer com que a decodificação (74LS138 e 74LS00) seja igual ao da Melodik.

Acredito que mais um bug da Explorer foi desvendado. Da minha parte, eu acho que prefiro montar uma Melodik para mim.

Nenhum comentário:

Postar um comentário

Seu comentário é bem vindo, mas peço que use este espaço adequadamente.