Como usar um joystick MegaDrive de 3 ou 6 botões em um MSX.


Como funciona um joystick de MegaDrive:

    Os controles para MegaDrive/Genesis funcionam de uma forma muito semelhante ao do MSX, o que permite adapta-los muito facilmente e inclusive aproveitar todos os botões sem necessidade de muitos circuitos intermediários.

    Esta é a pinagem de um conector de controle MegaDrive:
 
1
Para cima
2
Para baixo
3
Esquerda
4
Direita
5
+5V
6
A/B
7
Seleciona
8
Terra
9
Start/C

    Tal como no MSX, praticamente cada os pinos possui um respectivo um botão que o conecta ao a terra quando pressionado, entretanto no joystick do MegaDrive os botões A e B, e os botões C e Start usam pinos compartilhados. Mediante o uso de um multiplexador seleciona-se o botão que se queira ler. Por exemplo, para ler o estado do botão A deve-se setar para 0 (terra) o pino 7 a partir do console (MSX, no nosso caso) e ler o pino 6. Já para ler o status do botão B deve-se setar o pino 7 para 1 e ler o valor do pino 6. O mesmo vale para os botões Iniciar e C, usando-se o pino 9 em vez do 6. Quando o pino 7, correspondente ao multiplexador é 0 (terra) os pinos 1 e 2 são definidos como 0 e não mostram o estado dos botões direcionais para cima e para baixo.

    O joystick de 6 botões é um pouco mais complexo, temos mais 4 botões: X, Y, Z e Mode, ainda no mesmo conector pois deve ser compatível com o joystick 3 botões. Para obter o status dos novos botões de enviar uma sequência de 3 zero-um para o multiplexador, por isso temos de mudar rapidamente o estado do pino 7 desta forma: 010101. Ao fazê-lo ele irá mostrar o status de X, Y, Z e Mode nos pinos 3, 2, 1 e 4, respectivamente. Antes de enviar o último 1, quando o multiplexador contém 0 o joystick retornará os pinos 1, 2, 3 e 4 todos zerados, o que permitirá saber que trata-se de um joystick de 6 botões. Para o joystick mostrar novamente o estado dos botões normais é suficiente setar o multiplexador para 0, embora ele retorne por si mesmo após um determinado tempo (acredito que menos de 1/60s, mas não tenho certeza).

Como funciona a porta de joystick do MSX:

    Esta é a pinagem da porta de joystick do MSX:
 
1
Para cima
2
Para baixo
3
Esquerda
4
Direita
5
+5V
6
Trigger 1
7
Trigger 2
8
OUT
9
Terra

    Os pinos do conector do joystick estão ligados ao PSG (que não serve apenas para gerar o som) e podem controlar seu estado com os registradores 14 e 15. O PSG é controlado diretamente através de portas e A0h, A1h e A2h do MSX ou através das rotinas específicas do BIOS, consulte o MSX Technical Hand Book ou o Livro Vermelho do MSX.

    Através dos bits 0 a 5 do registrador 14 controlamos as entradas da porta de joystick, e os bits 6 e 7 cumprem outras funções que não nos interessam e portanto não os usaremos. Normalmente os pinos do conector do joystick não está conectados e portanto seus bits correspondentes no registrador 14 contém 1. Quando pressionamos um botão ou movemos o direcional do joystick os respectivos pinos são ligados à terra e o bit correspondente é setado para a 0.

    Esta é a distribuição do registrador 14 do PSG:
 
 
b0 Estado do pino 1
b1 Estado do pino 2
b2 Estado do pino 3
b3 Estado do pino 4
b4 Estado do pino 6
B5 Estado do pino 7
b6 Modo do Teclado
b7 Entrada da fita K7

    Com o registrador 15 controlam-se as saídas da porta de joystick, seleciona-se a porta que lerá com o registrador 14 e também se controla o LED de status Kana, embora este último não nos interesse. As saídas da porta de joystick são o pino 8 e os pinos 6 e 7, mas nos dois últimos tocaremos pois não poderíamos ler o status dos gatilhos. Embora este registrador controle as saídas da porta do joystick também pode ser lido, é claro que leremos mesma coisa que foi escrita, o que servirá para mascarar e assim não alterar os bits que não nos interessam.

    Esta é a distribuição do registrador 15 do PSG:
 
b0 Escrita no pino 6 da porta A
b1 Escrita no pino 7 da porta A
b2 Escrita no pino 6 da porta B
b3 Escrita no pino 7 da porta B
b4 Escrita no pino 8 da porta A
B5 Escrita no pino 8 da porta B
b6 Seleção de porta. 0=A/1=B
b7 LED de Status Kana

O adaptador:

    Bem, uma vez que sabemos como funciona o joystick do MegaDrive e sabemos controlar a porta de joystick do nosso MSX, adaptar um joystick é bem simples. O primeiro a se fazer é corresponder cada pino ao seu respectivo, como segue:
 
Puerto MSX Joystick MegaDrive
Pino 7 Pino 9
Pino 8 Pino 7 
Pino 9 Pino 8

    Assim utilizaremos o pino 8 da porta de joystick do MSX, que normalmente não é usado, para controlar o multiplexador do joystick.
    Problema: Por padrão o pino 8 contém 0, o que faz com que o joystick nos mostre o estado dos botões A e Start, mas não o estado das direções para cima e para baixo, e portanto não poderíamos usa-lo como um joystick normal de MSX. Para solucionar, o que podemos fazer (e foi o que fiz) é passar o sinal do multiplexador por um inversor. O inversor inverte o sinal que chega, ou seja quando chega um 0 ele irá enviar um 1 e vice-versa, e conseguiremos que o joystick retorne por padrão o status de todos os botões direcionais e os botões A e C, como trigger 1 e 2. Quando queremos acessar o resto dos botões do joystick bastará proceder como expliquei acima, mas considerando que temos os pinos 7 a 9 reordenados e a inversão no multiplexador.

    Como um inversor utilizei o integrado 74LS04, que é muito simples e barato. Alimentação e o aterramento podem ser obtidos diretamente da própria porta de joystick.

74LS04
    Então, essas são as conexões:

Esquema

Conclusão:

    Depois de tudo pronto teremos um joystick de 6 (na realidade são 8) botões funcionais a partir do MSX e também compatível com o padrão, pois os botões B e C são os gatilhos 1 e 2, respectivamente. Como curiosidade vale dizer que o joystick é utilizável sem adaptador, mas apenas o botão B estará disponível como trigger 1 apenas pela sorte de o pino 8 estar por padrão em 0 por estar ligado ao terra uma vez que este corresponde ao pino de seleção no conector do joystick do MD. Se não fosse assim nenhum botão funcionaria.
    Fiz a montagem em uma placa-padrão, que coube em uma caixa do tamanho de uma caixa de fósforos. Não tive nenhum problema com um joystick de 6 botões AsciiWare, muito bom por sinal. Para testá-lo criei um utilitário JoyMega, que verifica o status de todos os botões.
    Quero lembra-lo que tudo o que eu disse sobre o funcionamento do joystick não leva em conta o adaptador, ou seja para programá-lo no MSX deve-se levar em conta que o pino de comando do multiplexador esta invertido.
    Veremos se alguém lerá isto e se animará de fazer um jogo que suporte esses joysticks. Para qualquer dúvida, escreva para sergio.guerrero@ctv.es.
 

Saudações,

Sergio Guerrero Miralles.