Dienstag, 8. November 2016

Wie man Gateway Cheat Codes erstellt

Gateway Cheats scheinen wie Magie.
Wie kann eine scheinbar zufällige Zahl von Zahlen uns unendliche Leben in Super Mario 3D Land geben oder uns unbesiegbar machen?
Es ist einfach.
Sie greifen auf unsere Maschinen RAM, die unsere Spielinformationen hält und manipulieren Bytes zu tun, was wir wollen.
Sie können als eine sehr rudimentäre Form der Programmiersprache angesehen werden, aber eine, die mächtig ist.

In diesem "schnellen" Leitfaden werde ich erklären, die verschiedenen Code-Typen, die in der Gateway-Cheat-Engine implementiert sind, was die Codes tun und wie wir sie konstruieren.
Um die Codes und verhindern jegliche Missverständnisse zu verstehen, müssen wir die Terminologie zunächst zu definieren, so dass hier eine Liste von Wörtern, die ich im Laufe des Tutorials verwenden werden.
Ich werde auch alternative Terminologie hin, die in anderen Bereichen der Informatik verwendet werden könnten, sondern wegen dieses Tutorials wir mit der Terminologie zu bleiben werden, die fett markiert ist.

Beachten Sie, dass wir bei der Erstellung von Codes (Basis 16) viel mit hexadezimalen Zahlen umgehen werden.
Da wir hauptsächlich das Dezimalsystem in unserem täglichen Leben verwenden, müssen wir oft zwischen Dezimalzahlen und Hexadezimalzahlen (oder umgekehrt) rechnen.
Immer wenn ich eine Hexadezimalzahl verwende, wird es durch eine führende '0x' bezeichnet. Dies wird uns helfen, nicht hexadezimalen Werten zu verwechseln, wie Dezimalzahlen aussehen (wie zum Beispiel 0x10) mit ihren dezimal sibbling (10).
Also, wenn Sie eine reguläre Zahl wie '10' sehen, wird das dezimal. Wenn es 0x10 ist, ist es hexadezimal (0x10 = 16, fyi). 0b wird zur Bezeichnung von binären Zahlen verwendet (nur in den 16-Bit-Bedingungscodes verwendet).


Code: Ein Code besteht aus verschiedenen Parametern.
Parameter sind 'Codetyp', 'Adresse', 'Wert', 'Offset' 'Maske' und 'Datenregister'.
Ein Code wird in zwei 8-stellige Strings aufgeteilt, die durch ein Leerzeichen getrennt sind.

Code-Typ: Bestimmt, was der Code tut. Die erste Ziffer eines Code bestimmt den Codetyp, beachten Sie, dass einige Code-Typen (wie die D-Codes) weiter aufgeteilt in sekundäre Codetypen sein kann, die von der zweiten Stelle des Codes bestimmt wird. Gateway unterstützt 28 verschiedene Codetypen, 27 davon Gateway dokumentiert.

Adresse: Der Spielspeicher wird in Bytes ausgegeben, wobei jedes Byte durch eine einzelne Adresse dargestellt wird und eine spezielle Aufgabe innerhalb des Spielspeichers ausführt. Wir können genau festlegen, welches Byte wir manipulieren wollen, indem wir der Gateway 3ds-Cheat-Engine die genaue Adresse des Bytes mitteilen.
Ich gemeinsame Computer-Terminologie eine Adresse oft als "Offset" genannt wird, aber wir werden diesen Begriff für etwas brauchen sonst so werden wir Adressen streng unter dem Namen "Adresse" aufrufen.

Wert: Dies ist der Wert eines bestimmten Bytes im Spiele-Speicher. Zum Beispiel hat die Adresse, die Ihren Lebenslauf in Super Mario 3D Land hält, einen Wert, der dieser Zahl entspricht.
Oft als "Daten" bezeichnet. Um Verwechslungen mit dem "Datenregister" zu vermeiden, wird nur der Begriff "Wert" verwendet.


Offset: Da die erste Ziffer einer Codelinie immer reserviert ist, können wir - je nach Codetyp - keine 8-stellige Adresse in einen Code eingeben.
Wenn die Adresse, die wir wollen mehr als 7 Ziffern ist, müssen wir den Offset auf einen Wert zu setzen, die, wenn sie auf die Adresse Paramter hinzugefügt, summiert sich auf unsere richtige 8-stellige Adresse, die wir bearbeiten möchten.

