Wie findet man ein RCJC/AnAc? (FAQ-Version 1.1)



RCJC - Reversed Complementary Joker Command


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