APPLICATIONSCOURS DE BIDOUILLAGE ★ JOYSTICK n°5 - Cours de Bidouilles ★

Patrice Maubert - Cours de Bidouilles - Joystick N05Applications Cours De Bidouillage

Salut les kids. Dieu et chef ont été indulgents alors comme vous pouvez le constater, je suis encore là. Ca ne va peut-être pas durer donc j'en profite pour vous communiquer deux informations importantes : non je ne ferai pas de cours de bidouilles sur ST et non ne m'appelez pas Monta, ce n'est pas moi qui ai choisi ce surnom stupide... La dernière fois je vous ai juste donné une petite astuce rapide avant de partir. Cette fois-ci nous allons approfondir tout ça car se contenter de remplacer une chaîne hexa c'est pas violent et en plus sans comprendre ce qu'on fait c'est plutôt débile (c'est-à-dire faible). Tout ceci étant destiné à faire naître en vous le sentiment de culpabilité de votre ignorance et vous pousser ainsi à poursuivre la difficile lecture de ma prose insipide...

HEXA C'EST HEXA...

D'habitude dans les livres traitant de l'assembleur, on vous apprend a compter jusqu'à 1. Ici on va vous apprendre à compter jusqu'à F. Comme je me doute que la plupart d'entre vous connaissent déjà, disons simplement qu'il s'agit de compter en base 16 (niveau cours préparatoire) plutôt qu'en base 10 (niveau maternelle). Ceux qui n'ont pas suivi quand ils étaient au CP s'en mordent aujourd'hui les doigts. Il est inutile de savoir calculer en hexa CB65+1F20, sachez seulement sur le bout des doigts tous les nombres de0à 255 (=FF) et les autres valeurs remarquables : 800 -7000 - 4000 - FFFF... N'oubliez pas qu'avec Discology, tout (ou presque) se fait en hexadécimal.

ASSEMBLEUR ET CODE MACHINE...

Ces deux termes désignent deux notions différentes qu'il est indispensable de bien discerner. Le code machine est le seul langage (c'est-à-dire suite d'instructions) compréhensible directement par le microprocesseur. C'est en fait une suite de 0 et de 1 (des bits) que nous regroupons par commodité par 8, pour former des octets. Mais l'esprit humain est ainsi fait que ces suites de nombres, parfaitement claires pour l'ordinateur, le sont beaucoup moins pour nous. Nous les convertissons donc en un autre langage qui comporte des lettres et des mots : l'assembleur, le passage de l'assembleur au langage machine (et inversement) se fait par simple conversion (une instruction égale une autre instruction), alors que par exemple le passage du basic à l'assembleur est beaucoup plus compliqué. Pour schématiser grossièrement ce que nous ferons en assembleur, disons que cela va consister à manipuler des nombres (vous vous en doutiez non ?), d'une part en effectuant sur eux des opérations, et d'autre part en les stockant, soit dans des registres (internes au microprocesseur), soit dans des cases mémoires (externes), dont votre ordinateur possède pas moins de 65536 exemplaires.

PREMIERES INSTRUCTIONS...

Revenons a nos préoccupations premières, qui étaient je le rappelle les bidouilles. Intéressons-nous pour l'instant aux vies infinies. Imaginons un jeu ou vous possédez cinq vies. Le nombre cinq va être stocké dans une case mémoire et l'opération effectuée sur ce nombre sera une décrémentation, lorsque vous perdrez une vie. Le but final est d'éliminer la partie du programme ( là où sont les instructions ) qui provoque cette décrémentation. Pour cela, il nous faut tout d'abord trouver la case mémoire contenant le nombre de vies. Nous allons rechercher l'initialisation, c'est-à-dire la partie du programme qui, au début de la partie, met a jour tous les compteurs (vies, scores, levé!,..). Voyons ce que cela pourrait donner en assembleur (avec le code machine correspondant) pour un jeu à cinq vies :

LD A,5    3E  05 ; on met le nombre 5 dans le registre A
LD (4FC7),A    32 C7 4F ; on met le registre A dans la case mémoire 4FC7

La case mémoire dépend bien sur du bon vouloir du programmeur et vous ne pouvez pas la deviner. Vous connaissez donc les trois premiers octets qui sont 3E 05 32. Recherchez donc cette chaîne hexa avec votre DISCO préféré. Pour vérifier que vous êtes sur la bonne voie, remplacez le 05 par autre chose, 'et chargez votre jeu. Si le nombre de vies est changé, c'est tout bon. Vous avez reconnu là le petit « truc » que je vous avais donné le mois dernier. Mais cette fois-ci vous en comprenez le sens ! Quand vous avez repéré la zone avec DISCO, désassemblez le secteur (menu Afficher - option Désassembler écran). Si le listing laisse apparaître beaucoup d'instructions dans le style LD (XXXX),A c'est que vous avez des chances d'être tombé sur les initialisations. Si ce n'est pas le cas, cherchez plus loin. C'est le genre d'instruction qu'il n'est pas étonnant de rencontrer plusieurs fois. Une autre façon de repérer l'endroit : si le jeu se joue a deux joueurs et que vous rencontrez les instructions LD A, vies

LD (XXXX),A case mémoire pour le joueur 1

LD (YYYY),A case mémoire pour le joueur 2 alors tout va bien !

Ce n'est pas la seule façon de mettre une valeur dans une case mémoire. En voici une autre qui emploie un registre appelé HL :

LD HL, case  21 XX XX adresse de la case mémoire dans HL

LD (HL),5   36 05 met la valeur 5 dans la case adressée par HL

Si la première méthode n'a rien donné, essayez celle-ci en recherchant les octets 36 05 (ou autre selon le nombre de vies bien sur 0 et remplacez le 05 par autre chose, puis essayez. Cette méthode n'est pas utilisée en premier car elle est moins couramment employée par les programmeurs, et le nombre d'octets recherchés étant moins long, vous avez plus de chances d'en trouver a des endroits qui ne vous intéressent pas. Si ça ne marche toujours pas, essayez avec un nombre de vies différent. Par exemple, si le jeu affiche cinq vies au départ, essayez avec six. Il se peut que vous puissiez toujours jouer lorsque le jeu en indique zéro. Il arrive aussi que des jeux commencent systématiquement une partie par une décrémentation de vies : il vous semble en avoir cinq au départ alors que vous en avez déjà perdu une. Essayez aussi avec sept vies si jamais les deux cas précités cohabitent ( ça s'est déjà vu .0. Essayez aussi avec quatre vies, au cas où le jeu ne vous fasse en fait mourir non pas lorsque le contenu de la case mémoire des vies indique 0, mais 255 ( car 0 - 1 = 255 ! ).

Enfin le nombre de vies peut être exprime en caractère ASCII. Comme vous le savez, en ASCII, le caractère 0 correspond a 48, 1 a 49, 2 a 50...En hexa, ca nous donne de 30 a 39 ( facile à retenir non ? ). Donc pour un jeu à cinq vies, vous recherchez 3E 35 32 ou 36 35. Bien sur, les remarques exposées plus haut sont toujours valables, N'oubliez l'ASCII si le jeu affiche le nombre de vies sous forme d'un chiffre. S'il vous affiche par exemple des personnages, il y a bien sur beaucoup moins de chances que cette méthode soit utilisée ! Si vous ne trouvez toujours pas, le dernier recours est de rechercher et d'essayer de modifier tous les LD A,Nbre de vies. Mais attention ! Il risque d'y en avoir beaucoup ! (d'autant plus que le nombre de vies est faible). Recherchez donc les 3E  XX au lieu de 3E XX 32. Essayez en priorité ceux du style :

LD A,5 ou LD A,5 ou LD A,5

LD HL, CASE   LD (LX+00),A JR NZ, 0100

LD (HL),A LD (CASE),A

Un dernier détail : le fait de remplacer systématiquement le nombre de vies par FF peut conduire à un plantage du jeu, si le programme veut à tout prix afficher ces 255 vies ou si le code 255 correspond pour le programme a un caractère de contrôle particulier. Si cela fait planter le jeu ou occasionne un bordel monstre à l'écran, essayez des valeurs plus modestes du style A0, 99, 80,63,32...

That's ail folks...euh non je voulais dire kids!

Voila, si avec toutes ces explications, vous ne pouvez augmenter le nombre de vies du moindre de vos jeux, alors vous n'avez plus qu'à vous mettre au chômage technique...jusqu'au mois prochain ! Où nous aborderons des choses encore plus sérieuses, avec après le prolongement de la vie, carrément la vie infinie et même le temps infini si vous êtes sages, et si j'en dis toujours me poser des questions et me faire des propositions (même malhonnêtes) sur 36 15 JOYSTICK en BAL Maubert.
Bonnes vies infinies a tous et atchao bonsoir...

PATRICE MAUBERT, JOYSTICK n°05 JUILLET MAI 1990, page 74

★ LICENCE: COMMERCIALE
★ ANNÉE: 1990
★ AUTEUR: PATRICE MAUBERT

Page précédente : Patrice Maubert - Cours de Bidouilles - Joystick N04

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