sábado, 5 de maio de 2012

The Fury (Martech)

Estive trabalhando na adaptação do jogo The Fury para TK90X da Martech, para funcionar na interface de drive Beta 48. Eu achava que ia ser fácil, pois o programa não era protegido, porém a incompatibilidade da porta 254 novamente fez estragos.

Após escolher o tipo do controle (teclado ou um dos padrões de joystick), o jogador tem a opção de introduzir seu nome. Porém, na hora de digitar, a leitura do teclado repete muito rápido. Só de apertar brevemente a tecla C, aparece no vídeo:


Fica impossível de digitar corretamente, pois se preenche todo o espaço com uma tecla só. Para desvendar a causa, tive que desmontar (disassembly) a rotina da leitura do teclado. A listagem completa está junto com o jogo adaptado. Nesta postagem mostrarei só as partes relevantes para o entendimento do problema.

A leitura do teclado ocorre no seguinte trecho:

52231   LD C,(IX+0)     ; BC=endereço da porta a ler
        LD B,(IX+1)
        LD (52519),BC   ;que é guardado em 52519.
52241   IN A,(C)        ; Faz leitura da porta.
        LD B,5          ; Contador descendente de bits (máx. 5).
        LD E,0          ; Contador ascendente de bits.
        LD D,A          ; Guarda valor lido.
52248   RRCA            ; Se o bit menos significativo for 0, is-

        JP NC,52270     ;to é, tecla pressionada, salta adiante,
        INC E           ; Senão atualiza os dois contadores
        DJNZ 52248      ;e repete até o bit 5.
...     ...


Realiza-se a leitura da porta 254, o valor é guardado no registrador D e procura-se descobrir se alguma tecla foi pressionada. Caso tenha sido pressionada uma tecla, ocorre um salto para o endereço 52270, cuja listagem é:

; Repete o laço abaixo enquanto a tecla continuar pressionada,
; isto é, enquanto a leitura da porta der mesma leitura.
52272   LD C,(IX+0)    ; BC contém endereço da porta a ser lida. 
        LD B,(IX+1)

        IN A,(C)       ; Faz leitura da porta.
52280   CP D           ; Se valor for igual ao que foi lido

        JP Z,52272     ;antes, repete novamente todo ciclo de
                       ;leitura.

Para evitar a repetição da leitura da mesma tecla, compara-se a leitura da porta 254 com o valor lido anteriormente, que está guardado no registrador D. Entretanto no TK90X o bit 5 fica oscilando e a leitura da porta fica diferente, mesmo quando a tecla continuar sendo pressionada. Esta não é a forma adequada para a leitura e interpretação do teclado, pois somente os 5 bits menos significativos deveriam ser considerados.

Para contornar o problema, criei um pequeno patch (só 12 bytes!) que substitui o trecho acima. O tratamento da porta 254 só considera os 5 bits correspondentes ao teclado.

; Patch a ser aplicado no jogo The Fury para corrigir problema de
;
leitura de teclado no TK90X.
        ORG 52272
Loop:
        LD C,(IX+0)         ; BC=porta 254.
        LD B,0
        IN A,(C)            ; Faz leitura da porta.
        CPL                 ; Inverte bits, tecla pressionada 

                            ;terá valor 1.
        AND 00011111        ; Somente se alguma tecla for 

                            ;pressionada,
        JR NZ,Loop          ;repete o laço.


Após aplicação do patch, o programa passa a funcionar corretamente e torna-se possível digitar o nome do jogador:


Outra notícia boa é que descobri como fotografar a tela da TV com a minha câmera.

O jogo adaptado está disponível no 4 Sharednecessário ter uma conta para baixar). O ZIP contém arquivos no padrão Hobeta, para ser passado no disco ou em arquivo TRD. Mais detalhes estão contidos no arquivo TXT.

Nenhum comentário:

Postar um comentário

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