Muti-Multitap ?

Démarré par ccc, 13 Août 2012 à 22:35:38

« précédent - suivant »

0 Membres et 1 Invité sur ce sujet

ccc

J'ai une petite question par rapport ? la gestion de plus de deux manettes via un multitap: dans a doc il est indiqué qu'on peut monter en gros jusqu'? 4 pads (cf http://www.portabledev.com/media/SNES/PVSnesLib/doc/a00023.html).
Je n'ai pas encore essayé mais comme je n'ai pas de probl?me avec 2 j'imagine que ça ne doit pas poser de probl?mes.
Mais voil?, serait-possible de gérer plus de 4 pads ? Certains jeux officiels permettent de jouer ? 5, et des hombrew permettent m?me de jouer ? 8 (http://arstechnica.com/gaming/2008/10/8-player-snes-game-load-up-on-spells-bring-your-friends/).
Le jeu que j'ai en t?te devrait permettre de jouer ? 16 en m?me (deux par manette !) mais pour ça il me faudrait pouvoir gérer 8 pads...

Serait-ce possible avec PVSnesLib ? Ou avec une future évolution de celle-ci  ::)?

alekmaul

Bah, je dirais oui. Faut juste savoir quel registre il faut taper pour récupérer les infos.
Ensuite, les manettes sont gérées par des strutures, donc l'évolution serait tr?s simple ^^
Enfin, c'est 2 manettes , pas 4, une coquille dans la doc ça :/

Citationu16 pad_keys[2] = {0,0};
u16 pad_keysold[2]  = {0,0};
u16 pad_keysrepeat[2]  = {0,0};

Citation//---------------------------------------------------------------------------------
void scanPads(void) {
   unsigned int i;
   u16 pressed,released;

   while(REG_HVBJOY & PAD_BUSY); // Wait Auto-Joypad-Read Busy Flag not set

   for(i=0;i<2;i++) {
      pad_keysold = pad_keys;
      pad_keys = (REG_JOYxLH(i) & 0xFFF0);// ^ 0xFFF0;  // Read Auto-Joypad
   }
}

ccc

Le forum m'en veut ça fait 4 fois que j'essaye de taper ma réponse :-(
Et ? chaque fois je raccourcis la taille de celle-ci.
Les infos sur les registres sont l? http://nocash.emubase.de/fullsnes.htm#snescontrollersmultiplayer5mp5fiveplayeradaptor
Pour faire vraiment court j'arrive pas ? tout saisir, j'esp?re que pour toi ça sera plus clair.

En tout cas il semble exister 4 registres de manettes (JOY1 ? JOY4) et ? priori tu n'en utilises que 2. A voir si une simple augmentation de la taille du tableau et de nombre de fois o? on parcourt la boucle suffirai (mais pas sur vu ce qu'il y a écrit dans la doc de nocash)

PS: il manque un "k" ? alekmaul dans le fichier pads.c

alekmaul

Bizarre pour les pbs du forum, j'ai pas ça moi ...

A propos du k, tous les fichiers ont le pb, lol, j'ai corrigé.
Pour le multitap, de ce que je vois, y'a aussi des infos ici : http://wiki.superfamicom.org/snes/show/Controllers#multitap

Je regarde dés que je peux, on m'a sollicité aussi sur d'autres trucs pas sur Snes en ce moment ....

ccc

C'est pas le forum qui a un probl?me c'est moi, ? force de faire des allers-retours avec la doc j'ai laissé passé le timer d'une heure et j'ai été déconnecté automatiquement, je plaide coupable !

Merci pour le lien vers la doc, elle a l'air de dire en plus clair ce que celle que j'avais trouvé racontait, je vais potasser ça !

ccc

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 !
Citation"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 :
CitationWhen 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:
CitationDetecting 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


CitationIf 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 !



alekmaul

Oui, merci, dés que je peux , je regarde en détail mais pour l'instant j'ai d'autres priorités sur un autre projet.

ccc

Bonjour !

