CODING ★ LOGON CPCPLUS 45: LE CPC PLUS EN MUSIQUE ★

LOGON CPCPLUS 45: Le CPC plus en musique
CODING CPCPLUS: Le CPC plus en musique

Jusqu'à 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:

  • gérer 16 sprites hardwares zoomables. la résolution la plus fine d'un sprite étant 16 x 16 pixels mode 2 (sprite non zoomé) ( cf. Amstrad CPC n°41, page 51 );
  • gérer 15 couleurs parmi 4096 pour l'ensemble de ces sprites et définir la palette courante (en fonction du mode graphique, comme sur les anciens CPC) parmi 4096 couleurs ( cf. Amstrad CPC n°38, page 30 ) ;
  • gérer diverses possibilités de connexions Ram/Rom/IOPage ( cf. Amstrad CPC n°41, pages 49 à 51 );
  • gérer des décalages vidéo hardware facilitant la programmation de scrolls fluides multidirectionnels ( cf Instructions RETARDX et RETARDY du Basic) ;
  • gérer automatiquement des « splitscreens », technique appelée par nos soins sur les anciens modèles « Rupture» ( cf Instruction SPLIT du Basic ) ;
  • disposer d'interruptions vectorisées ( Mode IM2 du Z80A, cf. Amstrad CPC n° 33, page 50 pour une première approche).
  • Nous détaillerons la prochaine fois quels types de périphériques utilisent ce mode d'interruption;
  • supporter 4 joysticks analogiques grâce à son convertisseur analogique/digital (8 registres d'entrée à 200 Hz sur 6 bits chacun) ;
  • gérer une sortie imprimante 8 bits ( enfin! ) ;
  • et pour terminer cette liste, le CPC Plus peut gérer, d'une façon très particulière, les données envoyées au processeur sonore émulé.

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 ).


Schéma 1 : Les canaux DMA-sons sur CPC Plus

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.


Schéma 2 : Les instructions DMA-sons


QUELQUES REMARQUES GENERALES

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 ?


Schéma 3 : Registre de contrôle DMA (DCSR)


Vous avez sans doute remarqué les bits 0 à 2 (Non? Retournez au schéma 3). Nous voulons démarrer le canal DMA 0, aussi il nous suffit de positionner le bit 0 du registre de contrôle à 1 (qui peut être remis à 0 par le CPU ou par une instruction STOP). Les bits 1 et 2 servent respectivement pour les canaux 1 et 2, mais je suppose que vous vous en doutiez ...

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:

  • 1 microseconde de plus si le CPU accède au PPI ;
  • 2 us de plus si le CPU, à travers le PPI, écrit dans un registre sonore.

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
; DMA Sound Example
; Longshot pour A100%
;

ORG #A000
DI

;
; DÚlockage Asic
;

CALL DELOCK

;
; Connexion I/O Page
;

LD BC,#7FB8
OUT ( C) , C

;
; Init Adr DMA Sound
;

LD HL,SNDLIST
LD (#6C00),HL

;
; Pause Reg = (255+1)x64 ,us
; Soit 0.016384 seconde
;

LD A,255
LD (#6C02),A

;
; DMA contrôle ON !!
;

LD A,1
LD (#6C0F),A
;
; Déconnexion I/O Page
;

LD BC,#7FA0
OUT ( C),C

;
; Fin programme
;

EI
RET

;
; Programme Sound
;

SNDLIST:

;
; Init Freq Canal A (R0)
DEFW #0055

;
; ctrl Son canal A On
;

DEFW #073E

;
; Repeat 60 Fois

DEFW #203C ;

;
; Volume A = 15

DEFW #080F

;
; Attend 13x0.016384sec
; Soit 0.212992 seconde

DEFW #100D ;

; Volume A = 0 (Son Off)
;

DEFW #0800

;
; Attend 600xO.016384sec
; Soit 9.8304 secondes

DEFW #1258

;
; Loop Instruction

DEFW #4001

;
; stop DMA Liste

DEFW #4020

;
; Délockage de l'Asic
;

DELOCK:

DI
LD E,17
LD HL,TABASIC
LD BC,#BC00

SASIC:

LD A, (HL)
OUT ( C) , A
INC HL
DEC E
JR NZ, SASIC
RET

;
; Séquence "secréte" Pfff!
;

TABASIC

DEFB &ff,&00,&ff,&77,&b3,&51,&a8,&d4,&62,&39,&9c
DEFB &46,&2b,&15,&8a,&cd,&ee

Longshot , ACPC n°45 page 38-39-40

★ ANNÉE: 1992
★ AUTEUR: LONGSHOT
★ UPDATED: 10/08/2019

 

Page précédente : LOGON CPCPLUS 44: Des Rasters sur CPC+
★ AMSTRAD CPC ★ DOWNLOAD ★

Other platform tool:
» cpcplus45  dma  sound  exampleDATE: 2019-08-10
DL: 267
TYPE: text
SiZE: 3Ko
NOTE:

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

Lien(s):
» Coding » LOGON CPCPLUS 44: Des Rasters sur CPC+
» Coding » LOGON CPCPLUS 41: Programmation de l'ASIC
» Coding » LOGON CPCPLUS 47: Les derniers mystères
» Coding Src's » Disassembly of AMSDOS ROM CPCplus
» Coding » LOGON CPCPLUS 39: Exploitez les sprites de votre CPC Plus
» Coding » CPCplus : "Arnold V" Specification
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» 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 229 millisecondes et consultée 2747 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.