Côté bricolage :

  Une carte deux    joysticks pour votre   Zx81 et    TS1000. 

TIREZ PLUS DE VOTRE SINCLAIR

Mis à Jour :
Octobre 2008







Merci de faire part de la présence de cette page à l'auteur si vous le connaissez ou si vous avez la possibilité de le joindre.
Diffusion sur internet sous réserve de non utilisation mercantile, à titre pédagogique et pour la contribution de l'auteur à l'histoire du ZX81.



-

« Carte deux Joysticks pour ZX81. »



Montage pour brancher deux joysticks simultanément à l'arrière d'un Zx81.



Cette carte permet de brancher deux manettes de jeux numérique type « Amstrad » à micro-switchs (ou mico-contacts) ou analogique de type IBM, pour jouer à vos jeux.
Il faut savoir que cette interface ne se substitut pas aux touches du clavier, mais est gérée indépandement, au niveau logiciel.

Donc, il est fort peu probable que cette carte puisse fonctionnée avec les jeux du commerce.

Toutefois, sa programmation est simple mais nécessite qu'une petite routine en language machine.


Il est a préciser que toutes les manettes de jeux avec une prise 9 broches ne sont pas compatibles avec cette carte ...

Seuls les joysticks pour Amstrad, Spectrum et Atari, peuvent fonctionner avec ce montage.
Vous pouvez vérifier la disposition des broches à l'aide du schéma inclus dans le diagrammes filaire de la carte.
Puis modifier le branchement du joystick, soit à la prise, soit à l'intérieur du joystick lui même.

Pour les essais, il suffit de court-circuiter les broches avec le commun à l'aide d'un simple fil.



Schéma de câblage.

Zoomer...


Carte n°1:

Version double faces.

Implantation: (face avant/composants)

Zoomer...



PCB du montage double faces:


Nota:
1 / Ce PCB est la face composants (composants sur le coté cuivre)
2 / Ce PCB est à l'état de projet et peut comporter des erreurs.
3 / La taille de cette image doit être ajustée à la taille réelle sans changer la résolution de l'image.
4 / Dans cette configuration, les supports d'IC seront difficiles à souder donc attention aux brochages.

Face cuivre (face arrière)

Zoomer...

Face Composants (face avant)



Zoomer...

Photo de la carte (face avant et arrière)

Carte n°2:

Version simple face. (avec ponts « straps »)

Zoomer...

Face cuivre (face arrière)

Zoomer...



Nomenclature des composants :

Références

Descriptif

Quantité





IC1: 74 LS 32

TTL AND 4 modules.

1

IC4: 74 LS 244

TTL Buffer octal à 3 positions.

2

RS1: 10K Ohm x 8 sil
avec point commun.

Réseau de résistances avec point commun.

2

R1: 1K

Résistance – 1/4w

1

Connecteur 2x23 points fenelle avec détrompeur réajustable.(Pas 2,54mm)
Ou 2x25 points coupé de chaque coté.
Attention, vous n'avez que 2mm de jeu sur la fenêtre du port de sortie du Zx !

Droit à souder.

1

Connecteur 9 points mâle Sub-D
Type mini Rs232c.

Coudés à souder.

2

Supports de CI et boîtier noir pour le côté Pro...

-

-



Fonctionnement à partir du Basic:


Le système utilise l'entrée IORQ du bus du Zx81.

Sa lecture impose une petite routine assembleur qui va recopier l'état du bus dans une valeur basic.


Les deux adresses IORQ sont $DF pour le port A et $EF pour le port B.


Soit le bit A5 à 1 pour le Port A et le bit A4 à 1 pour le Port B.


PORT A=00100000=> $20 XOR $FF = $DF = 223.
PORT B=00010000=> $10 XOR $FF = $EF = 239.

En fait, les valeurs sont active à l'état 0 sur le port IORQ, donc il y a inversion des valeurs, d'où le OU exclusif avec 255.


La fonction IN A,($DF) sera utiliser pour charger le registre A avec le contenu du port de données (de D0 à D7).


Comme un USR renvoie la dernière valeur de BC avant le RET (retour vers le basic), la valeur de la variable sera égale à la valeur de bus de données.
... Et donc l'état de la manette de jeux au moment de la capture du bus de données.


Port A : IN A,($DF) / Port B : IN A,($DF)

Avec le bouton action ou « FIRE »

Valeur:

Action:

Valeur:

Action:

0

Repos.

16

FIRE

1

RIGHT

17

FIRE+RIGHT

2

LEFT

18

FIRE+LEFT

3

-

19

-

4

DOWN

20

FIRE+DOWN

5

DOWN + RIGHT

21

FIRE+DOWN+RIGHT

6

DOWN + LEFT

22

FIRE+DOWN+LEFT

