supGeckoASM

A tool to make gecko code from ASM


License
MIT
Install
pip install supGeckoASM==0.0.1a4

Documentation

supSMSASM

A tool to make Gecko code from ASM for SMS

This tool only runs on Windows currently.

Installation

First, install devkitPro.

Then, use pip to install supSMSASM:

pip install supSMSASM

Usage

This tool can make C0, C2, and Fixed-Location-C2 code from ASM code. See Supported Code Type for more information.

With all files prepared, use the following command to generate the Gecko code:

supSMSASM {*.s} [JP|JPA]

The generated code will be copied to your clipboard.

Symbols

Symbols defined in ldscript/ can be used in *.s and *.ld.

Supported Code Type

C0

Simply write your ASM code in *.s and use supSMSASM to convert it into Gecko code.

C2

You will need the following two files:

  • *.s: ASM source code
  • *.ld: LD script for defining the entry points of C2. You need to define a symbol $$ and set the value to 0.

To define a C2 entry, define a symbol with $C2$ prepending to the symbol defined in *.s file.

For example, to make 2 C2 codes, first write the body of the code in your xxx.s file:

SomeC2Code:
  # ...

AnotherC2Code:
  # ...

Then, in your xxx.ld file, define the entry points:

/* The following line is required for C2 code type */
$$ = 0;

$C2$SomeC2Code = 0x80345678;
$C2$AnotherC2Code = 0x80DEFABC;

Finally, use supGeckoCode xxx.s to generate Gecko code. The result will be like:

C2345678 XXXXXXXX
... (instructions in SomeC2Code)
C2DEFABC XXXXXXXX
... (instructions in AnotherC2Code)

Note that you can't branch to absolute address with bl or b directly since the location of the code is unknown. You will need to set the destination to register and use blr, bctr etc. instead.

Fixed-Location-C2

To solve the problem that C2 code type can't branch to absolute address directly, you can use 06 to place the code into a fixed location and then use 04 to replace the instruction with b or bl to the code.

You will need the following two files (same as C2):

  • *.s: ASM source code
  • *.ld: LD script for defining the entry points and the address to place the code

To define a entry, define a symbol with $b$ or $bl$ prepending to the symbol defined in *.s file. This will replace the instruction at the given address with b or bl to the the symbol.

For example, to make 2 Fixed-Location-C2 codes, first write the body of the code in your xxx.s file:

SomeCodeWithB:
  b $b$SomeCodeWithB+4

AnotherCodeWithBL:
  # ...
  blr

Then, in your xxx.ld file, define the entry points:

/* The following line defines the address to place the code.
   It will be 0x817F9800 if you don't specify */
$$ = 0x817F9800;

$b$SomeCodeWithB = 0x80345678;
$bl$AnotherCodeWithBL = 0x80DEFABC;

Finally, use supGeckoCode xxx.s to generate Gecko code. The result will be like:

04345678 494B4188 <-- b from 80345678 to SomeCodeWithB
04DEFABC 48A09D49 <-- bl from 80DEFABC to AnotherCodeWithBL
077F9800 XXXXXXXX
... (instructions in SomeCodeWithB and AnotherCodeWithBL)

Note that unlike C2, you have to explicitly do b or blr back to the original program. In addition, just like C2, you have to put the original instruction manually if needed.