Wie findet man ein RCJC/AnAc? (FAQ-Version 1.1)
RCJC - Reversed Complementary Joker Command
- Starte ein Spiel
u. wechsle in das Pause-Menü; öffne die
XLinkWIN-Trainer-Software
u. klicke auf Start, um den Speicher der PlayStation einzulesen.
- Versichere dich,
dass keine Taste auf dem Controller gedrückt wird u. klicke
anschließend
auf das Feld Wert. Hier gibst du die Zahl 65535 ein.
- Nachdem der
Dumping-Vorgang beendet ist, drückst du die L1-Taste auf dem
Controller
u. suchst nach dem bekannten Wert 64511.
- Danach drückst du die L2-Taste
u. suchst nach 65279.
- Bleibt nur noch eine Möglichkeit
übrig, hast du das RCJC schon gefunden
u. kannst direkt mit dem AnAc weitermachen.
- Wenn allerdings
noch mehrere Möglichkeiten existieren, gilt es, die "richtige"
RCJC-Adresse rauszusuchen.
Aktiviere dazu die mögl. Codes nacheinander; der richtige Code
ist daran zu erkennen, dass er den Controller
sozusagen blockiert - es ist nicht mehr möglich, per Tastendruck
eine Aktion im Spiel auszuführen.
[Alternativ kannst du auch die Bytekette im Memory Editor
überprüfen, siehe unten.]
- Zum Schluss musst du nur noch
die Code-Kennung ändern, indem du die "8"
durch eine "7"
ersetzt:
Bsp.: 80123456 ---> 70123456
AnAc - Analog Activator
Wenn du das RCJC bereits gefunden hast, ist der AnAc kein Problem
mehr.
Die passende Adresse befindet sich nämlich genau 2 Bytes davor u.
nimmt folgende Werte an:
4100 - Analog-Modus ist ausgeschaltet (Rote LED ist aus)
7300 - Analog-Modus ist eingeschaltet (Rote LED ist an)
(Danke für die Info, UL1 :-)
Im Memory Editor sieht das bei ausgeschaltetem Analog-Modus und
nicht betätigtem Controller so aus (beachte das Little-Endian-Format):
.. 00 41 FF FF ..
Natürlich kannst du auch direkt nach diesem String suchen,
aber manchmal kommen einfach zu viele Möglichkeiten in
Frage.
Nehmen wir ein praktisches Beispiel:
//-----
"Oddworld: Abe's Oddysee Deutsch SLES00839"
RCJC Pad 1
7008EB0A ????
RCJC Pad 2
7008EB4A ????
AnAc Pad 1
7008EB08 ????
AnAc Pad 2
7008EB48 ????
//-----
Zwar unterstützt dieses alte Spiel nicht den
Analog-Modus, aber dennoch lässt
sich der AnAc erstellen, denn JEDES PSX-Spiel hat sowohl RCJCs als
auch AnAcs.
Allerdings muss man hier mit Abstrichen rechnen. Ältere Titel
reagieren
zum Teil recht empfindlich, wenn der Analog-Modus eingeschaltet
wird.
Schlimmstenfalls friert das Spiel komplett ein. Meist reagiert der
Controller
nicht mehr auf Eingaben oder eine Fehlermeldung wird angezeigt.
So auch bei "Oddworld: Abe's Oddysee".
Folgende Meldung erscheint groß und fett auf dem
Bildschirm:
"Falscher oder Fehlerhafter Controller in Port 1"
Glücklicherweise läuft alles wieder reibungslos, sobald
man den Analog-Modus ausschaltet.
Vermutung: Das Spiel liest den Inhalt der AnAc-Adresse(n) ein; sobald
ein unerwarteter Wert auftritt, wird die obige Fehlermeldung ausgegeben.
Solche Entscheidungen trifft der Prozessor der PlayStation mit sog. BRANCH
Befehlen.
Diese Art der Anweisung ist nix weiter als eine Einseitige Auswahl:
Falls Bedingung erfüllt,
dann verzweige
(sonst mache nix)
Allerdings kann man die BRANCH Bedingung sehr leicht seinen eigenen
Wünschen "anpassen",
vorrausgesetzt man findet den relevanten Befehl im Speicher.
Dazu verwenden wir den Breakpoint Editor von XLinkWIN.
Wir setzen einen BREAK ON READ (Lesezugriff) auf die AnAc-Adresse ($8008EB08);
wenn der Breakpoint anspricht, JUMP RA.
Der Disassembler öffnet sich nun bei $8004D7A8.
Schauen wir uns die unmittelbare Umgebung an:
8004d7a0: 0c019d57 W... jal 0x8006755c
8004d7a4: 02602021 ! `. addu $a0,$s3,$zero
8004d7a8: 00021400 .... sll $v0,$v0,0x10 ; Breakpoint
8004d7ac: 10400008 ..@. beqz $v0,0x8004d7d0 ; NOP -> nix passiert
8004d7b0: 00000000 .... nop
8004d7b4: 3c058008 ...< lh $a1,[0x8008226c]
8004d7bc: 0c019d69 i... jal 0x800675a4
8004d7c0: 02602021 ! `. addu $a0,$s3,$zero
8004d7c4: 00021400 .... sll $v0,$v0,0x10
8004d7c8: 1440000c ..@. bnez $v0,0x8004d7fc ; NOP -> Fehlermeldung wird angezeigt
8004d7cc: 00000000 .... nop
8004d7d0: 3c028008 ...< lh $v0,[0x8008225a]
8004d7d8: 00000000 .... nop
8004d7dc: 14400007 ..@. bnez $v0,0x8004d7fc ; NOP -> nix passiert
8004d7e0: 00000000 .... nop
8004d7e4: 3c028009 ...< lhu $v0,[0x8008acb8]
8004d7ec: 00000000 .... nop
8004d7f0: 10400002 ..@. beqz $v0,0x8004d7fc ; NOP -> nix passiert
8004d7f4: 00000000 .... nop
Zuerst noppen wir nacheinander verdächtige BRANCH Befehle und
schauen, was passiert.
Bereits der zweite NOP scheint vielversprechend zu sein, denn die
nervige Fehlermeldung wird erzwungen.
Schauen wir uns den Befehl genauer an:
8004d7c8: 1440000c ..@. bnez $v0,0x8004d7fc
BNEZ = Branch on Not Equal to Zero = Verzweige, wenn <> 0
Es wird also nur verzweigt, falls der Inhalt des Registers $v0
ungleich von 0,
der Analog-Modus also ausgeschaltet ist. Logischerweise nimmt der
Wert genau
dann 0 an, wenn der Analog-Modus eingeschaltet wird.
An dieser Stelle manipulieren wir aber einfach die bereits erwähnte BRANCH
Bedingung so,
dass immer verzweigt wird, egal ob der Analog-Modus nun an oder aus
ist.
Der bedingungslose BRANCH sieht so aus:
8004d7c8: 1000000c .... b 0x8004d7fc
Als fertiger XploderCode:
Keine Fehlermeldung bei aktiviertem Analog-Modus
$8004D7CA 1000
Voilá! Der AnAc ist nun ohne Probleme verwendbar.
Auf ähnliche Weise kann man sicherlich auch bei anderen
Spielen die Analog-Abfrage umgehen.
Dieses FAQ wurde geschrieben von misfire