Archived
1
0
Fork 0
This repository has been archived on 2024-02-07. You can view files and clone it, but cannot push or open issues or pull requests.
supSMSASM/README.md

115 lines
3.2 KiB
Markdown
Raw Permalink Normal View History

2022-10-14 20:44:43 +09:00
# supSMSASM
A tool to make Gecko code from ASM for SMS
2022-10-14 18:46:03 +09:00
2022-10-14 20:44:43 +09:00
This tool only runs on Windows currently.
## Installation
First, install [devkitPro](https://github.com/devkitPro/installer/releases).
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](#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/](src/supSMSASM/ldscript) can be used in `*.s` and `*.ld`.
## Supported Code Type
2022-10-14 18:46:03 +09:00
### C0
2022-10-14 20:44:43 +09:00
Simply write your ASM code in `*.s` and use `supSMSASM` to convert it into Gecko code.
2022-10-14 18:46:03 +09:00
### C2
2022-10-14 20:44:43 +09:00
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:
```asm
SomeC2Code:
# ...
AnotherC2Code:
# ...
```
Then, in your `xxx.ld` file, define the entry points:
2022-10-14 18:46:03 +09:00
```ld
2022-10-14 20:44:43 +09:00
/* The following line is required for C2 code type */
2022-10-14 18:46:03 +09:00
$$ = 0;
2022-10-14 20:44:43 +09:00
$C2$SomeC2Code = 0x80345678;
$C2$AnotherC2Code = 0x80DEFABC;
```
Finally, use `supGeckoCode xxx.s` to generate Gecko code.
The result will be like:
2022-10-14 18:46:03 +09:00
```
2022-10-14 20:44:43 +09:00
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:
```asm
SomeCodeWithB:
b $b$SomeCodeWithB+4
AnotherCodeWithBL:
# ...
blr
```
Then, in your `xxx.ld` file, define the entry points:
2022-10-14 18:46:03 +09:00
```ld
2022-10-14 20:44:43 +09:00
/* 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;
2022-10-14 18:46:03 +09:00
```
2022-10-14 20:44:43 +09:00
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.