domingo, 5 de outubro de 2014

Toxic Elephant (Total Eclipse)

Ao lado de Crazy Samples II, o demo Toxic Elephant foi um dos primeiros que tive para a Explorer. Mal sabia eu que, décadas depois, encontraria um bug nele.


Em torno do início dos anos 1990, eu comprava revistas britânicas na Litec ou nas bancas de jornais da Av. Paulista em São Paulo. Tais revistas costumavam trazer fitas como brinde de capa e, num exemplar da Your Sinclair, veio este programa. Era um demo de uma tela única, com quatro  músicas AY (uma delas, "Green Sunday", era na verdade o famosíssimo "Blue Monday" da banda New Order).

No momento estou refazendo as conversões de programas para que funcione nas versões 48 e 128 da interface de drive Beta e, quando fui mexer com o Toxic Elephant no emulador Fuse, notei algo estranho. Não era possível selecionar a música através das teclas 1 a 4.

Investigando um pouco com o debugger, encontrei o motivo da incompatibilidade na porta 254, que é semelhante ao do Samurai Warrior e Rex. Para encontrar o momento em que o demo lê o teclado, usei o comando br port read 254, mas o disassembly insistia em apontar para a rotina da ROM. Certo de que deveria haver uma rotina própria em linguagem de máquina, restringi o breakpoint para endereços somente da ROM com: cond 1 pc>16384. Acabei chegando na seguinte rotina:

47919   LD A,%11110111      ; Enable keys 1 to 5 for reading.
47921   IN A,(254)          ; Read key. 
47923   CP %10111110        ; Test key 1. 
47925   JP Z,48214          ; Jump if key was pressed.
47928   CP %10111101        ; Test key 2.
47930   JP Z,48235          ; Jump if key was pressed.
47933   CP %10111011        ; Test key 3.
47935   JP Z,48256          ; Jump if key was pressed.
47938   CP %10110111        ; Test key 4. 
47940   JP Z,48277          ; Jump if key was pressed.


O programa espera que o bit 6 lido da porta 254 seja 0, o que não ocorre necessariamente para todos os tipos de computadores, além de ficar à mercê dos dispositivos ligados ao barramento. Para evitar o problema, deve-se substituir as instruções CP x por BIT n,A. Ao invés de montar uma rotina para fazer patch no jogo, resolvi usar POKE no próprio carregador BASIC:

65 FOR n=0 TO 3: POKE 47923+5*n,203: POKE 47924+5*n,71+8*n: NEXT n

Testando no emulador, agora as teclas 1 a 4 são lidas corretamente.

Criei um novo carregador BASIC, que aplica o patch acima (arquivo "Toxic!"). Para baixar os arquivos Hobeta, clique neste link.

Nenhum comentário:

Postar um comentário

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