CODING ★ La programmation HARD du PSG ★

Assembleur ACPC n°44 - La programmation HARD du PSG

L'assembleur n'est pas seulement un langage, c'est aussi un mode de penser que nous voulons vous faire entrevoir dans cet article. Si tout le monde est bien conscient qu'un poke n'est pas chose irréalisable, il doit aussi se dire qu'un OUT est à loger à la même enseigne. Nous allons donc vous en faire part illico. Et yop ! un petit coup de pouce aux débutants.

Il est exact que certains composants n'apprécient pas vraiment d'être pilotés en Basic. Il en va ainsi, par exemple, du FDC 765. Le moindre décalage au niveau des tempos et tout explose dans un plantage à faire pleurer. Remarquez que cela n'arrive pas avec toutes les commandes, mais tout de même. J'ai connu cela lors de mes premiers déboires avec ce collègue. En revanche, bon nombre de périphériques se révèlent fort sages lorsqu'on les conduit sous Basic. Le CRT 6845, par exemple, est docile comme un agneau et répond parfaitement à toutes les sollicitations.

Bref, nous allons taper dans le gras du sujet en vous donnant quelques exemples. Ainsi, plus besoin d'intégrer de l'assembleur, langage fort indélicat pour certains programmeurs, la où le Basic fera parfaitement l'affaire. Le PSG AY3 8912 plus connu sous le diminutif PSG, fait partie des composants quelque peu snobs. Sympathique à piloter, il nous servira de démonstration à la suite de cet article. Il nous faudra juste une petite interface assembleur pour appeler la routine &BD34 qui gère parfaitement ce composant. Bref, en avant la musique.

DES SONS GENIAUX

Avant tout, nous devons faire un bref tour d'horizon sur la structure de ce composant. Il contient trois voies capables d'émettre des sons écoutables. Il contient aussi un et un seul générateur de bruit qu'il est possible je mixer avec un ou plusieurs des canaux sons. Un générateur d'enveloppe permet de moduler les sons selon des courbes prédéfinies (ne pas confondre avec les enveloppe ENV et ENT), et, enfin, il existe un variateur de volume coupable à un ou à plusieurs :anaux. Si avec ça, on est incapable :l'arranger des petits bruits sympa, c'est qu'on est vraiment pas doué. Sachez, si vous êtes novice, ,que les instructions musicales du Basic du CPC se servent peu des vrais avantages du PSG et que les programmeurs de ce langage ont préféré reprogrammer tout en soft, histoire de mieux contrôler les enveloppes. Tout ce que nous allons faire, c'est utiliser le Basic pour taper dans le PSG presque sans passer par l'assembleur. Pour toute question traitant directement des caractéristiques techniques du PSG, voici un bref rappel.

LE CANAL BANAL

Le PSG dispose de 15 registres. Parmi eux, seulement 14 gèrent le son, le quinzième servant à adresser le clavier. Voici un bref descriptif.

R0 et R1 : poids faible et fort de la fréquence du canal 1 sur 12 bits (0 à 4095). Pour une fréquence de 1234 (&4D2), R0=D2, R1=4. Vous voyez donc que seuls les 4 bits de poids faible du registre (4 bits de droite) de poids fort sont utilisés. La fréquence du son est obtenue par le calcul suivant (à deux poils près) :

Valeur 12 bits = 125000 / fréquence.

Ou encore:

Fréquence = 125000 / valeur 12 bits.

Pour obtenir le LA du téléphone (440 Hz), voici le calcul:

— 125000 / 440 = 284 => &11C => R0=1C et R1=1 ;

— R2 et R3 : idem ci-dessus canal 2 ;

— R4 et R5 : idem ci-dessus canal 3.

— R6 est le registre de fréquence du générateur de bruit sur 5 bits (0 à 31). :::alcul de la fréquence comme pour :elle des canaux.

— R7 est le registre de contrôle du mélangeur et des ouvertures de canaux. Pour chaque canal, il est possible de préciser s'il est ouvert ou fermé et si le bruit doit y être mélangé ou non. Chacune de ces actions est réalisée si le bit correspondant est à zéro.
Bit 0 à 0: son sur canal 1.
Bit 1 à 0 : son sur canal 2.
Bit 2 à 0 : son sur canal 3.
Bit 3 à 0 : bruit sur canal 1.
Bit 4 à 0 : bruit sur canal 2.
Bit 5 à 0 : bruit sur canal 3.
Bit 6 à 0 : registre R14 du PSG en entrée pour la lecture du clavier (ne pas le mettre à 1 sinon plus de réponse clavier).
Bit 7 à 0 : inutilisé.
Ouverture du son avec bruit sur le canal 1, du son seul sur le canal 2 et du bruit seul sur le canal 3 :
%00010100 => &14 => 20
ATTENTION: le canal est ouvert si son identificateur est à zéro et non le contraire.

— R8: contrôle du volume du canal 1. Les quatre bits de poids faible forment le volume, le bit 4 permet d'utiliser le modulateur de volume s'il est à 1.

— R9 : idem pour le canal 2.

— R10: idem pour le canal 3.

— R11 et R12 : poids faible et fort de la période de modulation du volume sur 16 bits. Pour obtenir cette période en seconde, voici le petit calcul à appliquer:
Période en secondes = 125 000 * Valeur des registres /16.
Ou encore:
Valeur des registres = 125 000 * Période en secondes /16.
Ça sert d'apprendre les maths à l'école, on les utilise toujours.

— R13 contrôle la forme de la modulation sur 4 bits comme suit:

Valeur = 0, 1,2,3 ou 9:

\
\
\

Valeur = 4, 5, 6, 7 ou 15:

/
/
/

Valeur = 8 (cycle infini) :

