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