Connexion utilisateur

Modification switchless

Version imprimableversion PDF

Ce mod est en fait mon premier mod de console fabrication maison, je l'ai réalisé à la fois pour la megadrive 1 v1 et la megadrive 1 v2 avant d'avoir connaissance du supercic pour snes.

C'est une adaptation des différents montages de switch trouvés sur le net (pour la megadrive 1 v1 comme ici) et le fruit de quelques heures de patience à suivre les pistes de la carte mère.

Alors pourquoi un mod switchless qui va coûter plus cher qu'une paire de switches? Simplement parce-que même si je suis un bricoleur invétéré, j'aime que mes consoles aient l'air "vanilla", en clair, que l'aspect extérieur soit le même que la console d'origine, pas fan du perçage, des swithces externes, des gros boutons (même si certains sont très doué pour intégrer des boutons dans l'esprit du design d'origine de la console).

Bon, trève de blabla, voilà le fonctionnement théorique du montage :
- Le changement de zone se fait par un appui long sur le bouton reset de la console
- Le cycle des zones est le suivant : PAL, NTSC-U, NTSC-J
- La dernière zone sélectionnée est mémorisée.
- Un appui court sur le bouton reset résulte en... un reset, c'est fou non?

Pour ce faire, il faut interrompre le signal reset de la console, le plus simple est de déssouder le bouton reset et d'en déplier les pattes inférieures, ce qui donne cela :

On va utiliser la patte de gauche comme signal d'entrée pour notre chip, la patte de droite sera inutilisée, c'est un choix arbitraire, on peut très bien faire l'inverse.

Le choix du microcontrôleur a été assez simple, il m'en fallait un avec une horloge interne, une eeprom pour la sauvegarde, qui soit assez facile à trouver, donc le choix s'est porté sur un 12F629 de chez Microchip.

Comme je suis un gros fénéant, le programme du pic a été développé en PIC Basic, sous PIC Simulator IDE que j'avais acheté il y a quelques années pour d'autres projets.

Voici le contenu :
AllDigital
 
'JP settings
'JP1,JP2 = Language
'Language : 5v = English, Gnd = Japanese
'JP2,JP4 = Video Mode
'Video Mode : 5v = NTSC, Gnd = PAL
 
'Pin assignment
'GP5 : Green LED output
'GP4 : Blue LED output
'GP3 : Reset button input
'GP2 : Reset output
'GP1 : Video mode output
'GP0 : Language output
 
OPTION_REG.7 = 0
 
'PORTA is used for output
'PORTC is used for input
 
TRISIO = %00001100  'All output except GP3
WPU = %00000000  'Enable weak pullups
GPIO = %00000000  'Set initial pin state
 
DIM cnt AS Word  'Will hold the number of cnt the loop was repeated
DIM switched AS Bit  'Set if the console mode was changed (to avoid unwanted resets)
 
'Let' s define our zones
'byte is formed as this
'%0 0 0 R G B V L
'where :
'- R, G, B is our led Output (red, green And blue pins)
'- V is our video output type (PAL or NTSC)
'- L is the console language (English/Japanese)
 
DIM eur AS Byte
DIM usa AS Byte
DIM jap AS Byte
eur = %00001101  'Default LED lit, PAL, English
usa = %00000111  'Blue LED lit, NTSC, English
jap = %00001010  'Green LED lit, NTSC, Japanese
 
'Now let's build an array with our modes
DIM modes(3) AS Byte
modes(0) = eur
modes(1) = usa
modes(2) = jap
 
DIM curmode AS Byte
READ 0, curmode
IF curmode > 2 THEN curmode = 0
GOSUB setpins  'Init default values
 
LOOP:
	'Check if reset has been pressed
	IF GPIO.3 = 0 THEN
		cnt = cnt + 1
		'Check if pause has been pressed for long enough
		'to toggle from 50hz to 60hz and vice-versa
		IF cnt = 40000 THEN  '40000 is about 1.5s
			curmode = curmode + 1
			IF curmode = 3 THEN curmode = 0
			GOSUB setpins
			WRITE 0, curmode
			cnt = 0
			switched = 1  'Mode has been changed, we don't want to reset
		Endif
	ELSE
		'Check if pause has been pressed and released
		IF cnt > 2000 AND switched = 0 THEN
			'Ok, let's send a pause signal to the console
			Toggle GPIO.2
			WaitMs 100
			Toggle GPIO.2
		Endif
		cnt = 0
		switched = 0
	Endif
 
	GOTO LOOP
END                                               
 
setpins:
	DIM mode AS Byte
	mode = modes(curmode)
	GPIO.5 = mode.3
	GPIO.4 = mode.2
	GPIO.1 = mode.1
	GPIO.0 = mode.0
	RETURN

Le coeur du programme étant le main loop òu on détecte de façon logicielle la durée de l'appui, le but étant de minimiser les rebonds.

	IF GPIO.3 = 0 THEN
		cnt = cnt + 1
		'Check if pause has been pressed for long enough
		'to toggle from 50hz to 60hz and vice-versa
		IF cnt = 40000 THEN  '40000 is about 1.5s
			curmode = curmode + 1
			IF curmode = 3 THEN curmode = 0
			GOSUB setpins
			WRITE 0, curmode
			cnt = 0
			switched = 1  'Mode has been changed, we don't want to reset
		Endif
	ELSE
		'Check if pause has been pressed and released
		IF cnt > 2000 AND switched = 0 THEN
			'Ok, let's send a pause signal to the console
			Toggle GPIO.2
			WaitMs 100
			Toggle GPIO.2
		Endif
		cnt = 0
		switched = 0
	Endif

Le source et le fichier hex sont dispo ici

Le plan de montage quant à lui est assez simple, le seul point auquel il faut faire attention est le bouton reset : À gauche on soude sur la patte qui a été relevée, à droite on soude sur la pastille de la carte mère.

Autre point d'importance, sur le plan, le fil relier à l'anode de la led (la patte la plus longue) est sur le fil rouge de la led d'origine, pas sur le plan de masse.

Des tests ont été effectués avec la cartouche de streets of rage qui a l'avantage de contenir le texte en Anglais et Japonais.

Voilà voilà, bientôt les instructions de montage pour une megadrive 1 révision 1, quand j'aurai trouvé le temps de faire le plan de montage...

 

Ajouter un commentaire

CAPTCHA
Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage (spam).