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

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

Cher kids, je suis toujours en vacances en Irak avec toute ma famille. Ici, il fait encore très beau, tandis que chez vous il commence à faire froid. Moi je préfère de loin être ici. D'ailleurs un grand monsieur blond avec un oeil de verre qui passait par là a proposé de nous ramener, mais il avait une telle sale gueule que j'ai préféré rester avec Mr. Hussein (et avec sa dame). Mon fidèle pigeon voyageur Danbiss ayant déserté (il s 'est arrêté dans un Mac Donald Saoudien en revenant de France, et depuis je n'ai  plus de nouvelles), je n 'ai pas pu vous faire parvenir mon article de la même façon que le mois dernier.

J'ai bien pensé envoyer Elbaz, mais il se serait arrêté en Arabie Saoudite pour expliquer aux soldats américains comment ils devaient tenir leurs bazookas, alors j'ai renoncé à cette solution. J'ai flnalement envoyé ma grosse colombe Danboss, qui a courageusement survolé les lignes ennemies (elle a même sympathisé avec un 737 en chemin). Mais enfin ça y est, ce cours est sous vos yeux. Profitez-en bien...

MISE A L'INDEX

Au cours de votre grand voyage à travers l'assembleur Z80, nous avons déjà rencontré l'adressage immédiat de registres (ex: LD A,5 LD (&43E8),A), ainsi que l'adressage indirect (LD HL,&43E8 LD (HL), 5). Permettez-moi de vous présenter aujourd'hui monsieur l'adressage index, ainsi que toute sa famille... Enchanté, moi aussi!

L'adressage index se, fait, comme son nom l'indique, à travers les registres d'index, qui sont au nombre de deux: IX et IY. Ce sont des registres doubles (donc sur 16 bits), comme HL ou DE, mais la différence de ces derniers ce ne sont pas simplement des paires de bits, enfin je veux dire de registres huit bits (dans HL, on peut se servir de H et L tous seuls, pas dans IX et IY). Lorsque IX et IY sont employés pour adresser une case mémoire, il faut toujours préciser l'index. Je m'explique lorsque vous mettez un octet dans une case mémoire grâce HL, cela donne :

LD HL,&0173
LD (HL),&01

En adressage index par IX, cela donne :

LD IX,&0173
LD (IX+&25),&01

Le &25, c'est l'index, le décalage, la case mémoire où on met &01 dans notre exemple est donc &0173 + &25 = &0198. Pour la transcription d'assembleur en code machine, c'est carrément trop simple. il suffit de prendre le code machine de la même instruction avec le registre HL, et le faire précéder de DD pour le registre IX, ou de FD pour le registre IY puis de faire suivre le code de l'instruction d'un éventuel index, et d'une éventuelle opérande.

Exemple:

Avec HL:

LD HL,&0173        21 73 01
LD (HL),&01        36 01

Avec IX:

LD IX,&0173        DD 21 73 01
LD (IX+&25),&01    DD 36 25 01

Avec IY:

LD IY,&0173        FD 21 73 01
LD (IY+&25),&01    FD 36 25 01

Etonnant, non?

ET DIEU DANS TOUT CA?

Ben oui quoi, et les vies infinies dans tout ça, hein ? On est quand même là pour ça, non ? D'accord, j'y viens, mais un peu de culture générale en préambule n'a jamais fait de mal personne, et cela vous permettra d'aller plus loin par vous-mêmes.

Sachez tout d'abord que si les programmeurs de jeux se servent des registres indexés, c'est parce que c 'est parfois plus pratique pour eux.

Lorsqu'une partie du programme doit agir sur un groupe de cases mémoires qui est susceptible de changer d'emplacement, ou bien lorsqu 'il y a plusieurs de ces groupes sur lesquels il faut agir successivement, le programmeur doit réécrire plusieurs fois la même routine avec des adresses différentes s'il utilise des adresses absolues avec par exemple le registre HL. il est beaucoup plus simple de fixer la base avec IX ou IY, puis de programmer en adresses relatives par rapport à cette base. Pour agir sur des groupes de cases mémoires différents, il suffit chaque fois de fixer la base et d'appeler à nouveau la même routine. Cela permet de faire une seule routine.

