L'atelier le paddle d'arkanoid exclu suite a un post sur MRC
les paddles ARKANOID MSX et NES semblent identiques mais qu'en est t'il en vrai ?
images du paddle MSX
images du paddle NES
a premiére vue c'est pareil mais si on y regarde de plus prés c'est différent
MSX
NES
donc pas compatible directement sans une modif interne
images du paddle MSX
images du paddle NES
a premiére vue c'est pareil mais si on y regarde de plus prés c'est différent
MSX
NES
donc pas compatible directement sans une modif interne
Je me permets de ressortir ce post, juste pour dire que je viens de trouver un lien pour commander un paddle "fait maison" : https://rookiedrive.com/en/arkanoids-paddle-for-the-msx/
Etant un fan de ce jeu et dans la mesure où les vrais Paddle coûtent une blinde, j'en ai commandé un.
Je vous dirai ce que j'en pense dès réception
Etant un fan de ce jeu et dans la mesure où les vrais Paddle coûtent une blinde, j'en ai commandé un.
Je vous dirai ce que j'en pense dès réception
Bruno :
Je me permets de ressortir ce post, juste pour dire que je viens de trouver un lien pour commander un paddle "fait maison" : https://rookiedrive.com/en/arkanoids-paddle-for-the-msx/
Etant un fan de ce jeu et dans la mesure où les vrais Paddle coûtent une blinde, j'en ai commandé un.
Je vous dirai ce que j'en pense dès réception
Etant un fan de ce jeu et dans la mesure où les vrais Paddle coûtent une blinde, j'en ai commandé un.
Je vous dirai ce que j'en pense dès réception
Je l'avais amené chez Riton
Capture Twitter (avec vidéo) :
Il sera en test au JMSX si vous voulez. Il y a quelques incompatibilités de souvenir.
aoineko
Membre non connecté
Conseiller Municipal
Ça à l'air cool. Quelqu'un serait intéressé pour un achat groupé ?
Quand j'avais fais le support de la souris dans ma lib MSXgl, je pensais justement que ça serait cool d'ajouter aussi le paddle mais j'en avais pas pour tester.
On doit pouvoir faire d'autres jeux sympa avec ce périphérique.
Quand j'avais fais le support de la souris dans ma lib MSXgl, je pensais justement que ça serait cool d'ajouter aussi le paddle mais j'en avais pas pour tester.
On doit pouvoir faire d'autres jeux sympa avec ce périphérique.
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
aoineko :
Quand j'avais fais le support de la souris dans ma lib MSXgl, je pensais justement que ça serait cool d'ajouter aussi le paddle mais j'en avais pas pour tester.
Quand j'avais fais le support de la souris dans ma lib MSXgl, je pensais justement que ça serait cool d'ajouter aussi le paddle mais j'en avais pas pour tester.
De mémoire c'est la même chose que pour gérer la souris (au niveau de la routine). Edité par ericb59 Le 08/06/2024 à 08h41
aoineko
Membre non connecté
Conseiller Municipal
Suite à un prêt (merci Bruno ), j'ai 2 Arkanoid Vaus Paddles pour tester d'ajouter leur support dans MSXgl.
J'ai trouvé le protocole sur MRC :
Mes lacunes en hardware font que tout n'est pas très clair, mais si je comprends bien :
- On doit initialiser le transfert des données via le pin 8 (bits 4 ou 5 du registre 15) en mettant à 1 puis 0 puis à nouveau à 1.
- Ensuite, les données de 9-bits sont envoyés bit par bit, en alternant la valeur du pin 6 (bit 0 ou 2 du registre 15) à 0 puis à 1.
C'est bien ça ?
Par contre, j'ai pas compris l'histoire du compteur interne dans le paddle, si ce n'est que le BIOS peut reset le compteur si on le laisse faire.
Mais quel rapport entre le compteur et la valeur renvoyé par la paddle... aucune idée.
Pas sûr non plus d'avoir compris les histoires de timing.
Est-ce qu'on peut faire les commutations HIGH/LOW aussi vite que le permet l'assembleur ou faut-il inclure des temps d'attente !? Edité par aoineko Le 15/10/2024 à 00h52
J'ai trouvé le protocole sur MRC :
MRC :
The paddle contains an internal 9bit counter that is feed up by a 96.2KHz clock. This means that, once a new count cycle is triggered, this slow paddle takes up to 3.212ms (roughly 11498 Z80A cycles) to finish its internal processing. The algorithm goes like this:
1. Read a serial bit from the PSG R#14 bit0
2. Copy it to the lower bit of your reception shift-register
3. Shift your reception shift-register left
4. Pulse the clock low, then high on pin-6 of the joystick port, using the respective bit on PSG R#15. The bit-8 of the joystick port must be HIGH for the 1st pulse of the pin-6, and LOW for the remaining pulses.
5. Repeat the steps 1~4 nine times to read the entire 9bit value.
6. If you read the PSG R#14 at this point, the bit0 will be 1 if the paddle was disconnected, and 0 if the paddle is still present
7. Set the pin-8 (Output) to HIGH using the respective bit on PSG R#14.
8. Wait for at least 3.212ms before another trying to read the paddle again. (Taito games wait for an entire frame). The pin-8 of the joystick port must be kept HIGH all the time until the step-4 of the next reading block.
Notes:
- The first 9bit value read this way will be garbage
- To have the disconnection status bit on step-6, the pin-8 of the joystick port must kept HIGH for the 1st pin-6 pulse, and LOW for all subsequent pulses
- You must make sure that the pin-8 of the joystick port will be kept HIGH if you decide to wait for the next frame as a delay. The conflict is that the default MSX BIOS interrupt handler "ON STRIG" detector sets this pin to LOW every time, and this resets the paddle internal counter. There are many ways to disable the MSX BIOS keyboard/ON STRIG interrupt processing, you should pick the one that is the best for your program, but keep in mind that the keyboard won't be automatically updated anymore, so you won't be able to use CHGET.
- The safe range of this paddle goes from 110 to 380, with the center at 245, but Taito games consider the far left value as 164, center as 236 and 309 as the far right, because the game window doesn't take the full screen width.
1. Read a serial bit from the PSG R#14 bit0
2. Copy it to the lower bit of your reception shift-register
3. Shift your reception shift-register left
4. Pulse the clock low, then high on pin-6 of the joystick port, using the respective bit on PSG R#15. The bit-8 of the joystick port must be HIGH for the 1st pulse of the pin-6, and LOW for the remaining pulses.
5. Repeat the steps 1~4 nine times to read the entire 9bit value.
6. If you read the PSG R#14 at this point, the bit0 will be 1 if the paddle was disconnected, and 0 if the paddle is still present
7. Set the pin-8 (Output) to HIGH using the respective bit on PSG R#14.
8. Wait for at least 3.212ms before another trying to read the paddle again. (Taito games wait for an entire frame). The pin-8 of the joystick port must be kept HIGH all the time until the step-4 of the next reading block.
Notes:
- The first 9bit value read this way will be garbage
- To have the disconnection status bit on step-6, the pin-8 of the joystick port must kept HIGH for the 1st pin-6 pulse, and LOW for all subsequent pulses
- You must make sure that the pin-8 of the joystick port will be kept HIGH if you decide to wait for the next frame as a delay. The conflict is that the default MSX BIOS interrupt handler "ON STRIG" detector sets this pin to LOW every time, and this resets the paddle internal counter. There are many ways to disable the MSX BIOS keyboard/ON STRIG interrupt processing, you should pick the one that is the best for your program, but keep in mind that the keyboard won't be automatically updated anymore, so you won't be able to use CHGET.
- The safe range of this paddle goes from 110 to 380, with the center at 245, but Taito games consider the far left value as 164, center as 236 and 309 as the far right, because the game window doesn't take the full screen width.
Mes lacunes en hardware font que tout n'est pas très clair, mais si je comprends bien :
- On doit initialiser le transfert des données via le pin 8 (bits 4 ou 5 du registre 15) en mettant à 1 puis 0 puis à nouveau à 1.
- Ensuite, les données de 9-bits sont envoyés bit par bit, en alternant la valeur du pin 6 (bit 0 ou 2 du registre 15) à 0 puis à 1.
C'est bien ça ?
Par contre, j'ai pas compris l'histoire du compteur interne dans le paddle, si ce n'est que le BIOS peut reset le compteur si on le laisse faire.
Mais quel rapport entre le compteur et la valeur renvoyé par la paddle... aucune idée.
Pas sûr non plus d'avoir compris les histoires de timing.
Est-ce qu'on peut faire les commutations HIGH/LOW aussi vite que le permet l'assembleur ou faut-il inclure des temps d'attente !? Edité par aoineko Le 15/10/2024 à 00h52
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Alors, je commence à avoir quelque chose !
Ca ne fonctionne qu'avec le port 1 et je n'ai pas encore le bouton, mais je récupère bien une valeur valide sur 9 bits quand je tourne le potentiomètre.
Par contre, j'ai un comportement étrange :
- Le Arkanoid Vaus Paddle (paddle d'Arkanoid d'origine) n'est détecté que s'il est déjà connecté au démarrage du MSX ; si je déconnecte et le reconnecte, il n'est plus reconnu.
- Le « Breaker pad » (Paddle récent de Xavirompe) a exactement le comportement inverse.
Une idée d'où ça pourrait venir ? Edité par aoineko Le 15/10/2024 à 19h37
Ca ne fonctionne qu'avec le port 1 et je n'ai pas encore le bouton, mais je récupère bien une valeur valide sur 9 bits quand je tourne le potentiomètre.
Par contre, j'ai un comportement étrange :
- Le Arkanoid Vaus Paddle (paddle d'Arkanoid d'origine) n'est détecté que s'il est déjà connecté au démarrage du MSX ; si je déconnecte et le reconnecte, il n'est plus reconnu.
- Le « Breaker pad » (Paddle récent de Xavirompe) a exactement le comportement inverse.
Une idée d'où ça pourrait venir ? Edité par aoineko Le 15/10/2024 à 19h37
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Je progresse.
J'ai maintenant un driver cours et rapide qui gère un paddle dans le port A. Ca marche sur un vrai MSX avec le paddle d'origine et son clone moderne.
Le hardware de ce paddle est vraiment très étrange. La valeur du potentiomètre est récupérée via un compteur ; les grandes valeurs sont donc beaucoup plus lentes à récupérer que les petites. Les plus grandes valeurs peuvent prendre plus d'un millier de cycles du Z80 à être calculé.
Pour palier à ce problème, dans ses jeux, Taito lance le compteur lors d'une frame et ne lis sa valeur que la frame suivante. Le soucis, c'est que le BIOS change le registre 15 du PSG dans son gestionnaire d'interruption et coupe ainsi le compteur.
Dans MSXgl on peut zapper le gestionnaire d'interruption du BIOS quand on utilise une ROM, donc ça ne pose pas de problème, mais pour une application DOS ou un binaire BASIC, c'est gênant.
Il paraît qu'il y a une technique pour empêcher le BIOS d'accéder au registre 15... à creuser.
Il faut aussi que je gère les 2 ports joystick.
J'ai maintenant un driver cours et rapide qui gère un paddle dans le port A. Ca marche sur un vrai MSX avec le paddle d'origine et son clone moderne.
Le hardware de ce paddle est vraiment très étrange. La valeur du potentiomètre est récupérée via un compteur ; les grandes valeurs sont donc beaucoup plus lentes à récupérer que les petites. Les plus grandes valeurs peuvent prendre plus d'un millier de cycles du Z80 à être calculé.
Pour palier à ce problème, dans ses jeux, Taito lance le compteur lors d'une frame et ne lis sa valeur que la frame suivante. Le soucis, c'est que le BIOS change le registre 15 du PSG dans son gestionnaire d'interruption et coupe ainsi le compteur.
Dans MSXgl on peut zapper le gestionnaire d'interruption du BIOS quand on utilise une ROM, donc ça ne pose pas de problème, mais pour une application DOS ou un binaire BASIC, c'est gênant.
Il paraît qu'il y a une technique pour empêcher le BIOS d'accéder au registre 15... à creuser.
Il faut aussi que je gère les 2 ports joystick.
On est toujours ignorant avant de savoir.
MSXlegend
Membre non connecté
Conseiller Municipal
aoineko :
Ça à l'air cool. Quelqu'un serait intéressé pour un achat groupé ?
oubli l achat groupé, il ne fait aucune remise, je lui avais deja proposé un achat groupé de la rookie drive, il a refusé , meme prix pour tout le monde !! j'ai produit la mienne.
est ce que ça vaut le coup d'acheter ce truc ? combien de jeux sont compatible?
aoineko
Membre non connecté
Conseiller Municipal
2 jeux officiels (Arkanoid), plus quelques patchs pour des jeux existants.
Mais une fois ajouté à MSXgl et le driver assembleur rendu publique, ça créera peut-être des vocations.
En tout cas, perso, j'ai toujours été attiré par les contrôleurs originaux donc ça me tente bien.
Mais une fois ajouté à MSXgl et le driver assembleur rendu publique, ça créera peut-être des vocations.
En tout cas, perso, j'ai toujours été attiré par les contrôleurs originaux donc ça me tente bien.
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
En parlant de driver, voici le code que j'utilise actuellement :
(syntaxe asz80)
La fonction renvoie un entier 16-bits avec ce format:
Avec:
- C: Le compteur sur 9 bits
- B: L'état du bouton (0: appuyé, 1: relâché)
Il me reste à ajouter un bit pour détecter la connexion du paddle et ensuite supporter le 2e port joystick. Edité par aoineko Le 17/10/2024 à 22h49
Code ASM :
paddle_read: ; Read counter 1st bit and button state ld a, #14 ; Select R#14 out (P_PSG_REGS), a in a, (P_PSG_STAT) ; Reads (port A) ld h, a ; Store first bit and button state in H ld l, #0 ; Reset L ld b, #0x08 ; Setup 8 bits loop ; Read remaining counter's 8 bits paddle_nextbit: ld a, #15 ; Select R#15 out (P_PSG_REGS), a ld a, #0x1E out (P_PSG_DATA), a ; Clock LOW (port A) ld a, #0x1F out (P_PSG_DATA), a ; Clock HIGH (port A) ld a, #14 ; Select R#14 out (P_PSG_REGS), a in a, (P_PSG_STAT) ; Reads (port A) srl a ; Shift bit... rl l ; ...and store it in L djnz paddle_nextbit ; Reads next bit ; Start counter for next frame paddle_startcounter: ld a, #15 ; Select R#15 out (P_PSG_REGS), a ld a, #0x0F out (P_PSG_DATA), a ; Pin 8 LOW (port A) ld a, #0x1F out (P_PSG_DATA), a ; Pin 8 HIGH (port A)
(syntaxe asz80)
La fonction renvoie un entier 16-bits avec ce format:
Code TEXT :
54321098 76543210 [......BC CCCCCCCC]
Avec:
- C: Le compteur sur 9 bits
- B: L'état du bouton (0: appuyé, 1: relâché)
Il me reste à ajouter un bit pour détecter la connexion du paddle et ensuite supporter le 2e port joystick. Edité par aoineko Le 17/10/2024 à 22h49
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Ca y est ; j'ai la version finale de mon driver pour gérer le paddle Arkanoid.
Je l'ai ajouté dans MSXgl.
Il faut appeler la fonction ci-dessous une fois par frame dans la boucle principale.
Elle met à jour 2 variables 16 bits en mémoire (1 pour chaque port joystick) à partir de l'adresse _g_PaddleStates.
Le format de ces 2 variables :
Voici le code (syntaxe asz80) :
Merci à Bruno pour le prêt des paddles, et à l'utilisateur MRC Danjovic pour son aide. Edité par aoineko Le 19/10/2024 à 14h25
Je l'ai ajouté dans MSXgl.
Il faut appeler la fonction ci-dessous une fois par frame dans la boucle principale.
Elle met à jour 2 variables 16 bits en mémoire (1 pour chaque port joystick) à partir de l'adresse _g_PaddleStates.
Le format de ces 2 variables :
Code ASM :
; 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 ;------------------------------------ ; D 0 0 0 0 0 B C C C C C C C C C ; │ │ └───┴─┴─┴─┴─┴─┴─┴─┴── 9-bit counter ; │ └────────────────────── Button state (0: pressed, 1: released) ; └────────────────────────────────── Disconnect state (0: connected, 1: disconnected)
Voici le code (syntaxe asz80) :
Code ASM :
; Read port A ld iy, #_g_PaddleStates ld de, #0x3E3F call paddle_reads ; Read port B ld iy, #_g_PaddleStates + 2 ld de, #0x7B7F call paddle_reads ; Start counter for next frame (both port) ld a, #15 ; Select R#15 out (P_PSG_REGS), a ld a, #0x0F out (P_PSG_DATA), a ; Pin 8 LOW ld a, #0x3F out (P_PSG_DATA), a ; Pin 8 HIGH ret paddle_reads: ; Read counter 1st bit and button state ld a, #15 ; Select R#15 out (P_PSG_REGS), a ld a, e out (P_PSG_DATA), a ; Select given port for reading ld a, #14 ; Select R#14 out (P_PSG_REGS), a in a, (P_PSG_STAT) ; Reads (port A) and #0x03 ld h, a ; Store first bit and button state in H ld l, #0 ; Reset L ld b, #8 ; Setup 8 bits loop paddle_nextbit: ; Read remaining counter's 8 bits ld a, #15 ; Select R#15 out (P_PSG_REGS), a ld a, d out (P_PSG_DATA), a ; Clock LOW ld a, e out (P_PSG_DATA), a ; Clock HIGH ld a, #14 ; Select R#14 out (P_PSG_REGS), a in a, (P_PSG_STAT) ; Reads (port A) srl a ; Shift bit... rl l ; ...and store it in L djnz paddle_nextbit ; Reads next bit ; Check for disconnection ld a, h rra ; H.0 to F.c ld a, l adc a, #0 ; If L + F.c == 0, then all counter bits are 1 (paddle is not conected) jr nz, paddle_end set 7, h ; Set disconnection flag paddle_end: ld 0(iy), l ld 1(iy), h ret
Merci à Bruno pour le prêt des paddles, et à l'utilisateur MRC Danjovic pour son aide. Edité par aoineko Le 19/10/2024 à 14h25
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Bruno :
BRAVOOOOO !!!!
A quand un jeu type Arkanoid ? Hein ? Hein ?
A quand un jeu type Arkanoid ? Hein ? Hein ?
C'est celui qui le dit, qui le fait
(ceci dit, c'est un bon projet pour se lancer dans la programmation sur MSX)
On est toujours ignorant avant de savoir.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie