★ CODING ★ LOGON CPCPLUS 45: LE CPC PLUS EN MUSIQUE ★ |
LOGON CPCPLUS 45: Le CPC plus en musique |
CODING CPCPLUS: Le CPC plus en musiqueJusqu'à maintenant, nous avons passé en revue beaucoup de fonctionnalités visuelles du CPC Plus, mais ce que nous vous présentons en étonnera plus d'un au niveau sonore ... Depuis que nous avons abordé la description des nouveaux registres hardwares de l'Asic du CPC Plus (son circuit le plus précieux), nous avons répertorié beaucoup de fonctions spécifiques à la gestion vidéo (sprites, couleurs ... ). Il reste quelques fonctions à développer concernant ce type de registres, que nous aborderons progressivement et en détail plus tard ... (Tout vient à point pour qui sait attendre ... ) Cet article sera consacré aux caractéristiques générales et à la gestion du processeur sonore sur CPC Plus. Une des particularités de l'Asic est de regrouper (en émulant leur fonctionnement) divers circuits existant sur les modèles de première génération. Ainsi l'ASIC intègre-t-il le Gate Array, le Crtc 6845, le PPI 8255A, le PSG AY-3-8912 et l'ensemble des nouvelles fonctions (certaines représentant des améliorations des anciens circuits, les autres étant de réelles innovations fonctionnelles). Les concepteurs de l'Asic avaient prévu aussi d'émuler un circuit séparateur de données pour le drive, mais cela fut abandonné à cause des problèmes de timing, et un séparateur de données externe fut rajouté (un Sed9420 pour les puristes). Puisque je suis dans les problèmes de timing, sachez (s'il y en a que ça intéresse ... ) que l'oscillateur principal (la fréquence de base) de l'Asic est de 40 Mhz, ce qui nous donne, divisé par 9, une fréquence utile de 4,444 Mhz. Nous parlons de l'Asic depuis plusieurs mois maintenant, et, mis à part les sprites, les 4096 couleurs et la gestion des connexions Rom/Ram/IOpage, vous avez sans doute envie de savoir quelles sont les possibilités générales additionnelles de votre CPC Plus? les voici donc ... Le CPC Plus peut:
UN LANGAGE SONORE! L'Asic dispose d'un DMA 3 canaux qui permet la gestion des sons sans intervention (ou presque) du processeur. Un DMA est un circuit (ici émulé par l'Asic) permettant des accès directs à la mémoire (DMA pour Direct Memory Access). Son but est de délester le microprocesseur du travail de transfert de données entre la mémoire et des circuits périphériques (conçus pour accepter ce type de gestion ... ). Ainsi, si Amstrad n'avait pas fait l'économie d'un DMA avec le FDC765 (Floppy Drive Controller), vous pourriez, lors d'un jeu, continuer à jouer pendant le chargement du level suivant, car le processeur ne serait pas occupé à récupérer les données de chaque secteur (il aurait simplement donné cette tache au DMA ... ). Bref, estimons-nous heureux, ces 3 canaux DMA vont libérer le processeur de la gestion musicale à travers un langage sonore ... COMMENT ÇA MARCHE? Toutes les 64 us (c'est le temps d'affichage d'une ligne vidéo), chacun des canaux DMA va retirer (pendant la période HBL des 64 us ) un mot (2 octets ... TMP, le Suisse fou, va encore croire que je le prends pour un imbécile) de la Ram centrale, à l'adresse courante du canal DMA actif. Ce mot est « interprété » par l'Asic comme une instruction sonore (cf schéma 1 ).
L'instruction est exécutée et le pointeur courant du canal DMA est incrémenté de 2 pour la prochaine fois. D'ailleurs, pour information, le pointeur DMA est toujours une adresse paire, le bit 0 de ce pointeur est donc toujours à ... 0 (bravo Fred !). De plus, l'Asic ne peut accéder qu'à la ram centrale, ce qui exclut totalement les Ram supplémentaires des banques. En gros, on peut considérer que la Ram centrale peut contenir 3 listes d'instructions sonores, que j'appellerai désormais AY-Listes. le schéma 2 décrit les différentes instructions d'une AY-Liste.
Les boucles REPEAT ne peuvent être imbriquées (une seule à la fois), la dernière valeur étant prise en compte. Les instructions 4xxx peuvent être combinées ( exemple: INT ou STOP = 4030, donnera l'instruction Interruption, puis Stop). L'instruction STOP laisse le pointeur sur l'instruction suivante (ce qui est pratique si on désire « repartir»). Si le compteur de boucles est initialisé à N (avec REPEAT), le mode de bloc entre REPEAT et LOOP sera exécuté N + 1 fois. L'instruction la plus utile est sans nul doute l'instruction LOAD R,D car c'est elle qui permet d'envoyer des valeurs dans les registres du AY et donc de permettre la génération de sons de manière analogue aux anciens CPC (je vous conseille la lecture de Amstrad CPC n° 44, pages 24-25 pour avoir toutes les informations possibles sur les registres [R] et les valeurs [D] à envoyer au PSG AY [Programmable Sound Generator]). L'UNITE DE PAUSE Chaque canal DMA possède un registre d'unité de pause ... Celui-ci permet de définir le temps P (cf schéma 1). La valeur de ce registre nous donne un temps P = (registre pause + 1) x 64 µs. On remarque ici (si, si), que P peut varier de 64 à 16384 µs. Ainsi, l'instruction PAUSE N (qui attend N x P) permet des délais variant entre 64 us et 67 sec. LE CONTROLE DES CANAUX DMA Imaginons que vous venez de « saisir une AY-Liste située en #8000 et que vous avez décidé d'un temps P = 64 us. Vous devez tout d'abord initialiser un des canaux DMA pour faire le boulot. Admettons que nous travaillons avec le canal 0, ce qui nous donne (#6C00)=#8000 et (#6C02)=0. Il faut maintenant indiquer à l'Asic de « démarrer cette AY-Liste ... cela via le registre de contrôle DMA (qui a aussi un rôle de status, nous le verrons lorsque nous aborderons les interruptions). Regardez le schéma 3 pour la description de ce registre ... OK ?
LE SOUNDTRACK Un des avantages apportés par le système automatique des DMA est celui de pouvoir adresser périodiquement et de façon très rapide les registres du circuit sonore émulé. En matière de son, il est possible d'augmenter la qualité de ceux-ci grâce à l'échantillonnage d'un son réel ( réalisé généralement par un convertisseur) et ensuite de restituer celui-ci grâce à de la modulation d'amplitude ( celle-ci pouvant varier de 0 à 15 sur CPC ). La qualité du son dépend par la suite de la qualité des données échantillonnées et surtout de la vitesse de restitution de celles-ci au processeur sonore ... Nous avons vu qu'un canal DMA du CPC peut mettre à jour un registre PSG à la vitesse maximum d'une valeur toutes les 64 us, soit 15625 kHz (1/0,000064 s) ce qui permet d'ores et déjà d'imaginer dans le futur une qualité sonore équivalente à celle des bons soundtrackers ST ... DMA VERSUS Z80A Mais que se passe-t-il lorsqu'un programme essaie d'accéder aux registres sonores de façon conventionnelle (en passant par le PPI, cf Amstrad CPC n° 43, pages 23 à 27 ) ? Eh bien, l'Asic se charge de fixer les priorités, car il ne peut y avoir qu'un seul accès à la fois sur les registres sonores ... Toutes les instructions sonores prennent 1 micro-seconde à l'exécution, sauf l'instruction "LOAD R,D", qui prend 8 us! Si le processeur cherche à avoir accès au PPI durant ce temps, il attendra donc au moins 8 us ... De même, lorsqu'un canal DMA exécute un LOAD et que le CPU fait un accès au PPI, l'instruction LOAD durera:
L'utilisation conjointe des 2 méthodes d'accès aux registres sonores ne doit normalement pas poser de problèmes, car le registre d'index PSG courant n'est pas perdu par une instruction LOAD. L'EXEMPLE Et pour finir, le petit programme donné en exemple vous permettra de voir de façon concrète la manière d'aborder les DMA-sons du CPC Plus. Votre CPC va exécuter 60 bips espacés de 10 secondes chacun dans cet exemple (je sais, cela va plus vite en basic, mais imaginez que le Z80A n'est pas sollicité pendant l'exécution de la AY-liste !). Maintenant, à vous de jouer! ;; (c) Logon System 1992 ORG #A000 ; CALL DELOCK ; LD BC,#7FB8 ; LD HL,SNDLIST ; LD A,255 ; LD A,1 LD BC,#7FA0 ; EI ; SNDLIST: ; ; DEFW #073E ; DEFW #203C ; ; DEFW #080F ; DEFW #100D ; ; Volume A = 0 (Son Off) DEFW #0800 ; DEFW #1258 ; DEFW #4001 ; DEFW #4020 ; DELOCK: DI SASIC: LD A, (HL) ; TABASIC DEFB &ff,&00,&ff,&77,&b3,&51,&a8,&d4,&62,&39,&9c Longshot , ACPC n°45 page 38-39-40
|