Ze Skeud's guide sur l'asm

 

_
_
Sommaire
_Introduction
_SNES
_Compression
_Megadrive
_Final Thoughts
_


 
 
 

Another world : La Megadrive/Genesis




Là, cela portera sur mon boulot sur Phantasy Star 2, une création de routine de chargement de fonte en ASM 68000, un processeur que je ne connaissais pas du tout (mais VRAIMENT pas, et que je connais maintenant..... toujours aussi mal ;-) ).
Ptites infos sur ce processeur : c'est un motorola présent un peu partout, comme dans l'amiga, le macintosh (sous ses variantes) et meme dans votre TI 89. (-Petit message perso : La TI 89 n'est PAS une GAME BOY! Alors on arrête de payer ça 900 balles JUSTE pour jouer en cours de philo!!!-). Par contre, le processeur est Big endian. Donc, un 2568h sera en hexa 2568h et non 6825h comme sur snes.

Vala, c'est finit pour l'intro.

Ce qu'il y avait à faire?

Ce jeu a une fonte compressée (ohhhh, étonnant!). Et, plutot que de me casser le cul à la décompresser, je me suis casser le cul à reprogrammer la routine pour que le jeu charge une routine décompressée. La première difficulté est qu'il faut modifier en tout 5 routines à différents endroits!

C'est parti pour un peu de code.
 

Partie 1

00007348 6100 EF1E                BSR       $00006268(pc)
0000734C 46FC 2700                MOVE      #$2700,SR
00007350 3038 F610                MOVE.W    $F610,D0
00007354 0200 00BF                AND.B     #$BF,D0
00007358 33C0 00C00004            MOVE.W    D0,$00C00004
0000735E 6100 EA04                BSR       $00005D64(pc)
00007362 4DF9 00C00004            LEA       $00C00004,A6
00007368 3CBC 8F01                MOVE.W    #$8F01,(A6)
0000736C 3CBC 93FF                MOVE.W    #$93FF,(A6)
00007370 3CBC 945F                MOVE.W    #$945F,(A6)
00007374 3CBC 9780                MOVE.W    #$9780,(A6)
00007378 3CBC 4000                MOVE.W    #$4000,(A6)
0000737C 3CBC 0080                MOVE.W    #$0080,(A6)
00007380 33FC 0000 00C00000       MOVE.W    #$0000,$00C00000
00007388 3E16                     MOVE.W    (A6),D7
0000738A 0247 0002                AND.W     #$0002,D7
0000738E 66F8                     BNE       $00007388
00007390 3CBC 8F02                MOVE.W    #$8F02,(A6)
00007394 46FC 2500                MOVE      #$2500,SR
00007398 23FC 40200000 00C00004   MOVE.L    #$40200000,$00C00004
000073A2 41F9 000690D2            LEA       $000690D2,A0
000073A8 6100 EAE4                BSR       $00005E8E(pc)
000073AC 23FC 60000001 00C00004   MOVE.L    #$60000001,$00C00004
000073B6 41F9 00069948            LEA       $00069948,A0
000073BC 6100 EAD0                BSR       $00005E8E(pc)
000073C0 23FC 60000002 00C00004   MOVE.L    #$60000002,$00C00004
000073CA 41F9 00029EB8            LEA       $00029EB8,A0     /Ici, adresse de la fonte compressée
000073D0 6100 EABC                BSR       $00005E8E(pc)    / Et là, routine de décompression
000073D4 43F9 0006C53A            LEA       $0006C53A,A1
000073DA 203C 60000003            MOVE.L    #$60000003,D0
000073E0 7227                     MOVEQ     #$27,D1
000073E2 741B                     MOVEQ     #$1B,D2
000073E4 6100 EA84                BSR       $00005E6A(pc)
000073E8 43F9 0006CE9A            LEA       $0006CE9A,A1
000073EE 203C 40000003            MOVE.L    #$40000003,D0
000073F4 7227                     MOVEQ     #$27,D1
000073F6 741B                     MOVEQ     #$1B,D2
000073F8 6100 EA70                BSR       $00005E6A(pc)
000073FC 7001                     MOVEQ     #$01,D0
 
 
 

2eme
 
 

00007590 303C 0093                MOVE.W    #$0093,D0
00007594 6100 E874                BSR       $00005E0A(pc)
00007598 6100 EDB4                BSR       $0000634E(pc)
0000759C 46FC 2700                MOVE      #$2700,SR
000075A0 3038 F610                MOVE.W    $F610,D0
000075A4 0200 00BF                AND.B     #$BF,D0
000075A8 33C0 00C00004            MOVE.W    D0,$00C00004
000075AE 6100 E7B4                BSR       $00005D64(pc)
000075B2 46FC 2500                MOVE      #$2500,SR
000075B6 49F9 00FF0000            LEA       $00FF0000,A4
000075BC 41F9 00029EB8            LEA       $00029EB8,A0   /Encore la fonte compressée
000075C2 6100 E940                BSR       $00005F04(pc)   /routine de décompression, mais pas au même endroit qu'au dessus!
000075C6 6100 12EC                BSR       $000088B4(pc)
000075CA 4DF9 00C00004            LEA       $00C00004,A6
000075D0 3CBC 9300                MOVE.W    #$9300,(A6)
000075D4 3CBC 940C                MOVE.W    #$940C,(A6)
000075D8 3CBC 9500                MOVE.W    #$9500,(A6)
000075DC 3CBC 9680                MOVE.W    #$9680,(A6)
000075E0 3CBC 977F                MOVE.W    #$977F,(A6)
000075E4 3CBC 6000                MOVE.W    #$6000,(A6)
000075E8 31FC 0082 F644           MOVE.W    #$0082,$F644
000075EE 3CB8 F644                MOVE.W    $F644,(A6)
000075F2 23FC 40200000 00C00004   MOVE.L    #$40200000,$00C00004
000075FC 41F9 000AF82A            LEA       $000AF82A,A0
00007602 6100 E88A                BSR       $00005E8E(pc)
00007606 23FC 50000002 00C00004   MOVE.L    #$50000002,$00C00004
00007610 41F9 000B6E30            LEA       $000B6E30,A0
00007616 6100 E876                BSR       $00005E8E(pc)
0000761A 23FC 60000002 00C00004   MOVE.L    #$60000002,$00C00004
00007624 41F9 000B6C2C            LEA       $000B6C2C,A0
0000762A 6100 E862                BSR       $00005E8E(pc)
0000762E 43F9 000B7572            LEA       $000B7572,A1
00007634 203C 60000003            MOVE.L    #$60000003,D0
0000763A 7227                     MOVEQ     #$27,D1
0000763C 741B                     MOVEQ     #$1B,D2
0000763E 6100 E82A                BSR       $00005E6A(pc)
00007642 4DF8 E000                LEA       $E000,A6
00007646 7E00                     MOVEQ     #$00,D7
00007648 3C3C 03FE                MOVE.W    #$03FE,D6
0000764C 2CC7                     MOVE.L    D7,(A6)+
0000764E 51CE FFFC                DBRA      D6,$0000764C
00007652 7001                     MOVEQ     #$01,D0
00007654 6100 F502                BSR       $00006B58(pc)
00007658 41F8 FBE0                LEA       $FBE0,A0
0000765C 7000                     MOVEQ     #$00,D0
0000765E 7207                     MOVEQ     #$07,D1
00007660 20C0                     MOVE.L    D0,(A0)+
00007662 51C9 FFFC                DBRA      D1,$00007660
00007666 31C0 DE60                MOVE.W    D0,$DE60
0000766A 31FC 0168 F61A           MOVE.W    #$0168,$F61A
00007670 31FC 0001 FFF0           MOVE.W    #$0001,$FFF0
00007676 33FC 9011 00C00004       MOVE.W    #$9011,$00C00004
 

3eme
 

00008530 23FC 60000002 00C00004   MOVE.L    #$60000002,$00C00004
0000853A 41F9 00029EB8            LEA       $00029EB8,A0    /Fonte compressée...
00008540 6100 D94C                BSR       $00005E8E(pc)   /routine de décompression
00008544 23FC 70200003 00C00004   MOVE.L    #$70200003,$00C00004
0000854E 41F9 0007567A            LEA       $0007567A,A0
00008554 6100 D938                BSR       $00005E8E(pc)
00008558 43F9 00075BD8            LEA       $00075BD8,A1
0000855E 203C 66000003            MOVE.L    #$66000003,D0
00008564 7227                     MOVEQ     #$27,D1
00008566 740F                     MOVEQ     #$0F,D2
00008568 6100 D900                BSR       $00005E6A(pc)
0000856C 702F                     MOVEQ     #$2F,D0
0000856E 6100 E5E8                BSR       $00006B58(pc)
00008572 0C78 0103 CB00           CMP.W     #$0103,$CB00
00008578 661A                     BNE       $00008594
0000857A 31FC 0000 FB80           MOVE.W    #$0000,$FB80
00008580 43F9 000AE8A0            LEA       $000AE8A0,A1
00008586 203C 60000003            MOVE.L    #$60000003,D0
0000858C 7227                     MOVEQ     #$27,D1
0000858E 740D                     MOVEQ     #$0D,D2
 

4eme
 
 

000087AC 11FC 0095 D004           MOVE.B    #$95,$D004
000087B2 203C 40000000            MOVE.L    #$40000000,D0
000087B8 3E3C 05BF                MOVE.W    #$05BF,D7
000087BC 6100 E496                BSR       $00006C54(pc)
000087C0 6100 DAA6                BSR       $00006268(pc)
000087C4 46FC 2700                MOVE      #$2700,SR
000087C8 3038 F610                MOVE.W    $F610,D0
000087CC 0200 00BF                AND.B     #$BF,D0
000087D0 33C0 00C00004            MOVE.W    D0,$00C00004
000087D6 6100 D58C                BSR       $00005D64(pc)
000087DA 46FC 2500                MOVE      #$2500,SR
000087DE 49F9 00FF0000            LEA       $00FF0000,A4
000087E4 41F9 00029EB8            LEA       $00029EB8,A0   /Encore la fonte....
000087EA 6100 D718                BSR       $00005F04(pc)   /et là, la routine... mais pas la même! Pourquoi faire simple...
000087EE 6100 00C4                BSR       $000088B4(pc)
000087F2 4DF9 00C00004            LEA       $00C00004,A6
000087F8 3CBC 9300                MOVE.W    #$9300,(A6)
000087FC 3CBC 940C                MOVE.W    #$940C,(A6)
00008800 3CBC 9500                MOVE.W    #$9500,(A6)
00008804 3CBC 9680                MOVE.W    #$9680,(A6)
00008808 3CBC 977F                MOVE.W    #$977F,(A6)
0000880C 3CBC 6000                MOVE.W    #$6000,(A6)
00008810 31FC 0082 F644           MOVE.W    #$0082,$F644
00008816 3CB8 F644                MOVE.W    $F644,(A6)
 
 

5eme
 
 
 

000088E6 6100 D980                BSR       $00006268(pc)
000088EA 46FC 2700                MOVE      #$2700,SR
000088EE 3038 F610                MOVE.W    $F610,D0
000088F2 0200 00BF                AND.B     #$BF,D0
000088F6 33C0 00C00004            MOVE.W    D0,$00C00004
000088FC 6100 D466                BSR       $00005D64(pc)
00008900 4DF9 00C00004            LEA       $00C00004,A6
00008906 3CBC 8F01                MOVE.W    #$8F01,(A6)
0000890A 3CBC 93FF                MOVE.W    #$93FF,(A6)
0000890E 3CBC 943F                MOVE.W    #$943F,(A6)
00008912 3CBC 9780                MOVE.W    #$9780,(A6)
00008916 3CBC 4000                MOVE.W    #$4000,(A6)
0000891A 3CBC 0080                MOVE.W    #$0080,(A6)
0000891E 33FC 0000 00C00000       MOVE.W    #$0000,$00C00000
00008926 3E16                     MOVE.W    (A6),D7
00008928 0247 0002                AND.W     #$0002,D7
0000892C 66F8                     BNE       $00008926
0000892E 3CBC 8F02                MOVE.W    #$8F02,(A6)
00008932 23FC 60000002 00C00004   MOVE.L    #$60000002,$00C00004
0000893C 41F9 00029EB8            LEA       $00029EB8,A0   /Encore....
00008942 6100 D54A                BSR       $00005E8E(pc)   /je me repète...
00008946 4A78 F760                TST.W     $F760
0000894A 6604                     BNE       $00008950
0000894C 6100 00A0                BSR       $000089EE(pc)
00008950 4DF8 E000                LEA       $E000,A6
00008954 7E00                     MOVEQ     #$00,D7
00008956 3C3C 03FF                MOVE.W    #$03FF,D6
0000895A 2CC7                     MOVE.L    D7,(A6)+
0000895C 51CE FFFC                DBRA      D6,$0000895A
00008960 7001                     MOVEQ     #$01,D0
00008962 6100 E1F4                BSR       $00006B58(pc)
 

Tout d'abord, comment trouver l'endroit de cette routine? Simple : chargez la fonte décompressée (recuperée avec une savegarde memoire faire avec un emu), et allez juste au début avec l'éditeur hexa. Recuperez les premiers bits, si ils sont différents, et recherchez les dans la rom. Si il y en a plusieurs, modifiez-les l'un après l'autre, et regardez ce que ca donne. Si ca a changé la fonte (regardez avec genecyst, dans pattern viewer), alors vous avez le début de la fonte compressée. Ensuite, cherchez l'adresse du TOUT début de la fonte (en modifiant un peu avant) et après, cherchez cette adresse dans le code asm, ou une adresse pas loin... (par exemple, $00029EB au lieu de $00029EB8).

J'ai du modifier les adresses de chargement de la fonte, et la routine du dessous. Mais comment étaient faites les sous-routines?
Bah, voilà encore du code ;-)

