★ CODING ★ AMSLIVE ★ AMSLIVE n°01 - ASSEMBLEUR : LES RASTERS ★ |
AMSLIVE n°01 - Rasters | Coding 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 Cœur 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. -Mode 0: 160x200x16 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 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 1 - Disable Interrupt 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 !).
|