Un exemple précis (que l'on rencontre souvent) : lorsqu'un jeu se joue à deux joueurs, plutôt que de faire deux fois les mêmes routines d'affichage du nombre de vies, du score, d'incrémentation du temps, de décrémentation des vies ( ah ! je vous sens frémir... ) , le programmeur en fait une seule avec des registres indexés, et il y a deux blocs de données (deux valeurs de IX ou de IY ), un pour le joueur 1 , et un pour le joueur 2.

Et justement, ces blocs de données, ils sont initialisés au début de la partie, généralement de la faon suivante:

LD IX,&4500      DD 21 00 45 'bloc de données du joueur 1
LD (IX+&00),&05  DD 36 00 05 'vies du joueur 1
LD (IX+&01),&09  DD 36 01 09 'bombes...
LD (IX+&02),&99  DD 36 02 99 'énergie...
LD IX,&4530      DD 21 30 45 'bloc de données dujoueur2
LD (IX+&00),&05  DD 36 00 05 'vies du joueur 2
LD (IX+&01),&09  DD 36 01 09 'bombes...
LD (IX+&02),&99  DD 36 02 99 'énergie...

Bien sur, ceci n 'est qu'un exemple ! Il est de bon ton ici de remplacer les 05 par des FF pour avoir 255 vies.

Je précise que dans tout ce qui va suivre, je ne parlerai que de IX, mais tout pourra s'appliquer exactement de la même façon IY en remplaçant le DD qui commence les instructions par un FD. Les programmeurs utilisent généralement en premier IX, pour de sordides questions d'ordre alphabétique.

Mais comment la trouve-t-on justement cette zone des initialisations, me demanderez-vous ? C'est là que cela se complique un peu, car si vous savez par exemple que votre jeu donne cinq vies au départ, il faudrait alors rechercher les DD 36 00 05. Mais qui vous dit que le nombre de vies est forcément stocké dans la première case du bloc de données ? il se peut qu'il soit stocké par un LD (IX+&04),&05 ou encore LD (IX+&10),&05. Alors en fait il faudrait rechercher les instructions qui commencent par DD 36, ont ensuite un octet qui importe peu, et se terminent par 05.. Allez expliquer ça à DISCO ou votre Hacker ! Leurs routines de recherche ne sont pas prévues pour « sauter un octet' ». Qu'à' cela ne tienne, nous nous pencherons un jour prochain sur ce problème et nous ferons notre propre routine de recherche pour répondre au mieux à nos besoins. C'est promis !

En attendant, contentez-vous de rechercher tous les DD 36 dans votre jeu.

Mais attention! Vous allez en trouver des quantités non négligeables ! Alors n'essayez que ceux qui se trouvent dans des endroits ressemblant le plus possible à une zone d'initialisations comme d'écrite ci-dessus. Et sachez surtout que vous ne devez essayer les registres indexés pour rechercher des vies infinies que lorsque toutes les autres méthodes que nous avons déjà décrites ont chou...

A LA BOUFFE

Ben oui, il faut que vous laisse parce que j'ai très faim, et on me fait signe qu'ils vont bientôt servir le repas hebdomadaire à l'hôtel, donc je vous dis au mois prochain, où (entre autres) nous en finirons avec les registres d'index. Je vous rappelle que je répondrai avec plaisir à toutes vos questions sur minitel 36 15 JOYSTTCK en BAL MAUBERT ( les hôtels irakiens ont un excellent équipement télématique ).

Je terminerai par le proverbe du jour: “Le ramadan creuse”. Non Danbiss, c'est pas pour toi ça ! Toi tu mangeras la semaine prochaine. Allez couché Danbiss ! Ah, sale bête!

PATRICE MAUBERTI, JOYSTICK n°10 NOVEMBRE 1990, page 147

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

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

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