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:
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 é:
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.
; 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 Shared (é necessá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.