CODINGHEBDOGICIEL ★ FORMATION A L'ASSEMBLEUR PRATIQUE LANGAGE MACHINE SUR ZX81 ★

Âmes transparentes et virginales, regards clairs, esprits lumineux et sereins, ardents défenseurs de la veuve même joyeuse, de l'orphelin même délinquant et des allocations familiales pour tous, vous qui croyez encore en l'HHHHebdo et pouvez faire l'amour sans arrière-pensée, hommes de grande volonté qui avez foi en la multiplication des pains, la diminution consécutive des coûts de production et le sens de l'HHHHebdo, je vous le dis : tournez la page ou détournez votre regard car ces lignes ne sont pas pour vous.

Aujourd'hui je m'adresse aux vicieux. J'élargis mon audience en ratissant du côté des faux-culs, des esprits retors et hypocrites. Je rameute les lâches, les fourbes, toute une faune malsaine qui lorgne avec concupiscence la femme du voisin et convoite son microordinateur comme l'ensemble de sa logithèque. A ceux-là, que j'appelle mielleusement mes frères sachant qu'ils ne sont au mieux que mes semblables, à ceux-là seulement j'adresse, avec l'expression de mes sentiments les moins respectueux, cette routine en langage machine qui, en l'espace d'une centaine d'octets et d'un dixième de seconde, transformera n'importe quel honnête listing basic en véritable champ de mines, vrai piège à cons, arme universelle...

Imaginez un listing où tout apparemment soit normal, où les instructions du langage basic sont convenablement alignées, sagement suivies de leurs arguments et des opérateurs logiques ou mathématiques qui semblent n'avoir d'autre vocation que soulager l'humanité laborieuse de la difficulté de penser que (x-2) < (y/3) mais voilà qu'une fois lancé le fameux RUN -dont, à en croire les plus récentes statistiques, la fréquence d'utilisation dépasse aujourd'hui nettement celle du mot de confiance ce qui marque un fabuleux tournant dans l'histoire de la civilisation- voilà que le résultat affiché à l'écran est une colossale erreur, une insulte à Boole, Pascal, Euclide et bien d'autres jusqu'au programmeur boutonneux qui en perd son basic et finirait même par douter de la réalité de son acné post-juvénile. Il n'en faut pas d'avantage pour qu'une navette spatiale se transforme en feu d'artifice ou que le baron Empain soit déclaré non imposable par l'administration fiscale, si l'on en reste à la stricte analogie. Cette routine offre donc des perspectives au moins aussi excitantes pour l'esprit que le spectacle d'une catéchumène reconvertie au peep-show par un habile coeur vaillant.

Voyons plus précisément de quoi il retourne : cette routine a pour objet de substituer à certains opérateurs arithmétiques ou logiques présent sur le listing original, d'autres opérateurs qui eux n'ont rien à y faire sinon fausser complètement et d'une façon idéalement sournoise les résultats escomptés. Il s'agit donc de truquer rapidement et discrètement le listing d'un programme basic afin de rendre son utilisation ou sa copie inopérante. Cette routine extrêmement simple, à la trace linéaire et répétitive, est accessible à tous les débutants et je l'espère amènera au langage machine ceux qui n'ont pas encore osé s'y risquer. Pour eux nous allons détailler sa structure et analyser pas à pas son fonctionnement.

Attention ! Cette routine est dangereuse ! C'est pourquoi je propose avant toute utilisation d'effectuer un test simple qui décidera soit de l'activer, soit au contraire de la court-circuiter. C'est un feu de signalisation mis au vert : pas de danger, mis au rouge : trucage obligé du listing ! Il s'agit en réalité d'un octet disponible au début de la mémoire RAM, en amont du listing basic, dans cette zone dite des variables système. Cet octet sera le dépositaire d'une valeur verte (exemple : 100) ou rouge (toute autre valeur que 100). Une simple instruction Poke permettra de le colorer à sa guise. N'oublions pas que la valeur ainsi pokée sera sauvegardée en cas de copie. Votre garde-fou consiste donc en un test du contenu de cet octet suivi d'un retour conditionnel au basic en cas de feu vert. Dans le cas contraire on poursuit séquentiellement sur la routine de substitution.

Sa structure est bipartite. D'abord la délimitation de l'espace en RAM sur lequel interviendront d'éventuelles substitutions voulues. Ici trois modules oui métamorphoseront les * en / puis les + en - enfin les > en <.