7

-

23

-

8

UP

24

FIRE+UP

9

UP + RIGHT

25

FIRE+UP+RIGHT

10

UP + LEFT

26

FIRE+UP+LEFT

11

-

27

-

12

-

28

-

13

-

29

-

14

-

30

-

15

-

31

-



Exemples BASIC et driver en language machine:


Analyse simple des directions: (sans associations multiples)

10 REM 12345678901234
20 POKE 16514,1
30 POKE 16515,0
40 POKE 16516,0
50 POKE 16517,219
60 POKE 16518,223
70 POKE 16519,79
80 POKE 16520,201
90 POKE 16521,1
100 POKE 16522,0
110 POKE 16523,0
120 POKE 16524,219
130 POKE 16525,239
140 POKE 16526,79
150 POKE 16527,201

160 IF USR 16514<>0 THEN GOTO 200
170 IF USR 16521<>0 THEN GOTO 400
180 GOTO 160

200 LET PORTA= USR 16514
210 IF PORTA<17 THEN GOTO 250
220 PRINT ''PORT A: FIRE +'';
230 LET PORTA=PORTA-16
240 GOTO 260
250 PRINT ''PORT A:''
260 PRINT '' ''; ''RIGHT'' AND (PORTA=1);''LEFT'' AND (PORTA=2);''DOWN'' AND (PORTA=4);''UP'' AND (PORTA=8);''FIRE'' AND (PORTA=16)
270 GOTO 160

400 LET PORTB= USR 16521
410 IF PORTB<17 THEN GOTO 250
420 PRINT ''PORT B: FIRE +'';
430 LET PORTB=PORTB-16
440 GOTO 260
450 PRINT ''PORT B:''
460 PRINT '' ''; ''RIGHT'' AND (PORTB=1);''LEFT'' AND (PORTB=2);''DOWN'' AND (PORTB=4);''UP'' AND (PORTB=8);''FIRE'' AND (PORTB=16)
470 GOTO 160

Nota:
- Le bouton « Fire » est traité en premier puis, s'il est pressé, retranché de la valeur.
- Pas de LET dans l'analyse du port car cela rajoute des lignes dans le cycle de scrutation et donc ralentie l'affichage/programme.



Analyse des directions à associations multiples: (...Enfin ... dans tous les sens, Quoi !)

10 REM 12345678901234
20 POKE 16514,1
30 POKE 16515,0
40 POKE 16516,0
50 POKE 16517,219
60 POKE 16518,223
70 POKE 16519,79
80 POKE 16520,201
90 POKE 16521,1
100 POKE 16522,0
110 POKE 16523,0
120 POKE 16524,219
130 POKE 16525,239
140 POKE 16526,79
150 POKE 16527,201

200 LET PORTA= USR 16514
205 LET FIRE=0

210 IF PORTA<16 THEN GOTO 215

211 REM -FIRE PRESSED-
212 LET PORTA= PORTA-16

215 IF PORTA=0 THEN GOTO 200
218 IF PORTA<>1 THEN GOTO 240
220 REM RIGHT
230 GOTO 200
240 IF PORTA<>2 THEN GOTO 270
250 REM LEFT
260 GOTO 200
270 IF PORTA<>4 THEN GOTO 300
280 REM DOWN
290 GOTO 200
300 IF PORTA<>8 THEN GOTO 330
310 REM UP
320 GOTO 200

330 IF PORTA<>5 THEN GOTO 360
340 REM DOWN+RIGHT
350 GOTO 200
360 IF PORTA<>6 THEN GOTO 390
370 REM DOWN+LEFT
380 GOTO 200
390 IF PORTA<>9 THEN GOTO 420
400 REM UP+ RIGHT
410 GOTO 200
420 IF PORTA<>10 THEN GOTO 200
430 REM UP+LEFT
450 GOTO 200

Nota:
La programmation en  IF <> peut-être remplacée par le IF = classique en modification de variables simples de type X/Y, car cela peut accélérer la rapidité d'execution du programme basic.

Voilà, le seul piège qu'il vous faudra éviter, est dû au traitement purement numérique de l'information.
Surtout au niveau du traitement du bouton « Fire » qui est simultané aux autres commandes.
Ce qui est aussi un avantage car la fonction INKEY$, elle, ne traite qu'une touche en même temps (sauf pour les touche Shiftées naturellement).

Le code assembleur est noté sur le diagramme de câblage des composants.


Brochage des composants :


74LS32 & 74LS244


(voir schéma)





Si vous planifiez de réaliser ce montage, ce serai gentil de me contacter
pour donner vos truc et astuces ou photos pour la fabrication de cette carte.

zx81.ordi5 § free.fr

Je vous souhaites un bon bricolage ...



Vos astuces et vos réactions: