
| CODING - Les vecteurs system du CPC |
» LE CLAVIER
» LE MODE TEXTE
» LES SONS
» LES EVENEMENTS
» LE GESTIONNAIRE GRAPHIQUE
» LE GESTIONNAIRE D'ECRAN
» LE GESTIONNAIRE SONS
» LE KERNEL
» LE GESTIONNAIRE CASSETTE
INTERFACE MATÉRIELLE
Nous allons, dans cette liste, aborder les vecteurs gérant le clavier, les modes textes, l'écran, le graphisme, les sons et les accès disque (clavier, mode et sons pour ce numéro).
Nous vous indiquerons dans un premier temps l'adresse d'appel du vecteur suivi d'un petit commentaire sur la fonction réalisée ainsi que les conditions d'appel (initialisation de certains registres) et les conditions finales (l'état des registres et les flags).
L'état en sortie des registres vous permet de strocker prealablement ces derniers a l'aide de !'instruction PUSH pour ne pas perdre une valeur placee dans le registre avant l'appel de la routine. Il va de soi que cet empilement sera desactive a 'aide de l'instruction POP juste apres l'appel du vecteur.
A vous de faire votre choix tout en sachant que cette liste n'est pas exhaustive mais qu'elle renferme l'essentiel des vecteurs utilisables en assembleur.
. BB00 : Initialise le clavier, les predefinitions (KEY, KEYDEF), le tampon clavier (CLEAR INPUT sur 6128), etc.
CA : Aucune.
CF : Les registres AF,BC,DE et HL sont modifies.
. BB06 : Attente d'une touche du clavier et renvoie son code dans l'accu (voir également BB18)
CA : Aucune.
CF : L'accumulateur = numéro du caractere (exemple : 66 pour la touche B du clavier).
. BB09: Teste si une touche est enfoncee. Cette routine n'attend pas et doit etre placee dans une boucle d'attente.
CA : Aucune.
CF : Si une touche est pressee,
CARRY = 1 et Accumulateur = numéro du caractere,
sinon CARRY=0 et l'accumulateur est modifie.
. BB18 : Attente d'une touche du clavier.
Cette routine se differencie de BB06 par le fait qu'elle renvoie pour quelques touches un code different de BB06. Entre autres, les touches du pave numerique. Le vecteur BB18 renvoie des valeurs allant de 48 a 57 ( codes ASCII ) alors que BB06 donne 128 a 137 (valeur utilisable lors de la redefinition d'une touche). La difference est vraie avec 139 pour ENTER (au lieu de 13 avec BB18) et 138 pour le "." du pave numerique (au lieu de 46 avec BB18).
CA : Aucune.
CF : L'accumulateur = numéro du caractere.
. BB1B : Teste si une touche est enfoncee.
Cette routine n' attend pas et doit être placee dans une boucle d' attente.
Cette routine se differencie de BB09 par le fait qu'elle renvoie le numéro de la touche correspondant aux indications gravees sur le boitier de votre CPC 6128 (exemple pour un clavier Azerty, la touche A correspond a 67).
CA : Aucune.
CF : Si une touche est pressee, CARRY = 1 et Accumulateur = numero du caractere, sinon CARRY=0 et l'accumulateur est modifie.
. BB21 : Demande l'etat de la touche CAPS LOCK et SHIFT.
CA : Aucune.
CF: L contient l'etat de la touche CAPS et H celui de SHIFT. Notons qu'une valeur 0 signifie une touche non enclenchée et 255 une touche pressee.
. BB24 : Teste l'état du joystick.
Pour connaitre la position d'un manche a balai, il faudra tester les 6 premiers bits de l'accumulateur (exemple BIT 1,A, JR Z,...).
CA : Aucune.
CF : A et H contiennent l'etat du premier joystick et L l'etat du second. Les bits 0 a 5 de ces registres se placeront a 1 si les directions suivantes sont respectees ; haut, bas, gauche, droite, feu 2, feu 1. Exemple, pour un joy pointe vers le haut avec le bouton de feu enfonce, l'accumulateur aura ses bits 0 et 5 mis a 1.
. BB3F : Réglage des temps de réponse et de repetition du clavier (SPEED KEY du Basic).
CA: H = temps avant la premiere repetition,
L = La vitesse de repetition.
Ces vitesses sont indiquees en cinquantieme de seconde (LD H,50 pour une seconde).
CF : AF est modifie.
. BB48 : Desactive la touche ESC.
Sous Basic cet appel sera utilise de la façon suivante :
10 CALL &BB48
20 GOTO 20
CA: Aucune.
CF : AF et HL sont modifies.
. BB5A : Affiche un caractere Ascii à la position courante du curseur texte (LOCATE).
C'est en somme l'équivalent de PRINT mais pour un seul caractere. Sachez que pour afficher une phrase, il faudra écrire une routine de lecteur qui affichera les caracteres un par un. Contrairement au Basic, cette routine n' execute pas de retour chariot ce qui evite de replacer le curseur pour le caractere suivant. Exemple Basic PRINT "A";
CA : L'accumulateur contient Ie code Ascii du caractere à afficher (exemple : 65 pour A).
CF: Tout reste en place.
. BB60 : Lit un caractere à la position courante du curseur texte.
Equivalent Basic de COPYCHR$.
CA : Aucune.
CF : Si la routine reconnait un caractere, CARRY = 1 (JR C,..) et l'accumulateur-contient le code Ascii de ce caractere, sinon, CARRY = 0 et A = 0.
. BB66 : Fixe les limites d'une fenetre texte (WINDOW du Basic).
Il est evident que cette commande reagira exactement comme le Basic. Pour travailler sur plusieurs fenetres en me me temps (WINDOW#1, WINDOW#2...), il vous faudra redéfinir à chaque fois cette nouvelle fenêtre.
CA: H = Un côté de la fenêtre (droit ou gauche).
D = Le deuxième côtde la fenêtre (gauche ou droit).
L = Le troisieme cote de la fenêtre (haut ou bas).
E = Le dernier cote de la fenetre (bas ou haut).
CF: les registres A,F,H,L,B,C,D et E sont modifies.
. BB69 : Demande les dimensions de la fenetre texte courante.
En somme vous pouvez retrouver les valeurs passees par la routine BB66.
CA: Aucune.
CF : Si la fenetre couvre tout l'ecran, CARRY = 0 sinon CARRY = 1.
H = Colonne àgauche.
D = Colonne à droite.
L = Rangée en haut.
E = Rangée en bas.
. BB6C : Efface le contenu de la fenetre active et place le curseur texte en position haut et gauche de cette derniere.
Cest le CLS du Basic.
CA : Aucune.
CF: Tous les registres sont modifies.
. BB6F : Déplace la position du curseur texte horizontalement.
CA : L'accumulateur = nouvelle position de la colonne.
CF : AF et HL sont modifies.
. BB72 : Déplace la position du curseur texte verticalement.
CA : L'accumulateur = nouvelle position de la rangee.
CF : AF et HL sont modifies.
. BB75 : Déplace la position du curseur texte (LOCATE du Basic).
CA : H = Position de la colonne (X).
L = Position de la rangée (Y).
CF : AF et HL sont modifies.
. BB78 : Demande la position courante du curseur texte.
Cette routine vous indiquera en sortie le nombre de rotation (scrolling) effectues sur cette fenetre. Ce compteur est incremente si la rotation se fait vers le bas et decremente si la rotation se fait vers le haut.
CA: Aucune.
CF : H = Position de la colonne (X).
L = Position de la rangee (Y).
A = nombre de rotations.
. BB90 : Determine le stylo utilise pour l'ecriture texte (l'instruction PEN de notre cher Basic)
CA : A = Numero du stylo.
CF : AF et HL sont modifies.
. BB93 : Demande le numéro du stylo utilise pour l'ecriture texte.
CA : Aucune.
CF : A = Numéro du stylo utilise.
. BB96: Determine le stylo utilise pour le fond des caracteres texte (l'instruction PAPER du Basic)
CA: A = Numéro de fond.
CF: AF et HL sont modifies.
. BB99 : Demande le numero du stylo utilise pour le fond des caracteres.
CA : Aucune.
CF : A = Numero du stylo utilise.
. BB9C : Echange les encres du stylo et du fond.
Sous Basic, vous pouvez appeler cette routine pour une inversion video ou utiliser l'instruction, PRINT CHR$(24)
CA : Aucune.
CF : AF et HL sont modifies.
. BB9F: Place le mode d'écriture opaque ou transparent pour le fond des caracteres affichables.
CA: A=0 pour fond opaque.
A<>0 pour fond transparent.
CF : AF et HL sont modifies.
. BBA8 : Redetinit la matrice des caracteres Ascii affichables (au-dessus de 31).
L'equivalent Basic est la commande SYMBOL. Vous pensez bien qu'en travaillant en assembleur, vous n'aurez plus it reserver de place en memoire avec l'instruction SYMBOL AFTER.
CA : A = numero du caractere à redéfinir.
HL pointe sur la matrice (8 octets)
CF : Si le caractère est défini CARRY = 1 sinon CARRY = 0.
Tous les registres sont modifies Exemple pour l'utilisation de ce vecteur:
LD A,240
LD HL,ASCII
JP &BBA8
ASCII DEFB 1,2,3.4.5,6,7,8
. BCA7 : Initialise le gestionnaire sonore.
Ce vecteur coupe tous les sons joues ou en attente et reinitialise les differentes enveloppes (volume, frequence).
CA : Aucune.
CF : les registres AF,HL,BC et DE sont modifies.
. BCAA: Place un son sur le canal demande (l'instruction SOUND du Basic)
CA : HL pointe sur une table de donnees sonores de 9 octets qui doit se trouver dans la zone Ram entre &4000 et &C000.
CF : Si le canal n'est pas sature (cinq sons en attente) le son est place sur le canal et CARRY = 1, HL est modifie sinon, CARRY = 0.
En tout cas, les registres AF, BC, DE et IX sont modifies.
La table des donnees n'est pas organisee comme la commande SOUND du Basic. Voici l'ordre de placement des parametres:
ORG 40000
LD HL,SONS
JP &BCAA
SONS DEFB 1 ;CANAL
DEFB 2 ;ENVELOPPE DE VOLUME
DEFB 3 ;ENVELOPPE DE TON
DEFW 1000 ;FREOUENCE
DEFB 31 ;BRUIT
DEFB 15 ;VOLUME
DEFW 300 ;DUREE
Cet exemple équivaut à la commande SOUND 1,1000,300,15,2,3,31. Vous constatez que la frequence tout comme la durée du son sont placées sur deux octets.
Notez enfin que les valeurs négatives remplissent les mêmes roles qu'en Basic .
. BCAD : Teste l'etat des canaux sonores (l'instruction SQ du Basic).
La valeur d'entree pour les trois canaux sonores sont 1 pour le canal A, 2 pour le canal B et 4 pour le canal C.
Le mélange des canaux n'est pas realisable par ce vecteur.
CA : A = Numéro du canal à tester.
CF : A = l'état du canal.
Les registre F, BC, DE et HL sont modifies.
. BCB6 : Arrete momentanement tous les sons.
CA: Aucune.
CF : Les registres AF, BC et HL sont modifies.
. BCB9 : Libere les sons arretes avec la routine BCB6.
CA : Aucune (si ce n'est l'utilisation de la routine precedente).
CF : Les registres AF, BC, DE et IX sont modifies.
. BCBC : Création d'une enveloppe de volume (ENV).
CA : A = numéro de l'enveloppe (1 à 15).
HL pointe sur les donnees de l'enveloppe (15 octets).
CF : HL est augmente de 16, AF, HL et BC sont modifies.
. BCBF : Creation d'une enveloppe de frequence (ENT).
CA : A = numéro de l'enveloppe (1 à 15).
HL pointe sur les donnees de l'enveloppe (15 octets).
CF: HL est augmente de 16, AF, HL et BC sont modifies.
. BCC2 : Donne l'adresse des données d'une enveloppe de volume.
CA : A = numero de l'enveloppe (1 à 15).
CF : Si OK, CARRY = 1, HL pointe sur les donnees et BC = la longueur de l'enveloppe.
Les registres F et DE sont modifies.
. BCC5: Donne l'adresse des données d'une enveloppe de frequence.
CA : A = numero de l'enveloppe (1 à 15).
CF : Si OK, CARRY = 1, HL pointe sur les donnees et BC = la longueur de l'enveloppe.
Les registres F et DE sont modifies.
Avant tout. nous devons savoir que les vecteurs qui vont suivre utilisent des blocs d' événement qui permettent au système de travailler avec diverses routines d'interruption fonctionnant a diverses vitesses. Prenons le cas d'un bloc d' événement comme vous en verrez de nombreux si vous utilisez cette forme de programmation. En voici la structure réduite a son plus simple effet :
- octet 0 et 1 : pointeur système (il en faut)
- octet 2 : compteur (simple comme compteur)
- octet 3 : classe (priorité de l' évènement )
- octet 4 et 5 : adresse de la routine de traitement (facile)
- octet 6: adresse de sélection de la Rom (0 pour la Ram)
A ces blocs d' évènement viennent se souder des blocs de contra le qui permettent au système de partager le temps d'interruption entre toutes les routines installées, ceci sans trop ralentir le programme principal. II en existe de deux sortes : une pour les interruptions rapides et l'autre pour les interruptions « lentes ».
LENT, TERNE ET CLAIR
Quoi que 300 ou 50 fois par seconde, on ne peut pas dire que ce soit franchement escargotesque, mais bon... Si vous avez a utiliser les interruptions rapides, soit celles émises par le CRT tous les 1/300' de seconde, il vous sera possible de retrouver un bloc de contrôle d'interruption dont la structure est simple. Les premiers composants en sont un pointeur système sur deux octets, suivis d'un bloc d' évènement de la même structure que celui que nous avons décompose dans le paragraphe precedent . Si vous vous posez les mêmes questions que moL vous verrez que deux pointeurs systèmes se suivent. Va savoir a quoi ((a sert tant de redondance. M'enfin, ils doivent bien savoir ce qu'ils en font
Pour ce qui est des interruptions lentes (pouf pouf !), ils ont un bloc de contrôle un peu plus fourni. En voici sa bête composition:
- octet 0 et 1 : pointeur système (eh oui ! encore un)
- octet 2 et 3 : compteur(lorsqu'il passe a zéro, l'interruption est exécutée)
- octet 4 et 5 : recharge (valeur de recharge du compteur)
Puis suit le bloc d' événement dont nous n'avons cesse de parler df3puis le début
PRECAUTIONS D' UTILISATION
Un conseil, ne perdez jamais l'adresse d'un bloc de contrôle, car vous pourrez en avoir besoin a maintes reprises. Il est aussi très intéressant de travailler sur les valeurs utilisées par ces blocs de manière a forcer la priorité de telle ou telle action. Il est de plus tellement pratique de savoir exactement ou se trouvent les trucs qui influencent nos programmes. Notez aussi que, parfois, la routine d'interruption n'est pas forcement sur le plan de Rom sélectionne. Dans ce cas, il arrive que le système décide de ne pas lancer votre petit programme en attendant de meilleures conditions pour le faire. Il vaut mieux, alors, déplacer la routine d'interruption dans les 32 Ko de mémoire centrale, ce qui permet de la voir lancée presque a tous les coups, si le niveau de priorité est bien entendu assez fort Analysez bien les blocs de contrôle. Dans la majeure partie des cas, il est possible de réinitialiser les valeurs de contrôle, ainsi que celles de priorité, pour permettre le lancement systématique de son programme. A vous de tripoter...
VECTORISEZ
Comme pour les mois précédents, nous vous donnons 4 indications par vecteur passe en revue:
1 - l'adresse d'appel (indispensable voire primordiale) ;
2 - un bref commentaire sur la raison d'être (ce qu'il fait) ;
3 - les conditions d'appel passées dans les registres ;
4 - les conditions finales, soit les résultats de l'action émise ainsi que les registres ou zones modifies.
En voiture Thor, et sans tarder.
. BCD7 : initialisation et déposé d'un bloc d' événement dans la liste de ceux a activer lors d'une interruption en provenance du CRT .
Lorsque vous appelez ce vecteur, il met tout en ordre pour que la routine citée soit appelée a chaque fois qu'il est possible.
CA: contient l'adresse du bloc d' événement ;
B contient la classe de l' événement;
C contient l'adresse de sélection de la Rom;
DE contient l'adresse de la routine a insérer dans la file des événements temporises.
CF: AF, DE et HL modifies.
. BCDA: déposé d'un bloc d'événement dans la liste de ceux a activer lors d'une interruption en provenance du CRT
Comme il est possible d enlever un bloc d' événement dans la file d'attente avec le vecteur suivant, il est possible de le remettre avec celui-ci.
CA : HL Contient l'adresse du bloc d' événement;
CF : AF, DE et HL modifies.
. BCDD : enlève un bloc d'événement de la liste de ceux a activer lors d'une interruption en provenance du CRT
Voir la légende du vecteur précédent
CA : HL contient l'adresse du bloc d'événement ;
CF : AF, DE et HL modifies.
. BCE0 : initialisation et dépose d'un bloc d' événement dans la liste de ceux a activer lors d'une interruption rapide (tous les 1/300' seconde)
S'il te plaît, monsieur le système, peux-tu me lancer cette routine 300 fois par seconde ? Pas de problème Batman, on y va...
CA: HL contient l'adresse du bloc d'événement;
B contient la classe de l'événement;
C contient l'adresse de sélection de la Rom;
DE contient l'adresse de la routine a insérer dans la file des événements temporises.
CF : AF, DE et HL modifies
. BCE3 : pose d'un bloc d' événement dans la liste de ceux a activer lors d'une interruption rapide
Le même vecteur que &BCDA mais pour les interruptions rapides.
CA: HL contient l'adresse du bloc d’événement
CF : AF, DE et HL modifies.
. BCE6 : enlevé un bloc d'événement de la liste de ceux à activer lors d'une interruption rapide
Comme &BCDD mais pour les interruptions au 1 /300'
CA: HL contient l'adresse du bloc d'événement
CF: AF, DE et HL modifies.
. BCE9 : dépose simple d'un bloc d'événement dans la liste de ceux iI activer lors d'une interruption normale (tous les 1/50' seconde)
Attention! ici le bloc d'événement n'est pas initialise. Il faut utiliser le vecteur BCEF pour cela.
CA: HL contient l'adresse du bloc d'événement;
DE contient la valeur a installer dans le compteur ;
BC contient la valeur de recharge de ce compteur lorsqu'il atteint la valeur O.
CF : AF, BC, DE et HL modifies
. BCEC : enlevé un bloc d'événement dans la liste de ceux à activer lors d'une interruption normale .
II est possible de suspendre le lancement de certaines routines lentes sans pour autant les enlever de la file d' attente.
CA: HL contient l'adresse du bloc d'événement
CF : si le bloc d'événement appartenait bien a la liste, la retenue est vraie et DE contient la valeur du compteur. Dans tous les cas, AF, DE et HL modifies.
. BCEF : initialise un bloc d'événement de manière à ce qu'il soit gérable par les deux vecteurs precedents
Installer un événement dans une liste, c'est bien mais encore faut-il que la zone de mémoire concernée soit réellement un bloc de contrôle. C'est ici que nous le créons.
CA: HL contient l'adresse du bloc d'événement;
B contient la classe de l'événement;
C contient l'adresse de sélection de la Rom;
DE contient l'adresse de la routine;
CF: AF et DE sont modifies et HL contient l'adresse du bloc d'événement augmentee de 7 octets.
. BCF2 : actionne un bloc d'événement
Des compteurs sont mis en action lors des appels des interruptions. Le fait de passer par ce vecteur permet le lancement conditionnel de la routine tout en modifiant les compteurs et les priorités mis en oeuvre.
CA: HL contient l'adresse du bloc
d'événement
CF: les registres sauf IX et IY sont
modifies en fonction de la routine appelée.
. BCF5 : fait le ménage dans toutes les files d'attente d'événements temporises
CA : rien a configurer.
CF : AF et HL sont modifies.
. BCF8 : détruit un événement en l'enlevant physiquement de la file d'attente
CF : HL contient l'adresse du bloc d'événement.
CA : AF, BC, DE et HL modifies.
. BCFB: recherche de l'événement suivant a traiter
Cela permet de savoir si des taches restent a remplir ou non.
CA: rien à faire.
CF: si une routine est trouvée, la retenue est vraie et HL contient l'adresse du bloc d'événement. De toute manière, AF, DE et HL sont modifies.
. BCFE : traite un bloc d'événement
Dans ce cas, le lancement de la routine associée au bloc n'est pas force.
CA : HL contient l'adresse du bloc d'événement.
CF : AF, BC, DE et HL modifies.
. BD01 : termine le traitement d'un événement
Permet de modifier les niveaux de priorité des événements vises. Le système réalise cette opération en fonction des priorités de tous les événements.
. BD04 : interdiction des événements temporises normaux
Les files d'attente d'événements ne sont plus scannées.
CA : rien.
CF : HL est modifie.
. BD07 : réautorise les événements temporises conventionnels
Quand on a utilise le vecteur précèdent. on peut inverser l'action avec celui-ci.
CA : aucune.
CF : HL est modifie.
. BD0A : interdit un événement
Ce vecteur permet de stopper l'action d'un événement sans pour autant perdre du temps avec la gestion de la file d' attente.
CA: HL contient l'adresse de l'événement.
CF : AF est modifie.
. BD0D : donne le temps écoule en 1/300' de seconde depuis l'allumage du CPC
CA: rien a prévoir.
CF : DEHL forme le nombre demande sur 32 bits.
Si l'écran du CPC est toujours en mode graphique, il existe des primitives pour la gestion texte et la spécialisation graphique. Nous allons voir ensemble la seconde rubrique, car la première a été étudiée le mois passé. Sachez tout de même, pour la suite, qu'une coordonnée dite absolue se réfère à l'origine (au point 0,0) de l'écran, alors qu'une coordonnée relative se réfère à la position actuelle du curseur. Exemple: le curseur étant en 10,10, un positionnement relatif de 10,10 le forcera en 20,20 alors qu'un déplacement absolu des mêmes valeurs ne l'aurait pas déplacé. Sur ce, c'est parti...
. BBBA : initialisation du gestionnaire graphique
Le stylo prend la couleur 1, le curseur se positionne en bas à gauche de l'écran. Tout est remis à zéro.
CA : rien à faire;
CF : pas de retour;
: les registres AF, BC, DE et HL sont modifiés.
. BBBD : remise à zéro du gestionnaire
Je dirai que cet appel ne change rien à rien. Le curseur reste à sa place, la couleur ne change pas... Bref, tout est comme si de rien n'était.
CA : queue, dalle;
CF : ma cache;
: les registres AF, BC, DE et HL sont modifiés.
. BBC0 : positionnement absolu du curseur
Avec cet appel, vous réalisez le MOVE Basic. Positionnement aux coordonnées absolues à l'écran.
CA : DE contient la position horizontale X (abscisse) ;
: HL contient la position verticale y (ordonnée) ;
CF : bézef;
les registres AF, BC, DE et HL sont modifiés.
. BBC3 : positionnement relatif du curseur
En Basic, on dirait MOVER. Le déplacement du curseur est relatif à sa position actuelle.
CA : DE contient le décalage horizontal;
: HL contient le décalage vertical;
CF : blop ;
: les registres AF, BC, DE et HL sont modifiés.
. BBC6 : lecture de la position du curseur
Le curseur est sous Basic en XPOS,YPOS. Ce sont ces deux variables que nous allons récupérer d'un coup d'un seul.
CA : la couleur de la bicyclette du facteur, le vendredi;
CF : DE contient XPOS ;
: HL contient YPOS ;
: le registre AF est modifié.
. BBC9 : positionnement de l'origine du curseur
ORIGIN n'est pas ici le nom de la société d'édition bien connue, mais l'endroit de l'écran servant de références aux positionnements absolus du curseur.
CA : DE contient la position horizontale X (abscisse) ;
: HL contient la position verticale y (ordonnée) par rapport au coin en bas à gauche de l'écran;
CF : il fait beau, n'est-il pas?
: les registres AF, BC, DE et HL sont modifiés.
. BBCC : lecture de l'origine des tracés
Comme ci-dessus (BBC9) mais en lecture. CA : honni soit qui mal y pense; CF : DE contient l'abscisse;
: HL contient l'ordonnée;
: les registre sont préservés.
. BBCF : définitions des limites horizontales de la fenêtre graphique
Il est possible de forcer un cliping sur l'écran graphique.
Ainsi, tout tracé ne débordera pas du rectangle défini.
Ce vecteur permet de délimiter horizontalement cette zone.
CA : DE contient la position du bord droit;
: HL contient la position du bord gauche;
CF : l'écran graphique est modifié; : les registres AF, BC, DE et HL sont modifiés.
. BBD2 : définitions des limites verticales de la fenêtre graphique
Ce vecteur permet de délimiter verticalement la zone de cliping.
CA : DE contient la position du bord bas;
: HL contient la position du bord haut;
CF : la carry sonnera trois fois;
: les registres AF, BC, DE et HL
sont modifiés.
. BBD5 : lecture des limites horizontales de la fenêtre graphique
Ce vecteur permet de lire les limites horizontales de la zone de clipping.
CA : None ;
CF : DE contient la position du bord droit;
: HL contient la position du bord gauche;
: le registre AF est modifié.
. BBD8 : lecture des limites verticales de la fenêtre graphique
Ce vecteur permet de lire les limites verticales de la zone de cliping.
CA : DE contient la position du bord bas;
: HL contient la position du bord haut;
CF : pas de témoin;
: le registre AF est modifié.
. BBDB : effacement de la fenêtre graphique
Le ménage à l'écran
CA : rien du tout;
CF : du tout;: les registres AF, BC, DE et HL sont modifiés.
. BBDE : positionne la couleur des tracés (stylo)
Quoi de plus conventionnel.
CA : A contient la couleur;
CF : chouette;
: le registre AF est modifié.
. BBE1 : lecture de la couleur des tracés (stylo)
Et de plus, pratique.
CA : hibou;
CF : A contient la couleur;
: le registre AF est modifié.
. BBE4 : positionnement de la couleur du fond
Je dirai même plus.
CA : A contient la couleur;
CF : sans;
: le registre AF est modifié.
. BBE7 : lecture de la couleur du fond Plus!
CA : c'est à quel sujet 7
CF : A contient la couleur;
: le registre AF est modifié.
. BBEA : positionnement d'un point à l'écran en coordonnées absolues
On connaît cela.
CA : DE contient l'abscisse;
: HL contient l'ordonnée;
CF : califourchon;
: les registres AF, BC, DE et HL sont modifiés.
. BBED : positionnement d'un point à l'écran en coordonnées relatives à la position actuelle du curseur
Rien de neuf.
CA : DE contient l'abscisse relative;
: HL contient l'ordonnée relative;
CF : les mots me manquent pour définir ce vide;
: les registres AF, BC, DE et HL sont modifiés.
. BBF0 : teste un point aux coordonnées absolues spécifiées
Je me lasse.
CA : DE contient l'abscisse;
: HL contient l'ordonnée;
CF: A contient la couleur du point;
: les registres BC, DE et HL sont modifiés.
. BBF3 : teste un point aux coordonnées relatives
Dans la vie, tout est relatif.
CA : DE contient l'abscisse relative;
: HL contient l'ordonnée relative;
CF : A contient la couleur du point;
: les registres BC, DE et HL sont modifiés.
. BBF6 : tracé d'une droite en absolu
Le point de départ est la position actuelle du curseur. Seuls les points d'arrivée doivent être précisés en coordonnées absolues.
CA : DE contient l'abscisse du point d'arrivée;
: HL contient l'ordonnée du point d'arrivée;
CF : gardez la ligne;
: les registres AF, BC, DE et HL sont modifiés.
. BBF9 : tracé d'une droite en relatif
Le point de départ est la position actuelle du curseur.
CA : DE contient l'abscisse relative du point d'arrivée;
: HL contient l'ordonnée relative du point d'arrivée;
CF : suivez la ligne jaune;
: les registres AF, BC, DE et HL .
sont modifiés.
. BBFC : écriture d'un caractère en mode graphique à la position courante du curseur
CA : A contient le code ascii du caractère à écrire;
CF : Yop ;
: les registres AF, BC, DE et HL sont modifiés.
Comme vous l'avez vu, les vecteurs précédents se contentaient de modifier la mémoire vidéo sans faire appel au hardware. Nous allons maintenant énumérer les vecteurs qui s'interfacent entre le matériel et le logiciel de haut niveau. Conversion de numéros d'encre en valeurs pokables, utilisation des décalages d'écran, gestion des modes... Sachez encore la chose suivante: ce que nous nommons un masque est une configuration binaire qui permet d'isoler des bits d'un octet. Il offre la possibilité en l' occurrence de ne garder que les bits d'un seul pixel. A
vous de décaler ce masque pour isoler le bon pixel dans l'octet.
Roulez, jeunesse.
. BBFF : initialisation totale du gestionnaire
Tout est remis à zéro, les encres, les modes, les adresses...
CA : nada ;
CF : rien;
: les registres AF, BC, DE et HL sont modifiés.
. BC02 : réinitialisation partielle
Moins bulldozer que la première, elle sert à remettre les meubles en place sans bouleverser le gestionnaire.
CA : le vide total;
CF : comme en entrée;
: les registres AF, BC, DE et HL sont modifiés.
. BC05: positionne l'offset de départ de la mémoire vidéo
Vous connaissez le principe du scrolling ? Avec cela, vous n'aurez plus de mal à le gérer. Tout se fait tout seul. Attention! la position part de 0 et n'utilise donc pas l'adresse réelle mais le déplacement. De plus, le bit de poids faible est inactif. Les valeurs efficaces sont donc toutes les valeurs paires partant de zéro.
CA : HL contient l'offset de départ;
CF : aucune;
: les registres AF et HL sont modifiés.
. BC08: positionne l'adresse de l'écran en mémoire vive
C'est l'octet de poids fort de l'adresse en RAM que vous devez passer à cette routine (#40 ou #CO pour &4000 ou &C000).
CA : A contient une des deux valeurs citées;
CF : rien;
: les registres AF et HL sont modifiés.
. BC0B: lecture de l'adresse de l'écran en RAM
Comme le vecteur précédent mais en lecture.
CA : rien;
CF : A contient le poids fort de l'adresse visée;
: les registres AF et HL sont modifiés.
. BC0E : changement de mode
Que dire de plus expressif ?
CA : A contient le numéro du mode;
CF : rien;
: les registres AF, BC, DE et HL sont modifiés.
. BC11 : lecture du mode vidéo courant Vive la mode.
CA : rien;
CF : A contient le numéro du mode;
: le registre AF est modifié.
. BC14: effacement de l'écran
Le bleu avec le beau ready.
CA : aucune;
CF : non plus;
: les registres AF, BC, DE et HL sont modifiés.
. BC17 : lecture de la surface de l'écran en caractères
Cela permet de connaître la surface de travail du gestionnaire.
CA : rien;
CF : B contient le nombre de colonnes de l'écran en caractères;
: C contient le nombre de lignes en caractères.
. BC1A: calcule l'adresse de caractère
Cela permet d'obtenir l'adresse d'un caractère en mémoire vidéo, en fonction des coordonnées passées.
CA : H contient la colonne et L la ligne;
CF : HL contient l'adresse en RAM;
: B est la largeur du caractère affiché;
: le registre AF est modifié.
. BC1D : calcule ('adresse réelle d'un point graphique en fonction de ses coordonnées
Pas de commentaires.
CA : DE contient l'abscisse du point;
: HL contient l'ordonnée du point;
CF : HL contient l'adresse réelle du point en RAM ;
: B+ 1 contient le nombre de pixels par octets;
: C contient le masque de conversion;
: les registres AF et DE sont modifiés.
. BC20 : calcule l'adresse nouvelle de l'octet situe à droite de celui dont on passe l'adresse
L'offset ecran est pris en compte dans ce calcul.
CA : HL contient l'adresse courante;
CF : HL contient l'adresse suivante;
: le registre AF est modifie
. BC23 : calcule l'adresse reelle de l'octet situe a gauche de celui dant on passe l'adresse
L' offset ecran est aussi pris en compte dans ce calcul.
CA : HL contient l'adresse courante;
CF : HL contient l'adresse suivante;
: le registre AF est modifie.
. BC26 : calcule l'adresse reelle de l'octet situe sous celui dont on passe l' adresse
L'offset ecran est egalement pris en compte dans ce calcul.
CA : HL contient l'adresse courante;
CF : HL contient l'adresse suivante; : le registre AF est modifie.
. BC29 : calcule l'adresse reelle de CF l'octet situe au.dessus de celui dont on passe l'adresse
L'offset ecran est toujours en compte dans ce calcul.
CA : HL contient l' adresse courante ;
CF : HL contient l'adresse suivante;
: le registre AF est modifie.
. BC2C : remplit un octet avec la couleur demandee
Pour n' en afficher qu'un point, il faudra masquer les pixels indesirables.
Cette routine tient compte du mode en cours.
CA : A contient le numero de couleur ;
CF : A contient l'octet rempli de pixels colares ;
: AF est modifie.
. BC2F : renvoie un numero de couleur en fonction d'un octet rempli de pixels
Elle fait le contraire de la routine precedente.
CA : A contient l'octet a analyser ;
CF : A contient le numero de l'encre;
: AF est modifie.
. BC32 : installe une encre
Si vous connaissez la commande INK du Basic, vous pourrez utiliser ce vecteur sans probleme.
CA : A contient le numero de l'encre ; : B est la premiere couleur ;
: C est la seconde couleur ;
CF : les registres AF, BC, DE et HL sont modifies.
. BC35 : lecture des couleurs d'une encre
Appeler ce vecteur avec un numero d'encre permet de lire ses composants prealablement installes avec le call precedent.
CA : A contient le numero d'encre; CF : B et C contiennent respectivement la premiere et la seconde couleur.
: les registres AF, BC, DE et HL sont modifies.
. BC38 : installation de la couleur du bord
Si tu ne vas pas a BORDER, c'est BORDER qui viendra a toi.
CA : B et C contiennent les composants de la couleur du Border;
CF : les registres AF, BC, DE et HL sont modifies.
. BC3B : lecture des couleurs du bord Inverse du call precedent
CA : il suffit d'appeler ;
CF : B contient la premiere couleur et
C la seconde ;
: les registres AF, BC, DE et HL sont modifies.
. BC3E : positionne la duree de clignotements des couleurs du bord
Mon dieu, com me cela est proche du Basic.
CA : H et L contiennent les durees sur un octet pour chaque couleur ;
CF : HL et AF sont modifies.
. BC41 : lecture des durees d' exposition des couleurs du bord
CA : ne pas fumer ;
CF : H et L contiennent les valeurs programmees avec le call precedent;
: AF et HL sont modifies.
. BC44 : remplissage d'un rectangle
Ce n'est pas un Fill mais juste un Cis de zone rectangle. On peut definir la couleur de cet effacement a l'aide d'un masque cree par l'appel du vecteur BC2C, par exemple. Les coordonnees sont exprimees en caracteres.
CA : A contient le masque de couleur ; : H est la colonne de gauche;
: D est la colonne de droite ;
: L est le numero de la ligne superieure ;
: E est le numero de la ligne inferieure ;
CF : HL, BC, DE et AF sont modifies.
. BC47 : comme ci-dessus, sauf qu'on passe par une adresse écran au lieu de coordonnees
CA : A contient le masque de la couleur a appliquer ;
: HL contient l'adresse ecran du bord haut gauche du rectangle a remplir ;
: D contient le nombre d'octets;
: E contient le nombre de lignes ;
CF : HL, BC, DE et AF sont modifies.
. BC4A : inversion des couleurs d'un caractere
C'est l'action que realise le curseur.
CA : B est le masque de la couleur du fond;
: C est le masque de la couleur de l'encre;
: H est le numero de la colonne ;
: L est le numero de la ligne ;
CF : AF, BC, DE et HL sont modifies.
. BC4D : fait scroller verticalement l'ecran de 8 pixels
Comme cela se passe en mode caractere, cette routine utilise le CRTC au niveau hardware.
CA : B different de 0 pour un scrolling normal (l'ecran monte);
: Si B=0, l'écran descend dans un scrolling inverse;
CF : AF, BC, DE et HL modifies.
. BC50 : fait scroller verticalement une fenetre de 8 pixels
Contrairement a la precedente, cette routine travaille obligatoirement en soft, ce qui explique les saccades.
CA : B different de 0 pour un scrolling normal;
: si B=O, l'ecran descend dans un scrolling inverse;
: A contient le masque de couleur de l' encre ;
: H contient le numero de la colonne de gauche;
: D contient le numero de la colonne de droite ;
: L contient le numero de la ligne du haut ;
: E contient le numero de la ligne du bas;
CF : AF, BC, DE et HL modifies.
. BC53 : conversion de la matrice d'un caractere standard en une autre compatible avec le mode courant
Comme le CPC dispose de modes dont les affichages des caracteres et des pixels sont differents, cette routine se charge de convertir les images binaires des caracteres en masques de points a afficher.
CA : HL contient l'adresse de la matrice du caractere de depart ;
: DE contient l'adresse d'une zone de memoire libre capable de recevoir la matrice generee (max 32 octets en mode 0) ;
CF : AF, BC, DE et HL sont modifies.
. BC56 : conversion d'un caractere ecran en une matrice binaire de huit octets
Realisation de l'operation inverse de celie du vecteur precedent. Est utile lors des changements de modes si le caractere n' est pas encore stocke sous forme de matrice.
CA : A contient le masque de l'encre d' ecriture du caractere ;
: H contient la colonne ou il est;
: Len contient la ligne ;
CF : BC, DE, HL et AF modifies.
. BC59 : positionne le mode graphique
II est possible de preciser la maniere dont seront affiches les pixels.
Quatre modes differents existent: l' affichage avec ecrasement du fond (0) ; le OU logique exclusif avec Ie fond (1) ; le ET logique (2) ; et le OU logique inclusif (3). Ces opérations logiques sont binaires et correspondent à l'algèbre de Boule.
CA : A contient le mode d'affichage des points (opération logique de 0 à 3);
CF : AF, BC, DE et HL modifies.
. BC5C : affichage d'un point sur l'écran
Pas de mode, le fond est ecrase.
CA : B contient le masque de l'encre;
: C contient le masque du point; : HL contient l'adresse memoire du point;
CF : AF est modifie.
. BC5F : traçage d'une ligne horizontale
Quoi de plus bete qu'un trait?
CA : A contient le masque de l'encre ; : DE contient l'abscisse de depart; : BC contient l'abscisse d'arrivee;
: HL contient la ligne ;
CF : AF, BC, DE et HL modifies.
. BC62 : traçage d'une ligne verticale
Avec les deux derniers vecteurs, on peut faire des croix.
CA : A contient le masque de l'encre;
: DE contient l'abscisse (coordonnee horizontale) ;
: HL contient l'ordonnee de départ ;
: BC contient l'ordonnee d'arrivee ; CF : AF, BC, DE et HL modifies.
Notez que lorsqu'on dit cassette, on peut aussi dire disquette puisque les points d'entrée de ces gestionnaires sont strictement identiques.
. BC65 : initialisation du gestionnaire cassette .
Cela permet de remettre en forme toutes les variables système de ce périphérique.
CA : rien à passer.
CF : AF, BC, DE et HL modifiés.
. BC68 : positionnement de la vitesse d'écriture
Alors là, je ne puis vous en dire plus. A mon avis, il vaut mieux garder la valeur par défaut. Quoi qu'il en soit, je ne pense pas que ce vecteur agisse sur le lecteur de disquette. Je vous refile les commentaires tels que je les ai.
CA : HL contient la longueur de la moitié d'un bit à zéro (je ne puis vous dire en quelle unité c'est exprimé) ;
: A contient la précompensation à appliquer (la précompensation est normalement la valeur à partir de laquelle un réglage doit être effectué. Ici, va savoir...)
CF : AF et HL modifiés.
. BC6B : affichage des messages
Le gestionnaire donne des messages concernant l'état d'avance de la lecture ou de la sauvegarde d'un fichier en nombre de blocs. Ce vecteur autorise ou inhibe ces messages, comme le fait un point d'exclamation au début du nom d'un fichier.
CA : A=0 interdit, dans les autres cas, autorise.
CF : AF modifié.
. BC6E : mise en route du moteur cassette
Rien à dire sur ce vecteur si ce n'est qu'il n'influence pas le lecteur de disquette.
CA : aucune.
CF : A contient l'état précédent du moteur. De plus, si le moteur fonctionne, la retenue (Carry) est à un.
. BC71 : arrêt du moteur cassette
Voir &BC6E.
CA : aucune.
CF : comme le vecteur précédent.
. BC74 : restauration de l'état du moteur cassette
Pour remettre le moteur dans l'état dans lequel on l'avait trouvé avant d'intervenir.
CA : le contenu de l'accumulateur récupéré par l'un des deux vecteurs précédents.
CF : voir &BC6E.
. BC77 : lecture du premier bloc d'un fichier avec installation du tampon de transfert
Pour que le système sache quel est le type du fichier à lire, il faut avant tout qu'il en charge le premier enregistrement de 128 octets.
Grâce aux informations qu'il contient, toutes les variables système sont initialisées.
CA : B contient la longueur du nom de fichier;
: HL l'adresse du nom de fichier;
: DE l'adresse du tampon de 2 Ko servant à recevoir les données en provenance du disque.
CF : si tout se passe bien, le carry vaut un et le drapeau de zéro est nul. Dans ce cas:
: HL pointe sur le tampon contenant l'en-tête du fichier;
: DE pointe sur les données;
: BC contient la longueur du fichier;
: A est le type du fichier.
. BC7A : fermeture du fichier
A ce sujet, fermons-la!
CA : réduites à néant.
CF : si tout se passe bien, le carry vaut un. Dans tous les cas, HL, BC, DE et AF sont modifiés.
. BC7D : abandon de la lecture et fermeture du fichier actif
CA : sans commentaire.
CF : AF, BC, DE et HL sont modifiés.
. BC80 : lecture d'un octet CA : pas de condition.
CF : si tout se passe bien, le carry vaut un et zéro vaut zéro. A reçoit alors le caractère lu. Si le carry et zéro sont tous deux nuls, alors la fin de fichier est atteinte.
. BC83 : transfert d'un fichier en mémoire
CA : HL doit pointer sur l'adresse où devront arriver les données.
CF : si le carry vaut un et zéro zéro, HL pointe sur le point d'entrée de la routine chargée. Dans tous les cas, HL, BC, DE, IX et AF sont modifiés.
. BC86 : annulation de la lecture d'un octet
Lorsque vous lisez une donnée par l'intermédiaire de la routine &BC80, il vous est possible de la remettre dans le tampon disque en appelant ce vecteur.
CA : néant.
CF : rien.
. BC89 : test de la fin de fichier
Il est toujours bon de savoir où on met les pieds.
CA : pas de condition.
CF : si le carry et le zéro valent zéro, alors la fin de fichier est atteinte. Si le carry vaut un, alors on peut lire tranquille.
. BC8C : ouverture d'un fichier en sortie
Dans ce fichier, nous pourrons écrire à loisir.
CA : B contient la longueur du nom de fichier;
: HL l'adresse du nom de fichier;
: DE l'adresse du tampon de 2 Ko disponible pour le fichier.
CF : si tout se passe bien, le carry est vrai et le zéro est faux. Dans ce cas, HL pointe sur une zone mémoire qui sera écrite en début de chaque bloc de données.
. BC8F : fermeture propre d'un fichier de sorties
Faire les choses proprement n'est pas forcément mauvais.
CA : pas de conditions.
CF : si tout se passe bien, le carry vaut un et le zéro zéro. Dans le cas où il n'existait pas de fichier ouvert, les deux drapeaux sont nuls.
. BC92 : fermeture immédiate de fichier de sorties
Il arrive qu'on n'ait pas envie d'écrire le tampon de données sur bande. Dans ce cas, ce vecteur fait l'affaire.
CA : sans.
CF : HL, BC, DE et AF sont modifiés.
. BC95 : écriture d'un caractère dans le fichier de sortie
Pourquoi se poser plus de questions? CA : A contient le caractère à écrire.
CF : si l'opération est réussie, alors le carry est à un et le zéro à zéro. Si le fichier n'était pas ouvert, alors les deux drapeaux sont faux. Dans tous les cas, AF et IX sont modifiés.
. BC98 : transfert d'une zone mémoire vers la cassette
Il est bon de pouvoir sauver des données.
CA : HL contient l'adresse mémoire des données;
: DE le nombre d'octets à écrire;
: BC l'adresse du point d'entrée;
: A est le type du fichier.
CF : comme pour le vecteur précédent, mais HL, BC et DE sont aussi altérés
. BC9B : génération du catalogue
Mieux vaut savoir de quoi il retourne.
CA : DE doit contenir l'adresse du tampon servant à recevoir les informations du catalogue.
CF : si tout se passe bien, le carry vaut un et le zéro zéro.
. BC9E : écriture d'un enregistrement sur bande
CA : HL contient l'adresse des données à écrire;
: DE contient le nombre d'octets à écrire;
: A contient le caractère de synchronisation.
CF : les registres AF, HL, BC, DE et IX sont modifiés. Si tout se passe bien, le carry est vrai.
. BCA1 : lecture d'un enregistrement cassette
CA : HL contient l'adresse en mémoire où seront transférées les données.
: DE contient le nombre d'octets à lire;
: A contient le caractère de synchronisation;
CF: comme pour le vecteur précédent.
. BCA4 : comparaison de données entre la mémoire et le fichier
Mieux vaut être sûr!
CA : HL contient l'adresse des données à comparer;
: DE contient le nombre d'octets à comparer;
: A contient le caractère de synchronisation. CF : comme pour le vecteur précédent.
C'en est fini pour le vecteur cassette. Nous allons poursuivre par les adresses croissantes pour arriver maintenant au gestionnaire sonore. Il faut s'en méfier, car c'est un des plus énervants à manipuler. Seul le grand Poum manie ces adresses avec grâce et précision. Je vais donc lui laisser l'honneur et la joie de vous en parler dans un prochain numéro. Je me contenterai de poursuivre par les vecteurs du kernel. Si ces dernières sont moins bruyantes, elles n'en sont pas pour autant moins importantes.
Le kernel est le centre de gestion du CPC. Il contient tous les vecteurs d'interruption ainsi que la gestion des plans mémoire, surtout en ce qui concerne les rom. Les RSX sont aussi pris en charge par cette partie du système. Sur CPC, les interruptions gèrent de nombreuses et diverses temporisations. La couleur ainsi que la musique sont prises en charge par ces files d'événements. Cette partie est donc très intéressante à utiliser.
. BCC8 : remise en forme et nettoyage de toutes les files d'interruption ainsi que des chronomètres
Il faut bien pouvoir faire le ménage dans tout ce fouillis.
CA : pas de condition.
CF : DE contient l'adresse du vecteur d'interruption appelé par défaut. B la Rom sélectionnée, si c'est le cas. Si le programme est en ram,C contient l'adresse de la rom à sélectionner. AF et HL sont modifiés.
. BCCB : recherche et initialisation de toutes les rom de second plan
Mieux vaut savoir où trouver ses petits.
CA : DE-HL forment la plage dans laquelle doit se faire la recherche de rom.
CF : DE-HL contient la nouvelle plage de gestion des rom. AL et BC sont modifiés.
. BCCE : initialisation d'une rom de second plan
Il peut y avoir deux rom sur un même plan.
CA : C contient l'adresse de sélection de rom à tester;
: DE-HL contient la plage dans laquelle la rom doit être recherchée. CF : DE-HL contient la plage de mémoire dans laquelle se trouve la rom installée. AL et BC sont modifiés.
. BCD1 : installation d'un RSX
Pratique les nouvelles commandes.
CA : BC contient l'adresse de la table des commandes RSX ;
: HL pointe sur une zone libre de quatre octets pour la gestion par le système.
CF : DE est modifié.
. BCD4 : recherche d'un RSX dans les rom
CA : HL pointe sur le nom du RSX.
CF : si le RSX existe, HL contient l'adresse en mémoire, C le plan mémoire visé et Carry vaut un.
Dans tous les cas, AF, BC et DE sont modifiés.
Les programmeurs de la Rom ont classé ainsi tous les gestionnaires de mémoire morte, les compteurs, les points d'entrée d'interruptions... Voici la liste de ces vecteurs:
. BD10: positionne le compteur interne à une valeur précise
BD10 est utilisé à l'allumage de la machine pour mettre l'horloge interne à zéro.
CA: DE contient le poids fort de la valeur; HL contient le poids faible.
CF : AF est modifié.
. BD13 : charge un programme en Ram et le lance
Quoi de plus normal qu'un système se charge de cette tâche.
CA: HL contient l'adresse de la routine à appeler pour charger le programme (le vecteur cassette ou disquette accompagné des paramètres adéquats).
CF : les registres modifiés par le pro gramme appelé.
. BD16 : lance un programme d'une Rom de second plan
Il est agréable de disposer de vecteurs indirects permettant d'appeler des routines stockées en Rom.
CA: HL contient l'adresse de la routine; C représente le numéro de la Rom.
CF: Dis monsieur le programme en
Rom, quels registres modifies-tu?
. BD19 : synchronisation avec le CRTC
Appeler B019 revient à demander au CPC d'attendre que le balai qui génère l'image écran soit arrivé derrière le moniteur.
CA: aucune.
CF: pas plus, pas moins.
. BD1C : positionnement du mode écran
Vous connaissez l'instruction Basic Mode, alors vous connaissez ce vecteur.
CA: A contient le numéro du mode (0,1 ou 2).
CF: AF est modifié.
. BD1F : positionnement de l'offset de la mémoire vidéo
On peut se servir de ce vecteur pour opérer des scrollings hardwares à l'écran.
CA: A contient la base de l'adresse de la mémoire vidéo (&00, &40, &80 ou &CO selon le segment) ; HL contient l'offset (notez que ce dernier ne progresse que par pas de deux).
CF: AF est modifié.
. BD22 : standardisation de la palette
Toutes les encres sont mises dans la couleur précisée (simulation d'effacement d'écran).
CA: DE contient l'adresse sur un vecteur encre (deux couleurs).
CF: AF est modifié.
. BD25 : la palette modifiée (bis)
Comme pour le vecteur BD22 mais agit aussi sur le border.
CA: DE contient l'adresse sur un vecteur encre.
CF: AF est modifié.
. BD28 : initialisation du détournement vers l'imprimante
Il y a du PRINT #8 dans l'air.
CA: pas de paramètre.
CF: AF BC DE et HL sont modifiés.
. BD2B : envoi d'un caractère à l'imprimante avec retour
Si l'imprimante est occupée, le système fera en sor:e d" attendre un peu et rendra la main 3vec un statut d'erreur si besoin est Attention 1 la donnée envoyée est perdue quoI qu'il arrive.
CA. A contient le code Ascii du caractère a envoyer.
CF: AF est modifié Si la retenue (carry) est vraie. tout s'est bien passé. Si elle est fausse, l'imprimante est restée occupée trop longtemps.
. BD2E : test de l'imprimante
Le signal testé se nomme Busy.
CA : rien à faire.
CF: si la retenue est vraie, l'imprimante est occupée.
. BD31 : envoi d'un caractère à l'imprimante sans retour
Pour l'appel de cette fonction, l'imprimante ne doit pas être occupée.
CA : A contient le caractère à envoyer.
CF: la retenue est toujours vraie; AF toujours modifié.
. BD34 : envoi d'une donnée dans le PSG AY3 W8912
Quel nom barbare pour parler du générateur sonore. Si vous voulez en savoir plus, consultez les anciennes rubriques Bidouilles qui se sont étalées sur ce sujet
CA: A contient le numéro du registre; C contient la donnée.
CF : AF et BC sont modifiés.
LES BLOCS DE SAUT
Tous les vecteurs sont rangés en mémoire selon la grande liste que nous avons parcourue ensemble. Si certains ont étés détournés à des fins plus ou moins douteuses, il est possible de les réinitialiser grâce au vecteur suivant
. BD37 : réinitialise les blocs de saut standard
C'est pas un CALL a mais presque!
CA : rien à faire, cool!
CF: AF, BC, DE et HL modifiés.
N'oublions pas que le CPC ne serait pas ce qu'il est s'il ne disposait pas de son fabuleux générateur sonore. Si celui-ci est très pratique pour les bruitages, car autonome une fois programmé, il n'en va pas de même pour la musique. Les générateurs d'enveloppes qu'il utilise sont en effet trop peu malléables pour être utilisés dans de bonnes conditions. C'est pour cette raison que la Rom du CPC contient des primitives de gestion de files d'attente de notes, sons et enveloppes. Tout ceci est piloté à partir des interruptions et permet de pratiquer la musique sans avoir à s'arracher les cheveux. Inutile donc d'être un grand programmeur en assembleur pour entendre ses mélodies sous leur plus belle forme. Bien entendu, l'utilisation d'un tel système met en œuvre de nombreux vecteurs que nous allons passer en revue dans ces pages. Les structures de données utiles seront vues au fil des besoins.
. BCA7 : initialisation du gestionnaire sonore
À appeler pour que cela fonctionne.
CA : rien à préciser.
CF : AF, BC, DE et HL modifiés.
. BCAA : ajoute un son à la queue sonore
Les notes sont disposées dans une liste à la queue leu leu, et il faut bien disposer d'un gestionnaire permettant de les y introduire. Voici la structure des données à envoyer: canal (1 octet), enveloppe de volume (1 octet), enveloppe de ton (1 octet), . fréquence initiale (2 octets), bruit initiai (1 octet), volume initial (1 octet), durée (2 octets).
CA: HL contient l'adresse du son (il doit se trouver dans lèS 32 Ko de mémoire centrale).
CF : si la retenue est vrai, le son a pu être ajouté. Si elle est fausse, les queues étaient pleines. Dans tous les cas, HL BC, DE et IX sont modifiés.
. BCAD : teste si une queue sonore est pleine
Pratique pour savoir si on peut insérer des sons.
CA: A contient le numéro du canal à tester (1 pour A, 2 pour B et 4 pour C).
CF : A contient l'état du canal testé (4 si le canal est vide, 1 32 s'il joue). AF, BC, DE et HL sont modifiés.
. BCB0 : prépare l'exécution d'une interruption lorsqu'une queue sonore est vide
Il est bon de pouvoir faire un petit truc lorsqu'une musique est finie.
CA: A contient le numéro du canal à tester; HL contient l'adresse du programme à lancer.
CF : AF, BC, DE et HL modifiés.
. BCB3 : remet les sons en route sur un canal
Il est possible de stopper l'émission de sons à l'aide du vecteur suivant
CA: A contient le numéro de canal à remettre en fonctionnement (1 pour A. 2 pour B et 4 pour C).
CF: AF, BC, DE et HL modifiés.
. BCB6 : arrêt de tous les sons
Chut!
CA: si un son était émis, la retenue est vraie.
CF: AF, BC, DE et HL modifiés.
. BCB9 : remet tous les canaux en marche
Inverse l'action du vecteur précédent
CA: rien à faire.
CF : AF, BC, DE et IX modifiés.
. BCBC : initialisation d'une des 15 enveloppes d'amplitude
Comme sous Basic, avec les mêmes paramètres.
CA: A contient le numéro de l'enveloppe ; HL pointe sur les données définissant les amplitudes; BC contient la longueur des données à prendre en compte.
CF: si la retenue est vraie, l'enveloppe a été initialisée et HI incrémenté 16 fois. Dans tous les cas, HL, BC de et HL modifiés.
. BCBF : initialisation d'une des 15 enveloppes de fréquence
Remarques inutiles.
CA: A contient le numéro d'enveloppe; HL pointe sur les données définissant les fréquences; BC contient la longueur des données à prendre en compte.
CF: mêmes remarques que pour le vecteur précédent
. BCC2 : fournit l'adresse d'une enveloppe d'amplitude
Il est pratique de modifier les enveloppes dynamiquement en mémoire. Pour cela, rien ne vaut l'adresse des données convoitées.
CA: A contient le numéro d'enveloppe. CF: si l'enveloppe a été trouvée, la retenue est vraie. Dans ce cas, HL contient l'adresse de l'enveloppe et BC sa longueur. Sinon, HL est modifié et BC préservé. Dans tous les cas, AF est modifié.
. BCC5 : fournit l'adresse d'une enveloppe de fréquence
Pas de commentaire puisqu'on en parle déjà au-dessus.
CA: A contient le numéro d'enveloppe.
CF: si l'enveloppe a été trouvée, la retenue est vraie. Dans ce cas, HL contient l'adresse de l'enveloppe et BC sa longueur. Sinon, HL est modifié et BC préservé. Dans tous les cas, AF est modifié.
LA FIN DES FINS
Vous ne pourrez pas dire qu'on n'aura pas tout fait pour vous donner des informations concernant les vecteurs. Depuis un paquet de numéros, on vous flatte et vous offre le nécessaire à une programmation en assembleur facilitée. Je relance le mini concours. Envoyez vos produits et en échange, ils passeront dans les pages de votre magazine préféré. C'était le dernier épisode de la saga des vecteurs du CPC. Que leur utilisation vous soit propice. En attendant. bonne programmation !
Sined le Barbare, ACPC n°43 à 48 - http://cpcrulez.fr
| A voir aussi sur CPCrulez , les sujets suivants peuvent vous intéresser... |
» Coding - Crossdev - CCZ80
» Coding - Crossdev - Mycpctoolkit
» Coding - Crossdev - PhrozenC
» Coding - Crossdev - Cpcrslib