Maske: Wird nur in 16-Bit-Bedingungsanweisungen verwendet. Es erlaubt uns, einzelne Bits im Zustand zu "maskieren" - vergleichbar mit Wildcards.
Dies wird am 16-Bit-Bedingungsabschnitt klar erläutert.

Datenregister: ein bestimmtes Register, das einen Wert halten und diesem Wert hinzufügen kann. Standardmäßig ist er 0x0, aber wir können ihn auf jeden beliebigen Wert setzen oder einen Wert von einer beliebigen Adresse laden.
Bestimmte Codetypen werden verwendet, um einen Wert aus einer Adresse zu laden oder den Wert innerhalb des Datenregisters auf eine Adresse zu schreiben.

So ohne weiteres, hier sind die Codetypen:
Speicher-Schreibvorgänge:
Parameter: Adresse (XXXXXXX), Wert (JJ, JJJJ, JJJJ JJJJ)
Um eine Adresse höher als 0xFFFFFFF zu schreiben, müssen Sie einen Offset mit Code Type 0xD3 setzen. Der Offset wird dem Adressparameter hinzugefügt, um die endgültige Adresse zu bestimmen, die wir manipulieren möchten. Weitere Hinweise finden Sie im Code-Typ 0xD3.

Die Speicher-Schreibcodes werden in drei Codetypen aufgeteilt. Welcher Codetyp verwendet wird, hängt vom Wert ab, den Sie schreiben möchten. Ein Byte kann 256 Werte halten, zwei Bytes können 256² Werte halten, vier Bytes können 256 ^ 4 Werte enthalten, einschließlich 0. Somit kann der Maximalwert, den ein Schreibbefehl schreiben kann, folgendermaßen aussehen:

8-Bit: 255
16-Bit: 65,535
32-Bit: 4.294.967.295
Wenn das Spiel einen Wert als 8-Bit speichert, kann ein 16-Bit- oder 32-Bit-Schreibzugriff auf die Adresse das Spiel brechen oder andere Werte des Spiels manipulieren, die wir nicht ändern möchten. Als Beispiel, "Legend of Zelda: Tri Force Heroes" speichert die Menge der Elemente, die wir in 70 aufeinander folgenden Bytes, so dass ein 16-Bit-Schreiben an eine solche Adresse wird auch ändern, das Element neben dem, den wir ändern wollten . Seien Sie also vorsichtig, nur so wenig wie nötig zu manipulieren, aber so viel wie nötig.

0XXXXXXX YYYYYYYY - 32bit schreiben Sie an [XXXXXXX + offset]
Schreibt den von uns angegebenen 32-Bit-Wert an die angegebene Adresse. Dies manipuliert vier Byte ab der angegebenen Adresse. Zwei 16-Bit-Schreibvorgänge können mit dem gleichen Ergebnis verwendet werden, die Endlichkeit muss berücksichtigt werden. Siehe Hinweis am Ende des Tutorials über Endianness.

1XXXXXXX 0000YYYY - 16bit schreiben Sie an [XXXXXXX + Offset]
Schreibt den von uns angegebenen 16-Bit-Wert an die angegebene Adresse. Dies manipuliert zwei Byte ab der angegebenen Adresse. Zwei 16-Bit-Schreibvorgänge können einen 32-Bit-Schreibvorgang ersetzen, wobei jedoch Endianness zu berücksichtigen ist. Siehe Hinweis am Ende des Tutorials über Endianness.

2XXXXXXX 000000YY - 8bit schreiben Sie an [XXXXXXX + Offset]
Schreibt den 8-Bit-Wert, den wir angeben, an die angegebene Adresse. Dies manipuliert ein einzelnes Byte. Zwei 8-Bit-Schreibvorgänge können einen 16-Bit-Schreibvorgang ersetzen, wobei jedoch Endianness zu berücksichtigen ist. Siehe Hinweis am Ende des Tutorials über Endianness.

