Faire de l'ASM

From Pmpwiki

Contents

[edit] Necessite

Tutoriel Partie 1 :

Un editeur hexadecimal.

ROM Map de SMW Central.



Tutoriel Partie 2 :

SNES9X debugger (Pour reperer ce qu'il faut modifier).

xKas (Compileur ASM).

RAM Map de SMW central (Dans ce tutorial, on en prend un qui n'y est pas dans la liste).

Un editeur de texte.

[edit] Introduction

Vous voulez modifier quelque chose dans Super Mario World, vous voulez par exemple :

Que Mario Feu ou Mario Cape quand il se fait toucher qu'il devienne Super Mario (et PAS petit Mario) ?

Hé bien ce tutorial est fait pour vous !

En fait, tout est possible aussi en hexadecimal, mais quand on comprend rien...

Cette fois, on ajoute et on modifie et pas modifier tout court.

[edit] Tutoriel Partie 1 : L'hexadecimal

Je n'ai pas utilisé Translextion, j'ai utilisé Notepad++, il arrive a se mettre en mode hexadecimal.

Pour vous faire comprendre, regardez : Chaque ligne sont comme ça (les numeros seront different a chaque ligne) :

00000 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Par exemple : Si je dois modifier la musique du Special World qui est sur 71AC5, il sera sur 71AC0.

71AC0 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

71AC5 est situé : 71AC0 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

Donc je modifie 05 par 1A par exemple.

Ca donne ça : 71AC0 00 01 02 03 04 1A 06 07 08 09 0A 0B 0C 0D 0E 0F

Et voila !


[edit] Tutoriel Partie 2 : Le langage

1. Comprendre, comment ça marche.

Hé bien, il vaudrait mieux comprendre d'abord comment ça marche.

L'ASseMbleur comporte des commandes un peu plus compliquées que ceux du basic ou du C++.

En ASM ça donne ça :

JSL Main

Main:

LDA #$25

STA $000123

RTL

En fait, JSL sert de routine pour le label Main.

LDA permet de prendre en charge #$25.

STA sert a mettre ce qu'utilise LDA dans $000123.

En gros :

JSL Main

Main:

LDA #$25 ;\\ Mettre #$25

STA $000123 ; | dans $000123

RTL ;/ Retour


En PLUS GROS :

Main:

#$25 dans $000123 puis RTL.


C'est tout bete.


2. Commandes


Le plus important !

Les commandes de l'ASM !

Mais je donne seulement les plus faciles:


JSL label

Permet de faire la routine (si elle est longue).


RTL

Faire un retour au jeu (je crois).


ORG $????

Sans cette commande, impossible de mettre le code.

$???? sera l'endroit ou le code sera assemblee.


CMP #$??

Sert a comparer les valeurs.


BCS label

Sert a aller dans une autre routine.


LDA #$??

# veut dire que c'est la valeur. $ veut dire que c'est en hexadecimal. % veut dire que c'est en binaire.

LDA $12 prendra en charge la valeur dans le offset $12, donc si vous voulez mettre une valeur dans un offset, faut faire : LDA #$12


STA $??

Met la valeur prise par LDA dans l'objet.


STZ $??

Necessite que LDA soit au meme valeur que STZ car, l'objet servi sera mis a zero.


Voila des commandes plus utiles et a mettre au debut:

header

Permet de savoir a xkas que la rom a un header (Tres important car SMW en a un).


lorom

hirom

Permet de savoir xkas que la rom est lorom ou un hirom, mais comme SMW est un lorom...

Mettez lorom.


db "STAR"

dw $0080, $FF7F

Ceci permet de protéger au moins 80 Bytes. Ca s'appelle le "RATS tag".


3. Programmer


Voici l'etape qui vous interesse.

Il s'agira d'une routine a modifier.


D'abord...

Qu'est-ce que je dois modifier ?

N'avais-je rien dit a propos des power-ups plus haut ?


Hé bien, on modifiera la routine quand on Power-Down (touché par un ennemi).

Mais, ou est cette routine ?

Utilisons le SNES9x Debugger, (faites une sauvegarde de votre hack).

Essayons d'etre Mario Cape ou Feu et faites-vous toucher puis appuyez sur Breakpoint dans le debug.

Une ligne s'ajoute, et ca devrait etre comme ça :

$00/F600 64 19 STZ $19 [$00:0019] A:7901 X:0005 Y:0004 D:0000 DB:03 S:01EC P:envMXdizc


$00/F600 est l'adresse de la routine, STZ $19 est la commande qui a causé le "Breakpoint",

64 19 est la version hexadecimal de STZ $19.


Le code est comme ça :


header

lorom

org $F600

JSL Main

org $1fb000 ;L'adresse SNES ou le code est ajoutée.

db "STAR" ;\\

dw $0080, $FF7F ;/ Le "RATS tag"

Main:

lda $19 ;\\

cmp #$02 ; |Si Mario est Super

BCS to_super ; |alors {

STZ $19 ; |Mettre Mario en petit ($00)

lda #$29 ; |L'instruction supprimé pour mettre le JSL

rtl ;/ retour }

to_super: ;\\

lda #$01 ; |sinon {

sta $19 ; |Mettre Mario en Super Mario ($01)

lda #$29 ; |L'instruction supprimé pour mettre le JSL

rtl ;/ retour }


Enregistrez tout ça en nomdelaroutine.ASM


Utilsez XKAS, mettez la rom et la routine (nom.ASM) dans ce meme dossier.

Puis utilisez l'invite de commandes, allez dans le dossier de xkas et tapez :

xkas nomdelaroutine.ASM nomdelarom.SMC

Vous pouvez transformer ces commandes en hexadecimal en faisant :

xkas romdelaroutine.ASM nomdelaroutine.BIN

Et voila !

Personal tools