Joystick C64 vs Joypad NES

Joystick e Joypad a confronto

Vi siete mai chiesti come funzionano questi pad che con pochi fili gestiscono tanti pulsanti e le direzioni mentre il classico joystick del Commodore o dell’Atari aveva solo un pulsante?! Mettiamo al confronto queste due diverse tecnologie.

Come non ricordare il famoso Quickshot, un joystick ergonomico ma molto facile da rompere.
In passato ne ho avuti diversi e provai anche ad aggiustarli ma senza successo.. Questo modello non usava microswitch ma una piccola piastra di metallo leggermente curva che  sotto la pressione della leva chiudeva il contatto. Il problema era proprio quello, si esercitava una grande forza e quel pezzettino si metallo si distruggeva! Altri modelli di joystick erano più robusti ma la tecnologia era sempre quella, vediamo in dettaglio come funzionano.

Semplice no? ogni tasto o direzione è collegato ad un contatto che si chiude verso il GND, quindi per ogni movimento occorre un pin. Si ha così il vantaggio della lettura dello stato che sarà molto semplice ma utilizzerà un gran numero di porte. Il grande limite dei Joystick della Commodore o in genere Atari compatibili era proprio quello di avere un solo tasto, di solito assegnato al fuoco, mentre altre funzioni come salto o bombe si dovevano integrare con la tastiera o altre combinazioni.

Questo è tanto diverso?

A parte la forma, questo pad ha 4 direzioni e 4 pulsanti, si potrebbe pensare che come per il precedente, anche questo possa utilizzare un cavo per ogni funzione, già con 9 pin sarebbe possibile.
Questo Joypad usato dalla Nintendo in realtà è attivo rispetto all’altro che contente solo degli interruttori, si questo ha un chip che gestisce gli 8 contatti e invia il loro stato uno alla volta.
Converte 8 ingressi paralleli in 1 uscita seriale, ma come?

Questo è il suo funzionamento, sul cavo di questo joypad troviamo 2 pin per l’alimentazione del circuito (5V) ed altri 3 pin nominati Latch, Clock, Data.
Il pad non farà nulla anche se alimentato, saremo noi ad andare ad interrogarlo a certi intervalli per capire lo stato dei pulsanti.
Dobbiamo inviare un impulso di 12us sul pin Latch (attivo alto) e poi possiamo iniziare ad inviare un segnale di clock (normalmente a livello alto) con un periodo di 6us (dutty 50%). Il joypad invierà sulla linea Data lo stato del pulsante/direzione, in successione ad ogni fronte di salita del clock, quindi possiamo leggerli uno alla volta iniziando dal tasto A fino alla direzione ->.  Pulsante premuto = livello basso, non premuto = livello alto
Complicato?
No, il funzionamento è semplice, ma va gestito, non come il precedente joystick, ma con un integrato che diverse volte al secondo farà questa procedura di lettura.
Per il pad del Super Nintendo vale la stessa cosa, solo che avendo più tasti invierà più dati ma i fili saranno gli stessi.

In questo caso il chip invierà 16 stati anche se nel pad sono presenti 12 tasti, gli ultimi 4 stati sono sempre a livello alto e non utilizzati in questo sistema.

Se volessi collegare il joypad del NES o Super NES Commodore64?

Si, si può fare ma ovviamente occorre un circuito che legga il pad e trasformi il segnale ricevuto portando al gnd i relativi pin della porta joystick, non è una cosa complicata ma già sorge un problema, il Commodore non ha tutti questi segnali!, già si dovranno usare solo le direzioni ed un solo tasto. sad
In realtà si può collegare utilizzando la porta utente che può essere usata per comunicare con altre periferiche visto che ha diversi pin I/O.
Se colleghiamo il pad su questa porta, poi dobbiamo scrivere un programma per configurare i pin utilizzati in ingressi e uscite e gestire noi l’invio e ricezione dei dati. Difficile? mah, dipende! scriverlo in basic non è complicato ma come vedere dal video è inutilizzabile, l’interprete impiega troppo tempo a inviare e ricevere segnali e ancora di più a visualizzarli a schermo!!.
Questo è il codice che ho scritto per questo test: (per fortuna non c’è bisogno di avere clock e segnali con timing precisi !)
5 rem pb3: clock
6 rem pb5: latch
7 rem pb6: data
90 dim l(15):print"S"
100 poke56579,40:rem pb3-5 output
110 poke56577,8:rem clock alto
120 for x=0 to1:next:rem pause
200 poke56577,40:rem latch on+clk
205 for x=0 to 1:next:rem pause
206 poke56577,8:rem latch off
210 for x=0 to 2:next:rem pause
220 x=0
230 poke56577,0:for y=0 to 1:next
235 l(x)=peek(56577):for y=0to1:next
240 poke56577,8:for y=0 to 1:next:x=x+1
250 if x<16 then goto230
260 poke56577,8:rem clock alto
270 print"s":for x=0 to 15
280 if(l(x)and64)=0 then print"*";
290 if(l(x)and64)>0 then print".";:nextx
300 goto 200
READY.

Mentre per riuscire ad utilizzarlo occorre smanettare un po’ con l’assembler, questo è il codice che ho scritto per l’esempio (da loc. $2000):
.C:2000  A2 00       LDX #$00
.C:2002  A0 00       LDY #$00
.C:2004  A9 28       LDA #$28
.C:2006  8D 03 DD    STA $DD03
.C:2009  A9 08       LDA #$08
.C:200b  8D 01 DD    STA $DD01
.C:200e  C8          INY
.C:200f  C0 FF       CPY #$FF
.C:2011  D0 FB       BNE $200E
.C:2013  A0 00       LDY #$00
.C:2015  A9 28       LDA #$28
.C:2017  8D 01 DD    STA $DD01
.C:201a  C8          INY
.C:201b  C0 20       CPY #$20
.C:201d  D0 FB       BNE $201A
.C:201f  A0 00       LDY #$00
.C:2021  A9 08       LDA #$08
.C:2023  8D 01 DD    STA $DD01
.C:2026  C8          INY
.C:2027  C0 10       CPY #$10
.C:2029  D0 FB       BNE $2026
.C:202b  A0 00       LDY #$00
.C:202d  A9 00       LDA #$00
.C:202f  8D 01 DD    STA $DD01
.C:2032  AD 01 DD    LDA $DD01
.C:2035  9D 00 21    STA $2100,X
.C:2038  C8          INY
.C:2039  C0 10       CPY #$10
.C:203b  D0 FB       BNE $2038
.C:203d  A9 08       LDA #$08
.C:203f  8D 01 DD    STA $DD01
.C:2042  A0 00       LDY #$00
.C:2044  E8          INX
.C:2045  E0 10       CPX #$10
.C:2047  D0 DD       BNE $2026
.C:2049  A2 00       LDX #$00
.C:204b  BD 00 21    LDA $2100,X
.C:204e  29 40       AND #$40
.C:2050  C9 40       CMP #$40
.C:2052  F0 08       BEQ $205C
.C:2054  A9 2A       LDA #$2A
.C:2056  9D 00 04    STA $0400,X
.C:2059  4C 61 20    JMP $2061
.C:205c  A9 2E       LDA #$2E
.C:205e  9D 00 04    STA $0400,X
.C:2061  E8          INX
.C:2062  E0 10       CPX #$10
.C:2064  D0 E5       BNE $204B
.C:2066  60          RTS

Post Views: 607