SM64 Hacking - CajeASM v7.0 (Stable)

geschrieben am 07.10.2014 16:15:49
zuletzt bearbeitet von Tarek701 am 18.04.2015 16:44:16.
( Link )
CajeASM - A MIPS R4300i Assembler
CajeASM ist ein N64 MIPS Assembler, der für alle N64 ROMs funktioniert (big-endian, little-endian und byteswapped/middle-endian). Der Assembler kommt mit einer Frontend und ist daher sehr einfach und leicht zu gebrauchen, einfach nur ROM und ASM datei auswählen und assemblieren lassen.

Download Link:
http://origami64.net/attachment.php?aid=63

Hier wird gezeigt (für die, die es wirklich nicht verstehen) wie man eine ASM Datei auf die ROM assembled.

Tutorials:
https://www.youtube.com/watch?v=DnFxpRwT0Gc - How to assemble an ASM file to a SM64 ROM.

Wenn du MIPS ASM beherrschst, kannst du richtig cooles Zeug machen.

Beispiele:

FLUDD by Kazeshin(aka Kaze):

(Full Video: FLUDD)

Shop Guy by Tarek701/Cajetan (aka me):

(Full Video + Download Link: Shop Guy v0.2)

More Objects Patch by Kazeshin(aka Kaze):

(Full Video + Download Link: More Objects Patch

MfG,
Tarek701.
geschrieben am 08.10.2014 14:21:42
( Link )
Ich verstehe zwar nicht so viel von N64 Assembler, aber du hast dir auf jeden Fall schonmal meinen Respekt verdient, dass du es überhaupt so weit gebracht und eine erste Version veröffentlicht hast!
Ich hoffe mal, es finden sich Leute, die das Ding nutzen können und davon profitieren.
-Das quadratische Rad neu erfinden-
Mit das quadratische Rad neu erfinden (englisch Reinventing the square wheel) bezeichnet man die Bereitstellung einer schlechten Lösung, wenn eine gute Lösung bereits existiert.

-Slowsort-
Slowsort (von engl. slow: langsam) ist ein langsamer, rekursiver Sortieralgorithmus, der nach dem Prinzip Vervielfache und kapituliere (engl. Multiply and surrender, eine Parodie auf Teile und herrsche) arbeitet.

geschrieben am 10.10.2014 12:04:35
( Link )
Zitat von RPG Hacker:
Ich verstehe zwar nicht so viel von N64 Assembler, aber du hast dir auf jeden Fall schonmal meinen Respekt verdient, dass du es überhaupt so weit gebracht und eine erste Version veröffentlicht hast!
Ich hoffe mal, es finden sich Leute, die das Ding nutzen können und davon profitieren.


Danke. Also an sich ist es nicht schwer, Adressierungen sind nur halt anders und man hat sowas wie direct addressing, absolute oder long addressing nicht. Stattdessen ist das dann Register+Base Pointern.

Wenn ich also 'ne Adresse laden will muss ich einfach schreiben:
LUI T1, $8033 ; Oberer Teil der Adresse T1 := $80330000.[/color]
ORI T1, R0, $3D54 ; Unterer Teil der Adresse, T1 := $80333D54

LUI heißt einfach: "Load upper immediate", und "upper" bedeutet ja auch, dass hier die obere Adressenhälfte (die ersten vier bytes von links) angesprochen wird.
ORI ist, wie man erahnen kann, einfach nur OR. Man benutzt es aber hier, da es die bytes nach hinten (also die letzten vier bytes) shiftet und dann kriegt man auch die Adresse raus.

T1 ist ein Register bzw. das "temporary register 1" das für temporäre Werte verwendet wird. R0 ist auch ein Register, ist aber immer null. Man verwendet es sicherheitshalber um Fehler zu vermeiden, kann nämlich passieren, das wenn man gleiche Register ORI'd, dass dann irgendein Fehler entsteht und der Wert nicht mehr stimmt. Deshalb benutzt man immer R0.

Will ich jetzt einen Wert von einer Adresse, mache ich das gleiche mit LUI nochmal, nur das ich danach nicht ORI benutze sondern den Befehl LW, LB oder LH. (LW = Load Word (ladet 'nen 32-bit wert), LB = Load Byte (ladet 'nen 8-bit wert) oder LH = Load Halfword (Ladet 'nen 16-bit wert))

LUI T1, $8033 ; Obere Adressenhälfte. T1 := $80330000
LB T2, $3D54(T1) ; Lade Wert von Adresse $80333D54 in T2. T1 bleibt UNVERÄNDERT -> T1 ist immernoch: $80330000.

In dem Falle wird jetzt ein Byte-Wert von $80333D54 in T2 geladen. Wenn also bei $80333D54 steht: 0D 02 00 A2 D1 [...] wird nur das "0D" genommen und lädt es in T2. -> T2 := $0000000D. Bei Halfword hätte er jetzt $0D02 und bei 'nem Word hätte er $0D0200A2 geladen. Ich glaube aber, dass hier irgendwas noch mit Big-Endian und Little-Endian war, so das das bei manchen ROMs auch umgekehrt geshiftet wird. Kann also auch sein, dass $0D0200A2 vertauscht sind und man dann $A200020D hat. Mario 64 ist auf jedenfall Little-Endian.

Kannst auch einen Wert speichern, dafür gibts dann SW, SH, SB. Also Store word, Store Halfword oder Store Byte. Prozess ist der Gleiche. SB hat dabei 'nen Register wo der Wert reingeladen wird und die Adresse verknüpft mit dem Register, dass die obere Adressenhälfte in sich trägt:

LUI T0, $8033 ; Obere Adressenhälfte. T0 := $80330000
ORI T1, R0, $000A ; Unser Byte: $0A -> Wert.
SB T1, $3D54(T0) ; Speichert den Wert (LSB -> Least Significant Byte, $0A) aus T1 an Adresse $80333D54. T0 bleibt wieder unverändert und ist immernoch $80330000

Hier wird das Register "T1" als der zu speichernde Wert verwendet und wieder Pointer+Base Syntax zur Adresse und anschließend wird das Byte dort gespeichert. Nach diesem Code würde statt 0D 02 00 A2 D1 jetzt 0A 02 00 A2 D1 stehen.
geschrieben am 31.10.2014 20:20:13
( Link )
v3.23 ist draußen!
Hab jetzt alle Befehle von MIPS drin, Labels gehen, .ORG, .ASCIIZ direktive sind auch jetzt drin. Und natürlich alle floating-point Befehle (Das war sehr anstrengend)

MfG,
Tarek701.
geschrieben am 31.10.2014 23:33:23
( Link )
Good guy Tarek!
Was ist .ASCIIZ? Zum Einfügen von Text oder sowas?
-Das quadratische Rad neu erfinden-
Mit das quadratische Rad neu erfinden (englisch Reinventing the square wheel) bezeichnet man die Bereitstellung einer schlechten Lösung, wenn eine gute Lösung bereits existiert.

-Slowsort-
Slowsort (von engl. slow: langsam) ist ein langsamer, rekursiver Sortieralgorithmus, der nach dem Prinzip Vervielfache und kapituliere (engl. Multiply and surrender, eine Parodie auf Teile und herrsche) arbeitet.

geschrieben am 01.11.2014 4:38:00
( Link )
Zitat von RPG Hacker:
Good guy Tarek!
Was ist .ASCIIZ? Zum Einfügen von Text oder sowas?


Es gibt zwei ASCII Direktiven, einmal .ascii und .asciiz. Beide erlauben es ASCII-Strings in die ROM einzufügen. Unterschied ist nur, dass .asciiz den Strint mit einem \0 (Terminator-String, "00" Byte) abschließt. Wenn ich in MIPS bspw. den Hello World Code schreibe, wird .asciiz empfohlen, da MIPS dann genau an dieser Stelle aufhört zu lesen. Würde man .ascii verwenden, so würde MIPS beim Auslesen von Pointern (z.B Pointer zu Text) einfach weiterlesen und dann unschöne Ergebnisse hervorrufen.

Inzwischen hat mein Programm auch eine Front-End (GUI):
geschrieben am 03.11.2014 15:44:03
( Link )
CajeASM v3.30 ist draußen.

Updates:
Man kann jetzt Variablen/Defines reinmachen. Bspw.:

[Var1]: 0xA

ADDIU T0, T1, @Var1
NOP

Wird umgewandelt in:

ADDIU T0, T1, 0x000A

Auch sind jetzt Dezimalwerte und Binärwerte drin. Wenn ma also schreibt, ADDIU T0, T1, #12 wird das als Dezimalwert gewertet und entsprechend in Hex umgewandelt zu ADDIU T0, T1, 0xC

Download-Link:
http://www.smwcentral.net/?p=section&a=details&id=9277
geschrieben am 09.12.2014 18:38:12
( Link )
Neue CajeASM Version draußen! Ist zwar schon 'ne Weile da, aber wird jetzt geshared:

Änderungen/Neuerungen:
- Variablen können jetzt auch Binär- und Dezimalwerte enthalten
- LUI Instruktionen funktionieren jetzt auch mit Variablen
- Mit hex { hex werte hier } kann nun direkt Hex-Werte in die ROM eingefügt werden.
- Code wurde bisschen verbessert, Geschwindigkeitsboost. Und Labels und Variablen werden nun besser
dargesellt.
- Konsole schließt sich nicht mehr sofort. So kann man vorher noch schauen, ob man irgendwo 'nen Syntax
Error hat.
- Dezimalwerte und Binärwerte funktionierten vorher nicht richtig, wurde gefixt.
- Kommentare wurden vorher nicht in Variablen oder Labels ignoriert, was dazu führte, dass der Code nicht mehr
weiterschrieb.
- CajeASM Dokumentation
- Neue Pseudo-Befehle, BGT (Größer Als), BLT (Kleiner Als), BGE(Größer als oder gleich), BLE (Kleiner Als oder
gleich), BAL (Branch Link), B (Branch, direct)
- rn64crc (Checksum Recalculator) war vorher fucked up und hat daher die Prüfsumme nicht neu berechnet, was
dazu führte, dass die ROM evtl. nicht mehr startete.

http://www.smwcentral.net/?p=section&a=details&id=9277
geschrieben am 03.01.2015 14:27:59
( Link )
So, CajeASM v5.1 ist draußen. Ist sehr vieles verändert wurden und den Großteil nochmal neugeschrieben. Es gibt jetzt eine .include direktive, labels müssen nicht mehr mit "!" Token gepräfixt werden und die Variablen/Defines laden jetzt entsprechend des Befehls entweder nur die obere Hälfte der 32-Bit Adresse (bspw. LUI) oder die untere Hälfte der Adresse (bspw. ORI, ADDI/ADDIU, LH, SH, LB, SB, LW, SW, etc.).

Bsp.:
[Var1]: 0x8034B218

LUI T0, @Var1
LH T1, @Var1(T0)

Würde später so übersetzt werden:
LUI T0, 0x8034
LH T1, 0xB218(T0)

Das würde jetzt den derzeitigen Münzwert von Mario von Adresse 0x8033B218 in T1 laden. (0x8033B218 weil 0xB218 größer als 0x7FFF ist. Wenn ich eine 16-Bit Adresse, die negativ ist, auf 32-bit verlängere, will MIPS logischerweise die negative Zahl erhalten und deshalb sieht die Zahl im 32-Bit Bereich so aus: 0xFFFFB218. Nun wird dieser Wert zu 0x8034 hinzuaddiert, und wir kriegen 0x8033B218. Deshalb müssen wir zur oberen Hälfte immer eins hinzufügen, ansonsten würde er nämlich (falls wir ursprünglich 0x8033 geschrieben hätten) fälschlicherweise den Wert aus 0x8032B218 laden)

Englische Changelog:
[ADD]: .include directive, which let's you allow to include other asm files to your main asm file. It also imports labels and variables/defines.
[ADD]: Defines are now handled properly when load with LUI. LUI only loads the upper half of the define, while all other lower half instructions like ADDIU, ORI, etc. load the lower half of the define.
[FIX]: Comments won't get messed up anymore.
[DEL]: Labels no longer need to be prefixed with a "!" token.
[ADD]: New Pseudo-Instructions: BEQI, BNEI, BGTI, BLEI, BGEI, BLTI.
[ADD]: A complete rewritten and up-to date CajeASM Manual.
geschrieben am 20.02.2015 16:46:32
( Link )
ENDLICH. CajeASM v6.0 ist draußen. War bisher das nervigste von allem, vorallem wegen Vektoren und Skalaren.

Hier Update Liste (auf englisch)

  • [ADD]: Added RSP ASM Instruction Set.

  • [FIX]: Error when using more than 3 or 4 labels.

  • [FIX]: Some instructions not recognizing lowercased registers.

  • [FIX]: A lot of BitField errors (blame me)

  • [FIX]: Read/Write Error when including an asm file which includes asm files too which also include asm files. (lol)

  • [FIX]: Unclosed FileStreams; Sometimes caused some code not to be written. (blame me^2)

  • [FIX]: Counter error; didn't properly count the value out of range errors.

  • [FIX]: CajeASM sometimes didn't properly open rn64crc and chksum64 and so didn't fix the checksum.

  • [IMP]: Improved speed of CajeASM and use Streams properly now to save RAM. (Fastz)


Download-Link:
http://sm64-hacks.square7.ch/CajeASM%20v6.0.zip
geschrieben am 05.04.2015 23:23:38
( Link )
UPDATE(04/05/2015):
CajeASM v7.0 ist draußen. Habe das komplette tool neugeschrieben, verdammt viel verbessert und CajeASM supportet jetzt auch little-endian und byteswapped/middle-endian ROMs.

Download-Link:

http://origami64.net/attachment.php?aid=52

UPDATES:

  • [IMPR]: Recoded and improved errors in code, writes errors now to a log file. (Logs/log.txt) Label and define errors are saved in two separate log files in Logs folder.

  • [IMPR]: CajeASM assembles 12-20 secs faster than before. Hyperspeed fucky fuck funky.

  • [ADD]: CajeASM is now able to assemble ASM code to big-endian (.z64), little-endian (.v64) and byteswapped/middle-endian (.n64).

  • [ADD]: Added new directives:

    • .incbin "binfile.bin" -> Let's you include binary files into your ASM code.

    • .byte/.halfword/.word/.float -> Let's you insert numeric values into your code.

    • .align alignment, (optional) fill -> Aligns your data/code to a byte boundary, optionally filling the skipped bytes with 'fill'.

    • .skip n, fill -> skips 'n' bytes, optionally filling them with 'fill'.

  • [FIX]: Fixed decimal, binary value conversion.

  • [FIX]: Fixed LI instruction to not use ADDI/ADDIU anymore for values which are in 16-bit range.

  • [FIX]: Fixed crashes caused if the immediate value didn't have a prefix or was too short.

  • [FIX]: Re-added missing instruction SYSCALL.

  • [FIX]: Rewritten label/define list code. This time it should work better and more efficient now and prevent mystical label errors.

  • [ADD]: New command-line options, new command-line argument parser.

  • [IMPR]: If no destination register is specified in pseudo-branch instructions, then on default AT register is used.

  • [FIX]: Fixed MTC2/MFC2 (RSP) instructions not reading the element. (ex.: mtc2 t0, v3[2])

  • [FIX]: Fixed vector load/store instructions not reading the address properly.

  • [ADD]: New CajeASM v7.0+ Manual. Better, explains all pseudo-stuff step-for-step and shows how they look like when translated to real MIPS code.

  • [FIX]: ROM and ASM Files close properly now.

  • [FIX]: include directive for ASM files didn't work properly before and didn't import all defines.

  • [FIX]: hex {} parser/lexer error and confusing it with labels. Has been finally fixed.

  • [FIX]: CajeASM v6.03 crashed when labels were called three times.

  • [DEL+REPL]: (internal) Deleted some old encoding algorithm (originally this was supposed to be a small, quick reader (encoding) for ASM code, fucked up crap which never worked in the end. This was replaced with an algorithm somewhat similiar to ( w(v') >= t + 1) )

  • [FIX]: Closing CajeASM console-command line by pressing "X" caused that rn64crc.exe and chksum64.exe didn't open.

  • [FIX]: CajeASM update checker sometimes didn't read the URL.

  • [FIX]: Fixed prefixes like "0X" not being recognized (forgot to uppercase that one in my check code)

  • [FIX]: Fixed inefficient use of my BitFields (some fields were left filled with bits of preceding instructions, sometimes causing horribly wrong instruction encodings)

  • [FIX]: Fixed instruction reader and code which passes the bits to it's fields, especially the FPU instructions were sometimes not written properly.

  • [FIX]: CajeASM GUI no longer crashes if file is in use (actually it shouldn't even crash before, but it still did for some others. )

  • [FIX]: BEQI/BNEI and BGEI/BLEI/BLTI/BGTI not being correctly translated. Fixed this finally.

  • [FIX]: Lexer errors sometimes crashed CajeASM, especially LI instructions once again.

  • [FIX]: Result of MIPS instructions (Appending BitFields) sometimes were out of range (leading zero's) causing errors.

  • [FIX]: Fixed CajeASM GUI being not properly getting the filepath sometimes (when space was used in filenames).

  • [FIX]: include directive for ASM files sometimes didn't assemble some instructions (forgot to point to visitor, blame me)

  • [FIX]: CajeASM didn't read RSP instructions properly sometimes (especially the scalar modes)

  • [IMPR]: Re-coded reader for scalar modes for RSP instructions (0q, 1q, 0h, 1h, 2h, 3h, 0w-7w)

  • [FIX]: Removed "URL not found" spam. (caused when link wasn't available or when some crap was wrong with the host)

  • [FIX]: Fixed crash when attempting to open a zero byte file.

  • [FIX]: Fixed various memory corruption issues (random crashing)

  • [FIX]: Fixed parser not recognizing RSP instruction VSUB.

  • [FIX]: Fixed endless loop if define didn't exist.

  • [FIX]: Fixed B instruction not being translated correctly to real MIPS ASM instruction.

  • [IMPR]: CajeASM GUI and CajeASM console-application merged to one.