[THOMSON TO8] Lire 6 boutons d'un pad Mega Drive

Cette catégorie traite de développements récents destinés à nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Répondre
Bentoc
Messages : 179
Inscription : 14 sept. 2019 13:35
Localisation : Var - France

[THOMSON TO8] Lire 6 boutons d'un pad Mega Drive

Message par Bentoc »

Je partage avec vous quelques lignes de code qui permettent d'exploiter les boutons A, B, X, Y, Z et MODE d'une manette Mega Drive (originale sans aucune modification) sur un Thomson TO8.

On commence par les infos de câblage des manettes :

Code : Tout sélectionner

; Mega Drive control pad pin
; --------------------------
; pin 1 : up/Z
; pin 2 : down/Y
; pin 3 : left/X
; pin 4 : right/mode
; pin 5 : +5v
; pin 6 : B/A
; pin 7 : line select
; pin 8 : ground
; pin 9 : C/Start

; Thomson TO8 control pad pin
; ---------------------------
; pin 1 : up
; pin 2 : down
; pin 3 : left
; pin 4 : right
; pin 5 : +5v
; pin 6 : A
; pin 7 : B
; pin 8 : ground
; pin 9 : <not connected>
On remarque deux choses :
- par défaut la lecture standard depuis le TO8 ne permet que de lire le bouton B, en effet le second bouton est lu depuis le pin 7, occupé par le line select sur une manette Mega Drive.
- on ne pourra pas lire les boutons C et START, car le pin 9 n'est pas connecté sur le TO8

Comment ça fonctionne ?

Code : Tout sélectionner

; Mega Drive 6btn control pad line select sequence
; ------------------------------------------------
; Cycle  TH out  TR in  TL in   D3 in  D2 in  D1 in  D0 in
; 1      HI      C      B       Right  Left   Down   Up
; 2      LO      Start  A       0      0      Down   Up
; 3      HI      C      B       Right  Left   Down   Up
; 4      LO      Start  A       0      0      Down   Up
; 5      HI      C      B       Right  Left   Down   Up
; 6      LO      Start  A       0      0      0      0
; 7      HI      C      B       Mode   X      Y      Z
; 8      LO      Start  A       ---    ---    ---    ---
Pour venir lire les valeurs des boutons "supplémentaires" du pad de la Mega Drive, il faut envoyer alternativement des 1 et des 0 sur le pin 7 de la manette. La manette va a lors rendre visible d'autres boutons que ceux par défaut, en suivant le tableau ci dessus.

Le code d'initialisation suivant va paramétrer le MC6821 pour que tous les bits venant des ports manette du TO8 soient en lecture, sauf les pin 7 des deux ports qui vont être positionnés en écriture.

Code : Tout sélectionner

joypad.md6.init

        ; configure MC6821 to be able to read joypads (1&2) direction
	lda   $E7CE      ; read Control Register A (CRA)
	anda  #$FB       ; unset bit 2 
	sta   $E7CE      ; select Data Direction Register A (DDRA)
	clrb             ; unset all bits
	stb   $E7CC      ; Peripherial Interface A (PIA) lines set as input
	ora   #$04       ; set b2
	sta   $E7CE      ; select Peripherial Interface A (PIA) Register

        ; configure MC6821 to be able to read joypads (1&2) buttons
	lda   $E7CF      ; read Control Register B (CRB)
	anda  #$FB       ; unset bit 2 
	sta   $E7CF      ; select Data Direction Register B (DDRB)
        ldb   #$0C       ; set bit 2 (pin7 ctrl 0) and 3 (pin7 ctrl 1), warning : DAC bits set as output
        stb   $E7CD      ; Peripherial Interface B (PIB) lines set as input
	ora   #$04       ; set b2
	sta   $E7CF      ; select Peripherial Interface B (PIB) Register
        rts

En effectuant cette configuration, toutes les commandes envoyées aux manettes vont aussi se retrouver en sortie du DAC.
il faudra donc "mute" l'op amp du dac via le bit 2 du CSR du 6846. (Si j'ai faux sur la méthode du mute dites moi, c'est la première fois que je le met en place).
On effectue la lecture des registres en respectant les cycles indiqués dans le tableau.
Remarque : dans le code ci dessous, j'ai volontairement ajouté un espace après les #% et avant les chiffres, le forum mouline dans le vide quand on poste le message sinon ... évidement retirez ces espaces sinon lwasm ne va pas être content :D

Code : Tout sélectionner

joypad.md6.ctrl0.held
joypad.md6.ctrl0.held.dpad     fcb   0
joypad.md6.ctrl0.held.fire     fcb   0
joypad.md6.ctrl0.press
joypad.md6.ctrl0.press.dpad    fcb   0
joypad.md6.ctrl0.press.fire    fcb   0

joypad.md6.read

        ; mute DAC
        lda   map.MC6846.CSR
        ora   #% 00000100
        sta   map.MC6846.CSR

        ldd   #$0C00     ; PB2=1 (pin7 port manette 0) PB3=1 (pin7 port manette 1)
        sta   $E7CD      ; set line select to HI
        ldx   $E7CC      ; read data : E7CC:Right1|Left1|Down1|Up1|Right0|Left0|Down0|Up0 - E7CD:B1|B0|_|_|_|_|_|_
        stb   $E7CD      ; set line select to LO
        sta   $E7CD      ; set line select to HI
        stb   $E7CD      ; set line select to LO
        sta   $E7CD      ; set line select to HI
        stb   $E7CD      ; set line select to LO
        ldb   $E7CD      ; read data : E7CD:A1|A0|_|_|_|_|_|_
        sta   $E7CD      ; set line select to HI
        lda   $E7CC      ; read data : E7CC:Mode1|X1|Y1|Z1|Mode0|X0|Y0|Z0

        ; control pad 0
        anda  #% 00001111 ; keep MXYZ in place
        andb  #% 01000000 ; filter A for ctrl0 only
        lsrb             ; set A in place
        stb   @b         ; set ora operator
        ora   #0         ; merge bits
@b      equ   *-1
        sta   @a         ; save value
        tfr   x,d
        anda  #% 00001111 ; keep RLDU in place, dpad values are in register A
        andb  #% 01000000 ; filter B for ctrl0 only
        lsrb
        lsrb             ; set B in place
        orb   #0         ; merge bits, fire values are in register B
@a      equ   *-1

        ; process dpad
        coma                              ; reverse bits to get 0:released 1:pressed
        sta   @a
        lda   joypad.md6.ctrl0.held.dpad
        eora  @a
        anda  @a
        sta   joypad.md6.ctrl0.press.dpad ; store only new pressed pads
        lda   #0
@a      equ   *-1
        sta   joypad.md6.ctrl0.held.dpad  ; store current pressed state

        ; process fire
        comb                              ; reverse bits to get 0:released 1:pressed
        stb   @b
        ldb   joypad.md6.ctrl0.held.fire
        eorb  @b
        andb  @b
        stb   joypad.md6.ctrl0.press.fire ; store only new pressed btns
        ldb   #0
@b      equ   *-1
        stb   joypad.md6.ctrl0.held.fire  ; store current pressed state
        rts

Miracle ! le code a fonctionné du premier coup :shock:

Une vidéo du test sur machine réelle :


En pj, l'outil de test que vous pouvez utiliser chez vous si vous avez un TO8 et une manette officielle SEGA 6 boutons.
pad6.zip
(31.85 Kio) Téléchargé 23 fois
Dernière modification par Bentoc le 20 avr. 2024 22:17, modifié 2 fois.
Fool-DupleX
Messages : 2367
Inscription : 06 avr. 2009 12:07

Re: [THOMSON TO8] Lire 6 boutons d'un pad Mega Drive

Message par Fool-DupleX »

Génialissime, du grand art ! :)
Brochiman
Messages : 3545
Inscription : 02 juin 2019 11:26
Localisation : Angers

Re: [THOMSON TO8] Lire 6 boutons d'un pad Mega Drive

Message par Brochiman »

Excellent ça et en plus mon TO8 est de sortie donc je vais pouvoir tester ça. Merci :D
Bentoc
Messages : 179
Inscription : 14 sept. 2019 13:35
Localisation : Var - France

Re: [THOMSON TO8] Lire 6 boutons d'un pad Mega Drive

Message par Bentoc »

Fool-DupleX a écrit : 27 sept. 2023 20:20 Génialissime, du grand art ! :)
Merci Fool !
Daniel
Messages : 17426
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [THOMSON TO8] Lire 6 boutons d'un pad Mega Drive

Message par Daniel »

S'il y a des jeux en développement pour le pad MegaDrive Il faudrait peut-être l'émuler dans dcmoto ?
Daniel
L'obstacle augmente mon ardeur.
Ythunder
Messages : 941
Inscription : 21 août 2019 10:12

Re: [THOMSON TO8] Lire 6 boutons d'un pad Mega Drive

Message par Ythunder »

Ca ne peux faire que du bonus... (mais bon du travail pour rien si ça n'est pas exploité du tout)

Bravo sinon !
Bentoc
Messages : 179
Inscription : 14 sept. 2019 13:35
Localisation : Var - France

Re: [THOMSON TO8] Lire 6 boutons d'un pad Mega Drive

Message par Bentoc »

Daniel a écrit : 28 sept. 2023 08:19 S'il y a des jeux en développement pour le pad MegaDrive Il faudrait peut-être l'émuler dans dcmoto ?
Pour le moment non, mais je te contacterai si besoin.
Avatar de l’utilisateur
adnz
Messages : 213
Inscription : 10 janv. 2010 00:07

Re: [THOMSON TO8] Lire 6 boutons d'un pad Mega Drive

Message par adnz »

SI on fait les choses, c'est que c'est prévu qu'on l'exploite :) ce n'est pas les idées qui nous manquent 8)
Avatar de l’utilisateur
OlivierP
Messages : 711
Inscription : 21 sept. 2009 15:50
Localisation : IDF

Re: [THOMSON TO8] Lire 6 boutons d'un pad Mega Drive

Message par OlivierP »

C'est génial !
Bravo pour cette belle trouvaille.
J'ai hâte de voir comment ce sera utilisé
Bentoc
Messages : 179
Inscription : 14 sept. 2019 13:35
Localisation : Var - France

Re: [THOMSON TO8] Lire 6 boutons d'un pad Mega Drive

Message par Bentoc »

il faudra donc "mute" l'op amp du dac via le bit 2 du CSR du 6846. (Si j'ai faux sur la méthode du mute dites moi, c'est la première fois que je le met en place).
Concernant le mute, ce n'est pas le bit2 du CSR (E7C0) qui entre en jeu mais le bit3 du PCR (E7C1).
et il faut également que PCR4 et PCR5 valent tous les deux 1 pour que ça fonctionne.

J'avais fait une lecture trop rapide de la datasheet ...
Répondre