CODING ★ LOGON CPCPLUS 44: DES RASTERS SUR CPC+ ★

LOGON CPCPLUS 44: Des Rasters sur CPC+
Cette fois, on va privilégier les possesseurs de CPC+, car mis a part le B-ASIC, je crois qu'ils n'ont pas grand-chose a se mettre sous la dent.

J'entends déjà certaines remarques désobligeantes : « Quoi ? Encore des Rasters ? ». Eh oui, mais cette fois sur le CPC +, et on peut dire que 4096 couleurs a la place de 27, cela fait une grosse différence!

Il est a noter que les fonctionnalités de l'Asic par rapport au Gate Array sont beaucoup plus diverses et plus complexes. Cela ne veut pas forcement dire que la programmation en est plus compliquée, bien au contraire, comme nous allons le voir.

Essayons d'énumérer les différences non visibles extérieurement par l'utilisateur mais visibles par le programmeur - qui existent entre l'Asic et le Gate Array.

Tout d'abord, la différence majeure, et la plus importante à mes yeux, se situe dans l'accès aux registres de l'Asic qui s'effectue en écrivant ou en lisant dans la mémoire centrale et non pas dans la zone d'Entrées/Sorties du Z80 (comme se fait habituellement l'accès aux périphériques). Pour ceux qui ne saisissent pas ce que cela signifie, je vais essayer d'être plus clair et de donner un exemple concret, ce qui ne m' empechera pas de présenter le cote technique.

COTE TECHNIQUE

Sur un CPC de l'ancienne génération, lorsque l'on desire programmer le Gate Array, il est nécessaire d'utiliser des instructions d'Entrees/Sorties (OUT pour ecrire dans la zone d'Entrées/Sorties et IN pour y lire). Le Z80 ne se com porte pas de la même maniere lorsqu'on lit/ecrit avec des instructions d'Entrées/Sorties que lorsqu'on lit écrit dans la mémoire centrale. Dans le cas d'une instruction d'adressage de la mémoire centrale, le Z80 positionne l'adresse a laquelle doit s'effectuer l'opération sur son bus (groupe de fils sur lesquels transitent des valeurs binaires qui sont les adresses, broches A0 a A15) et ensuite active sa broche Read/Write (Lecture/Ecriture pour les anglophobes) en fonction de l'operation desiree. Si c'est une lecture, il va prendre la valeur presente sur son bus de données et va la mettre dans un registre (celui désigne par l'instruction). Si c'est une écriture, il va positionner la valeur d'un registre (celui désigne par l'instruction) sur son bus de données. Tout cela se déroule en une micro-seconde et est donc tres rapide. Pour connaître la durée totale de l'instruction, il faut aussi tenir compte du temps que prend le décodage de l'instruction (c'est-à-dire le temps durant lequel le Z80 lit et comprend l'instruction a exécuter). Cela peut durer entre 1 et 4 micro-secondes et dépend de différentes choses : les registres entrant en jeu (1 micro-seconde de plus pour IX et IV), le mode d'adressage (indirect, indirect indexe, etc.) et la taille de la donnée a traiter (8 bits ou 16 bits).

Une instruction de Lecture/Ecriture dans la zone d'Entrées/Sorties se déroule presque de la même manière, a deux différences près. En premier lieu, pour signaler que l'instruction intervient sur les Entrées/Sorties, le Z80 active en plus sa broche IORQ (Input Output Request ou bien Demande d'Entrées/Sorties), et ensuite la phase Lecture/Ecriture proprement dite dure plus longtemps.

Le Z80 insère une micro-seconde d'attente, cela s'explique par le fait qu'a l'époque de la fabrication du Z80, les périphériques étaient plus lents que les mémoires, ce qui nécessitait une attente plus longue durant les accès.

II est aussi a noter que les instructions d'Entrées/Sorties sont beaucoup moins sou pies que des instructions d'adressage a la mémoire centrale, donc moins facilement optimisables.

TOUT CELA POUR VOUS DIRE QUE...

Si je me suis bien fait comprendre, vous réalisez en ce moment même que pour lire/écrire dans les registres de l'Asic no us n'avons plus qu'a utiliser les instructions LD a la place des instructions IN et OUT qui sont beaucoup trop lentes.

L'ASIC: BIEN SOUS TOUS RAPPORTS

Un des autres avantages de l'Asic, non visible par l'utilisateur mais rendant bien des services aux programmeurs, se situe dans le fait que les registres de l'Asic se trouvent tous (je dis bien tous) a des adresses différentes. lis sont donc directement accessibles en une seule instruction, contrairement a certains registres (pour ne citer qu'eux) du

Gate Array ou du CRT 6845, qu'il faut préalablement choisir par l'intermediaire d'un registre de sélection (exemple: OUT &BC00 puis OUT &BD00 pour le CRT 6845), dans lequel on écrit le numéro de registre courant. De cet avantage découle la diminution du nombre d'instructions nécessaires a la programmation des registres Asic et l'optimisation s'en trouve facilitée.

Une fois que l'on a bien saisi les différences qu'implique la programmation de l'Asic, on va pouvoir songer a nos fameux Rasters en 4 096 couleurs. Pour comprendre le fonctionnement des registres de couleurs (je ne pense pas me tromper en disant que ce sont ceux-la qu'il faut utiliser pour faire des Rasters), il ne faut pas faire appel a nos connaissances sur le Gate Array, en se disant qu'avec telle valeur nous obtiendrons telle couleur. On ne doit pas considérer des valeurs exactes, mais des groupes de bits qui, une fois réunis, donnent une valeur.

Plus clairement, on ne peut pas directement savoir quelle couleur donnera la valeur 703. Tout d'abord, il faut savoir que les registres de couleurs sont des registres 16 bits dont 12 bits sont utilises. Ces 12 bits se découpent en trois groupes de 4 bits chacun. Ces trois groupes correspondent a chacune des composantes (rouge, vert, bleu) nécessaires pour obtenir une couleur ; plus la valeur sur 4 bits est élevée, plus la composante sera intense. Le mélange des trois composantes donne les couleurs intermédiaires.

Donc, pour donner un exemple simple, si nous mettons &0000 dans un registre de couleur, toutes les composantes sont au minimum: ce qui donne du noir ; si par contre nous mettons &FFF (sur 12 bits utiles, ne pas oublier !), nous aurons toutes les composantes au maximum, lesquelles, une fois mélangées, donneront du blanc brillant.

Pour vérifier (est-ce bien nécessaire ?) le nombre de couleurs disponibles, il suffit de faire le calcul suivant : 2 élevé à la puissance 12, car no us avons 12 bits et 2 valeurs possibles pour chaque bit, le résultat est effectivement 4 096 (ouf! je suis rassure, on ne sait jamais, ils auraient pu se tromper chez Amstrad !).

L'Asic dispose de 16 registres de couleurs pour les encres, d'un registre pour la couleur du bord, ainsi que de 15 registres de couleurs pour les encres des sprites, il n'y a que 15 encres pour les sprites, car l'encre 0 correspond a l'encre transparente a laquelle on ne peut pas affecter de couleur (ce qui est logique, non ?).

AU BOULOT