Beispiele:
Warnung: Spoiler im Inneren! Verstecken
03BA110C 01CD5F99 - schreibt den Wert 0x1CD5F99 (30.236.569) an die Adresse 0x3BA110C. Manipuliert die Bytes an den Adressen 0x3BA110C, 0x3BA110D, 0x3BA110E und 0x3BA110F.

13BA110C 00005F99 - schreibt den Wert 0x5F99 (24.473) an die Adresse 0x3BA110C. Manipuliert die Bytes an den Adressen 0x3BA110C und 0x3BA110D.

23BA110C 00000099 - schreibt den Wert 0x99 (153) an die Adresse 0x3BA110C. Manipuliert nur das Byte an Adressen 0x3BA110C.

Bedingte 32-Bit-Codes:
Parameter: Adresse (XXXXXXX), Wert (JJJJJJJ)

Durch bedingte Codes können wir den Wert einer Adresse mit dem Wert vergleichen, den wir als Parameter bereitstellen. Wenn die Bedingung wahr ist, wird die Ausführung an der nächsten Codezeile fortgesetzt. Bei false springt die Ausführung zum nächsten Abschlußcode (Codetyp 0xD0 und 0xD2) und von dort weiter. Bedingungen können verschachtelt werden. Der Code manipuliert den Spielspeicher nicht, er muss von einem Code gefolgt werden, der die Manipulation ausführt (beispielsweise ein 32-Bit-Schreiben).


3XXXXXXX YYYYYYYY - Weniger als (JJJJJJJY <[XXXXXXX + Offset])
Wenn der Wert an der angegebenen Adresse kleiner als der von uns angegebene Wert ist, fahren Sie mit dem Befehl fort.

4XXXXXXX YYYYYYYY - Größer als (JJJJJJJY> [XXXXXXX + Offset])
Wenn der Wert an der angegebenen Adresse größer ist als der von uns angegebene Wert, fahren Sie mit dem Befehl fort.

5XXXXXXX YYYYYYYY - Gleich (JJJJJJJJ == [XXXXXXX + Offset])
Wenn der Wert an der angegebenen Adresse gleich dem von uns bereitgestellten Wert ist, fahren Sie mit dem Befehl fort.

6XXXXXXX YYYYYYYY - nicht gleich (JJJJJJJJ! = [XXXXXXX + Offset])
Wenn der Wert an der angegebenen Adresse nicht dem von uns bereitgestellten Wert entspricht, fahren Sie mit dem Befehl fort.

Beispiele:
33BA110C 00000063 - wenn der Wert bei Adresse 0x3BA110C kleiner als 0x63 (99) ist, nächste Zeile ausführen.
03BA110C 01CD5F99 - setzt den Wert an Adresse 0x03BA110C auf 30.236.569
D0000000 00000000 - beendet die if-Anweisung und setzt den Code exection ohne Bedingung fort.

63BA110C 00000063 - Wenn der Wert bei Adresse 0x3BA110C nichts anderes als 0x63 (99) ist, führen Sie die nächste Zeile aus.
03BA110C 01CD5F99 - setzt den Wert an Adresse 0x03BA110C auf 30.236.569
D0000000 00000000 - beendet die if-Anweisung und setzt den Code exection ohne Bedingung fort.

Bedingte 16-Bit-Deref + Write-Codes:
Parameter: Adresse (XXXXXXX), Wert (YYYY), Maske (ZZZZ)
Obwohl Gateway sie Schreibcodes aufruft, schreibt das Data-Trainer-Toolkit-Handbuch für den AR DS und meine Testversionen nicht an den Speicherort. Es muss ein Code folgen, der die Manipulation durchführt (zB ein 16-Bit-Schreiben). Der Maskenparameter erlaubt es uns, bestimmte Bits des 16-Bit-Werts für die Bedingung auszublenden. Wenn die Maske auf 0x0000 gesetzt ist, verhält sich der Code genau wie die bedingten 32-Bit-Codes (Code-Typen 0x03-0x06).

- Zazzle-Artikel promoten oder Designs ganz GRATIS verkaufen ZZZZYYYY - Weniger als
Wenn der maskierte Wert an der angegebenen Adresse kleiner als der von uns bereitgestellte maskierte Wert ist, fahren Sie mit dem Befehl fort.

