Pesquisa das funções que fazem a leitura do teclado / joysticks (continuação)
Começamos nossa análise ao redor dos endereços onde a função GTSTK (Get Stick) é chamada.Line 2043: 4f37 cdd500 call 00d5h
Line 2058: 4f49 cdd500 call 00d5h
Line 2061: 4f4f cdd500 call 00d5h
Line 4602: 6214 cdd500 call 00d5h
O objetivo é rastrear as referências a esta chamada. Queremos saber se a leitura do Joystick é feita no meio do loop do jogo, ou se é chamada a partir dele. Devemos seguir o código para trás e para a frente até chegar a um bloco estanque. No caso temos todo o bloco compreendido entre os endereços 0x4f1c e 0x4f5e.
Pesquisando então pelo endereço 0x4f10 achamos quatro chamadas:
Precisamos analisar esta função e ver o que ela recebe de entrada e o que retorna de saída. As primeiras instruções mostram que se o registrador A for igual a 0xFF na entrada, a função desvia para 0x4f48.
Analisando a primeira parte da função (chamada com A!=255), vemos que a matriz de teclado também é lida (função SNSMAT - 0141h) pesquisando-se as teclas 'C' (row 3 bit 0) e 'Z' (row 5 bit 7)
4f1f 3e05 ld a,05h
4f21 cd4101 call 0141h
4f24 1607 ld d,07h
4f26 cb7f bit 7,a Testa 'Z'
4f28 3e07 ld a,07h Retorna 7 (esquerda)
4f2a c8 ret z
4f2b 3e03 ld a,03h
4f2d cd4101 call 0141h
4f30 cb47 bit 0,a Testa 'C'
4f32 3e03 ld a,03h Retorna 3 (direita)
4f34 c8 ret z
Caso nenhuma destas teclas esteja pressionada, a rotina lê o Joystick 2. Caso o joystick 2 esteja em repouso, ou na posição 1 (cima) ou na posição 5 (baixo) a função retorna. Por outro lado, se o joystick estiver nas posições 2,3,4 (direita e diagonais) a função retorna o valor '3' (direita). Analogamente, se a posição for superior a 5 (6,7,8 - esquerda e diagonais) a função retorna o valor '7' (esquerda).
4f35 3e02 ld a,02h
4f37 cdd500 call 00d5h
4f3a fe02 cp 02h retorna se menor que 2
4f3c d8 ret c
4f3d fe05 cp 05h retorna se igual a 5
4f3f c8 ret z
4f40 3803 jr c,4f45h ; (+03h)
4f42 3e07 ld a,07h retorna 7 (esquerda)
4f44 c9 ret
4f45 3e03 ld a,03h retorna 3 (direita)
4f47 c9 ret
Os valores 3 e 7 correspondem às posições direita e esquerda, respectivamente que são os mesmos que a função GTSTK retorna quando o joystick é acionado para a esquerda ou a direita.
Já o outro trecho de código lê o teclado e o joystick 1 e também retorna 3 ou 7 caso um destes dois dispositivos esteja nas posições direita/diagonais-direita ou esquerda/diagonais-esquerda.
4f45 3e03 ld a,03h Retorna 3 (direita)
4f47 c9 ret
4f48 af xor a A=0, Direcionais teclado
4f49 cdd500 call 00d5h
4f4c f5 push af
4f4d 3e01 ld a,01h A=1, Joystick 1
4f4f cdd500 call 00d5h
4f52 c1 pop bc
4f53 b0 or b
4f54 fe02 cp 02h
4f56 d8 ret c
4f57 fe05 cp 05h
4f59 c8 ret z
4f5a 38e9 jr c,4f45h ; (-17h)
4f5c 3e07 ld a,07h Retorna 7 (esquerda)
4f5e c9 ret
Este trecho inteiro é candidato a local para se instalar os patches, mas agora é preciso descobrir como o jogo transforma o resultado dos controles direcionais em coordenadas da personagem, que é o tema do próximo artigo.
Nenhum comentário:
Postar um comentário