30

Je sais, je sais, c'était juste un exemple. De toute façon personne de sensé ne va s'amuser à faire du 0(a0,d0) quand l'offset est fixe cheeky
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

31

Zerosquare (./26) :
Certains jeux ont des routines de checksum(...)
En effet c'est un checksum qui protège. J'ai remplacé un des 4E71 qui trainent au début par l'instruction que je remplace par 4E71 pour compenser, et ça passe.

Dans Ghouls n Ghost j'ai tracé la frame où ça décompte une vie.
Le nombre de vie est à B213, et je remarque ça : A1=00FFB200 .
Est-ce que ça veut dire que $0013(A1) correspond à l'adresse mémoire B213 ?
Car je vois justement cette ligne : 5329 SUBQ.B #1,$0013(A1)
Mais si je la désactive, le jeu reboote au moment de retirer une vie...

Pour Belle's Quest j'ai aussi tracé la frame où la vie est décomptée, et j'ai trouvé dedans l'endroit où ça retire le point de vie :
0479 SUBI.W #$0001,($00FF070E)
Je me demande pourquoi l'opération est sur 070E alors que le nombre de vies est stocké sur l'octet suivant : 070F... D'après ce que je comprend, ça atteint 070F car 0001 représente deux octects. Mais ça me semble être du gachis car 070E ne sert donc à rien, vu qu'on ne va pas avoir plus de 255 vies.

32

Pour fixer le cheksum à la volée et ne plus t emmerder à chaque fois tu peut aller dans Option -> Général -> Auto Fix Cheksum

33

Merci de l'astuce.

J'ai résolu mes problemes grace à la version debugger de Regen, avec ça je peux mettre un breakpoint sur l'écriture de l'adresse mémoire et trouver facilement quelle instruction fait ça.

Hier je me suis attaqué à la Master System. J'ai remarqué que l'ordre dans les instructions du Z80 est inversé par rapport à la Megadrive. Mais j'ai réussi sans probleme. Et là je viens de m'attaquer, avec succès, à des jeux de NES.

Pour remplacer une instruction par d'autres, constatant que je n'aurai pas la place et sachant que je ne pouvais pas décaler ce qui suit, j'ai eu l'idée d'ajouter mon code après la fin normale de la rom, de le faire sauter vers cette endroit, puis de le renvoyer là où il devait continuer. Du coup je suis tout fier, ça y est je me prend pour un petit génie qui comprend l'ASM. ^^

Une chose que j'aimerai bien faire mais je n'ai pas trouvé : virer un écran, ou au moins raccourcir sa durée d'affichage. Je pense en particulier à ces écrans de logo qui font ch**r au démarrage. J'ai supposé que leur durée d'affichage était basée sur une valeur qui descend ou monte tout au long de leur présence à l'écran, mais je n'ai pas trouvé de telle valeur, je finis toujours sur 0 résultat. :\
Quelqu'un sait ?

34

C'est certainement un compteur oui, mais ça doit aller tellement vite que trouver ça avec un débogueur va pas être facile...
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

35

_trames_restantes - 1; } while (nb_trames_restantes != 0);
Ça peut être aussi l'équivalent d'une boucle de ce style : nb_trames_restantes = nb_trames_delai;
do {
        AttendVBL();
        nb_trames_restantes = nb
sauf que nb_trames_restantes sera stocké dans un registre, donc tu ne le verras jamais en mémoire.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

36

J'utilise d'abbord Cheat Engine sur l'émulateur, ensuite je cherche dans la mémoire du jeu en changeant les valeurs avec Cheat Engine pendant que l'ému est en pause, donc elles apparaissent. Et j'ai réussi à choper deux choses :
- Une valeur qui détermine l'écran où on se trouve. Mais la plupart du temps, si je change, le jeu plante. Y'a que de rares fois où ça fonctionne, qu'il se croit sur le dernier logo alors qu'il est sur le logo SEGA, et qu'il m'amène alors directement au menu.
- Une valeur qui se met à 150 lorsque le logo a finit son fondu d'entrée, puis descend, et à 0 le logo commence à disparaitre. Si lorsque le logo apparait je met moi-même cette valeur à 1, le logo repart aussitot.

Donc j'ai mis Gen en slow-mode et j'ai tracé uniquement la frame où la valeur passe de 0 à 150, pouvant la surveiller dans Cheat Engine qui était resté ouvert juste à côté.
Puis j'ai mis des breakpoints au hasard sur quelques mov que je voyais dans le traçage, surveillant quand la valeur changeait, et ainsi j'ai cerné petit à petit la ligne qui donnait cette valeur.

23 FC MOVE.L #$000FE426,$00FF1634
Il la met bien dans une adresse, mais juste après il met cette valeur dans SP (c'est quoi ?) puis efface cette adresse :
2F 39 MOVE.L ($00FF1634),-(SP)
23 FC MOVE.L #$00000000,($00FF1634)

Probleme, la valeur est 150, ou 96 en hexa, donc je ne comprend pas ce FE426. Et sa taille n'est-elle pas trop grosse pour tenir dans une adresse ?
En tout cas, si je modifie, ça plante.

37

darkpig (./36) :
23 FC MOVE.L #$00000000,($00FF1634)

#argh#
clr.l bordel ! (sauf smc)

38

Ça dépend, si c'est un registre hardware, clr a des effets secondaires ennuyeux.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

39

C'est vrai.

40

Salut Darkpig,


le SP c'est le stack pointer, le pointeur de pile, c'est un reg qui pointe une zone mémoire qui est utilisé pour un paquet de truc. (Sauvegarde de regs, d'adresse de retour pour des appels de routines, etc...)

Ces progs peuvent t'aidé mais sans avoir aucune notion de l'asm utilisé ca peut etre un peu chaud. Car chaque programmeur a son style, ces techniques. Et parfois des trucs super tordus.

exemple : d7=$12340001

un sub.w d7, d1

ne va soustraire qu'un a d1. C'est un truc que j'utilise de temps en temps, mais faut faire gaffe a tout le reg, car l'autre partie de d7 sera utilisé plus loin.

ou sinon chargé deux var1 en word accolés, les chargés d'un coup avec un seul move.l

move.l Var1,dn

suivant l'operation juste ne jouant avec un word ou un long, on touche la var qu'on veux sinon un simple swap suffit.

move.l Dn,Var1



Var1 : dc.w 4
Var2 : dc.w 8



ensuite ne surtout pas oublié le prefetch du 68000 qui fait que sous debugger certaines valeurs sont erronés !!! Que pour beaucoup d'instructions mathématiques, pas besoin de faire de test pour vérifier certains résultat, etc...

ensuite certaines instructions n'affectent pas les flags, donc parfois tu as ton test a plusieurs kilosbytes plus loin. Exemple :

jsr routine_48
beq.s Game_over

8 kilos de code !!
ce que vous voulez



Routine_48:
movem.l xxx
sub.w #1,Nb_vies
movem.l xxxx
rts

Ce ne sont que quelques exemples, car suivant que le codeur veule optimisé en vitesse, en place mémoire, ça change du tout au tout. J'ai déjà utilisé des tableaux qui était indexé sur d'autres tableaux, donc le moindre registre modifié, plantage garanti. C'est un des gros avantages de l'assembleur, faire des trucs que tu peux pas faire avec d'autres langages, dans les entrailles de la bête. Sans parlé du code généré, auto modifiant, etc...

Mais en tout cas bonne chasse aux vies smile


GT Pro Motorola top


petit H.S. on voit bien ce qui dev du 68000 sur des PC, car le coup du moveq.l me fait toujours sourire, car un moveq le fait obligatoirement sur un long, extension de la valeur 8 bits.




avatar
Accrochez vous ca va être Cerebral !!

41

Rien n'empêche pourtant d'écrire moveq.l. Perso je le fais, même si je sais pertinemment que c'est inutile ^^

42

Folco (./41) :
Rien n'empêche pourtant d'écrire moveq.l. Perso je le fais, même si je sais pertinemment que c'est inutile ^^


Oui je sais et tu est pas le seul, c'etait juste une parenthese smile


GT En long top
avatar
Accrochez vous ca va être Cerebral !!

43

Merci pour ces explications. wink