| ★ CODING ★ Premiers programmes avec la gamme Amstrad Plus et GX-4000 ★ |
| Les DMA audio de l'Asic |
Les DMA audio de la gamme Amstrad Plus / GX-4000(article très inspiré du site Quasar, voir [QUASAR]) L'Amstrad Plus dispose de trois DMA (Direct Memory Access pour accès direct à la mémoire) pas comme les autres. Oui, à l'instar des sprites hards "pas comme les autres" de l'ASIC, les DMA du CPC sont aussi un peu particuliers. N'espérez pas déplacer de la mémoire avec, faire des split-rasters ou charger une disquette en tâche de fond, ils n'ont pas été conçus pour ça. Par contre, ils sont capables tous les trois d'envoyer des valeurs aux registres audio de l'AY en évitant toute la gymnastique propre au CPC à travers le PPI. Terminés donc les 6 OUT incompressibles et coûteux en temps machine, place aux DMA-listes! C'est déjà pas mal. Toutes les instructions sont dédiées au traitement de l'audio et de synchronisation.
Petite particularité des listes DMA. Elles seront toujours lues directement dans la mémoire centrale (les premiers 64K) quel que soit la configuration mémoire active. Chaque instruction doit être placée sur une adresse PAIRE (multiple de 2). Bien que le nombre de listes sous-entende une filiation avec le nombre de canaux audio de l'AY, une seule liste suffit pour envoyer du son à tous les canaux, puisque l'instruction LOAD adresse n'importe quel registre. Il faut plutôt y voir une polyvalence d'usage, par exemple streamer des sons en continu avec deux listes qui font du ping-pong et pourquoi pas une troisième pour la synchro qui déclenche une interruption sur le dernier sample. Les instructions des listes DMA sont lues lors de la HBL. Une fois les instructions lues, ce qui prend au minimum 3 NOPS, elles sont exécutées. Alors le truc à retenir, c'est surtout ce "retard" de 3 NOPS rapport au début de la HBL, parce que les interruptions classiques ou les interruptions rasters, elles, démarrent en même temps que la HBL! Il n'est donc pas toujours possible de remplacer plusieurs interruptions rasters par une liste DMA d'interruptions (pour ceux qui ont regardé l'article sur le rouleau d'Axelay). Mais déclencher plusieurs interruptions avec une liste DMA reste une façon pratique pour multiplexer des sprites. En optimisant correctement, on arrivera aussi à faire de beaux rasters avec. La capture ci-dessous montre le déclenchement des interruptions en vert dans les bords (étendus pour l'occasion) ainsi que le contour des sprites hard. J'en compte au moins 28 de visibles, plus ceux planqués dans les côtés en attente d'être utilisés.
Note : Les interruptions de multiplexage ne sont pas matérialisées car elles réactivent les interruptions immédiatement. L'importance de l'acquittement En utilisant l'acquittement universel (bit 0 de l'IVR à zéro), il suffit de terminer ses vecteurs d'interruption par EI:RET. En acquittement spécifique, tant que le bit correspondant dans le DCSR n'est pas mis à 1, l'ASIC cesse totalement d'exécuter le programme principal, appelant le vecteur concerné à l'infini. Les listes sont pilotables via un lot de registres dont voici le détail :
*table de vecteurs d'interruption pour le mode IM 2 Avec l'aimable autorisation d'Offset, je vous mets les deux schémas un peu plus visuels
Utilisation générique des listes DMA Le DCSR permet d'activer/désactiver simultanément les trois listes DMA. On met le bit à 1, l'exécution commence à la prochaine HBL. Dans l'exemple ci-dessous, on lance la liste DMA, les temporisations sont manuelles, c'est l'exemple le plus simple d'utilisation d'une liste [Télécharger les sources + fichier audio] include 'system.asm' |
|
Page créée en 634 millisecondes et consultée 16 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. |