- Zazzle-Artikel promoten oder Designs ganz GRATIS verkaufen ZZZZYYYY größer als
Wenn der maskierte Wert an der angegebenen Adresse größer als der von uns bereitgestellte maskierte Wert ist, fahren Sie mit dem Befehl fort.

9XXXXXXX ZZZZYYYY - Gleichgestellt
Wenn der maskierte Wert an der angegebenen Adresse gleich dem von uns bereitgestellten maskierten Wert ist, fahren Sie mit dem Befehl fort.

AXXXXXXX ZZZZYYYY - nicht gleich
Wenn der maskierte Wert an der angegebenen Adresse nicht gleich dem von uns bereitgestellten maskierten Wert ist, fahren Sie mit dem Befehl fort.

Verstehen von Masken ist ein bisschen schwierig und aus der Spitze von meinem Kopf kann ich nicht wirklich an einen vernünftigen praktischen Gebrauch eines maskierten bedingten denken, aber ich werde mein Bestes versuchen, sie zu erklären. Wenn Sie denken, dass Sie eine klarere Erklärung der Masken zur Verfügung stellen können, fühlen Sie sich frei, sie zu posten, ich kann es hier einfügen, wenn Sie mögen.

Masken arbeiten auf einer binären / bit Ebene. Eine Maske von 0x0000 übersetzt in 0b00000000 00000000 (Platz für eine bessere Lesbarkeit hinzugefügt), 0xFFFF wird zu 0b11111111 11111111 übersetzen. Jedes Bit, das auf 1 gesetzt ist, wird ignoriert, wenn man den Wert an der Adresse vergleicht, die mit dem Wert versehen ist, den wir in dem Code übergeben.

Sagen wir, wenn unser Charakter einen regulären Sprung macht, wird der Wert an der Adresse 0x03BA110C auf 0x25 geändert, aber wenn wir einen Sprung laufen, wechselt er auf 0x15. Die Adresse 0x03BA110E bestimmt die Schwerkraft und wir wollen sie bei jedem Sprung null setzen, unabhängig davon, ob wir einen Sprung oder einen Sprung laufen. Ein Code 93BA110C 00000005 (Maske = 0x0000) wäre nur für einen regulären Sprung, nicht für einen laufenden Sprung gültig. Das ist, warum wir alle mögliche Spitzen heraus maskieren möchten, die wir für irrelevant für unseren Zustand betrachten. Dazu müssen wir 0x25 und 0x15 in Binär zuerst übersetzen:

0b00000000 00100101 = 0 x 25
0b00000000 00010101 = 0 x 15

Wollen wir, dass die Bedingung wahr ist, wann immer der Wert mit 0x5 endet, so dass wir dies in binär übersetzen:

0b00000000 00000101 = 0x5

Wir maskieren alle Bits, die wir nicht mit einer 0b1 kümmern und wandeln sie in Hexadezimal

0b11111111 11111000 = 0xFFF8

Diese Maske nimmt nur die letzten 3 Bits des Wertes und vergleicht sie mit den letzten drei Bytes unseres Wertes, den wir im Code übergeben. Wenn also in unserem Beispiel die letzten drei Binärziffern unseres Werts 0b101 (0x5) entsprechen, gilt die Bedingung true und wir setzen die nächste Codezeile fort. Wenn es falsch ist, springen wir zum nächsten 0xD0- oder 0xD2-Code.

Beispiele:
93BA110C 00000005 - wenn der Wert an Adresse 0x03BA110C genau 0x5 ist, führen Sie die nächste Zeile aus. True nur für 0x5
13BA110E 00000001 - setzt den Wert an Adresse 0x03BA110E auf 1
D0000000 00000000 - beendet die if-Anweisung und setzt den Code exection ohne Bedingung fort.


93BA110C FFF80005 - wenn der maskierte Wert bei Adresse 0x03BA110C 0x5 ist, führen Sie die nächste Zeile aus. True für 0x5, 0x15, 0x25 etc. (aber auch 0xD, 0x1D, 0x2D usw.)
13BA110E 00000001 - setzt den Wert an Adresse 0x03BA110E auf 1
D0000000 00000000 - beendet die if-Anweisung und setzt den Code exection ohne Bedingung fort.

Offset-Codes:

