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.
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.