Wie macht man einen "Durch Wände Fahren" Code?

Um einen solchen Code zu erstellen, mußt du mit dem Breakpoint Editor und Disassembler vertraut sein.
Im Prinzip geht es darum: irgend eine Routine im Programm prüft, ob du dich an einer erlaubten
Position im Spielfeld aufhältst oder nicht.

Als erstes sucht man mit dem XLINK Trainer den "Koordinaten-Modifizierer".
- starte eine Suche
- ändere deine Position, suche UNGLEICH
- während du still stehst, benutze die Kameratasten, suche GLEICH
- wiederhole die letzten beiden Schritte, bis eine übersichtliche Anzahl Adressen übrigbleibt.

Nehmen wir als praktisches Beispiel "Autobahn Raser II Deutsch", erhalten wir den
Koordinaten-Modifizierer: $800D50E8
Diesen tragen wir im Breakpoint Editor ein und machen einen BREAK ON READ/WRITE, JUMP RA.
Der Disassembler wird nun bei $800478C8 geöffnet.
Schauen wir uns die Umgebung an:
80047850: 03e00008 .... jr $ra
80047854: 24020001 ...$ addiu $v0,$zero,0x0001 ; Ende vorige Routine

80047858: 27bdffb0 ...' addiu $sp,$sp,0xffffffb0 ; Start Routine
8004785c: afbf0028 (... sw $ra,0x0028($sp)
80047860: afb10024 $... sw $s1,0x0024($sp)
80047864: afb00020  ... sw $s0,0x0020($sp)
80047868: 3c011f80 ...< lw $s1,[0x1f800010]
80047870: 00000000 .... nop ; -> break on execute
80047874: 8e220060 `.". lw $v0,0x0060($s1)
80047878: 00000000 .... nop 
8004787c: afa20034 4... sw $v0,0x0034($sp)
80047880: 8e220068 h.". lw $v0,0x0068($s1)
80047884: 00000000 .... nop 
80047888: afa20038 8... sw $v0,0x0038($sp)
8004788c: 8e30005c \.0. lw $s0,0x005c($s1)
80047890: 00000000 .... nop 
80047894: 8e020018 .... lw $v0,0x0018($s0)
80047898: 00000000 .... nop 
8004789c: afa2003c <... sw $v0,0x003c($sp)
800478a0: 8e02000c .... lw $v0,0x000c($s0)
800478a4: 00000000 .... nop 
800478a8: afa20040 @... sw $v0,0x0040($sp)
800478ac: 8e040044 D... lw $a0,0x0044($s0)
800478b0: 0c009d9b .... jal 0x8002766c     ; NOP -> nix passiert
800478b4: 00000000 .... nop 
800478b8: afa20048 H... sw $v0,0x0048($sp)
800478bc: 8e040014 .... lw $a0,0x0014($s0)
800478c0: 0c009d9b .... jal 0x8002766c     ; NOP -> nix passiert
800478c4: 00000000 .... nop 
800478c8: afa20044 D... sw $v0,0x0044($sp) ; Breakpoint
In dieser Routine sind zwei JAL Befehle, die eine unbekannte Routine ausführen.
Ein Ausschalten durch einen NOP bringt keinen sichtbaren Erfolg.
Gehen wir zum Anfang der Routine -> $80047858
und wieder ein Stück vorwärts zum ersten NOP -> $80047870.
Bei einem NOP kann man absturzfrei einen BREAK ON EXECUTE, JUMP RA ausführen.
Das machen wir und gelangen zu $8002B5BC.

Schauen wir uns wieder die Umgebung an:
...
8002b53c: 00000000 .... nop 
8002b540: 0c00a468 h... jal 0x800291a0 ; NOP -> Durch Wände Fahren
8002b544: 00000000 .... nop 
8002b548: af8282fc .... sw $v0,0xffff82fc($gp)
8002b54c: 3c011f80 ...< lw $v0,[0x1f800004]
8002b554: 1000003e >... b 0x8002b650
8002b558: 2052ffff ..R  addi $s2,$v0,0xffffffff
8002b55c: 3c011f80 ...< lw $v0,[0x1f80001c]
8002b564: 00000000 .... nop 
8002b568: 8c420000 ..B. lw $v0,0x0000($v0)
8002b56c: 10000019 .... b 0x8002b5d4
8002b570: ac220010 ..". sw $v0,0x0010($at)
8002b574: 8c620028 (.b. lw $v0,0x0028($v1)
8002b578: 00000000 .... nop 
8002b57c: 1040000f ..@. beqz $v0,0x8002b5bc
8002b580: 00000000 .... nop 
8002b584: 94620010 ..b. lhu $v0,0x0010($v1)
8002b588: 00000000 .... nop 
8002b58c: 30420008 ..B0 andi $v0,$v0,8      ; OR $v0,$v0,8 ->
8002b590: 1440000a ..@. bnez $v0,0x8002b5bc ; $v0=8, 8<>0, also springe
8002b594: 00000000 .... nop 
8002b598: 84620034 4.b. lh $v0,0x0034($v1)
8002b59c: 3c011f80 ...< sw $v0,[0x1f8000bc]
8002b5a4: 8c220010 ..". lw $v0,0x0010($at)
8002b5a8: 00000000 .... nop 
8002b5ac: 8c420028 (.B. lw $v0,0x0028($v0)
8002b5b0: 00000000 .... nop 
8002b5b4: 0040f809 ..@. jalr $v0 ; NOP -> Durch Laternen & Poller Fahren
8002b5b8: 00000000 .... nop 
8002b5bc: 3c011f80 ...< lw $v0,[0x1f800010] ; Breakpoint
Durch rein spekulatives Löschen der JUMP und BRANCH Befehle mit der NOP Funktion im Disassembler erhält man nun
die erwünschten Codes.
An Stelle eines NOP habe ich beim "Laternen & Poller Fahren" Code einen AND in einen OR Befehl verwandelt.
Beim "Durch Wände Fahren" Code habe ich den Ersatz-NOP "LI ZERO..." gewählt.

Dies ergibt die folgenden Xploder Codes:

"Autobahn Raser II"
*Deutsch SLES02341
**Durch Laternen & Poller Fahren
*An
(Druecke Select & Links)
$700E12DE FF7E
$8002B58E 3442
*Aus
(Druecke Select & Rechts)
$700E12DE FFDE
$8002B58E 3042
**Durch Waende Fahren
*An
(Druecke Select & Oben)
$700E12DE FFEE
$8002B542 3400
*Aus
(Druecke Select & Unten)
$700E12DE FFBE
$8002B542 0C00


Bei diesem Spiel fand ich den Code recht schnell. Leider ist das nicht immer so.
Meist muß man die BREAK ON EXECUTE, JUMP RA Prozedur so lange wiederholen,
bis man zu einem JAL gelangt, der dich unbeweglich macht.
Dann geht man wieder zurück zur Routine, auf die der JAL verweist und klappert dort alle JUMP und BRANCH Befehle ab.

Dieses FAQ wurde geschrieben von Nachbrenner