src/supSMSASM | ||
.gitignore | ||
LICENSE | ||
MANIFEST.in | ||
pyproject.toml | ||
README.md | ||
setup.cfg |
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 to0
.
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.