sous partie 1

à  BSR   $00005E8E(pc)
(partie 1)

00005E8E 47F8 F7A0                LEA       $F7A0,A3
00005E92 7000                     MOVEQ     #$00,D0
00005E94 7400                     MOVEQ     #$00,D2
00005E96 1418                     MOVE.B    (A0)+,D2
00005E98 6700 003C                BEQ       $00005ED6(pc)
00005E9C 6B00 0064                BMI       $00005F02(pc)
00005EA0 5342                     SUBQ.W    #$1,D2
00005EA2 45F8 F7A0                LEA       $F7A0,A2
00005EA6 264A                     MOVE.L    A2,A3
00005EA8 1618                     MOVE.B    (A0)+,D3
00005EAA 1818                     MOVE.B    (A0)+,D4
00005EAC E14C                     LSL.W     #8,D4
00005EAE 1818                     MOVE.B    (A0)+,D4
00005EB0 E18C                     LSL.L     #8,D4
00005EB2 1818                     MOVE.B    (A0)+,D4
00005EB4 E18C                     LSL.L     #8,D4
00005EB6 1818                     MOVE.B    (A0)+,D4
00005EB8 8084                     OR.L      D4,D0
00005EBA 7E1F                     MOVEQ     #$1F,D7
00005EBC E38C                     LSL.L     #1,D4
00005EBE 6400 0004                BCC       $00005EC4(pc)
00005EC2 1483                     MOVE.B    D3,(A2)
00005EC4 524A                     ADDQ.W    #$1,A2
00005EC6 51CF FFF4                DBRA      D7,$00005EBC
00005ECA 51CA FFD6                DBRA      D2,$00005EA2
00005ECE 72FF                     MOVEQ     #$FF,D1
00005ED0 B181                     .L        D1,D0
00005ED2 6700 0012                BEQ       $00005EE6(pc)
00005ED6 7E1F                     MOVEQ     #$1F,D7
00005ED8 E388                     LSL.L     #1,D0
00005EDA 6500 0004                BCS       $00005EE0(pc)
00005EDE 1698                     MOVE.B    (A0)+,(A3)
00005EE0 524B                     ADDQ.W    #$1,A3
00005EE2 51CF FFF4                DBRA      D7,$00005ED8
00005EE6 4DF8 F7A0                LEA       $F7A0,A6
00005EEA 4BF9 00C00000            LEA       $00C00000,A5
00005EF0 2A9E                     MOVE.L    (A6)+,(A5)
00005EF2 2A9E                     MOVE.L    (A6)+,(A5)
00005EF4 2A9E                     MOVE.L    (A6)+,(A5)
00005EF6 2A9E                     MOVE.L    (A6)+,(A5)
00005EF8 2A9E                     MOVE.L    (A6)+,(A5)
00005EFA 2A9E                     MOVE.L    (A6)+,(A5)
00005EFC 2A9E                     MOVE.L    (A6)+,(A5)
00005EFE 2A9E                     MOVE.L    (A6)+,(A5)
00005F00 608C                     BRA       $00005E8E
00005F02 4E75                     RTS

A BSR    $00005F04
(Partie 2)

00005F04 47F8 F7A0                LEA       $F7A0,A3
00005F08 7000                     MOVEQ     #$00,D0
00005F0A 7400                     MOVEQ     #$00,D2
00005F0C 1418                     MOVE.B    (A0)+,D2
00005F0E 6700 003C                BEQ       $00005F4C(pc)
00005F12 6B00 005E                BMI       $00005F72(pc)
00005F16 5342                     SUBQ.W    #$1,D2
00005F18 45F8 F7A0                LEA       $F7A0,A2
00005F1C 264A                     MOVE.L    A2,A3
00005F1E 1618                     MOVE.B    (A0)+,D3
00005F20 1818                     MOVE.B    (A0)+,D4
00005F22 E14C                     LSL.W     #8,D4
00005F24 1818                     MOVE.B    (A0)+,D4
00005F26 E18C                     LSL.L     #8,D4
00005F28 1818                     MOVE.B    (A0)+,D4
00005F2A E18C                     LSL.L     #8,D4
00005F2C 1818                     MOVE.B    (A0)+,D4
00005F2E 8084                     OR.L      D4,D0
00005F30 7E1F                     MOVEQ     #$1F,D7
00005F32 E38C                     LSL.L     #1,D4
00005F34 6400 0004                BCC       $00005F3A(pc)
00005F38 1483                     MOVE.B    D3,(A2)
00005F3A 528A                     ADDQ.L    #$1,A2
00005F3C 51CF FFF4                DBRA      D7,$00005F32
00005F40 51CA FFD6                DBRA      D2,$00005F18
00005F44 72FF                     MOVEQ     #$FF,D1
00005F46 B181                     .L        D1,D0
00005F48 6700 0012                BEQ       $00005F5C(pc)
00005F4C 7E1F                     MOVEQ     #$1F,D7
00005F4E E388                     LSL.L     #1,D0
00005F50 6500 0004                BCS       $00005F56(pc)
00005F54 1698                     MOVE.B    (A0)+,(A3)
00005F56 528B                     ADDQ.L    #$1,A3
00005F58 51CF FFF4                DBRA      D7,$00005F4E
00005F5C 4DF8 F7A0                LEA       $F7A0,A6
00005F60 28DE                     MOVE.L    (A6)+,(A4)+
00005F62 28DE                     MOVE.L    (A6)+,(A4)+
00005F64 28DE                     MOVE.L    (A6)+,(A4)+
00005F66 28DE                     MOVE.L    (A6)+,(A4)+
00005F68 28DE                     MOVE.L    (A6)+,(A4)+
00005F6A 28DE                     MOVE.L    (A6)+,(A4)+
00005F6C 28DE                     MOVE.L    (A6)+,(A4)+
00005F6E 28DE                     MOVE.L    (A6)+,(A4)+
00005F70 6092                     BRA       $00005F04
00005F72 4E75                     RTS

Sous partie 3 (Idem partie 1)

Sous partie 4 (Idem partie 2)

Sous partie 4 (Idem partie 1)

Il y a aucun commentaire. Normal! C'est la routine de décompression, et si je l'avais décryptée, je n'aurais pas eu à tout refaire ;-) !

Maintenant, mes modifs! Attention, c'est de la merde! Alors pas de mails du genre "elle pue ta routine, pas optimisée". Et je me suis aidé d'une vieille source d'une ancienne démo. (METTRE LE NOM!)

A 73CA, j'ai mis un jmp BF6D0 qui permet de pointer là où j'ai mis ma routine.

Et là, elle commence....

000BF6D0 41F9 00029EB8            LEA       $00029EB8,A0
000BF6D6 6100 0008                BSR       $000BF6E0(pc)
000BF6DA 4EF9 000073D4            JMP       $000073D4
000BF6E0 4BF8 00C0                LEA       $00C0,A5

000BF6E4 0000 4DF8                OR.B      #$F8,D0|noppé
000BF6E8 000C 1E30                OR.B      #$30,A4|noppé
 

000BF6EC 201E                     MOVE.L    (A6)+,D0
000BF6EE 0C80 FF0000FF            CMP.L     #$FF0000FF,D0
000BF6F4 6700 0000                BEQ       $000BF6F6(pc) A changer!!!
000BF6F8 2080                     MOVE.L    D0,(A0)
000BF6FA 2A9E                     MOVE.L    (A6)+,(A5)
000BF6FC 2A9E                     MOVE.L    (A6)+,(A5)
000BF6FE 2A9E                     MOVE.L    (A6)+,(A5)
000BF700 2A9E                     MOVE.L    (A6)+,(A5)
000BF702 2A9E                     MOVE.L    (A6)+,(A5)
000BF704 2A9E                     MOVE.L    (A6)+,(A5)
000BF706 2A9E                     MOVE.L    (A6)+,(A5)
000BF708 60EE                     BRA       $000BF6F8 A changer!!! EC
000BF70A 4E75                     RTS
 