J'ai pris un peu de retard (j'étais sur un hack de Super Mario Kart qui m'a pris beaucoup de temps :-[), mais je suis toujours motivé !
As-tu eu le temps de jeter un coup d'?il ? mes histoires de multitap ? Aucune urgence je pourrai tester mon principe avec 4 joueurs / 2 manettes en attendant.

Sinon y'a encore des rigolos qui s'amusent avec la page d'accueil du wiki .
Hier c'était un texte sur l'Afrique, aujourd'hui ce sont des portes industrielles  >:( Ils n'en finiront donc jamais...

alekmaul

nan, pas de temps sur le multitap, je suis moi m?me "trop" pris sur une autre console ...
Un peu d'aide sur pvsneslib serait sympa pour faire progresser la lib ...
Pour le wiki, j'ai changé tout cela ce week end, suite ? un message hier d'un autre membre ....
Y'en a, que ça ? foutre ... J'ai donc désactivié les inscriptions automatiques sur le wiki, faudra me demander pour modifier ...

ccc

Citation de: alekmaul le 04 Mars 2013 à 06:12:55
nan, pas de temps sur le multitap, je suis moi m?me "trop" pris sur une autre console ...
Un peu d'aide sur pvsneslib serait sympa pour faire progresser la lib ...
Pour le wiki, j'ai changé tout cela ce week end, suite ? un message hier d'un autre membre ....
Y'en a, que ça ? foutre ... J'ai donc désactivié les inscriptions automatiques sur le wiki, faudra me demander pour modifier ...

Ok je vais voir ce que je peux faire, sans garantie de résultat hein mais ça aura le mérite de me faire mettre les mains dans le cambouis  ;)
Mais je vais déj? mettre au propre ma gestion des sprites sur ma démo et écrire une partie du wiki ? ce sujet (que je t'enverrai pour correction et pour mise en ligne)

alekmaul

Quand tu dis "propre gestion des sprites", c'est pour gérer quoi exactement ? Qu'est-ce qui manque dans la version actuelle pour toi ?

ccc

Citation de: alekmaul le 08 Mars 2013 à 06:28:27
Quand tu dis "propre gestion des sprites", c'est pour gérer quoi exactement ? Qu'est-ce qui manque dans la version actuelle pour toi ?

Bein je parlais surtout de mon code ? moi, c'était pas relatif ? la librairie, mais toi tu voulais dire dans la lib ou dans le wiki ?
Dans le wiki il manque clairement des infos pour aller plus loin (voir tous les probl?mes que j'ai eu pour comprendre comment ajouter proprement un 2eme sprite). C'est pour ça que lorsque je j'aurai corrigé mon propre code et que je me sentirai parfaitement ? l'aise avec cette gestion j'aimerais compléter le wiki pour que tout le monde ne gal?re pas autant que moi.

Au niveau de la lib ce qui manquerait peut-?tre c'est un niveau d'abstraction supplémentaire, o? on aurait pas ? s'occuper des emplacements mémoires ou de la gestion des palettes, o? on aurait pas ? se prendre la t?te sur les histoires de sprites entrelacés, les décalages etc. C'est vrai que c'est intéressant car on comprend mieux le fonctionnement et les limitations de la "b?te", mais ça peut aussi rebuter ? mon avis.
Maintenant je suis bien conscient qu'on est sur SNES et que c'est déj? pas mal de pouvoir faire du C dessus :-[

alekmaul

Oui, pas simple de faire quelque chose qui aide "vraiment" car la SNES est limité comme tu dis, et j'avoue que j'ai pas mal galéré aussi lorsque j'ai débuté dessus.
Pour une gestion plus simple des sprites, je vois pas trop ce que l'on pourrait faire pour aider ? comprendre cet entrelacement et autre ... Mais si tu as des idées, je suis preneur :D !
OK pour la mise ? jour du wiki, tu me diras lorsque tu veux le faire, je te préparerais un compte (incript. désactivées suite aux noombreux spam dessus ...).