|
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
0000734C 46FC 2700
00007350 3038 F610
00007354 0200 00BF
00007358 33C0 00C00004
0000735E 6100 EA04
00007362 4DF9 00C00004
00007368 3CBC 8F01
0000736C 3CBC 93FF
00007370 3CBC 945F
00007374 3CBC 9780
00007378 3CBC 4000
0000737C 3CBC 0080
00007380 33FC 0000 00C00000
00007388 3E16
0000738A 0247 0002
0000738E 66F8
00007390 3CBC 8F02
00007394 46FC 2500
00007398 23FC 40200000 00C00004
000073A2 41F9 000690D2
000073A8 6100 EAE4
000073AC 23FC 60000001 00C00004
000073B6 41F9 00069948
000073BC 6100 EAD0
000073C0 23FC 60000002 00C00004
000073CA 41F9 00029EB8
000073D0 6100 EABC
000073D4 43F9 0006C53A
000073DA 203C 60000003
000073E0 7227
000073E2 741B
000073E4 6100 EA84
000073E8 43F9 0006CE9A
000073EE 203C 40000003
000073F4 7227
000073F6 741B
000073F8 6100 EA70
000073FC 7001 |
BSR______$00006268(pc)
MOVE____ #$2700,SR
MOVE.W__ $F610,D0
AND.B____#$BF,D0
MOVE.W__ D0,$00C00004
BSR______$00005D64(pc)
LEA______ $00C00004,A6
MOVE.W__ #$8F01,(A6)
MOVE.W__ #$93FF,(A6)
MOVE.W__ #$945F,(A6)
MOVE.W__ #$9780,(A6)
MOVE.W__ #$4000,(A6)
MOVE.W__ #$0080,(A6)
MOVE.W__ #$0000,$00C00000
MOVE.W __(A6),D7
AND.W___ #$0002,D7
BNE______$00007388
MOVE.W__ #$8F02,(A6)
MOVE____ #$2500,SR
MOVE.L___#$40200000,$00C00004
LEA______$000690D2,A0
BSR_____ $00005E8E(pc)
MOVE.L___#$60000001,$00C00004
LEA______$00069948,A0
BSR_____ $00005E8E(pc)
MOVE.____#$60000002,$00C00004
LEA______$00029EB8,A0
BSR_____ $00005E8E(pc)
LEA______$0006C53A,A1
MOVE.L___#$60000003,D0
MOVEQ___#$27,D1
MOVEQ___#$1B,D2
BSR_____ $00005E6A(pc)
LEA______$0006CE9A,A1
MOVE.L___#$40000003,D0
MOVEQ___#$27,D1
MOVEQ___#$1B,D2
BSR_____ $00005E6A(pc)
MOVEQ___#$01,D0 |
[01]
[02]
|
[01] Ici, adresse de la fonte compressée.
[02] Et là, routine de décompression.
|
Partie 2:
00007590 303C 0093
00007594 6100 E874
00007598 6100 EDB4
0000759C 46FC 2700
000075A0 3038 F610
000075A4 0200 00BF
000075A8 33C0 00C00004
000075AE 6100 E7B4
000075B2 46FC 2500
000075B6 49F9 00FF0000
000075BC 41F9 00029EB8
000075C2 6100 E940
000075C6 6100 12EC
000075CA 4DF9 00C00004
000075D0 3CBC 9300
000075D4 3CBC 940C
000075D8 3CBC 9500
000075DC 3CBC 9680
000075E0 3CBC 977F
000075E4 3CBC 6000
000075E8 31FC 0082 F644
000075EE 3CB8 F644
000075F2 23FC 40200000 00C00004
000075FC 41F9 000AF82A
00007602 6100 E88A
00007606 23FC 50000002 00C00004
00007610 41F9 000B6E30
00007616 6100 E876
0000761A 23FC 60000002 00C00004
00007624 41F9 000B6C2C
0000762A 6100 E862
0000762E 43F9 000B7572
00007634 203C 60000003
0000763A 7227
0000763C 741B
0000763E 6100 E82A
00007642 4DF8 E000
00007646 7E00
00007648 3C3C 03FE
0000764C 2CC7
0000764E 51CE FFFC
00007652 7001
00007654 6100 F502
00007658 41F8 FBE0
0000765C 7000
0000765E 7207
00007660 20C0
00007662 51C9 FFFC
00007666 31C0 DE60
0000766A 31FC 0168 F61A
00007670 31FC 0001 FFF0
00007676 33FC 9011 00C00004 |
MOVE.W__#$0093,D0
BSR_____ $00005E0A(pc)
BSR_ __ _ $0000634E(pc)
MOVE____#$2700,SR
MOVE.W_ _$F610,D0
AND.B_ __ #$BF,D0
MOVE.W_ _D0,$00C00004
BSR______$00005D64(pc)
MOVE____#$2500,SR
LEA______$00FF0000,A4
LEA______$00029EB8,A0
BSR______$00005F04(pc)
BSR______$000088B4(pc)
LEA______$00C00004,A6
MOVE.W__ #$9300,(A6)
MOVE.W__ #$940C,(A6)
MOVE.W__ #$9500,(A6)
MOVE.W__ #$9680,(A6)
MOVE.W__ #$977F,(A6)
MOVE.W__ #$6000,(A6)
MOVE.W__ #$0082,$F644
MOVE.W__ $F644,(A6)
MOVE.L_ _ #$40200000,$00C00004
LEA______$000AF82A,A0
BSR______$00005E8E(pc)
MOVE.L_ _ #$50000002,$00C00004
LEA______$000B6E30,A0
BSR______$00005E8E(pc)
MOVE.L __ #$60000002,$00C00004
LEA______$000B6C2C,A0
BSR______$00005E8E(pc)
LEA______$000B7572,A1
MOVE.____#$60000003,D0
MOVEQ___#$27,D1
MOVEQ___#$1B,D2
BSR______$00005E6A(pc)
LEA______$E000,A6
MOVEQ___#$00,D7
MOVE.W__ #$03FE,D6
MOVE.L___D7,(A6)+
DBRA_____D6,$0000764C
MOVEQ___#$01,D0
BSR______$00006B58(pc)
LEA______$FBE0,A0
MOVEQ___#$00,D0
MOVEQ___#$07,D1
MOVE.L___D0,(A0)+
DBRA_____D1,$00007660
MOVE.W__ D0,$DE60
MOVE.W__ #$0168,$F61A
MOVE.W__ #$0001,$FFF0
MOVE.W__ #$9011,$00C00004 |
[01]
[02]
|
[01] Encore la fonte compressée.
[02] Routine de décompression, mais pas au même
endroit qu'au dessus!
|
Partie 3:
00008530 23FC 60000002 00C00004
0000853A 41F9 00029EB8
00008540 6100 D94C
00008544 23FC 70200003 00C00004
0000854E 41F9 0007567A
00008554 6100 D938
00008558 43F9 00075BD8
0000855E 203C 66000003
00008564 7227
00008566 740F
00008568 6100 D900
0000856C 702F
0000856E 6100 E5E8
00008572 0C78 0103 CB00
00008578 661A
0000857A 31FC 0000 FB80
00008580 43F9 000AE8A0
00008586 203C 60000003
0000858C 7227
0000858E 740D |
MOVE.L __#$60000002,$00C00004
LEA______$00029EB8,A0
BSR_____ $00005E8E(pc)
MOVE.L __#$70200003,$00C00004
LEA______$0007567A,A0
BSR_____ $00005E8E(pc)
LEA______$00075BD8,A1
MOVE.L __#$66000003,D0
MOVEQ #$27,D1
MOVEQ #$0F,D2
BSR_____ $00005E6A(pc)
MOVEQ #$2F,D0
BSR_____ $00006B58(pc)
CMP.W __ #$0103,$CB00
BNE_____ $00008594
MOVE.W #$0000,$FB80
LEA______$000AE8A0,A1
MOVE.L __#$60000003,D0
MOVEQ #$27,D1
MOVEQ #$0D,D2 |
[01]
[02]
|
[01] Fonte compressée...
[02] Routine de décompression...
|
Partie 4:
000087AC 11FC 0095 D004
000087B2 203C 40000000
000087B8 3E3C 05BF
000087BC 6100 E496
000087C0 6100 DAA6
000087C4 46FC 2700
000087C8 3038 F610
000087CC 0200 00BF
000087D0 33C0 00C00004
000087D6 6100 D58C
000087DA 46FC 2500
000087DE 49F9 00FF0000
000087E4 41F9 00029EB8
000087EA 6100 D718
000087EE 6100 00C4
000087F2 4DF9 00C00004
000087F8 3CBC 9300
000087FC 3CBC 940C
00008800 3CBC 9500
00008804 3CBC 9680
00008808 3CBC 977F
0000880C 3CBC 6000
00008810 31FC 0082 F644
00008816 3CB8 F644 |
MOVE.B #$95,$D004
MOVE.L #$40000000,D0
MOVE.W #$05BF,D7
BSR $00006C54(pc)
BSR $00006268(pc)
MOVE #$2700,SR
MOVE.W $F610,D0
AND.B #$BF,D0
MOVE.W D0,$00C00004
BSR $00005D64(pc)
MOVE #$2500,SR
LEA $00FF0000,A4
LEA $00029EB8,A0
BSR $00005F04(pc)
BSR $000088B4(pc)
LEA $00C00004,A6
MOVE.W #$9300,(A6)
MOVE.W #$940C,(A6)
MOVE.W #$9500,(A6)
MOVE.W #$9680,(A6)
MOVE.W #$977F,(A6)
MOVE.W #$6000,(A6)
MOVE.W #$0082,$F644
MOVE.W $F644,(A6) |
[01]
[02]
|
[01] Encore la fonte...
[02] Et là, la routine... mais pas la même!
Pourquoi faire simple...
|
Partie 5:
000088E6 6100 D980
000088EA 46FC 2700
000088EE 3038 F610
000088F2 0200 00BF
000088F6 33C0 00C00004
000088FC 6100 D466
00008900 4DF9 00C00004
00008906 3CBC 8F01
0000890A 3CBC 93FF
0000890E 3CBC 943F
00008912 3CBC 9780
00008916 3CBC 4000
0000891A 3CBC 0080
0000891E 33FC 0000 00C00000
00008926 3E16
00008928 0247 0002
0000892C 66F8
0000892E 3CBC 8F02
00008932 23FC 60000002 00C00004
0000893C 41F9 00029EB8
00008942 6100 D54A
00008946 4A78 F760
0000894A 6604
0000894C 6100 00A0
00008950 4DF8 E000
00008954 7E00
00008956 3C3C 03FF
0000895A 2CC7
0000895C 51CE FFFC
00008960 7001
00008962 6100 E1F4 |
BSR
$00006268(pc)
MOVE #$2700,SR
MOVE.W $F610,D0
AND.B #$BF,D0
MOVE.W D0,$00C00004
BSR $00005D64(pc)
LEA $00C00004,A6
MOVE.W #$8F01,(A6)
MOVE.W #$93FF,(A6)
MOVE.W #$943F,(A6)
MOVE.W #$9780,(A6)
MOVE.W #$4000,(A6)
MOVE.W #$0080,(A6)
MOVE.W #$0000,$00C00000
MOVE.W (A6),D7
AND.W #$0002,D7
BNE $00008926
MOVE.W #$8F02,(A6)
MOVE.L #$60000002,$00C00004
LEA $00029EB8,A0
BSR $00005E8E(pc)
TST.W $F760
BNE $00008950
BSR $000089EE(pc)
LEA $E000,A6
MOVEQ #$00,D7
MOVE.W #$03FF,D6
MOVE.L D7,(A6)+
DBRA D6,$0000895A
MOVEQ #$01,D0
BSR $00006B58(pc) |
[01]
[02]
|
[01] Encore...
[02] Je me repète...
|
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
00005E92 7000
00005E94 7400
00005E96 1418
00005E98 6700 003C
00005E9C 6B00 0064
00005EA0 5342
00005EA2 45F8 F7A0
00005EA6 264A
00005EA8 1618
00005EAA 1818
00005EAC E14C
00005EAE 1818
00005EB0 E18C
00005EB2 1818
00005EB4 E18C
00005EB6 1818
00005EB8 8084
00005EBA 7E1F
00005EBC E38C
00005EBE 6400 0004
00005EC2 1483
00005EC4 524A
00005EC6 51CF FFF4
00005ECA 51CA FFD6
00005ECE 72FF
00005ED0 B181
00005ED2 6700 0012
00005ED6 7E1F
00005ED8 E388
00005EDA 6500 0004
00005EDE 1698
00005EE0 524B
00005EE2 51CF FFF4
00005EE6 4DF8 F7A0
00005EEA 4BF9 00C00000
00005EF0 2A9E
00005EF2 2A9E
00005EF4 2A9E
00005EF6 2A9E
00005EF8 2A9E
00005EFA 2A9E
00005EFC 2A9E
00005EFE 2A9E
00005F00 608C
00005F02 4E75 |
LEA
$F7A0,A3
MOVEQ #$00,D0
MOVEQ #$00,D2
MOVE.B (A0)+,D2
BEQ $00005ED6(pc)
BMI $00005F02(pc)
SUBQ.W #$1,D2
LEA $F7A0,A2
MOVE.L A2,A3
MOVE.B (A0)+,D3
MOVE.B (A0)+,D4
LSL.W #8,D4
MOVE.B (A0)+,D4
LSL.L #8,D4
MOVE.B (A0)+,D4
LSL.L #8,D4
MOVE.B (A0)+,D4
OR.L D4,D0
MOVEQ #$1F,D7
LSL.L #1,D4
BCC $00005EC4(pc)
MOVE.B D3,(A2)
ADDQ.W #$1,A2
DBRA D7,$00005EBC
DBRA D2,$00005EA2
MOVEQ #$FF,D1
.L D1,D0
BEQ $00005EE6(pc)
MOVEQ #$1F,D7
LSL.L #1,D0
BCS $00005EE0(pc)
MOVE.B (A0)+,(A3)
ADDQ.W #$1,A3
DBRA D7,$00005ED8
LEA $F7A0,A6
LEA $00C00000,A5
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
BRA $00005E8E
RTS |
A BSR $00005F04
(Partie 2)
00005F04 47F8 F7A0
00005F08 7000
00005F0A 7400
00005F0C 1418
00005F0E 6700 003C
00005F12 6B00 005E
00005F16 5342
00005F18 45F8 F7A0
00005F1C 264A
00005F1E 1618
00005F20 1818
00005F22 E14C
00005F24 1818
00005F26 E18C
00005F28 1818
00005F2A E18C
00005F2C 1818
00005F2E 8084
00005F30 7E1F
00005F32 E38C
00005F34 6400 0004
00005F38 1483
00005F3A 528A
00005F3C 51CF FFF4
00005F40 51CA FFD6
00005F44 72FF
00005F46 B181
00005F48 6700 0012
00005F4C 7E1F
00005F4E E388
00005F50 6500 0004
00005F54 1698
00005F56 528B
00005F58 51CF FFF4
00005F5C 4DF8 F7A0
00005F60 28DE
00005F62 28DE
00005F64 28DE
00005F66 28DE
00005F68 28DE
00005F6A 28DE
00005F6C 28DE
00005F6E 28DE
00005F70 6092
00005F72 4E75 |
LEA
$F7A0,A3
MOVEQ #$00,D0
MOVEQ #$00,D2
MOVE.B (A0)+,D2
BEQ $00005F4C(pc)
BMI $00005F72(pc)
SUBQ.W #$1,D2
LEA $F7A0,A2
MOVE.L A2,A3
MOVE.B (A0)+,D3
MOVE.B (A0)+,D4
LSL.W #8,D4
MOVE.B (A0)+,D4
LSL.L #8,D4
MOVE.B (A0)+,D4
LSL.L #8,D4
MOVE.B (A0)+,D4
OR.L D4,D0
MOVEQ #$1F,D7
LSL.L #1,D4
BCC $00005F3A(pc)
MOVE.B D3,(A2)
ADDQ.L #$1,A2
DBRA D7,$00005F32
DBRA D2,$00005F18
MOVEQ #$FF,D1
.L D1,D0
BEQ $00005F5C(pc)
MOVEQ #$1F,D7
LSL.L #1,D0
BCS $00005F56(pc)
MOVE.B (A0)+,(A3)
ADDQ.L #$1,A3
DBRA D7,$00005F4E
LEA $F7A0,A6
MOVE.L (A6)+,(A4)+
MOVE.L (A6)+,(A4)+
MOVE.L (A6)+,(A4)+
MOVE.L (A6)+,(A4)+
MOVE.L (A6)+,(A4)+
MOVE.L (A6)+,(A4)+
MOVE.L (A6)+,(A4)+
MOVE.L (A6)+,(A4)+
BRA $00005F04
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
000BF6D6 6100 0008
000BF6DA 4EF9 000073D4
000BF6E0 4BF8 00C0
000BF6E4 0000 4DF8
000BF6E8 000C 1E30
000BF6EC 201E
000BF6EE 0C80 FF0000FF
000BF6F4 6700 0000
000BF6F8 2080
000BF6FA 2A9E
000BF6FC 2A9E
000BF6FE 2A9E
000BF700 2A9E
000BF702 2A9E
000BF704 2A9E
000BF706 2A9E
000BF708 60EE
000BF70A 4E75 |
LEA
$00029EB8,A0
BSR $000BF6E0(pc)
JMP $000073D4
LEA $00C0,A5
OR.B #$F8,D0|noppé
OR.B #$30,A4|noppé
MOVE.L (A6)+,D0
CMP.L #$FF0000FF,D0
BEQ $000BF6F6(pc)
A changer!
MOVE.L D0,(A0)
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
MOVE.L (A6)+,(A5)
BRA $000BF6F8
A changer! EC
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!
|