L'atelier Mettre un SN76489AN dans un MSX (jeux ColecoVision sur MSX)
Bonjour,
J'ai vu qu'il était encore possible de se procurer les PSG de la ColecoVision / Sega Master System (SN76489AN).
J'aimerai en piloter un avec un MSX afin de faire fonctionner des jeux ColecoVision plus facilement et pour pas cher.
Cette puce est très simple. Seul un port (en écriture et lecture) est utilisé. Sur ColecoVision, c'est le port 0F0h.
Comment créer ce port à partir d'une cartouche ? Et comment faire en sorte que le son passe par le MSX ?
Info :
http://en.wikipedia.org/wiki/Texas_Instruments_SN76489
http://www.colecovision.dk/PDF/SN%2076489.pdf Edité par GDX Le 30/06/2012 à 13h58
J'ai vu qu'il était encore possible de se procurer les PSG de la ColecoVision / Sega Master System (SN76489AN).
J'aimerai en piloter un avec un MSX afin de faire fonctionner des jeux ColecoVision plus facilement et pour pas cher.
Cette puce est très simple. Seul un port (en écriture et lecture) est utilisé. Sur ColecoVision, c'est le port 0F0h.
Comment créer ce port à partir d'une cartouche ? Et comment faire en sorte que le son passe par le MSX ?
Info :
http://en.wikipedia.org/wiki/Texas_Instruments_SN76489
http://www.colecovision.dk/PDF/SN%2076489.pdf Edité par GDX Le 30/06/2012 à 13h58
Fabf
Membre non connecté
Conseiller Municipal
Pour que le son passe par le MSX il suffit, si le signal est assez élevé, de câbler le pin 7 du SN76489AN au pin 49 du connecteur MSX.
Pour le reste j'ai encore du mal à comprendre comment on décode un adresse
Si Jipe pouvait nous expliquer encore une fois
Il faut aussi être sur que le port 0F0h n'est pas déjà utilisé par le MSX (mais je pense que tu a vérifié)
Le projet est très intéressant.
Il n'y a pas d'autres choses que la Coleco aurait et pas le MSX, des choses donc émulé ?
Tant qu'à faire
Pour le reste j'ai encore du mal à comprendre comment on décode un adresse
Si Jipe pouvait nous expliquer encore une fois
Il faut aussi être sur que le port 0F0h n'est pas déjà utilisé par le MSX (mais je pense que tu a vérifié)
Le projet est très intéressant.
Il n'y a pas d'autres choses que la Coleco aurait et pas le MSX, des choses donc émulé ?
Tant qu'à faire
D'après cette page :
http://map.grauw.nl/resources/msx_io_ports.php
le port 0F0h est libre.
Ce qui resterait à "émuler", serait seulement les manettes de jeux.
Pour gérer les manettes sur ColecoVision, on utilise les ports 0FCh et 0FFh. Ils sont pris sur MSX par le memory mapper. J'avais aussi imaginé de créer un adaptateur pour manettes coleco (ou similaires) sans fil en passant par d'autres ports d'entré mais ça complique pas mal et vu mon niveau en électronique.... Ce n'est pas très difficile de patcher la ROM à la place de toute façon.
L'autre problème, de taille, sont les interruptions qui sont différentes sur Colecovision. Le VDP provoque une interruption non-masquable (rst 66) à 50 ou 60Hz selon que la ColecoVision soit Pal ou NTSC. La je ne vois pas vraiment de solution.
http://map.grauw.nl/resources/msx_io_ports.php
le port 0F0h est libre.
Ce qui resterait à "émuler", serait seulement les manettes de jeux.
Pour gérer les manettes sur ColecoVision, on utilise les ports 0FCh et 0FFh. Ils sont pris sur MSX par le memory mapper. J'avais aussi imaginé de créer un adaptateur pour manettes coleco (ou similaires) sans fil en passant par d'autres ports d'entré mais ça complique pas mal et vu mon niveau en électronique.... Ce n'est pas très difficile de patcher la ROM à la place de toute façon.
L'autre problème, de taille, sont les interruptions qui sont différentes sur Colecovision. Le VDP provoque une interruption non-masquable (rst 66) à 50 ou 60Hz selon que la ColecoVision soit Pal ou NTSC. La je ne vois pas vraiment de solution.
Fabf
Membre non connecté
Conseiller Municipal
Toujours intéressé par le projet
Si en plus je peux apprendre à décoder une adresse I/O, ça me servira bien pour ma carte PSG MSX
Si en plus je peux apprendre à décoder une adresse I/O, ça me servira bien pour ma carte PSG MSX
avant d'aborder le coté MSX il faut comprendre comment fonctionne le chip dans une vrai Coleco
IO:
(ABC lines of decoder go to /WR, A5, and A6 respectively /E1 -> /IO_request
/E2 -> Reset; E3 -> A7)
80-9F (W) = Controls _ Set to keypad mode
80-9F (R) = Not Connected
A0-BF (W) = Video ___ A0 also decoded by video chip
A0-BF (R) = Video /
C0-DF (W) = Controls _ Set to joystick mode
C0-DF (R) = Not Connected
E0-FF (W) = Sound
E0-FF (R) = Controls _ A1 also decoded by chips (A1=0 ctrl 1; A1=1 ctrl 2)
le décodage du SN76489 Sound est simpliste les adresses i/o de fonctionnement allant de E0-FF quand Write est actif
ce mode de décodage n'est donc pas compatible avec le MSX
le registre de controle répond a l'adresse F0 d'aprés l'exemple ci dessous
To write a 10-bit word for frequenct into the sound chip you must first
send the control word, then the second frequency register. Note that the
second frequency register doesn't have a register number. When you write
to it, it uses which ever register you used in the control word.
So, if we want to output 11 0011 1010b to tone channel 1:
First, we write the control word:
LD A,1000 1010b
OUT (F0h),A
Then, the second half of the frequency:
LD A,0011 0011b
OUT (F0h),A
il faut donc être sur que la puce sound SN76489 ne répond uniquement qu'a cette adresse
IO:
(ABC lines of decoder go to /WR, A5, and A6 respectively /E1 -> /IO_request
/E2 -> Reset; E3 -> A7)
80-9F (W) = Controls _ Set to keypad mode
80-9F (R) = Not Connected
A0-BF (W) = Video ___ A0 also decoded by video chip
A0-BF (R) = Video /
C0-DF (W) = Controls _ Set to joystick mode
C0-DF (R) = Not Connected
E0-FF (W) = Sound
E0-FF (R) = Controls _ A1 also decoded by chips (A1=0 ctrl 1; A1=1 ctrl 2)
le décodage du SN76489 Sound est simpliste les adresses i/o de fonctionnement allant de E0-FF quand Write est actif
ce mode de décodage n'est donc pas compatible avec le MSX
le registre de controle répond a l'adresse F0 d'aprés l'exemple ci dessous
To write a 10-bit word for frequenct into the sound chip you must first
send the control word, then the second frequency register. Note that the
second frequency register doesn't have a register number. When you write
to it, it uses which ever register you used in the control word.
So, if we want to output 11 0011 1010b to tone channel 1:
First, we write the control word:
LD A,1000 1010b
OUT (F0h),A
Then, the second half of the frequency:
LD A,0011 0011b
OUT (F0h),A
il faut donc être sur que la puce sound SN76489 ne répond uniquement qu'a cette adresse
Fabf
Membre non connecté
Conseiller Municipal
Désolé jipé, hier je voulais poster les infos que j'ai glanées sur le net depuis que je convertis des Jeux Colecovision mais je n'ai pas eu le temps.
Tous les jeux que j'ai rencontrés utilisent le port 0F0h. Donc, c'est bon si la puce sound SN76489 ne répond uniquement qu'a cette adresse. Et puis, même si un jeu utilisait un port reflet, ça je serait pas un problème. Un petit patch pour changer le port et le tour est joué.
De toute façon, une bonne partie des jeux gèrent les manettes par accès directs. il faudra les patcher au moins pour le VDP et pour ça.
Voici les infos que j'ai récupérés sur les entrées/sorties et le son :
Tous ça est un extrait du PDF que j'ai fait au fur et à mesure que j'ai accumulé les infos. Le PDF est largement inachevé mais si il t'intéresse, je peux te le passer par MP. Tout est en Français. J'espère le finir un jour.
Dans les doc. de la Colecovision, il y a parfois des phrases qui me laissent dubitatif.
Tout est indiqué comme si tous les ports avaient des reflèts (dans ce cas, de A0 à BF pour la vidéo et à côté, c'est écrit que le port A0H est aussi décodé. Ce qui semble contredire tout le reste et laisse penser que seule le port F0h est décodé pour le son après tout. Edité par GDX Le 10/07/2012 à 14h14
Tous les jeux que j'ai rencontrés utilisent le port 0F0h. Donc, c'est bon si la puce sound SN76489 ne répond uniquement qu'a cette adresse. Et puis, même si un jeu utilisait un port reflet, ça je serait pas un problème. Un petit patch pour changer le port et le tour est joué.
De toute façon, une bonne partie des jeux gèrent les manettes par accès directs. il faudra les patcher au moins pour le VDP et pour ça.
Voici les infos que j'ai récupérés sur les entrées/sorties et le son :
Citation :
Carte de la mémoire et des entrées/sorties
La ColecoVision utilise 2 puces 74138, décodeurs de 3~8 lignes, pour gérer la mémoire et les entrées/sorties.
La mémoire est divisée en 8 plages de 8Ko et les entrées-sorties sont divisées en 4 ports d'écriture et 4 de lecture.
Mémoire
Les lignes ABC du décodeur vont vers A5, A6 et A7 (/E1 -> /M_request ; /E2 -> Reset; E3 -> +V)
0000h~1FFFh = ROM du BIOS
2000h~3FFFh = Port d'extension
4000h~5FFFh = Port d'extension
6000h~7FFFh = RAM (1Ko entre 7000h et 73FFh. Le reste sont des reflets)
8000h~9FFFh = ROM d'une cartouche
A000h~BFFFh = ROM d'une cartouche
C000h~DFFFh = ROM d'une cartouche
E000h~FFFFh = ROM d'une cartouche
Entrées/Sorties
Les lignes ABC du décodeur vers /WR, A5, et A6 (respectivement /E1 -> /IO_request ;
/E2 -> Reset ; E3 -> A7)
00h~7Fh : Port inutilisés.
80h~9Fh : Port d'écriture (W) du mode pavé numérique des manettes.
80h~9Fh : Port de lecture (R) = Non connecté.
A0h~BFh : Port d'écriture (W) aux registres du VDP.
A0h~BFh : Port de lecture (R) aux registres du VDP.
C0h~DFh : Port d'écriture (W) du mode Joystick des manettes.
C0h~DFh : Port de lecture (R) = Non connecté.
E0h~FFh : Port d'écriture (W) aux registres sonores.
E0h~FFh : Port de lecture (R) = État des manettes. A1 est également décodé par les puces (A1=0 manette 1; A1=1 manette 2)
Puce sonore de la ColecoVision
La puce sonore de la ColecoVision est la SN76489AN fabriquée par Texas Instruments.
Elle dispose de 4 voix sonores (3 générateurs de sons programmables et 1 générateur de bruit) et 8 registres de contrôle.
Le volume de chaque voix peut être contrôlé séparément en 16 niveaux (du silence au plus fort) à l'aide des registres 0 à 3.
Chaque octet écrit au port de la puce sonore détermine soit le registre à utiliser avec sa valeur soit, la partie haute de la valeur la fréquence.
Registres de fréquence sonore
La valeur de la fréquence est codée sur 10 bits donc elle est partagée sur 2 octets
Premier octet :
Le bit 7 est à 1 pour indiquer qu'il s'agit d'un registre de contrôle.
R2~R0 correspondent au numéro de registre de contrôle.
000 Fréquence sonore pour la voix 1
001 Volume sonore pour la voix 1
010 Fréquence sonore pour la voix 2
011 Volume sonore pour la voix 2
100 Fréquence sonore pour la voix 3
101 Volume sonore pour la voix 3
110 Contrôle du bruit
111 Volume du bruit
D3~D0 correspondent soit aux 4 bits de poids faible de la valeur de la fréquence soit, à la valeur du volume.
Deuxième octet :
Celui-ci contient la partie haute de la valeur de la fréquence.
Le bit 7 est à 0 pour indiquer qu'il s'agit de la partie haute de la valeur de la fréquence .
D9-D4 correspond aux 6 bits de poids fort de la valeur de la fréquence.
Utilisation :
Pour écrire la valeur de la fréquence vous devez d'abord envoyer le premier octet contenant indiquant la destination, puis le second indiquant le reste de la valeur de la fréquence.
Donc, si nous voulons un son de fréquence 11 0011 1010 b sur le canal 1, nous devons faire comme dans l'exemple suivant.
Tout d'abord, nous écrivons le mot de contrôle avec la première partie de la fréquence :
LD A, 1000 1010b
OUT (F0h), A
Ensuite, la seconde partie de la fréquence :
LD A, 0011 0011b
OUT (F0h), A
Pour définir la fréquence de l'onde à générer, utilisez cette formule:
f = 3579545 / (32n)
f est la fréquence de sortie et n correspond à votre valeur binaire de 10 bits.
La ColecoVision utilise 2 puces 74138, décodeurs de 3~8 lignes, pour gérer la mémoire et les entrées/sorties.
La mémoire est divisée en 8 plages de 8Ko et les entrées-sorties sont divisées en 4 ports d'écriture et 4 de lecture.
Mémoire
Les lignes ABC du décodeur vont vers A5, A6 et A7 (/E1 -> /M_request ; /E2 -> Reset; E3 -> +V)
0000h~1FFFh = ROM du BIOS
2000h~3FFFh = Port d'extension
4000h~5FFFh = Port d'extension
6000h~7FFFh = RAM (1Ko entre 7000h et 73FFh. Le reste sont des reflets)
8000h~9FFFh = ROM d'une cartouche
A000h~BFFFh = ROM d'une cartouche
C000h~DFFFh = ROM d'une cartouche
E000h~FFFFh = ROM d'une cartouche
Entrées/Sorties
Les lignes ABC du décodeur vers /WR, A5, et A6 (respectivement /E1 -> /IO_request ;
/E2 -> Reset ; E3 -> A7)
00h~7Fh : Port inutilisés.
80h~9Fh : Port d'écriture (W) du mode pavé numérique des manettes.
80h~9Fh : Port de lecture (R) = Non connecté.
A0h~BFh : Port d'écriture (W) aux registres du VDP.
A0h~BFh : Port de lecture (R) aux registres du VDP.
C0h~DFh : Port d'écriture (W) du mode Joystick des manettes.
C0h~DFh : Port de lecture (R) = Non connecté.
E0h~FFh : Port d'écriture (W) aux registres sonores.
E0h~FFh : Port de lecture (R) = État des manettes. A1 est également décodé par les puces (A1=0 manette 1; A1=1 manette 2)
Puce sonore de la ColecoVision
La puce sonore de la ColecoVision est la SN76489AN fabriquée par Texas Instruments.
Elle dispose de 4 voix sonores (3 générateurs de sons programmables et 1 générateur de bruit) et 8 registres de contrôle.
Le volume de chaque voix peut être contrôlé séparément en 16 niveaux (du silence au plus fort) à l'aide des registres 0 à 3.
Chaque octet écrit au port de la puce sonore détermine soit le registre à utiliser avec sa valeur soit, la partie haute de la valeur la fréquence.
Registres de fréquence sonore
La valeur de la fréquence est codée sur 10 bits donc elle est partagée sur 2 octets
Premier octet :
Code TEXT :
Bit 7 Bit 9 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 1 R2 R1 R0 D3 D2 D1 D0
Le bit 7 est à 1 pour indiquer qu'il s'agit d'un registre de contrôle.
R2~R0 correspondent au numéro de registre de contrôle.
000 Fréquence sonore pour la voix 1
001 Volume sonore pour la voix 1
010 Fréquence sonore pour la voix 2
011 Volume sonore pour la voix 2
100 Fréquence sonore pour la voix 3
101 Volume sonore pour la voix 3
110 Contrôle du bruit
111 Volume du bruit
D3~D0 correspondent soit aux 4 bits de poids faible de la valeur de la fréquence soit, à la valeur du volume.
Deuxième octet :
Celui-ci contient la partie haute de la valeur de la fréquence.
Code TEXT :
Bit 7 Bit 9 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 0 xx D9 D8 D7 D6 D5 D4
Le bit 7 est à 0 pour indiquer qu'il s'agit de la partie haute de la valeur de la fréquence .
D9-D4 correspond aux 6 bits de poids fort de la valeur de la fréquence.
Utilisation :
Pour écrire la valeur de la fréquence vous devez d'abord envoyer le premier octet contenant indiquant la destination, puis le second indiquant le reste de la valeur de la fréquence.
Donc, si nous voulons un son de fréquence 11 0011 1010 b sur le canal 1, nous devons faire comme dans l'exemple suivant.
Tout d'abord, nous écrivons le mot de contrôle avec la première partie de la fréquence :
LD A, 1000 1010b
OUT (F0h), A
Ensuite, la seconde partie de la fréquence :
LD A, 0011 0011b
OUT (F0h), A
Pour définir la fréquence de l'onde à générer, utilisez cette formule:
f = 3579545 / (32n)
f est la fréquence de sortie et n correspond à votre valeur binaire de 10 bits.
Tous ça est un extrait du PDF que j'ai fait au fur et à mesure que j'ai accumulé les infos. Le PDF est largement inachevé mais si il t'intéresse, je peux te le passer par MP. Tout est en Français. J'espère le finir un jour.
Jipé :
A0-BF (W) = Video ___ A0 also decoded by video chip
A0-BF (R) = Video /
A0-BF (R) = Video /
Dans les doc. de la Colecovision, il y a parfois des phrases qui me laissent dubitatif.
Tout est indiqué comme si tous les ports avaient des reflèts (dans ce cas, de A0 à BF pour la vidéo et à côté, c'est écrit que le port A0H est aussi décodé. Ce qui semble contredire tout le reste et laisse penser que seule le port F0h est décodé pour le son après tout. Edité par GDX Le 10/07/2012 à 14h14
Salut Jipé,
Que penses-tu de ce schéma ?
Il y a des résistances sur chaque Q alors sur ce schéma de mapper, il n'y en a pas.
http://msx.gouget.com.br/?p=65
Est-ce qu'elles ne sont pas nécessaires ? Peut-on les regrouper en une seule ? (Ce qui en ferait 2 au total.)
Que penses-tu de ce schéma ?
Il y a des résistances sur chaque Q alors sur ce schéma de mapper, il n'y en a pas.
http://msx.gouget.com.br/?p=65
Est-ce qu'elles ne sont pas nécessaires ? Peut-on les regrouper en une seule ? (Ce qui en ferait 2 au total.)
Fabf
Membre non connecté
Conseiller Municipal
D'après ma logique, ça décode bien 0F0H
Maintenant celle de Jipé sera peut être différente
Maintenant celle de Jipé sera peut être différente
igal
Membre non connecté
Conseiller Municipal
Moi je trouve intéressant vôtre projet
Par contre, plutôt que de modifier/Patcher la ROM Colécovision, il est peut être possible de faire un périphérique qui regroupe de PSG + Port Manette spécifique
Ce serait une sorte de cartouche émulateur puisqu'elle répondrait à la particularité du PSG et Manette de la Colecovision.
un peu comme la cartouche SVI-2000, mais avec les Port INPUT au lieu de OUTPUT:
Est ce possible
Edit: Après tout, l'idée du MSX c'est de pouvoir être étendu Edité par igal Le 10/07/2012 à 18h58
Par contre, plutôt que de modifier/Patcher la ROM Colécovision, il est peut être possible de faire un périphérique qui regroupe de PSG + Port Manette spécifique
Ce serait une sorte de cartouche émulateur puisqu'elle répondrait à la particularité du PSG et Manette de la Colecovision.
un peu comme la cartouche SVI-2000, mais avec les Port INPUT au lieu de OUTPUT:
Est ce possible
Edit: Après tout, l'idée du MSX c'est de pouvoir être étendu Edité par igal Le 10/07/2012 à 18h58
igal :
Par contre, plutôt que de modifier/Patcher la ROM Colécovision, il est peut être possible de faire un périphérique qui regroupe de PSG + Port Manette spécifique
Pour ne pas avoir à patcher les jeux, il faudrait aussi ajouter le VDP qui provoque une interruption non-masquable à l'adresse 066h et voir même une ROM pour le BIOS de la ColecoVision.
Et puis, brancher des joystick sur une cartouche n'est pas une bonne solution car on risque de retirer la cartouche en tirant dessus en pleine partie. C'est pour ça que d'abord j'ai pensé à un adaptateur sans fil.
Le but de ce projet est de faire pas cher. Sinon, il y a PlaySoniq (ou Franky) qui existe et peut faire bien plus sans patch (ou très peu).
http://supersoniqs.com/projects/
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie