sexta-feira, 11 de outubro de 2013

Versão 2 de Terminator 2

Enfim, aqui está a 2ª versão de Terminator 2 convertido para disco Beta que roda em TK90X com TKMEM-128


Consegui contornar a falta de som para Explorer sem a ROM 128 habilitada. Eu tive que substituir IM 1 por IM 2, porém este último requer uma tabela de 257 bytes para os vetores de interrupção. A dificuldade é encontrar uma parte não usada da RAM entre 32768-49151 (#8000-#BEFF) para criar esta tabela. Não havia tal espaço disponível.

Por este motivo busquei outra abordagem que, ao invés de uma tabela, usa apenas um único endereço armazenado em alguma parte da memória com endereço hexadecimal #XXFF. Fazendo uma busca na RAM, vi que o conteúdo de 44287/44288 (#ACFF/#AD00) é 23936 (#5D80) que seria um endereço aparentemente não usado pelo jogo. Colocando o valor 172 (#AC) no registrador I e ativando IM 2, o Z80 iria desviar sua execução a cada requisição de interrupção para o endereço 23936. Bastaria então colocar uma instrução de desvio (JP) a partir deste endereço para que a rotina de interrupção do jogo possa ser executada. Para ter mais informações do funcionamento das interrupções no TK90X, leia o meu artigo na revista Jogos 80 nº 11.

Ao fazer esta modificação,  parecia que tudo estava bem pois obtive a música para Explorer. Ao jogar (com POKEs, obviamente), percebi que dava reset na terceira fase. Após uma análise no emulador, concluí que a posição da RAM em 23936 era usada pelo programa. Não encontrei nenhuma outra posição na RAM adequada.

Passei então a procurar um endereço na ROM que pudesse apontar para alguma posição não usada pelo jogo. Após exaustivas pesquisas, encontrei o valor 43 (#2B) para o registrador I, pois no endereço #2BFF encontra-se o valor 23653 que, de fato, não é usado pelo jogo.

Experimentei fazer nova modificação no programa e testei no meu TK90X. Para minha satisfação, funcionou bem e agora era possível ouvir a música no menu do jogo. Entretanto esta solução não é perfeita, pois se algum periférico colocar algum sinal no barramento do Z80 durante a requisição de interrupção, o programa pode travar. Não observei nenhum travamento até o momento, mas pode ser que dependa de cada máquina ou dos periféricos a ela ligada.

A versão 2 do Terminator 2 em formato Hobeta está disponível neste link. Outros formatos podem ser encontrados neste subdiretório. A modificação na rotina de interrupção não está ativada por padrão, pois pode haver risco de travar o jogo. Para ativá-la, deve-se modificar a linha 60 do carregador BASIC com  remoção da instrução REM, para que o POKE seja efetuado. A função "BIN 00010000" poderá ser ainda substituída por "BIN 00011111" para ativar energia e tempo infinitos.

Nenhum comentário:

Postar um comentário

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