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

ARTICLES

8 / 74

POKES 03 - 16 bits

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


Pourquoi j'ai baptisé la partie 03, 16 bits ?

Vous allez me dire, mon CPC est un ordinateur avec un processeur Z80 et jusqu'à preuve du contraire, c'est une machine 8 bits (les Atari St et Amiga eux étaient des 16 bits). Et c'est tout a fait vrai.
Mais la mémoire vive de notre CPC va de &0000 a &FFFF (valeur 16 bits)

 

Quelques explications sur les registres :
Les registres 8 bits = A, B, C, D, E, H, L (valeur possible en décimal = 0 a 255 ; en hexadécimal = &00 a &FF)
Les registres 16 bits (Assemblage de 2 registres 8 bits) = BC, DE, HL (valeur possible en décimal = 0 a 65535 ; en hexadécimal = &0000 a &FFFF)

Car justement il est tout a fait possible d'utiliser un registre 16bits pour assigner une valeur dans un jeu et bien entendu de modifier cette valeur.
Le registre 16 bits le plus utilisé et qui nous intéresse pour tricher dans les jeux est le registre HL.

Je vais vous donner plusieurs exemples avec l'utilisation du registre HL.


1) SKWEEK
Fichier utilisé : Skweek (F) (1989).dsk
Dans le jeu nous avons de visible 5 vies (5 pastilles jaunes rondes), mais si vous tuez rapidement votre Skweek et que vous comptez votre total de vie vous arriverai a 6 (donc 0 a 5 = 6 vies).

Voici comment c'est écrit dans le programme pour le joueur 1 :

#9970 : 21 69 02 36 06
21 69 02 => ld HL,&0269
36 06 => ld (HL),&06


ça nous fait un poke &0269,&06
Le programmeur aurait pu écrire 3E 06 32 69 02, ça serait revenu au même.

3E 06 => ld A,&06
32 69 02 => ld (&0269),A



Voici comment c'est écrit dans le programme pour le joueur 2 :

#997E : 21 57 03 36 06
21 57 03 => ld HL,&0357
36 06 => ld (HL),&06


ça nous fait un poke &0357,&06

Pour les vies infinies là c'est tordu et très intelligent, ça fonctionne pour les 2 joueurs.
Le programme fait une copie du nombre de vie en &7B51 et nous n'avons qu'un seul endroit pour gérer la décrémentation.

#72AF : 21 51 7B 35
21 51 7B => ld HL,&7B51 (dans HL nous mettons l'adresse mémoire qui nous intéresse)
35 => dec (HL)


C'est beaucoup plus court, seulement 4 octets utilisés en mémoire, alors que si on devait l'écrire avec la méthode qu'on a vu au tout début, il nous faudrait 7 octets (3A 51 7B 3D 32 51 7B)
Pour les vies infinies nous n'avons que le &35 a désactiver.


2) BARBARIAN
Fichier utilisé : Barbarian (UK) (Face A) (1987) [Palace Software] [Original].dsk
On lance le jeu : RUN"BARB1A.BIN

On commence par compter notre énergie (6 ronds rouge qui se décompose en 2, soit 12 points d'énergie, ce qui fait en hexadécimal &0C)

Les programmeurs ont utilisés le registre 16 bits HL pour écrire les points d'énergie pour les 2 joueurs en une seule fois

#6D44 : 21 0C 0C 22 EB C7
21 0C 0C => ld HL,&0C0C
(dans HL ici c'est l'énergie &0C = joueur 1 ; &0C = joueur 2)
22 EB C7 => ld (&C7EB),HL
(et ici c'est l'écriture en mémoire en &C7EB = valeur registre H + &C7EC = valeur registre L)



ça correspondrait a 2 pokes :
poke &C7EB, &0C
poke &C7EC, &0C

par rapport a l'utilisation du registre A, ici les programmeurs gagnent 2 octets.
sinon on aurait pu l'écrire ainsi : 3E 0C 32 EB C7 32 EC C7

3E 0C => ld A,&0C
32 EB C7 => ld (&C7EB),A
32 EC C7 => ld (&C7EC),A

 

 

3) FLIMBO QUEST
Fichier utilisé : Flimbo's Quest (UK) (1990).dsk
On a vu comment faire des pokes avec un registre 16 bits (soit poke normal avec Skweek, soit double poke avec barbarian), mais on a pas vu comment faire un double peek (enfin un peek 16 bits = 2 peek 8 bits).
C'est utilisé le plus souvent soit pour du TIME ou MONEY, surtout si on dépasse les &FF (255 en décimal).

2A yy xx => ld HL,(&xxyy)

Lire la double valeur située en &xxyy et &xxyy+1



3) AIGLE D'OR
Fichier utilisé : L'Aigle D'Or (F) (1986) [Original].dsk

500 pieces en or au début du jeu :

#92E0 : 21 00 05 22 CA 6A
21 00 05 => ld HL,&0500

LES 500 sont en décimal codé binaire, si ça n'avait pas était le cas on aurait converti en hexadécimal et là on aurait cherché &01F4, n'oublions pas l'histoire du poids fort et du poids faible, donc on aurai cherché 21 F4 01

22 CA 6A => ld (&6ACA),HL
Ecriture de la valeur en 6ACA = &00 et 6ACB = &05

 

#6AE4 : 2A CA 6A CD 51 6E
2A CA 6A => ld HL, (&6ACA)
Lire la valeur 16 bits


CD 51 6E => CALL &6E51
Appel d'une fonction (on pourrait suivre la fonction pour trouver où le programme décrémente puis écrit les données, mais on va tricher, on va faire une autre recherche en cherchant que 22 CA 6A)

 

#6B36 : 22 CA 6A


Nouveau poke pour CPCGAMES

 

Argent infini :
poke &6B36, le &22 en &21

 

 

CONCLUSION :

Faire un poke 8 bits en utilisant un registre 16 bits :

21 yy xx (adresse mémoire)
36 nb (valeur)

 

 

Faire un poke 8 bits avec décrémentation en utilisant un registre 16 bits :

21 yy xx (adresse mémoire)
35 (lecture + décrémentation + écriture)

 

 

Faire un peek 16 bits (Lire la double valeur située en &xxyy et &xxyy+1) :

2A yy xx => ld HL,(&xxyy)

 

 

Faire un poke 16 bits (la valeur a écrire est stocké dans HL => 21 yy xx) :

22 yy xx => ld HL, (&xxyy)

 

 

Article créé le : Vendredi 10 Avril 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.