sábado, 28 de novembro de 2015

Convertendo jogos para uso com Paddles (4)

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: