MSX Village forum

L'atelier le paddle d'arkanoid exclu suite a un post sur MRC

Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10731

Le 24/09/2018 à 10h39
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


:noel
Site web    
Bruno Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 25/10/2017 à 22h56

Messages: 111

Le 04/06/2024 à 19h45
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 ^^
   
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5566

Le 04/06/2024 à 20h13
Il a l'air pas mal ce Pad.


banniere-ericb59e
Site web    
Sebbeug Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h33

Messages: 2525

Le 04/06/2024 à 21h33
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 ^^


Je l'avais amené chez Riton

Capture Twitter (avec vidéo) :
screenshot_20240604_213506_x

Il sera en test au JMSX si vous voulez. Il y a quelques incompatibilités de souvenir.


Clé de sol

Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 07/06/2024 à 13h23
Ç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.


On est toujours ignorant avant de savoir.
Github    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5566

Le 07/06/2024 à 18h06
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.


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


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 15/10/2024 à 00h13
Suite à un prêt (merci Bruno :top), j'ai 2 Arkanoid Vaus Paddles pour tester d'ajouter leur support dans MSXgl.

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.


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 !? :hum Edité par aoineko Le 15/10/2024 à 00h52


On est toujours ignorant avant de savoir.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 15/10/2024 à 19h33
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. :tchin

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.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 17/10/2024 à 09h22
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.


On est toujours ignorant avant de savoir.
Github    
MSXlegend Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 18/06/2010 à 22h42

Messages: 6284

Le 17/10/2024 à 18h27
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?


KCX Bluetooth emitter Mono/ Stéréo, Smart USB
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 17/10/2024 à 20h03
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.


On est toujours ignorant avant de savoir.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 17/10/2024 à 22h48
En parlant de driver, voici le code que j'utilise actuellement :
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.
Github    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 19/10/2024 à 14h22
Ca y est ; j'ai la version finale de mon driver pour gérer le paddle Arkanoid.
Je l'ai ajouté dans MSXgl. :tea

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.
Github    
Bruno Membre non connecté

Touriste

Rang

Avatar

Inscrit le : 25/10/2017 à 22h56

Messages: 111

Le 20/10/2024 à 12h19
BRAVOOOOO !!!! :top :tchin

A quand un jeu type Arkanoid ? Hein ? Hein ? :D
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2904

Le 20/10/2024 à 12h47
Bruno :
BRAVOOOOO !!!! :top :tchin

A quand un jeu type Arkanoid ? Hein ? Hein ? :D


C'est celui qui le dit, qui le fait :p

(ceci dit, c'est un bon projet pour se lancer dans la programmation sur MSX)


On est toujours ignorant avant de savoir.
Github    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie