CODING ★ CRTC + astuces ★

Assembleur ACPC n°21 - CRTC + astuces
AS SIX TH ES PAR SINED
(édition spéciale)

Je sens que vous êtes là comme chaque mois avec une petite angoisse qui vous prend à la gorge et au ventre, comme si vous attendiez que la créature de vos rêves vous fasse les avances à prendre avec recul. Accrochezvous car ce mois-ci, comme l'indique le titre de la rubrique, vous aurez droit à une conversation nocturne que j'ai eue avec Sined.

Zède : Ahhh, mon pauvre Sined, ce soir je n'ai pas trop le moral et plus j'y pense et plus je me dis que rien ne vaut un bon CPC pour oublier tous les hauts et surtout les bas du chemin que nous empruntons pour avancer dans ce que certains nomment la vie.

Tiens, à propos, tu savais qu'avec les circuits que possède l'Amstrad on peut faire des trucs vachement sympa? Je me rappelle qu'un soir, en bidouillant le CRTC qui est, comme tu le sais, le contrôleur vidéo de notre viel ami, j'ai trouvé le moyen de faire un petit scrolling sous Basic qui ne mange pas de pain mais qui n'a jamais été exploité par quiconque. Ouais, tu penses que je raconte comme d'habitude des blagues, mais je t'assure... Pour te le prouver, voici la routine que j'avais mise de côté pour mes vieux jours.

10 OUT &BC00,1:OUT &BD00,63: SPEED KEY 32,1:OUT &BC00,2
20 FOR I=0 TO 63:OUT &BD00,I: CALL &BB18:NEXT I:GOTO 20

C'est tout. Tu lances ce petit prog. et tu gardes ta main poilue sur une touche, il ne te reste plus qu'à admirer le résultat. C'est pas du Zède tout craché, ça ?

CRTC : J'EN AI ASSEZ (ÇA C'EST PLACE)

Sined : Tu te fous de moi ou quoi? Ton truc fait tic-tic à chaque fois que le pointeur d'écran fait un tour. La ruse serait de trouver le moyen d'éviter ce tic-tic. Personnellement, je cherche encore. Bravo tout de même pour la ruse. Les lecteurs préféreraient sans doute que tu leur donnes la liste des registres du CRTC avec leurs fonctions, cela serait plus divertissant et instructif.

Je vais te donner quelques astuces me venant à l'esprit en me rappelant de certains listings peu optimisés. Pourquoi, lorsqu'on n'a pas besoin de A, charger un registre simple avec zéro et l'instruction LD X,0, alors que XOR A suivi de LD x,A sont plus rapides, car internes et d'un octet chacune? De plus, pourquoi charger le double registre BC pour accéder aux ports d'entrée-sortie, alors que souvent (sauf lorsque C est concerné) B suffirait (seul le poids fort de ce registre 16 bits compte dans la sélection du co-processeur) ? En parlant de parenthèses, écrivez à 7 pour lui dire de compter les siennes. La devise de l'optimiseur est la suivante: ne rien laisser de côté est la seule manière permettant de ne pas partir les mains vides. Dans la même optique, ADD HL,HL est plus performant que SLA L suivi de RL H. Le résultat est plus fort de café.

Zède : Tiens, j'aurais parié que les décalages étaient plus puissants, mais bon, même les meilleurs peuvent se tromper. Pour les registres du CRTC tu as raison, surtout quand tu penses que les Clefs pour Amstrad sont, paraît-il, introuvables. Alors, voici la liste complète:
Les 16 premiers registres sont en lecture-écriture, alors que les deux derniers sont en lecture uniquement.
Le registre 0 détermine la fréquence de synchronisation horizontale en caractères.
Sined : Bof...

Zède : Le registre 1 correspond au nombre de mots (deux octets) affichés par ligne, donc est égal à 40 lors de la réinitialisation du Cpc. Pour remplir ce registre, il suffit de compter le nombre d'octets à afficher à l'écran et de le diviser par deux.
Sined : Ahhhhh... (fatigué et non admiratif)... .

Zède : Le registre 2 sert à ajuster la position de l'écran en horizontal ( et non pas la synchro comme il est dit dans les Clefs ), je rai utilisé dans mon petit scrolling et il est égal à 46 en temps normal. Il permet bête,ment de répartir le border de part et d autre de l'écran d'affichage.
Sined : Quelle heure est-il?

Zède : Le registre 3, c'est la longueur de synchronisation horizontale. Les quatre bits du poids fort sont inutilisés. Les quatre autres permettent de désynchroniser ou de décaler l'écran. La longueur de synchromsatIon verticale est seize fois supérieure à sa petite sœur horizontale et automatiquement prise en compte par le 6845.
Sined : Déjà, mon dieu, ma pilule!

