CODING ★ Le CLS le plus rapide sur CPC - Part II - AS TIC AU OU VERS AU VENT ★

Assembleur ACPC n°22 - Le CLS le plus rapide sur CPC - Part II
C'est rare, et même très rare que l'on revienne en arrière quand il s'agit du cours assembleur On ne ferait pas partie de Cent Pour Cent si l'on ressortait nos vieilles chaussettes pour les laver avec vous. Mais pour une fois, nous allons faire une exception, qui confirmera la règle d'or inscrite dans tous les plus grands livres de la planète. Inutile de vous la rappeler, car nous sommes tous conscients qu'elle fait depuis longtemps partie de votre vocabulaire.

Souvenez-vous. C'était en juin, dans la rubrique de Franck. Il y avait une routine assez bizarre qui est passée inaperçue pour beaucoup d'entre vous. Il s'agissait de la routine intitulée "le CLS le plus rapide sur CPC". Suite à votre courrier et à bon nombre de coups de téléphone - sans parler de la demande de Poum pour avoir des
explications en ce qui la concerne -je me décide, ci m'empresse de vous expliquer ce programme qui était trulTé tic ruses ci d'astuces. Faisons un petit flash-back. Une demi-page de Basic et un programme à n'y rien comprendre. Pourquoi ? Les deux zigotos que sont POUM et SEPTH ont eu les idées suivantes :

  • Premièrement, écrire une routine pour effacer l'écran avec une vitesse inégalée sur CPC Pour votre gouverne, sachez qu'un CLS sous Basic prend pour cela 37 trois-centièrnes de seconde, alors que leur routine en prend 12, et est donc trois fois plus rapide.
  • Deuxièmement, masquer cette routine en l'écrivant, non pas pour la protéger mais pour la rendre incompréhensible (et là., je l'avoue. Ils ont bien réussi).
  • Troisièmement, jouer avec les Tokens qui correspondent aux instructions du Basic, ce qui explique des aberrations du genre "OUT 1,1,15.1,15, -1" qui ne signifient absolument rien, vues sous cet angle et sotties de leur contexte.

CLS BALAISE A L'AISE