Da für eine Vielzahl von Codes nur eine 7-stellige Adresse analysiert werden kann, müssen wir oft einen Offset zu diesem Adressparameter hinzufügen, um die endgültige Adresse zu bestimmen. Wir haben ein paar Arten von Codes Umgang mit Offsets. Die Regel ist immer: Adressparameter + Offset = Zieladresse.

D3000000 XXXXXXXX - Offset auf sofortigen Wert setzen
Parameter: Offset (XXXXXXXX)

Dadurch wird der Offset auf einen unmittelbaren Wert gesetzt, den wir im Code übergeben. Dieser Wert wird jedem Adreßparameter in allen anderen Codetypen hinzugefügt, um zu der Zieladresse zu führen, so daß auf Adressen mit 8 Stellen geschrieben werden muß, daß ein Offset gesetzt werden muß. Es ist auch üblich, den Offset auf die Zieladresse zu setzen und mit dem Adressparameter 0x0000000 in allen anderen Codes zu arbeiten. Diese Methode, meiner Meinung nach, hat ein paar Vorteile, so dass in meinen Codes werden Sie in der Regel sehen mich erklären einen Offset jedes Mal, auch wenn es nicht notwendig wäre.

Beispiele:
Warnung: Spoiler im Inneren! Verstecken
D3000000 10000000 - setzt den Offset auf 0x10000000
23BA110E 00000063 - schreibt einen 8-Bit-Wert von 0x63 (99) an die Adresse 0x13BA110E (0x10000000 + 0x3BA110E = 0x13BA110E)

Der gleiche Code kann auch so geschrieben werden:

D3000000 13BA110E - setzt den Offset auf 0x13BA110E
20000000 00000063 - schreibt einen 8-Bit-Wert von 0x63 (99) an die Adresse 0x13BA110E (0x13BA110E + 0x00000000 = 0x13BA110E)

Wie Sie sehen können, können Sie damit die Adresse klarer sehen als die erste Methode. Welche Methode Sie bevorzugen, ist bis zu Ihnen, beide Methoden sind korrekt und gültig.

DC000000 XXXXXXXX - Fügt dem aktuellen Offset einen Wert hinzu
Parameter: Wert (XXXXXXXX)

Mit diesem Codetyp können Sie den Offset um den von Ihnen angegebenen Hexadezimalwert erhöhen. Dies ist besonders nützlich in Kombination mit dem Loop-Code (siehe Code-Typ 0xC0) zu manipulieren eine Menge von Adressen in einem sich wiederholenden Muster mit nur ein paar Zeilen Code.

Beispiele:
Warnung: Spoiler im Inneren! Verstecken
D3000000 13BA110C - setzt den Offset auf 0x13BA110C
20000000 00000063 - schreibt einen 8-Bit-Wert von 0x63 (99) an die Adresse 0x13BA110C (0x13BA110C + 0x00000000 = 0x13BA110C)
DC000000 00000002 - erhöht den Offset um 0x2, Offset ist jetzt 0x13BA110E
20000000 00000063 - schreibt einen 8-Bit-Wert von 0x63 (99) an die Adresse 0x13BA110E (0x13BA110E + 0x00000000 = 0x13BA110E)

BXXXXXXX 00000000 - Versatz = * (xxx)
Parameter: Adresse (XXXXXXX)

Dieser Codetyp erlaubt es uns, einen 32-Bit-Wert aus der von uns bereitgestellten Adresse (+ jeglicher Versatz, den wir zuvor gesetzt haben) in das Offsetregister zu laden und den aktuellen Offset zu ersetzen. Dies ermöglicht es uns, Zeiger in unserem Code zu verwenden. Für ein Tutorial, wie Sie Hinweise finden, finden Sie unter http://www.maxconsole.com/maxcon_forums/threads/293146-Finding-Pointer-Codes-With-Gateway-RAM-Dump (dank @ json, für den Hinweis auf dieses Tutorial )

Beispiel:
Warnung: Spoiler im Inneren! Verstecken
D3000000 13BA110C - setzt den Offset auf 0x13BA110C
B0000000 00000000 [COLOR =] [/ COLOR] - lädt den 32-Bit-Wert an der Adresse 0x13BA110C in das Offset-Register und ersetzt unseren aktuellen Offset. Also, wenn der Wert bei 0x13BA110C 0x368F39C3 ist, wird dies unsere neue Offset (Hinweis: wenn Sie Hex-Werte in einem Hex-Editor auf Ihrem PC oder das Gateway-Cheat-Menü, nehmen endianness berücksichtigt!)
20000000 00000063 - schreibt einen 8-Bit-Wert von 0x63 (99) an die Adresse 0x368F39C3 (0x368F39C3 + 0x00000000 = 0x368F39C3)

Loop-Code:
C0000000 JJJJJJJJ - Setzt den Wiederholungswert auf 'JJJJJJJJ'

Parameter: Anzahl der Schleifen (JJJJJJJ)

Dieser Code ermöglicht es uns, den folgenden Block von Codes so oft wiederholen, wie wir es brauchen. Wenn der Code-Typ 0xD1 oder 0xD2 getroffen wird, wird die Loop-Nummer um 0x1 verringert und erneut gestartet. Kombiniert mit anderen Codes können wir eine riesige Reihe von Adressen mit nur ein paar Zeilen Code zu manipulieren.

Beispiel:
Warnung: Spoiler im Inneren! Verstecken
D3000000 13BA110C - setzt den Offset auf 0x13BA110C
C0000000 00000032 - die folgenden Anweisungen 0x32 (50) mal wiederholen
20000000 00000063 - schreibt einen 8-Bit-Wert von 0x63 (99) an die Adresse 0x13BA110C (0x13BA110C + 0x00000000 = 0x13BA110C)
DC000000 00000002 - erhöht den Offset um 0x2, Offset ist jetzt 0x13BA110E
D1000000 00000000 - Schleifenzähler um 0x1 verringern, zum vorherigen 0xC0-Code zurückspringen.

Anstatt 50 Adressen nacheinander zu manipulieren, setzt unsere Schleife automatisch den Wert jeder anderen Adresse auf 0x63 (99)

Terminator-Codes
D0000000 00000000 - Ende Wenn Anweisung
Dieser Code beendet den aktuellen bedingten Codebefehl. Beispiele finden Sie im Abschnitt über bedingte Codes

D1000000 00000000 - Wiederholungsbefehl beenden
Dieser Code verringert den aktuellen Schleifenzähler um eins und führt die Codeausführung zum letzten 0xC0-Code zurück. Siehe Loop-Code für Beispiele.

D2000000 00000000 - Endcode-Anweisung. (Nicht vom Team-Gateway dokumentiert)

Dieser Code verringert den aktuellen Schleifenzähler um eins und führt die Codeausführung zum letzten 0xC0-Code zurück. Es beendet auch alle bedingten Blöcke. Außerdem werden der aktuelle Offset und jeder Wert gelöscht, den Sie möglicherweise in das Datenregister geschrieben haben. Es wird empfohlen, dies als endgültigen Code-Terminator zu verwenden, bevor ein neuer Code gestartet wird.


Datenregister-Codes:
Das Datenregister erlaubt es uns, einen Wert von einer Adresse zu kopieren und zu manipulieren, bevor er an eine Adresse zurückgeschrieben wird (entweder die gleiche Adresse oder eine andere). Das Datenregister ist immer 32-Bit, wir können über die "Bit-Ness" während der Schreibbefehle entscheiden. Wenn nicht gesetzt oder geladen von einem Code, wird es 0x0 sein.

D5000000 XXXXXXXX - Setzt das Datenregister auf XXXXXXXX
Parameter: Wert (XXXXXXXX)

Dieser Code ermöglicht es uns, den Inhalt des Datenregisters auf einen beliebigen beliebigen Wert zu setzen.


D9000000 XXXXXXXX - (32bit) setzt Daten auf [XXXXXXXX + Offset]
Parameter: Adresse (XXXXXXXX)

Dieser lädt den 32-Bit-Wert aus der vorgesehenen Adresse (auch unter Berücksichtigung des Offsets) und speichert ihn im Datenregister.


DA000000 XXXXXXXX - (16bit) setzt Daten auf [XXXXXXXX + Offset] & 0xffff
Parameter: Adresse (XXXXXXXX)

Dadurch wird der 16-Bit-Wert aus der vorgesehenen Adresse geladen (auch unter Berücksichtigung des Offsets) und im Datenregister gespeichert.


DB000000 XXXXXXXX - (8bit) setzt Daten auf [XXXXXXXX + Offset] & 0xff
Parameter: Adresse (XXXXXXXX)

Dadurch wird der 8-Bit-Wert aus der vorgesehenen Adresse (auch unter Berücksichtigung des Offsets) geladen und im Datenregister abgelegt.


D4000000 XXXXXXXX - Fügt dem Datenregister XXXXXXXX hinzu
Parameter: Wert (XXXXXXXX)

Dieser Code fügt einfach den Wert, den wir an das Datenregister übergeben.


D6000000 XXXXXXXX - (32bit) [XXXXXXXX + Offset] = Daten; Versatz + = 4
Parameter: Adresse (XXXXXXXX)

Dieser Code schreibt den aktuellen Inhalt des Datenregisters als 32-Bit-Wert an die angegebene Adresse (unter Berücksichtigung des Versatzes). Nach dem Schreiben wird automatisch der aktuelle Offset um 0x4 erhöht.


D7000000 XXXXXXXX - (16bit) [XXXXXXXX + Offset] = Daten & 0xffff; Versatz + = 2
Parameter: Adresse (XXXXXXXX)

Dieser Code schreibt den aktuellen Inhalt des Datenregisters als 16-Bit-Wert an die angegebene Adresse (unter Berücksichtigung des Versatzes). Nach dem Schreiben wird automatisch der aktuelle Offset um 0x2 erhöht.


D8000000 XXXXXXXX - (8bit) [XXXXXXXX + Offset] = Daten & 0xff; Offset ++
Parameter: Adresse (XXXXXXXX)

Dieser Code schreibt den aktuellen Inhalt des Datenregisters als 8-Bit-Wert an die angegebene Adresse (unter Berücksichtigung des Versatzes). Nach dem Schreiben wird automatisch der aktuelle Offset um 0x1 erhöht.

Beispiel für die Datenregistrierung:
Warnung: Spoiler im Inneren! Verstecken
D3000000 13BA110C - setzt den aktuellen Offset auf 0x13BA110C
D5000000 413C0000 - setzt das Datenregister auf 0x413C0000
C0000000 0000002B - eine Schleife starten und 0x2B (43) mal ausführen
D6000000 00000000 - Datenregister an Adresse 0x13BA110C schreiben und Offset um 0x4 erhöhen. Neuer Offset ist jetzt 0x13BA1110. Das Datenregister bleibt 0x413C0000
D1000000 00000000 - verringert die Schleifenzahl um 0x1 und kehrt zur obigen 0xC0-Zeile zurück. Wenn die Schleifenzahl bei 0x0 ist, wird die Ausführung an der nächsten Codezeile fortgesetzt.
D3000000 13BA178C - setzt den aktuellen Offset auf 0x13BA178C
C0000000 0000002B - eine Schleife starten und 0x2B (43) mal ausführen
D6000000 00000000 - das Datenregister in die Adresse 0x13BA178C schreiben und den Offset um 0x4 erhöhen. Neuer Offset ist jetzt 0x13BA1790. Das Datenregister bleibt 0x413C0000
D2000000 00000000 - verringert den Schleifenzähler um 0x1, kehrt zum vorherigen 0xC0-Code zurück. Sobald Schleifenzähler 0x0 ist, löscht es das Daten- und Offsetregister, beide kehren zu 0x0 zurück,

Spezielle Codes:

DD000000 XXXXXXXX - wenn KEYPAD Wert XXXXXXXX den nächsten Satz ausführt
Parameter: Keypad-Wert

Dieser Code erlaubt uns, Codes nur zu aktivieren, sobald ein Button-Combo gedrückt wird. Dies ist ideal für das Erstellen von Codes, die aktiviert werden können "on demand" durch Drücken der Taste Combo, die mit dem Wert, den wir übergeben. Jede Taste entspricht einem bestimmten Hexadezimalwert. Wir fügen einfach alle Werte der Schaltflächen hinzu, die wir für die Schaltfläche aktivieren möchten. Nehmen wir an, wir wollen L + R + Start + Auswählen drücken, wir addieren einfach 0x200, 0x300, 0x8 und 0x4. Das Ergebnis ist 0x50C

Also, indem Sie die Zeile DD000000 0000050C vor unserem Code müssen wir die Tasten drücken, um den Code zu aktivieren. Die Gateway-Cheat-Engine scheint sehr empfindlich über die Taste drücken, so dass manchmal der Code mehrmals ausgeführt wird, auch mit dem kürzesten einer der Tastenkombination. Die verfügbaren Tasten und die entsprechenden Werte finden Sie in der folgenden Liste. Neue 3DS Knöpfe (ZL, ZR, C-Stick) sind derzeit nicht verfügbar.

Warnung: Spoiler im Inneren! Verstecken
0x1A
0x2 B
0x4 Auswählen
0x8 Start
0x10 Rechts
0x20 Links
0x40 Nach oben
0x80 Down
0x100 R
0x200 L
0x400 X
0x800 Y

EXXXXXXX JJJJJJJJ - Patch-Code
Parameter: Adresse (XXXXXXX), Anzahl der Bytes (JJJJJJJ)

Dieser Code-Typ wurde in Gateway 3.6.2 eingeführt, aber die Implementierung ist ein bisschen iffy. Ich glaube Gateway kann verklemmt haben diese ein bisschen. Dieser Code schreibt YYYYYYY Bytes aus der Liste der folgenden Werte (ein Beispiel wird dies ein bisschen klarer, bitte mit mir) beginnend an der Adresse (+ Offset haben wir gesetzt haben). Wo dieser Code ein wenig iffy ist die endianness es behandelt die Liste der Werte zu schreiben:

Warnung: Spoiler im Inneren! Verstecken
D3000000 32C825A4 - setzt den aktuellen Offset auf 0x32C825A4
E0000000 00000008 - schreiben Sie die folgende Liste von 08 (0x10) Bytes an die Adressen 0x32C825A4 weiter
44332211 88776655 - das ist der Teil der Code geht iffy. 0x11 ist der Wert, der auf 0x32C825A4 geschrieben wird, 0x22 wird auf 0x32C825A5, 0x55 auf 0x32C825A8, 0x66 auf 0x32C825A9 usw. geschrieben.

Logik würde in der Regel diktieren, dass es nicht behandeln sollte die Liste als einzelne 32-Bit-Strings, sondern nur ein Strom von Bytes zu schreiben, aber es tut. Also ist dieser Code sehr sorgfältig zu verwenden, um den richtigen Wert zu den Adressen zu schreiben, die wir wollen. Es ist nicht an sich gebrochen, es ist nur ein bisschen schwierig, deinen Geist um den Strom von Bytes zu beugen.

Der 0xE-Codetyp wird auch die Codetyperfassung für YY der Bytes in der Codeliste deaktivieren. D.h. Im obigen Beispiel würde die Zeile nach E0000000 00000008 einfach als eine Liste von Werten interpretiert werden, nicht als 0x4 (32 Bit größer als 'bedingter Code).

Fußnote über Endianness:

Wenn Sie einen RAM-Speicher des 3DS betrachten - entweder im eingebauten Hex-Editor oder auf Ihrem PC - haben Sie vielleicht bemerkt, dass bei der Betrachtung eines Wertes an einer Adresse die Werte, die unsere Codes schreiben, nicht übereinstimmen. Thi ist, weil das 3DS RAM in Little endian angelegt ist, werden unsere Codes in big endian geschrieben. Wenn wir den 32-Bit-Big-Endian-Wert 11223344 nehmen, wird die Cheat-Engine diese in vier Bytes aufteilen, 11 22 33 44 und dann das am wenigsten signifikante Byte (44) an die Adresse schreiben, die wir wollen. Schreibt dann das nächste Byte (33) an die folgende Adresse. Für weitere Klarstellung, überprüfen Sie die Wikipedia-Eintrag über Endianness. Im Sinne dieser Anleitung:

Wenn Sie den Wert 1A2B3C4D in einem Code übergeben, wird er als 4D 3C 2B 1A im RAM angezeigt. Der Wert ist zwar korrekt.


Keine Kommentare:

Kommentar veröffentlichen