CODINGAMSLIVE ★ AMSLIVE n°01 - ASSEMBLEUR : LES RASTERS ★

AMSLIVE n°01 - RastersCoding Amslive

En voiture pour le cours d'Assembleur du nouveau Amstrad Live !

Pour mieux répondre à vos attentes je me propose de vous faire des cours sur mesure ; en effet, puisque vous retrouverez dorénavant cette rubrique tous les mois (enfin j'espère), autant la rendre interactive ! Aussi, j'attends avec impatience vos suggestions et me tiens à votre entière disposition. Ceci dit, voilà le principe que je vous propose pour cette rubrique : un coup vous aurez droit au cours proprement dit (la théorie) et le mois suivant je vous livrerai un listing d'exemple commenté (la pratique). Et maintenant entrons dans le vif du sujet...

Le Plat du Jour

Pour ce premier cours d'Assembleur j'ai décidé de commencer en douceur en vous parlant des rasters. Tout d'abord un raster c'est quoi ? Sous cet anglicisme barbare se cache une technique très simple qui consiste à modifier les couleurs de l'écran pendant le balayage vidéo. Résultat : on oublie la limitation à 2, 4 ou 16 couleurs et on affiche librement les 27 couleurs de la palette du Gâte Array à l'écran. Soit dit en passant, si vous avez un CPC plus, vous pouvez afficher aisément 2000 couleurs en mode 2 mais nous nous cantonnerons ici aux bons vieux CPC et à leur bon vieux Gâte Array (NDSNN : T'as pas honte de faire baver plus des trois-quarts de notre lectorat ?). Ah ! C'est qui celui-là ? Eh bien on peut dire que c'est le coeur du CPC car il gère des tonnes de choses. C'est lui, en premier lieu, qui génère l'affichage (le non moins célèbre CRTC n'est là que pour générer les synchros), qui gère la commutation des RAM et des ROM et qui crée les interruptions pour le Z80. Pour l'heure nous nous intéresserons uniquement à la partie de gestion de l'affichage vidéo.

Le Gai Taré

Une particularité du Gâte Array dans sa gestion des couleurs est qu'il ne raisonne pas en binaire mais sur 3 états (0-1-2), c'est ainsi que nous avons 27 couleurs dans notre palette et non 16 ou 32. C'est pour cette même raison que sur un CPC plus les couleurs n'apparaissent pas tout à fait de la même manière que sur un CPC, car l'Asie, lui, raisonne en binaire et la conversion ne peut donc pas être exacte.
Voilà pour la palette des couleurs ; ensuite on a les modes d'affichage, les fameux modes 0, 1 et 2. En fait, il existe 4 modes :

-Mode 0:  160x200x16
-Mode 1 : 320x200x4
-Mode 2 : 640x200x2
-Mode 3 : 160x200x4

En clair , le mode 3 est complètement idiot et c'est bien pour ça que personne n'en parle. Vous connaissez certainement la commande INK du Basic ou le CALL &BC32 du système qui permettent de reconfigurer nos couleurs mais pas question de modifier plusieurs fois une couleur pendant un balayage avec ces bêtes là ; il faut s'adresser directement au Gai Taré.

Physiquement, celui-ci se trouve sur le port &7F00. La valeur envoyée sur ce port doit être coupée en deux pour avoir un sens. Les deux bits de poids fort déterminent le mode du Gâte Array à activer, le Bit 5 est toujours à 0 (sinon on commute des ROMs et des RAMs dans tous les sens), les 5 derniers bits sont la valeur à envoyer. En clair voilà à quoi ressemble un bit envoyé au Gâte Array :

Dans le cas qui nous intéresse nous n'utiliserons que les valeurs 0 et 1 pour les bits de contrôle. En mode de contrôle 00 les bits de commande permettent de choisir l'encre courante ; leur valeur doit donc être comprise entre 0 et 15 en Mode 0, 0 et 3 en Mode 1 et 0 et 1 en Mode 2 (et entre 0 et 3 en Mode 3 pour les farceurs). Une fois une encre sélectionnée on lui attribuera une couleur grâce au mode de contrôle 01, les 5 bits de poids faible contiennent alors le code de la couleur en question. Attention, il s'agit d'un codage 3 états et les valeurs obtenues n'ont donc rien à voir avec celles indiquées dans votre notice qui ont été réordonnées de la plus sombre à la plus lumineuse. Voici un tableau donnant la correspondance entre les couleurs soft (codage système) et hard (codage Gate Array). (voir tableau ci-contre. )

C'est Quand qu'on va Où ?

Demeure un problème, comment qu'on fait en pratique pour changer les couleurs quand y faut ? De ce côté là, le CPC est assez pauvre et nous n'avons pas trop le choix (pourquoi on a pas un Coper comme sur Amiga !)... La première étape consiste à attendre le début du balayage vidéo (VBL) : le CALL &BD19 fait ça très bien. Ensuite, pour se placer exactement où on le désire à l'écran nous avons à notre disposition les interruptions du Gate Array qui sont générées tous les 300èmes de seconde (soit 6 interruption par VBL (synchro verticale) toutes les 52 lignes de synchro horizontale (HBL))... Mais pour pouvoir réellement les utiliser en tant que synchro il faut les dérouter pour qu'elles soient stables.

En standard le Z80 fonctionne en mode IM 1 ce qui signifie qu'à chaque interruption Gâte Array celui-ci fait un RST &38 et, en &38, il y a la routine système (JP &B941). La méthode la plus simple pour s'en débarrasser est de la remplacer par un EI suivi d'un RET, c'est à dire de poker &FB en &38 et &C9 en &39. Mais attention, faites votre poke sous DI (Disable Interrupt) sinon vous risquez d'avoir des surprises. Une fois nos nouvelles interruptions en place (n'oubliez pas le EI (Enable Interrupt) après vos pokes en &38 et &39)) il nous suffira d'attente une interruption pour se retrouver 52 lignes plus bas grâce à l'instruction HALT.

Vue votre mine perplexe, je récapitule :

1 - On reconfigure les interruptions
2 - On attend la synchro verticale pour être en  haut de l'écran
3 - On place le nombre de HALT désiré pour descendre ou on veux à 52 lignes près.
4 - On attend quelques "64 nops" en boucle pour se placer exactement où on veut à la ligne près.
5 - On attend quelques nops pour se placer exactement en début de ligne.
6 - On joue avec le port &7F00
7 - On boucle en 2

Il va sans dire que le réglage des synchros par les nops ne s'obtient que par essais successifs (quoique...). Mais rien ne vous empêche de tenter de mettre le programme au point par vous-même dès à présent puisqu'en voici l'algorithme à base
de Basic :

1 - Disable Interrupt
2 - Poke &38,&FB:POKE &39,&C9
3 - Enable Interrupt
4 - Encre 0=Noir 5-CALL&BD19
6 - Attente de 8/10 ligne HBL (pour sauter l'interruption durant la VBL)
7 - HALT
8 - HALT
9 - HALT
10 - Synchros
11 - Raster (encre 0)
12 - Boucle en 4, Résumé d'informations : il y a 64 nops entre deux HBL, 52 HBL entre deux interruptions, 6 interruptions et 312 HBL entre deux VBL!

Voilà, je pense qu'avec ces quelques notions vous allez pouvoir faire connaissance avec les Rasters. A très bientôt avec un beau programme d'exemple (peut-être deux !).

OffseT , AMSLIVE n°1

★ ANNÉE: ???
★ AUTEUR: OFFSET

Page précédente : AMSLIVE n°01 - Init

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 123 millisecondes et consultée 2265 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.