Vous avez le source original de cette routine qui utilise la pile. Tout d'abord, on sauve la pile à l'adresse &BF30 (celle de l'étiquette PILE) pour pouvoir mieux la récupérer plus tard. On utilise le registre B comme compteur. En lui attribuant la valeur zéro. on bouclera 256 fois sur les 32 PUSH DE, ce qui nous fait la somme toute ronde de 8 192. Donc, je vous dis que cette routine n'est pas la plus rapide car vous pouvez supprimer le compteur, mais vous vous trouverez en face d'une routine qui efface l'écran avec un rurbo de plus de 8 Ko, ce qui appartient au domaine de la folie à l'état pur. On récupère la pile, on rend la main au Basic, et voilà, le tour est joué. Mais cela ne vous dit pas comment ça marche.
Lors de l'appel d'un CALL a partir du Basic, le paramètre est passé dans le double registre DE. Donc CALL ADRESSE , VALEUR nous fait l'opération de LD DE, VALEUR. La pile, si vous ne le savez pas. est décrémentée à la suite d'une instruction PUSH. et c'est pour cette raison qu'elle pointe sur l'adresse zéro, car elle va ainsi pouvoir prendre les valeurs allant de &C000 à &FFFF dans le sens inverse. Vérifiez, 8 192 mots (doubles octets) pokés représentent bien &4000 octets. En deux mots vous pouvez voir l'empilement d'une même valeur, car la pile est mise en Un de la mémoire écran.
Petite pause pour expliquer le fonctionnement de l'instruction PUSH : lorsque le Z80 rencontre PUSH. il décrémente"deux fois SP et stocke la valeur à pousser dans ce nouvel emplacement mémoire. C'est aussi bête que ça, mais il fallait y penser, comme Régis, du MBM, qui nous a montré un scrolling écran par une astuce similaire. A vous de trouver d'autres utilités, qui seront toujours les bienvenues à la rédaction. Un tout petit détail à noter absolument. Cette routine ne s'efface pas de la mémoire après un CALL 0 ou un RESET (CTRL-SHIFT-ESC), car elle est implantée dans une zone mémoire qui n'est pas réinitialisée par le système. Essayez sous Basic, POKE &BF00,123, faites un CALL 0, puis PRINT PEEK(&BF00). Etonnant. non ? Il est bien entendu que si vous éteignez votre ordinateur, la routine dégénérera et finira par se désintégrer sous le capot de notre machine favorite.

ET LE BASIC DANS TOUT ÇA ?

Personnellement, je trouve la partie assembleur très amusante mais moins que celle écrite sous Basic. Déjà que les deux compères ont assez d'humour pour nous pondre des lignes du genre "POKE (MOI). PEEK(LE)", réfléchissez deux petites secondes. Cela revient à dire "POKE 0,PEEK(0)" et ne sert à rien, sinon à intriguer les lecteurs. Les valeurs stockées en DATA ne représentent pas des instructions
assembleur mais des notes de musique qui seront jouées plus tard (on y arrive). A propos d'arriver, connaissez-vous les contrepèteries ? Quelle est celle de "Le-fakir arrive à pied par la Chine" ? Demandez la réponse à Miss X si vous ne trouvez pas.

TOKEN AROUND THE CLOCKEN

Je laisse la parole à Sined qui veut absolument vous expliquer le fonctionnement des Tokens. Sined : C'est pas que je veuille absolument, mais Zède vient de s'allonger par terre, telle une saucisse dans un sandwich, entre deux couvertures molletonnées et accueillantes. A première vue, il est assez pris par ses pensées, si vous voyez ce que je veux dire. De plus, il émet... comment dire... des grognements étranges, rappelant le bruit que fait la voiture de mon père (une vieille Citroën deudeuche, mâtinée d'un capot de 4L) lorsqu'elle ne veut pas démarrer. Ceci dit (belle abbesse), attaquons les Tokens sur lesquels je tique ! Et toc ! Question : Qu'est-ce qu'un Token ? Réponse : un Token est aux mots clefs Basic ce qu'un code assemblé est à la mnémonique assembleur. En clair :le Basic n'est pas stocké de la manière dont vous le saisissez au clavier, mais est Tokenisé pour être traité bien plus rapidement lors du RUN. De cette manière, il prend aussi bien moins.de place en mémoire. En codé : rata blup, imi noter avé profla idem ugli tas-roum hidu, gnak gnak coulé poum poum (traduction intégrale de la réponse).

Ligne 230. C=PEEK(ET-PEEK-ET-COLEGRAME). bourre et bourre le ralatame. si cela ne vous rappelle rien, il faut arrêter les drogues dures immédiatement et sans dés laids. C'est somme toute primaire, mais efficace. C'est en fait une manière perverse et nauséabonde de faire un C= 1 soit PEEK(O) ! Arghh ! le bougre ! En ligne 240. tant que B est différent de &14. soit de 20 en décimal, la ligne se tirlipote gaiement la routine de tirage de nombre aléatoire. On se croirait au Loto national.

Ce qui se passe ensuite n'a rien de bien sorcier, ni de magique, et est donc facilement compréhensible par le barbare terre à terre que je suis (honga !). Les chaînes de caractères sont associées pour n'en former qu'une. VAN est rempli par la valeur 1248, ceci dans la joie et la bonne humeur, et la suite commence , 1 pointe sur le premier octet de la routine assembleur devant être un PUSH DE, ceci en &BF09. Cette instruction est pokée 32 fois par la petite boucle WHILE-WEND. Faites le calcul. &C9+20+1-9 est bien égal à &D5, le code assemblé de PUSH DE. Attention, à cet endroit précis, la routine assembleur est totalement implantée. car le début et la fin des DATA étaient bien les bonnes données, et les fausses, citées ci-après, ont été écrasées par le bon &D5. Passons donc à la suite. Vient extemporanément le moment de faire mumuse avec les Tokens à proprement parler. ZE valant zéro puisque non encore affecté, une recherche de valeurs s'effectue vers et dans le programme Basic encore tout irais et tout joli. Avant tout est recherchée la valeur &98 qui est le Token de END. Lorsque son adresse est trouvée, elle est stockée dans la variable P. On fait de même pour le Token OUT de valeur &B9. stockée dans K. Pour SYMBOL, c'est un peu plus compliqué car il faut aussi s'assurer qu'un espace de code 32 suit bien l'instruction, sans quoi ce n'est pas la bonne (valeur &CC*10+32 soit 2102 dans la variable Q). Je vous passe toute la frime pendant laquelle ils font quelques CLS abasourdissants, nous laissant ahuris, pantois, béats d'admiration et d'impuissance (non, je n'ai pas dit stérile !) devant un spectacle aussi impressionnant qu'irréel, de beauté sans égal au regard de la vieille deux-pattes de mon papa (au demeurant mignon aussi, si on le regarde dans le noir).

Bref, une bête démo, histoire de montrer que cela marche car on ne sait jamais avec ces bêtes-là. Ensuite arrive le moment crucial et émouvant de ce programme. C'est en ligne 410 que le bon vieux OUT n'importe quoi est subtilement transformé en ENV qui devient une instruction cohérente sans rapport aucun avec le précédent état, mais tout à fait à sa place dans ce qui suit. Si je puis m'exprimer ainsi, la plus grosse des pourritures que ces deux compères'non encore papas aient effectuées, dans ce sombre emberlificotis de merdouillage, est en ligne 430. C'est là. par un POKE maléfique et sournois, que le END adressé par P subir une mutation exonérée d'impôt. Il devient par le fait un NEW bien de chez nous, dont l'effet désastreux n'est plus à rappeler à tout utilisateur ayant déjà subi les méfaits malicieux, du genre "The River of no Return". de cette instruction. En ligne 440 , l'instruction SYMBOL, entité religieuse vénérée par les japonais lorsqu'elle est pleine de riz. est remplacée par SOUND dont le Token est de trois plus petit. Avec Michelin, je ne dis rien.

Quelques lignes, histoire de dire à Poum qu'il sait faire de la musique avec des DATA honteusement dissimulées, ce qui n'est pas rien dans le cadre d'un CLS. De plus, maintenant que les Tokens ont repris figure humaine (pardonnez-moi cette expression, mais je manque parfois de vocabulaire), il est possible à un petit air de venir charmer nos douces oreilles pimpantes.

ORG #BF00
LD ;(PILE),SP
LD ;B,0
LD ;SP,0
BOUC PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
PUSH ;DE
DJNZ ;BOUC
LD ;SP,(PILE)
RET
PILE DEFW ;00

Enfin, en fin. j'ai faim, en ligne 480. cet espèce d'enfoiré de Poum réitère son affront, comme si cela ne suffisait pas. en nous repokant le NEW de peur que sa première tentative ait échoué. Ceci est bien sûr exécuté grâce (?) à un acte lâche, désespéré et inavouable de traître, dont le retrait stratégique n'est qu'une piteuse fuite désordonnée. Bref, c'est dégueulasse de nous faire le coup deux fois. Non mais, des fois !

Zède qui a trop de vin , ACPC n°20, p44-45

Page précédente : Assembleur ACPC n°21 - CRTC + astuces
★ AMSTRAD CPC ★ DOWNLOAD ★

Aucun fichier de disponible:
» Vous avez des fichiers que nous ne possédons pas concernent cette page ?
★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Assembleur ACPC n 02 - Les vecteurs d'interruption
» Coding » Bidouilles ACPC n°16 - Bidouilles bizarres
» Coding » Assembleur ACPC n°36 - Dis moi, c'est quoi l'assembleur
» Coding » Bidouilles ACPC n°15 - Les secrets du GATE ARRAY (2/2)
» Coding » Bidouilles ACPC n 03 - Les Instructions supplemetaires du Z80
» Coding » Assembleur ACPC n°49: Assemblez vos vumetres
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 231 millisecondes et consultée 1838 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.