Trouver les adresses de début et de fin de listing ne pose pas de difficulté. On sait que le corps d'un programme basic commence invariablement à l'adresse 16514, immédiatement après l'espace réservé aux variables système, en revanche, il nous faut interroger l'une de ces variables système pour localiser l'adresse du dernier octet d'un listing dont les dimensions sont variables à l'infini ou presque, c'est la raison d'être de D.FILE qu'il suffit de questionner là où elle réside, à l'adresse 16396. Cette variable nous renvoie aussitôt l'adresse de l'octet qui suit immédiatement le dernier octet du listing. Il suffit donc de décrémenter cette valeur pour coïncider avec ce que nous recherchons.

Adresses de départ et de fin ne sont pas suffisantes si l'on désire utiliser la puissante instruction CPDR, lisez : comparaison par bloc avec décrémentation et répétition, c'est en effet l'instruction la mieux adaptée au type de travail que nous souhaitons mettre en oeuvre : comparer chacun des octets du listing avec des valeurs types (exemple : "•" codée 23) qui seront remplacées à chaque  rencontre  par  d'autres signes (exemple : 23 par 24, "/"). CPDR effectuera une comparaison de l'octet pointé par HL avec le contenu de l'accumulateur suivi d'une décrémentation automatique de HL ainsi que BC, ces opérations se répéteront jusqu'à ce que BC soit égal à 0 ou que la comparaison (HL)/ACCU se révèle positive. Il sera donc nécessaire par CPDR de placer la valeur correspondant à (D.FILE-16514). C'est le sens de l'instruction SBC HL.BC pour laquelle il est indispensable de remettre préalablement à zéro l'indicateur de report C grâce à l'instruction XOR A.

Au terme de ce module de délimitation du listing nous aurons donc stocké dans la pile :

- au premier niveau le nombre d'octets du listing
- au deuxième niveau (D.FILE-1) Nous somme prêts désormais à utiliser CPDR.

C'est au niveau des modules de substitution que nous sortons de la pile ces deux valeurs pour les placer sur les paires de registres utilisées par CPDR. HL passe sur BC tandis que (D.FILE-1) retrouve HL. Il suffit maintenant de placer dans l'accumulateur l'opérande qui servira d'élément de comparaison et d'attendre la sortie automatique de l'instruction CPDR, celle-ci signifiant que la recherche a aboutit et que l'on a exploré tous les octets voulus. Dans le premier cas, une incrémentation nous repositionnera au niveau de l'octet à modifier tandis qu'une décrémentation, une fois la substitution opérée, réamorcera CPDR au bon endroit.

Vous vous interrogez peut-être sur la présence de CP 30. Cette instruction n'a d'autre utilité que de remettre à 0 l'indicateur Z qui venait d'être positionné. Notez pour finir que la sauvegarde immédiate dans la pile des valeurs de départ de la recherche CPDR permet la réinitialisation facile de cette instruction au début de chaque module de substitution.

Maintenant que vous avez tout compris il me reste à vous souhaiter de faire le plus mauvais usage possible de cette routine.

            REM LISTING ASSMEBLEUR ZX 81
            REM * TRUCAGE LISTING
            REM * VERIFICATION FEU
            LD A,(16417)                  sauvegardable
            LD B,A
            LD A,100                      vert
            CP B                          feu vert?
            RET Z                         oui: retour au basic
            REM * DELIMITATION LISTING
:L0         LD HL,(1439,5)     D.FILE
            DEC HL
            PUSH HL                       fil de listing
            XOR A                         net l'indicateur
            LD BC,16514                   C a 0 pour SBC
            SBC HL.BC
            PUSH HL                       espace listing
REM « SUBSTITUTION » –> /
            POP BC                        inuerse BC
            POP HL                        et HL...
            PUSH HL                       replaces dans
            PUSH BC                       la pile
            LD A,23                       *
:L2         CPDR
            JR NZ,L1
            INC HL
            LD (HL),24
            DEC HL
            CP 30                          Met Z à 0
            JR L2
            REM * SUBSTITUTION ? –> -
:L1         POP BC                         on reprend
            POP HL                         au début
            PUSH HL
            PUSH BC
            LD A,21                        +
:L3         CPDR
            JR NZ,L4
            INC HL
            LD (HL),22                     -
            DEC HL
            CP 30
            JR L3
            REM * SUBSTITUTION > –) <
:L4         POP BC
            POP HL
            LD A,18                         >
:L5         CPDR
            JR NZ,L6
            INC HL
            LD (HL),19                      <
            DEC HL
            CP 30
            JR L5
:L6         RET

Hebdogiciel n°130 p30, Bernard Guyot

★ LICENCE: COMMERCIALE
★ ANNÉES: 1986
★ AUTEUR: BERNARD GUYOT

Page précédente : La page pédagogique d'hebdogiciel 127: Registre F

CPCrulez[Content Management System] v8.75-desktop/c
Page créée en 080 millisecondes et consultée 1216 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.