domingo, 10 de março de 2013

Incompatibilidade do Roland

Recentemente refiz a adaptação de Rodland, mas uma coisa estava me incomodando. As telas de apresentação e de interlúdio desapareciam rapidamente.


A tela acima (aliás, uma das fadinhas parece ser estrábica?) nunca é vista no TK90X com TKMEM-128. Só mostra brevemente a primeira tela da sequência, para logo depois ser apagada.

Como no emulador funciona bem, suspeitei tratar-se de alguma incompatibilidade. Carreguei o programa no Fuse e esperei que o teclado fosse acessado (através da porta 254). Após examinar o disassembly, encontrei o seguinte trecho no banco de RAM 3: 

62844   LD HL,250
62847   LD C,0
62849   HALT
62850   DEC HL
62851   LD A,L
62852   OR H
62853   RET Z
62854   XOR A
62855   IN A,(254)
62857   XOR 191
62859   JP Z,62849
62862   LD C,255
62864   RET

O problema situa-se na instrução XOR 191,  onde o flag Zero só é ativado se A contiver valor 191 (%10111111) que, no Spectrum, significa que nenhuma tecla foi pressionada. Neste caso, a instrução seguinte JP Z,62849 irá voltar ao laço em 62849. Se uma tecla for pressionada, o registrador C recebe o valor 255 (deve ser um tipo de flag) e encerra a sub-rotina.

Este é um caso em que o programador não descartou os 3 bits mais significativos da porta 254, para ler o teclado. Estes 3 bits não tem o mesmo valor entre TK90X, TK95 e Spectrum. A solução é reescrever a rotina como na listagem que se segue:

62857   OR %11100000
62859   INC A
62860   JR Z,62849


A instrução OR %11100000 descarta os bits mencionados, INC A terá resultado 0 somente se nenhuma tecla for pressionada e, nesta situação, JR Z,62849 irá retornar ao laço.

Para fazer a alteração acima, basta fazer POKEs em 5 bytes no banco de RAM 3. Mas não é necessário faze-lo, pois já fiz uma versão (2.1) com carregador BASIC modificado. Os arquivos Hobeta encontram-se neste link, outros arquivos podem ser encontrados neste subdiretório.

Nenhum comentário:

Postar um comentário

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