\ |\ |\ |\ |\
\ | \ | \ | \ | \
\| \| \| \| \

Valeur = 10 (cycle infini) :

\ /\ /\
\ / \ / \
\/ \/ \

Valeur = 11 (cycle infini) :
______________

\ |
\ |
\|

Valeur = 12 (cycle infini) :

/| /| /| /| /|
/ | / | / | / | / |
/ |/ |/ |/ |/ |

Valeur = 13 (cycle infini) :

_________________
/
/
/

Valeur = 14 (cycle infini) :

/\ /\ /
/ \ / \ /
/ \/ \/

OUKETI

Pour générer un son, il faut avant tout préparer un canal à cet effet. Mettre une fréquence dans le registre aproprié, régler le volume et enfin appuyer sur le bouton pour que cela sorte. Nous utiliserons le canal 1. Voici les valeurs ainsi que les numéros de registre que nous allons utiliser.

Une fréquence de 1000 dans le canal 1 :

— registre 0 : &E8 ;

— registre 1 : &03.

Volume au maximum:

— registre 8 : &0F.

Ouverture de la porte sonore:

— registre 7: &3E (00111110).

Attention! Notez que pour qu'un son sorte, il faut non seulement ouvrir la porte le concernant, mais en plus lui allouer le volume nécessaire à son écoute. Pour couper un canal, il ne suffit pas non plus de fermer sa porte, il faut aussi mettre son volume à zéro.

Cela nous suffira. Maintenant, encore faut-il réussir à trouver le PSG pour lui donner tout ce bon miam. Sur le CPC, le PSG se cache derrière le PPI. Le PPI est un circuit qui permet au Z80 de s'interfacer avec des tas de périphériques tels que le clavier, le lecteur de cassettes, l'imprimante, l'écran et, bien sûr, le PSG. Comme tout passe par ce composant, qui n'est pas de taille éléphantesque, il n'est pas .possible de voir l'intégralité du PSG simultanément à travers lui. Seule une valeur est visible par accès. Cette valeur peut bien entendu être soit une commande de sélection de registre, soit une donnée à déposer ou à lire. Il nous faudra donc un petit gestionnaire permettant de distinguer une donnée d'un numéro de registre. Le PPI sera là pour nous faciliter la tâche, car deux des bits de contrôle du PSG y sont aussi reliés.
Pour causer au PSG, il faut déposer me donnée dans le PPI sur le port &F400, et dire au port &F600 quel est le type de cette première. Elle peut en effet être un numéro de registre ou encore le contenu du registre actif. En clair, voici les manipulations directes à effectuer :

Out &F400, n° de registre ; donnée sur le port 1
Out &F600, &C0 ; lecture du registre par le PSG
Out &F600, &00 ; état repos pour le PSG Jour écrire le numéro de registre qui deviendra actif
Out &F400, Valeur ; donnée sur le port 1
Out &F600, &80 ; lecture de la donnée :Jar le PSG
Out &F600, 0 ; état repos pour le PSG pour ranger une valeur dans le registre courant.

Malheureusement, le Basic n'est pas assez speed pour réaliser ces opérations. Il ne nous reste donc plus qu'à passer par le système qui fait si bien ce qu'il n'est pas nécessaire de réinventer.

AU BONHEUR DES DAMS
Le vecteur &BD34 permet d'écrire la donnée passée dans le registre C du Z80 dans le registre du PSG dont le numéro est contenu dans l'accumulateur. En clair:

LD A, n° du registre PSG
LD C, valeur
CALL #BD34

Nous savons aussi que le dernier paramètre passé au CALL par le Basic est dans le double registre DE. Pokons donc à n'importe quel endroit de la mémoire les quelques instructions suivantes:

LD A,D
LD C,E
JP #BD34

Pour que les valeurs recherchées soient bien dans DE, il suffit d'appeler la routine par:
CALL Adresse, RegistrePSG * 256 + Donnée PSG

Tapez le petit exemple et vous verrez que tout roule tout cool.

100 FOR 1=0 to 4 :READ A$
110 POKE &9000+I,VAL("&"+A$):NEXT
120 DATA 7A,4B,C3,34,BD
130 R=0:D=2:CALL &9000,R*256+D
140 R=l:D=0:CALL &9000,R*256+D
150 R=2:D=4:CALL &9000,R*256+D
160 R=3:D=0:CALL &9000,R*256+D
170 R=4:D=0:CALL &9000,R*256+D
180 R=5:D=8:CALL &9000,R*256+D
190 R=7:D=&3E:CALL &9000,R*256+D
200 R=8:D=16:CALL &9000,R*256+D
210 R=9:D=16:CALL &9000,R*256+D
220 R=10:D=16:CALL &9000,R*256+D
230 R=l1 :D=84:CALL &9000,R*256+D
240 R=12:D=30:CALL &9000,R*256+D
250 R=13:D=13:CALL &9000,R*256+D

Désolé de vous laisser sur votre faim pour cette fois, mais la prochaine, nous taperons dans d'autres périphériques. Sur CPC, ce n'est pas ce qui manque.

Erabrab El Denis, ACPC n°44 Juil92, p24-25

Page précédente : Bidouilles ACPC n°43 - Les vecteurs system

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Assembleur ACPC n°20 - Convertion numerique
» Coding » Assembleur ACPC n 04 - Initiation : Débuter avec sont assembleur
» Coding » Bidouilles ACPC n°32 - Bip, son and sound
» Coding » Bidouilles ACPC n°12 - Création de RSX
» Coding » Assembleur ACPC n°46 - La multiplication et la division
» Coding » Bidouilles ACPC n°37 - Gestion de la matrice de caractere
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 432 millisecondes et consultée 2399 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.