Salut,
Le lien du wiki m'a bien aidé et en me servant des deux docs j'ai presque réussi ? déchiffrer ce bazar.
Je te décris ici ce que j'ai cru en comprendre :
La solution standard est de brancher le multitap sur le port 2, et donc de n'avoir qu'une seule manette sur le port 1.
Ce qui est fait habituellement c'est de lire d'abord les pads 1 ? 3 en mode automatique (Auto-Joypad Read, ce qui est actuellement fait dans PVSnesLib), puis de switcher sur les ports 4 et 5 en changeant le IObit de 1 ? 0, la lecture de ces deux ports doit par contre se faire manuellement. Il est visiblement important de respecter cet ordre pour une question de synchronisation. Et il faut remettre le IOBit ? sa valeur initiale apr?s lecture des 2 manettes.
Etant donné qu'on a 4 registres pour récupérer les données en mode automatique (les fameux JOY1 ? JOY4) et que JOY1 et 3 sont affectés au port manette 1 et JOY2 et 4 au port manette deux on a donc effectivement les infos du joueur 3 sur le registre JOY4 (JOY3 étant réservé au port manette 1)
l'IOBit : c'est le bit n°6 ou 7 du registre IOPort ($4201 (ecriture) et $4213 (lecture))
C'est le bit 6 si le multitap est branché sur le port 1, et le bit 7 s'il est branché sur le port 2.
Donc en passant
En lecture manuelle, avec une manette sur le port 1 et le multitap sur le 2, ça donne donc ça, donné par nocash :
[4016h].Bit0=1 ;-strobe on (to player 1-5)
[4016h].Bit0=0 ;-strobe off (to player 1-5)
read any number of bits from [4016h].Bit0 ;-read Player 1 data
read any number of bits from [4017h].Bit0/Bit1 ;-read Player 2/3 data
[4201h].Bit7=0 ;-select Player 4/5
read any number of bits from [4017h].Bit0/Bit1 ;-read Player 4/5 data
[4201h].Bit7=1 ;(prepare here for next frame) ;-select Player 2/3
do no further access until next frame (allow [4201h].Bit7=1 to stabilize)
On voit que l'IOBit pour le port 2 (bit 7 du registre 4201) passe de 1 ? 0 (puis l'inverse). On récup?re ensuite les bits informations des manettes sur les registres 4016 (port 1 alias JOYA) et 4017 (port 2 alias JOYB).
Si j'ai bien compris en lecture manuelle les infos Data1 sont au bit 0 de JOYA/B (soit l'équivalent de JOY1 et JOY3) et le data2 au bit 1 (JOY2 et JOY4). D'apr?s le wiki il faut lire data1 et Data2 en m?me temps !
"Thus, you must read both bits at once, you can’t choose to read only Data1 and leave Data2 for later."
. Par contre comment on fait pour lire ces bits exactement ça je n'ai pas bien compris (lit-on les 16 bits d'un coup ou faut-il le faire séquentiellement ...)
Si on veut 2 multitaps il faudrait donc faire la m?me manip que pour le multitap sur le port 2, c'est ? dire changer le IOBit du port 1 (bit 6 de JOYA) pour switcher des valeurs des manettes 1/2 ? 3/4 du port 1 (et enfin switcher le bit 7 de ce m?me registre pour passer de 5/6 ? 7/8 sur le port 2)
Je pense que la premi?re lecture en "Auto Joy Reading" doit permettre de lire les 4 manettes suivantes : 1 et 2 du port 1 et 1 et 2 du port 2 (aka les joueurs 5 et 6), ce qui nous remplirait les 4 registres d'un coup (JOY1 ? JOY4, soit 4218h, 421Ah,421Ch et 421Eh). Pour les 4 manettes suivantes ce sera en mode manuel (joueurs 3 et 4 sur le port 1 et joueurs 7 et 8 sur le port 2).
Concernant la détection des multitap je suis toujours dans le flou, voil? ce que dit le wiki :
When Latch is active, 1s will be read from Data2 and 0s from Data1. This is sometimes used to detect the presence of an MP5 unit. The override switch disables this behavior.
((There is some confusion on this point: according to nintendo’s book2, Data1 SHOULD keep returning normal controller data; that is, stuck on the first bit (B button) since shift-register is stopped when “latch is activeâ€. However, according to this document by Jim Christy, the first bit of controller data is not loaded onto the Data line until the falling edge of the latch pulse: presumably, therefore, the console can start the latch pulse, wait a bit, read the data lines to detect an MP5, end the latch pulse, wait a bit longer, then start the first clock pulse and sample the first bit of controller data.)).
Et voil? ce que dit nocash:
Detecting the MP5 Hardware
Below can be used to detect MP5 in ports 1 (n=0) and 2 (n=1). Games do usually check both ports (and show an error messages when sensing a MP5 in port 1).
[4016h].Bit0=1 ;-strobe on (force MP5 Bit1=1)
read 8 bits from [4016h+n].Bit1 to byte A ;-read byte A
[4016h].Bit0=0 ;-strobe off (normal data mode)
read 8 bits from [4016h+n].Bit1 to byte B ;-read byte B
if A=FFh and B<>FFh then MP5=present ;-verify result
If there's no MP5 connected, then A and B will be typically 00h (since most controllers don't use [4017h].Bit1, exceptions are Turbo File, SFC Modem, Voice-Kun, and X-Band Keyboard).
If a MP5 is connected, then A will be FFh, and B will be first 8bit of data from joypad 3 or 5 (which can't be FFh since one can't push all four DPAD directions at once).
J'esp?re que ça aidera !