Mis a part la possibilité d'ajouter un cote esthétique non négligeable à vos demos, le fait de disposer de beaucoup de couleurs vous permet de créer de nouveaux effets, comme par exemple donner une impression de profondeur dans les déplacements des Rasters. Cela n'a rien de très nouveau de voir des Rasters se promener sur l'écran, même si ceux-ci suivent une douce courbe sinusoïdale. C'est plat et terne. Ce que je vous propose comme programme d'illustration de cet article, ce sont des Rasters qui se déplacent a la fois sur l'axe Y (de bas en haut ou de haut en bas, c'est comme vous voulez...) et en même temps sur un axe Z (pour la profondeur). La gestion de l'axe Y n'est pas une nouveauté, il nous suffit d'utiliser une table de cosinus pour le déplacement. Si vous avez régulièrement suivi les articles Logon, je pense que ce genre de chose ne doit pas vous poser de problèmes.

Pour ce qui est de l'axe Z, c'est une autre paire de manches. Il faut tout d'abord songer a l'effet que l'on désire obtenir. Dans notre cas, nous souhaitons avoir un Raster qui donne l'impression de se rapprocher ou de s'éloigner de l'écran. Lorsqu'il s'éloigne, le Raster est sombre et plus petit, par contre, lorsqu'il se rapproche, il est plus grand et plus clair.

Nous prévoyons en mémoire une zone dans laquelle seront stockées différentes tables de couleurs qui correspondent aux différents niveaux de profondeur visible.

Dans notre programme d'exemple, il y a 16 niveaux de profondeur.

VOUS SUIVEZ ?

Pour savoir quel Raster choisir a un instant précis, nous gérons une table de cosinus de 16 valeurs d'amplitude et dont l'indice sera lie a celui de la table des cosinus du déplacement sur l'axe des Y. Etant donne que nous utilisons un axe Z, il devient très simple de gérer plusieurs Rasters avec différentes priorités d'affichage en fonction de la position des Rasters sur l'axe Z.

En effet, un Raster éloigne sur l'axe Z doit être affiche "sous" un autre Raster plus proche.
En fait, il doit être affiche avant, ce qui nous fait comprendre que l'ordre d'affichage des Rasters dépend de leur position sur l'axe Z.

ENCORE DEUX MOTS

Pour déterminer l'ordre des Rasters avant l'affichage, il nous faudra préalablement les trier, et ceci en fonction de leur position sur l'axe Z. Il existe plusieurs manières de trier un tableau. On peut scruter les éléments les uns après les autres, en sortir le plus petit, et cela autant de fois qu'il y a d'éléments. On peut optimiser cette méthode en tenant compte des inversions durant la recherche du plus petit. S'il n'y a plus d'inversion entre les éléments, cela signifie que le tableau est entièrement trie, donc plus la peine de continuer.

La solution pour laquelle j'ai opte consiste a remplir un tableau avec la coordonnée Z de chaque Raster. Ensuite, on cherche le plus petit du tableau et on l'affiche.

Le plus petit trouve doit être supprime du tableau. On continue le tri jusqu'a que l'on soit sur d'avoir affiche tous les Rasters.

Voici a peu près toutes les explications que je peux donner. Il ne vous reste plus qu'a taper les deux listings: le chargeur en Basic qui crée les tables et lance le programme binaire, et le listing en assembleur que vous sauvegarderez sous le nom RASTER+.BIN.

Pour les non-programmeurs, saisissez le lanceur Basic et les data. Lancez les datas qui généreront le fichier binaire et regardez le résultat en lançant le... lanceur.
— Et avec ça Madame?
— Ce sera tout, merci.

Digit, ACPC n°44 Juill/Aout 92, p45-46

★ ANNÉE: 1992
★ AUTEUR: DIGIT
★ INFO: Download la derniere version B-ASIC

 

Page précédente : LOGON CPCPLUS 42: Le B-ASIC nouveau est arrivé
★ AMSTRAD CPC ★ DOWNLOAD ★

Other platform tools:
» CPCplus44-Raster  Plus    (Typed  by  Takis  Olaf)DATE: 2014-02-19
DL: 279
TYPE: ZIP
SiZE: 22Ko
NOTE: 40 Cyls
.HFE: √

» cpcplus44aDATE: 2012-08-27
DL: 189
TYPE: image
SiZE: 388Ko
NOTE: w543*h2320

» cpcplus44bDATE: 2012-08-27
DL: 167
TYPE: image
SiZE: 122Ko
NOTE: w359*h732

» cpcplus44cDATE: 2012-08-27
DL: 173
TYPE: image
SiZE: 102Ko
NOTE: w361*h356

» cpcplus44dDATE: 2012-08-27
DL: 161
TYPE: image
SiZE: 604Ko
NOTE: w533*h2582
 

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

Lien(s):
» Coding » LOGON CPCPLUS 45: Le CPC plus en musique
» Coding Src's » Disassembly of AMSDOS ROM CPCplus
» Coding » Chronique A100% CPC+ (Logon System)
» Coding » LOGON CPCPLUS 41: Programmation de l'ASIC
» Coding » LOGON CPCPLUS 38: Dessinez en 4096 couleurs
» Coding » LOGON CPCPLUS 47: Les derniers mystères
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 571 millisecondes et consultée 2082 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.