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

ARTICLES

6 / 74

POKES 01 - Facile

* 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)


Qui n'a pas rêvé de trouver ses propres pokes dans ses jeux favoris ?
Vous allez me dire, il faut savoir programmer en Assembleur pour arriver a tricher dans un jeu ?
En fait nous n'avons pas besoin de connaître grand chose pour arriver a bidouiller un jeu.
Nous n'avons besoin que de quelques connaissances et de beaucoup de patience et parfois aussi de chance.


On va travailler sur : 3D Stunt Rider (UK) (1985) [Original].dsk
Et je vais utiliser l'émulateur WinCPC.

ETAPE 1 : Trouver l'adresse mémoire du nombre de vie


On charge le jeu et nous voyons, LIVES = 5

* LES BASES :
Dans 90% des jeux, le nombre de vie est écrit de la façon suivante :

3E nb 32 yy xx


nb = le nombre de vie.
xxyy = l'adresse mémoire où va être stocké le nombre de vie.


Nous allons traduire se bout de code Hexa : 3E 05
=> en assembleur : ld A, &05
=> en Basic : A = 5
Charger la valeur 5 dans le registre A
donc 3E nb (nb, contiendra le nombre de vie)


Nous allons traduire se bout de code Hexa : 32 yy xx
=> en assembleur : ld (&xxyy), A
=> en basic : poke &xxyy, A
Ecrire le contenu de "A" en mémoire a l'adresse &xxyy
donc 32 yy xx (qu'on lira &xxyy car le poids fort et le poids faible sont inversé)


Par exemple si on voulait écrire la valeur 255 (&FF en hexa) en &C000 ça se traduirait ainsi :
En Hexa : 3E FF 32 00 C0
En assembleur : ld A, &FF : ld (&C000), A
En Basic : poke &C000, &FF


* CONCLUSION
on retrouvera souvant : 3E nb 32 yy xx


Maintenant que nous savons ça, nous allons rechercher dans la mémoire, 3E 05 32 et nous noterons soigneusement l'adresse et les 2 octets derriere le &32

Voici le résultat, on a de la chance, seulement 3 chaînes
Adresse : chaine trouvée

#AB3A : 3E 05 32 66 98 => poke &9866, &05
#ABC0 : 3E 05 32 10 AA => poke &AA10, &05
#AD11 : 3E 05 32 66 98 => poke &9866, &05



Donc on a 2 adresses mémoires a surveiller : &9866, &AA10
On démarre une partie :

Après le passage de l'avion je regarde les 2 adresses

&9866 = &05
&AA10 = &05



Allez je vais scratcher ma moto, histoire de tomber a 4 vies.

&9866 = &05
&AA10 = &04


Donc logiquement la bonne adresse serait &AA10, pour m'en assurer je vais modifier sa valeur, je vais mettre &09
Allez je vais encore scratcher ma moto, et cette fois-ci je dois voir a l'écran 9 vies - 1 = 8
Eureka ça fonctionne.

Et voilà un nouveau poke pour CPCGAMES.

- POKES -
Nombre de vies :
poke &AA10, Nb



ETAPE 2 : Trouver les vies infinies

Maintenant on en veut encore plus, c'est a dire les Vies infinies.
Histoire de ne pas avoir a rajouter des vies sans arrêt.
Qu'avons nous besoin de connaitre ?

Pour que les vies soient décompté il faut que le programme :
1) lise le nombre de vie en mémoire
2) fase -1 a ce nombre
3) l'écrive en mémoire

Pour lire en mémoire, voici une méthode
3A yy xx

Etant donnée que nous connaissons l'adresse mémoire des vies,
nous allons rechercher
3A 10 AA (c'est notre &AA10 qui devient xx = &AA et yy = &10)
=> en assembleur : ld A, (&AA10)
=> en basic : A = peek(&AA10)
Charger dans A, la valeur stocké en &AA10


Voici le résultat, on a encore de la chance, seulement 2 chaînes

Adresse : chaine trouvée

#AAA6 : 3A 10 AA CD D4 AD
#BC9E : 3A 10 AA 3D 32 10 AA




* CHAINE 1

#AAA6 : 3A 10 AA CD D4 AD


3A 10 AA
=> ld A, (&AA10)
on a notre lecture en mémoire

CD D4 AD
=> call &ADD4 (CD yy xx)
appel d'un sous programme, correspond a un GOSUB en basic
il pourrait tout a fait y avoir la décrémentation dans le sous-programme, mais ce n'est pas le cas ici.
Si ça avait été le cas, il aurait suffit de mettre un &C9 (Ret)our a l'adresse &ADD4 (enfin ça dépend du contenu du sous-programme, ceci est une autre histoire).


* CHAINE 2

#BC9E : 3A 10 AA 3D 32 10 AA


3A 10 AA
=> ld A, (&AA10)
on a notre lecture en mémoire (on connais maintenant)

3D
=> dec A
Pas besoin de faire de la programmation pour comprendre le mot (dec)rémentation pour diminuer
ça fait tout bêtement A = A - 1

32 10 AA
=> ld (&AA10),A
on a notre ecriture en mémoire (on connais maintenant)

Donc il nous suffit soit de désactiver la décrémentation &3D ou de dire que le &32 (poke) devienne un &3A (peek)
Les 2 possibilités fonctionnerons.
Pour désactiver on va utiliser un &00 (nop)

#BC9E : 3A
#BC9F : 10
#BCA0 : AA
#BCA1 : 3D => on va remplacer par &00
#BCA2 : 32
#BCA3 : 10
#BCA4 : AA



Et voilà un deuxième poke pour CPCGAMES.

- POKES -
Vies infinies :
poke &BCA1, le &3D en &00



CONCLUSION
Donc nous avons vu :

3A yy xx => Lire la valeur de l'adresse mémoire &xxyy et la mettre dans A
32 yy xx => Ecrire la valeur A dans l'adresse mémoire &xxyy
CD yy xx => appel d'un sous-programme commencant en &xxyy
3E nb => attribuer une valeur au registre A ; A = nb
3D => dec A (A = A - 1)
C9 => ret (retour d'un sous-programme, appellé par un call CD yy xx)
00 => nop

 

Article créé le : Samedi 10 Janvier 2009 à 00 h 00
Dernière mise à jour le : Samedi 03 Mars 2012 à 11 h 43
 
 

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.