Ad Astra e Interface 2
Eletrônica

Ad Astra e Interface 2


Depois que o meu joystick passou a funcionar, comecei a testá-lo na entrada existente no TK90X. Quando tentei jogar Ad Astra, percebi que o controle não funcionava como deveria.


No menu acima, as opções 5 e 6 corresponderiam às duas entradas disponíveis no ZX Interface 2 (vide mais detalhes no TK-Wiki). Entretanto somente uma das entradas era acionada em ambas as opções e, por uma infelicidade, justo a que não correspondia ao padrão do TK90X .

Resolvi investigar no debugger do Fuse e encontrei a rotina de leitura dos controles. Esta rotina assume que o acumulador (registrador A do Z80) indica o tipo de interface selecionado. O início da listagem revela que o padrão de bits representado o estado da interface Kempston é armazenado na variável em 24811:

; O acumulador contém 1=Kempston, 2=Sinclair 2, 3=Sinclair 1 
;e 4=Cursor.
25537   CP 1                    ; Salta para diante se não for
        JR NZ,25550             ;
Kempston.

        LD BC,31                ; Porta para Kempston.
        IN A,(C)                ; Faz leitura da porta.
        LD (24811),A            ; Guarda resultado da leitura.
        RET


A rotina segue e, se a entrada 2 da Interface 2 está sendo usada, faz se a leitura as teclas 1 a 5 e o resultado é guardado na mesma variável após o devido tratamento:

25550   CP 2                    ; Salta para diante se não for
        JR NZ,25582             ;Sinclair 2. 
25554   LD BC,63486             ; Porta para Sinclair 2.
        IN A,(C) 
              ; Faz leitura da porta.
        LD B,0                  ; Inicializa modelo de bits.
        BIT 0,A                 ; Se a tecla 1 (esquerda) foi

        JR NZ,25567             ;pressionada, levanta bit 1 de B.
        SET 1,B
25567   BIT 1,A                 ; Se a tecla 2 (direita) foi
        JR NZ,25573             ;
pressionada, levanta bit 0 de B.
        SET 0,B
25573   AND 011100           ; Zera os bits exceto b2 a b4.
        XOR 011100           ; Inverte os bits b2 a b4 e
        OR B                    ;
mescla com os bits em B.
        LD (24811),A            ; Guarda resultado final. 

        RET

Na sequência examina-se a possibilidade a opção da entrada 1 da Interface 2:

25582   CP 3                    ; Salta para diante se não for
        JR NZ,25635             ;Sinclair 1. 
        LD A,(24814)            ; Lê Sinclair 2 se for o primeiro
        CP 1                    ;
jogador no modo 2 jogadores.
25591   JR Z,25554
        LD BC,61438             ; Porta para Sinclair 1.
        IN A,(C)                ; Faz leitura da porta.

        BIT 0,A                 ; Se tecla 0 foi pressionada,
        JR NZ,25606             ;
levanta bit 4 de B.
        SET 4,B
25606   BIT 1,A                 ; Se tecla 9 foi pressionada,
        JR NZ,25612             ;
levanta bit 3 de B.
        SET 3,B
25612   BIT 2,A                 ; Se tecla 8 foi pressionada,
        JR NZ,25618             ;
levanta bit 2 de B.
        SET 2,B
25618   BIT 3,A                 ; Se tecla 7 foi pressionada,
        JR NZ,25624             ;
levanta bit 0 de B.
        SET 0,B
25624   BIT 4,A                 ; Se tecla 6 foi pressionada,
        JR NZ,25630             ;
levanta bit 1 de B.
        SET 1,B
25630   LD A,B
        LD (24811),A            ; Guarda resultado final.

        RET

Na terceira linha deste trecho, verifica-se o uso de uma variável em 24814 que indica qual jogador está na vez. No modo para 1 jogador, seu valor é sempre 1; caso seja para 2 jogadores, a variável pode assumir valor 1 (jogador 1) ou 2 (jogador 2).  Nas linhas seguintes da listagem pode-se observar que na vez do jogador 1, o programa desvia sempre para a leitura do joystick 2 da Interface 2. Somente quando for a vez do jogador 2, aciona-se o joystick 1.

Agora ficou claro do motivo do Joystick 1 não funcionar no modo para 1 jogador, o que é uma dificuldade para o TK90X. A solução deste problema é simples, basta inverter a lógica do desvio condicional em 25591 de JR Z para JR NZ, com o seguinte POKE:

POKE 25591,32

que pode ser introduzido via Multiface 1 ou no carregador BASIC.

Agora sim, consigo jogar Ad Astra no TK90X com o meu joystick renovado.



loading...

- Dica Tvs Panasonic Tx-32pk25f Chassis Euro-4h
Defeito--Imagem a preto e branco ou com as cores alteradas com manchas como se o              TRC estivesse magnetizado. Foi regravada a eeprom mas não resultou. Em           ...

- Dica Tvs Panasonic Tx-25xd3e Chassis Euro 2m
Defeito--Este  tv estava em protecção, trazia o transístor de saída de linhas (2SD1577-               LB) em curto. Depois de o substituir, o tv arrancou apresentando o seguinte       ...

- Número Aleatório Por Xor-shift
Apresento a sub-rotina de geração de número pseudoaleatório que foi usada na minha parte do demo Mission Highly Improbable.  Anteriormente mostrei a sub-rotina de Phantom Club para a mesma finalidade, porém a qualidade da sequência gerada...

- Outra Rotina De Detecção De Ram 48/128k
Eu publiquei nesta postagem, uma rotina que faz a detecção no TK90X da configuração com ou sem a TKMEM-128 (128 ou 48K de RAM). Modifiquei-a e consegui fazer com que ficasse menor ainda (25 bytes).  Esta rotina testa se ocorre chaveamento entre...

- Thundercats V. 2 Para Basic 128
Mal acabei de lançar uma adaptação do Thundercats para Beta e TKMEM-128 e estou com a versão 2. A versão anterior tinha um problema: não consegue carregar a partir do BASIC 128, portanto tinha que dar um 'USR 0' antes. Na versão 2 não...



Eletrônica








.