Zède : Les registres 4 et 5 règlent la synchronisation verticale. R4 contient la partie entière de l'ajustement sur sept bits et R5 la partie decimale sur cinq bits. Cela permet de synchroniser parfaitement le 6845 avec la vitesse de balayage du moniteur.
Sined : Ah, la voilà. T'aurais pas un verre d'eau?

Zède : Le registre 6 est le nombre de caractères (8 lignes) affichés en hauteur, donc est égal à 25 lors de la reinitialisation.
Sined : Gloup ! Beurk...

Zède : Le registre 7 est pour le 6 ce qu'est le 2 pour le 1, il ajuste l'écran en vertical et est à 30 quand on allume le CPC (c'est dur de ne pas se répéter). Il permet le centrage de l'écran d'affichage dans le border.
Sined : Shazann, Banzaï, Zlonga !

Zède : Le registre 8 est un peu plus étrange que les autres car il contient moult fonctions de réglage. Les deux bits de poids faible servent à régler l'entrelacement. C'est une technique permettant d'afficher deux fois plus de lignes à l'écran que le moniteur ne peut en accepter normalement. Cela est possible en affichant, lors du premier balayage, les lignes paires de l'image mémoire et, lors du second, les lignes impaires. En fait, seule la moitie du nombre réel de lignes mémoire est affichée à l'écran, et à chaque balayage, mais le résultat est là, scintillant de mille feux et vibrant du desir de vous époustoufler.

Deux modes existent: le 1 et le 3. Les bits 4 et 5 agissent sur le DE skew (Display Enable) et diminuent l'offset d'affichage de deux octets multiplies par la valeur des deux bits. 3 est une valeur interdite. Pour en finir avec ce registre, les bits 6 et 7 influencent la position du curseur de la même manière que 4 et 5 agissent sur l'écran.
Sined : Oh, zut, j'ai encore oublié le produit pour mes lentilles.

Zède : Le registre 9 contient le nombre de lignes par caractères en verticale.
La valeur incrémentée qu'il contient multipliée par celle du registre 6 donne le nombre réel de pixels à l'écran et en verticale.
Sined : Tant pis, je vais faire sans:

Zède : Les registres 10 et 11 conditionnent le curseur hardware utilisé à titre indicatif dans l'éditeur de Pyradev. Les bits 6 et 7 du registre 10 agissent sur le curseur. Voici les effets découlant respectivement des valeurs possibles : 0, curseur fixe, 1 , non affiche, 2, clignotant à 1/16e des interruptions et 3 clignotant au 1/32e. Les cinq bits resstant des deux registres règlent la ligne de départ du curseur et la ligne de fin (il est obligatoirement plein et fait 12 lignes de 0 à 11).
Sined : Qu'est-ce que tu penses de mes nouvelles pompes?

Zède : Les 12 et 13 agissent ensemble pour former l'adresse mémoire au point en haut à gauche de l'écran ainsi que la taille memoire utillsee pour l'affichage (multiple de 16 K?). Les deux bits de poids fort du registre 12 permettent de forcer le mode oversccan dont le petit Rubi nous avait fait part il y a quelques mois de cela, les deux bits suivants contiennent le numéro de slot mémoire choisi, et multipliés par 16384, ils donnent l'adresse de départ de l'écran. Les 12 bits qui restent forment l'offset à appliquer aux paramêtre précédents.
Sined : C'est con, J ai pas trouve le même design en vert et en bleu, elles étaient dégueulasses.

Zède : Les registres 14 et 15 servent à positionner le curseur sur l'écran et sont soumis aux mêmes règles que les registres ci-dessus.
Sined : Attt... Attt... Atchaaa ! Verbe la venêtre z'il de blaît (snif) !

Zède : Les registre 16 et 17 servent au crayon optique et je n'ai pas mes lunettes.
Sined : Rrrrr... Pfff... Hein, pas mal... Tu paies un café.? . , ,

Zède : T'attendais pas, hem? T as vu ce que je t'ai mis? Et paf, un barbare à la casse.
Sined : Comment fais-tu pour foutre toutes les encres dans la couleur du border en trois instructions? Puisque tu sembles si fort...

Zède : T'as pris ta pilule (air dégagé et nonchalent) ?
Sined : Il te suffit d'utiliser l'instruction interdite du registre 8 du CRTC. Un partout, balle au centre, service Zède.

Zède : T'as bonne mine... D'accord, j'attaque.

DIVERSES ASTUCES: VERZASTUSSES !

Zède : Je voulais dire deux mots sur un super prog. qui sortait de l'esprit tordu de Poum et Septh, qu'ils avaient, à juste titre, appelé le CLS le plus rapide du CPC. Leur truc (car ils n'ont jamais voulu donner d'explications) consistait à utiliser la pile pour effacer l'écran. Ils sauvaient la pIle et empilaient des valeurs allant de 0 à FFFF après avoir positionné celle-ci en &C000, ce qui se faisait à une vitesse inégalable. Il suffisait enfin de remettre la pile à sa bonne place. Il va de soit qu'il fallait interdire toutes les interruptions, sinon personne ne pouvait répondre aux plantages de la machine (les interruptions utilisent aussi la pile).
Sined : Excuse-moi, mais j'ai mon mot à dire dans cette sombre affaire. Enfoirés! Sinon, ce prog. est génial, quoi qu'il soit bête que ce principe ne s'utilise pas pour les transferts de blocs en mémoire, ce qui arrangerait bien nos affaires vu la vitesse du Z80 (quoique, trouves l'astuce...). A ce sujet, encore un gain de temps,.dans la programmation. Sache que 1 instruction LDIR est très lente. Elle correspond à la brouette dans l'échelle des véhicules. Si tu veux faire des transferts de blocs, il vaut mieux utiliser une petite boucle du genre:

LD C, Poids fort
LD B, Poids faible
LD HL, Source
LD DE, Destination
BOUC LD A,(HL)
LD (DE),A
INC HL
INC DE
DJNZ BOUC
DEC C
JR NZ,BOUC

Prends ta calculette et teste, tu verras, cela n'a rien à voir. Il faut parfois se forcer à se casser la tête pour gagner des secondes plutôt que de casser celle du Z80 qui a déjà assez à faire avec les bits.

Zède : C'est pas du tout neuf ce que tu me donnes là. De l'innovation, que diable!
Sined : Lorsque j'étais petit et que je programmais encore en Logo (à cet . âge-là, les petits trains et le Logo motivent), j'avais besoin d'énormément de vitesse pour que ma tortue lapine. Figure-toi qu'elle se mettait à bomber quand je faisais le POKE &38,&C9.

Malheureusement, après cette opération, elle n'entendait plus rien aux ordres que je lui envoyait aux travers du clavier. Le POKE &38,&C3 la calmait et lui rendait la tête qu'elle avait perdue pour un bout de queue de file d'interruption. Moralité, si tu veux de la vitesse, fais le premier POKE mais attention car sans le second, le CPC ne rend pas la main, ce qui n'est pas le pied.
A ce propos, ce n'est pas une balle dans le coude qui me fera plier le genou et n'ayez crainte, ma petite dame, je m'occupe du chariot. Le premier qui nous dit d'où viennent les deux dernières expressions gagne un soft.
Zède : Tu regardes trop la télé, barbare barbu barbant. Qu'à cela ne tienne et que les réponses foncent. Tu sais quoi d'autre de sympa?

Sined : Alors que je discutais avec Rubi, il m'annonça une nouvelle qui me sortit de mes gonds. L'art et la manière dont évolue le registre R. Simple, évident mais fallait le trouver.
C'est bien lui le meilleur. Le registre R est un registre non pas huit bits mais sept bits. A chaque fois que le Z80 lit un code machine, il additionne à R la taille de l'opérateur de cette instruction. En clair, LD A,12 fait deux octets, un d'opérateur et un d'opérande. Après cette instruction, R aura été incrémenté. Pour tous les codes machines à préfixes (CB, DD, ED et FD), comme par exemple LDIR. R sera augmenté de deux. Si un dépassement de la capacité des sept bits intervient, tout se passe modulo 128 ce qui est la moindre des choses. Alors, tu dis mieux pour ce soir mon petit bonhomme?
Zède : C'est pas que je manque d'arguments, mais j'ai mal à la tête, au dos et aux bouts des doigts à force de taper ce texte.
Sined : Je t'avais dit de me laisser la place dès le début mais t'as voulu jouer le costaud, alors...
Zède : Mon petit Sined, le moral ça va mieux, mais je me sens un peu las. Je te propose qu'on se fasse un petit film. On s'est déja passé plus de 1 000 fois Equus et au moins 923 fois Birdy. si tu n'y vois pas d'inconvénient on va se faire The Wall des Pink Floyd pour se changer les esprits.
Sined : Zède de mon cœur, je te dis 80 fois oui...

J'ai signé... Moi aussi! Copieur..., ACPC n°21, p65-67-69

Page précédente : Bidouilles ACPC n°20 - Déviation du Ctrl Shift Esc.....

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

Lien(s):
» Coding » Bidouilles ACPC n°12 - Création de RSX
» Coding » Assembleur ACPC n°29 - On assemble ensemble
» Coding » Bidouilles ACPC n°44 - Les vecteurs system (2/6)
» Coding » Assembleur ACPC n°30 - L'homme du scroll mignon
» Coding » Assembleur ACPC n°41 - Les flags, grands délires
» Coding » Assembleur ACPC n 06 - Initiation : Les transferts
Je participe au site:

» 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 366 millisecondes et consultée 1957 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.