CPC-POWER : CPC-SOFTS - CPCArchives 
Options de Recherche :
 
 
 

ARTICLES

13 / 74

POKES 04 - Adresses indexées

* LES BASES


PEEK & POKE

* EXPLICATIONS POUR TRICHER DANS LES JEUX


POKES 00 - Recapitulatif
POKES 01 - Facile
POKES 02 - Surprise
POKES 03 - 16 bits
POKES 04 - Adresses indexées

* EMULATEURS - COMMENT UTILISER LES POKES


PC : WinCPC - Les pokes
PC : CPCE - Les pokes

* LIVRES - PARFAIRE VOS CONNAISSANCES


Peeks et Pokes du CPC (Micro Application 1985)


Les jeux utilisant les valeurs indexées (IX et IY sont des Registre d'index) ont toujours été les plus durs a modifier pour ceux qui ne savent pas programmer correctement en assembleur. Au travers de cet article je vais démystifier cette technique en vous parlans uniquement de quelques instructions.

 

Voici 6 instructions avec IX :

DD 21 00 60 => ld IX,#6000 => IX = &6000 Assigner une adresse a IX
DD 36 02 05 => ld (IX+02),#05 => poke IX + 02, &05 Ecrire &05 a l'adresse IX + 02
DD 35 02 => Dec (IX+02) => poke IX + 02, peek (IX + 02) - 1 Faire -1 a la valeur contenu a l'adresse IX + 02
DD 34 02 => inc (IX+02) => poke IX + 02, peek (IX + 02) + 1 Faire +1 a la valeur contenu a l'adresse IX + 02
DD 7E 01 => ld A,(IX+&01) => A = peek IX + 01 Lire la valeur de l'adresse mémoire IX + 01 et la mettre dans A
DD 77 01 => ld (IX+&01),A => poke IX + 01, A Ecrire la valeur A dans l'adresse mémoire IX + 01



Voici 6 instructions avec IY :

FD 21 00 60 => ld IY,#6000 => IY = &6000 Assigner une adresse a IY
FD 36 02 05 => ld (IY+02),#05 => poke IY + 02, &05 Ecrire &05 a l'adresse IY + 02
FD 35 02 => Dec (IY+02) => poke IY + 02, peek (IY + 02) - 1 Faire -1 a la valeur contenu a l'adresse IY + 02
FD 34 02 => Inc (IY+02) => poke IY + 02, peek (IY + 02) + 1 Faire +1 a la valeur contenu a l'adresse IY + 02
FD 7E 01 => ld A,(IY+&01) => A = peek IY + 01 Lire la valeur de l'adresse mémoire IY + 01 et la mettre dans A
FD 77 01 => ld (IY+&01),A => poke IY + 01, A Ecrire la valeur A dans l'adresse mémoire IY + 01



On constate que la seule différence entre IX et IY c'est que les codes héxadécimal commence respectivement par DD et FD.

Imaginez que le programmeur couple ça a un tableau de données et a une boucle pour mettre a jour les informations et vous aurez une routine très très rapide et très puissante, mais pour bidouiller le jeu vous aurez beaucoup plus de difficulté.



ISS - Incredible Shrinking Sphere (Registre d'index IX)
Le nombre de point de vie est stocké en &B02D

Le programmeur a utilisé le registre IX
#00CA : DD 21 00 B0 => IX = &B000
Vu que IX = &B000 et qu'on sait que les vies sont en &B02D, on sait que le programme a ajouté &2D

Vies infinies :
#0753 : DD 35 2D => Dec (IX+&2D)



Ikari Warriors (Registre d'index IY)

Nous savons que nous avons 6 vies dans le jeu :

Donc on aura un FD 36 ?? 06 ou un DD 36 ?? 06 quelques part dans le code. les ?? représente l'index utilisé par le codeur et ça nous ne pouvons pas le savoir par avance. Malheureusement on ne va rien trouver. Nous pouvons le faire au petit bonheur la chance, on trouve une adresse avec DD 35 ?? ou FD 35 ?? et on remplace par 00 00 00 pour annuler la décrémentation. Jusqu'à temps qu'on tombe sur la bonne.


Vies infinies :
#5754 : FD 35 08 => Dec (IY+&08)

Maintenant qu'on la trouvé grâce au petit bonheur la chance, on va pouvoir faire le chemin inverse et trouver la valeur d'IY en utilisant un émulateur et en demandant une pause dans l'exécution du programme (comme toujours pour ce genre de travail j'utilise WinCPC). IY = &0039
Donc IY + &08 = adresse mémoire &0041
Le nombre de vie est bien stocké en &0041

 

 

Le 5eme Axe (Registres IY + A)
Avec ce jeu nous découvrons une variante très intéressante, le couple de registre IY et A
Le nombre de point de force est stocké en &5341

Le programmeur a utilisé le registre IY pour l'adresse mémoire
#5A17 : FD 21 40 53 => ld IY,&5340

Je vous épargne les différentes opérations utilisées par le programmeur pour obtenir la nouvelle valeur pour le registre "A".

#5A31 : FD 77 01 => ld (IY+&01),A
Sachant que IY = &5340 + &01 = &5341, le programmeur va bien écrire la valeur contenu dans le registre "A" a l'adresse &5341
Pour obtenir la force infini, on va simplement transformer l'écriture en lecture.
FD 77 01 va devenir FD 7E 01 et le tour est joué.

 



CONCLUSION
Lorsque vous ne trouvez rien avec les techniques classiques, il y a fort a parier que le programmeur a utiliser les registres d'index, même si vous ne connaisser rien a l'assembleur grâce aux exemples données au dessus vous pourrez tout de même arriver a modifier le jeu, mais il vous vaudrat de la patience et un peu de chance.

 

Article créé le : Mardi 02 Mars 2010 à 10 h 11
Dernière mise à jour le : Samedi 03 Mars 2012 à 11 h 44
 
 

CPC-POWER/CPCArchives, projet maintenu par Fredouille.
Programmation par Kukulcan © 2007-2024 tous droits réservés.
Reproduction sans autorisation interdite. Tous les titres utilisées appartiennent à leurs propriétaires respectifs.