Bon, en gros, c'est ca...
J'ai perdu ma source originale, et la modif qui permet de charger cette routine à été faite que pour l'un des appels présentés ci-dessus.
Et puis ca me saoule d'aller désassembler cette rom pour vous la fournir, en substance, c'est la même qu'au dessus.
Une des raisons pour laquelle j'ai arreté le hacking de cette rom, outre le fait que je ne peux pas blairer ce jeu (qui est tout de même une bonne raison!) est qu'il était impossible d'utiliser les nouveaux caractères!
En effet, contrairement à la plupart des autres jeux, les lettres en hexa ne sont pas dans le meme ordre que celui vu dans la fonte, et quand on mettait le code hexa qui devait "normalement" correspondre à l'accent inséré, il y avait un Bô carré blanc!
En plus, pour rajouter les lettres avec accents, c'est mera qui s'en était occupé, car je n'arrivait pas à "voir" la fonte (j'ai bien dit "arrivait" !), car, outre le fait que cette rom soit chiante au niveau du code, elle l'est aussi au niveau du graphisme! Il n'existe qu'un seul editeur capable de visualiser la fonte : SV (de peekinsoft). (remarque: j'ai récupéré la fonte d'une sauvegarde d'un emu genesis!). Nana n'edite pas du tout les roms megadrive, c'est une grosse farce ce logiciel!
J'ai pas envie de vous expliquer le format genesis, il suffit de lire la doc de SV, il y est expliqué.

Pour finir, c'est pas demain la veille que je recommencerait à hacker une rom genesis! Il manque de bons logiciels, et pis j'ai jamais aimé cette console :-) !

C'est tout pour la partie Genesis!