[v0.0.1] rename tool, update README
This commit is contained in:
parent
3f66f46ff3
commit
571ffde3c5
9 changed files with 117 additions and 18 deletions
|
@ -1,2 +1,2 @@
|
||||||
include src/supGeckoASM/include/*
|
include src/supSMSASM/include/*
|
||||||
include src/supGeckoASM/ldscript/*
|
include src/supSMSASM/ldscript/*
|
||||||
|
|
114
README.md
114
README.md
|
@ -1,16 +1,114 @@
|
||||||
# supGeckoASM
|
# supSMSASM
|
||||||
A tool to make gecko code from ASM
|
A tool to make Gecko code from ASM for SMS
|
||||||
|
|
||||||
## Supported code type
|
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
|
||||||
### C0
|
### C0
|
||||||
|
Simply write your ASM code in `*.s` and use `supSMSASM` to convert it into Gecko code.
|
||||||
|
|
||||||
### C2
|
### 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:
|
||||||
|
```asm
|
||||||
|
SomeC2Code:
|
||||||
|
# ...
|
||||||
|
|
||||||
|
AnotherC2Code:
|
||||||
|
# ...
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, in your `xxx.ld` file, define the entry points:
|
||||||
```ld
|
```ld
|
||||||
|
/* The following line is required for C2 code type */
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
$C2$.xxx = ...;
|
|
||||||
|
$C2$SomeC2Code = 0x80345678;
|
||||||
|
$C2$AnotherC2Code = 0x80DEFABC;
|
||||||
```
|
```
|
||||||
### 06
|
|
||||||
|
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:
|
||||||
|
```asm
|
||||||
|
SomeCodeWithB:
|
||||||
|
b $b$SomeCodeWithB+4
|
||||||
|
|
||||||
|
AnotherCodeWithBL:
|
||||||
|
# ...
|
||||||
|
blr
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, in your `xxx.ld` file, define the entry points:
|
||||||
```ld
|
```ld
|
||||||
$$ = ...;
|
/* The following line defines the address to place the code.
|
||||||
$b$.xxx = ...;
|
It will be 0x817F9800 if you don't specify */
|
||||||
$bl$.yyy = ...;
|
$$ = 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.
|
||||||
|
|
12
setup.cfg
12
setup.cfg
|
@ -1,15 +1,15 @@
|
||||||
[metadata]
|
[metadata]
|
||||||
name = supGeckoASM
|
name = supSMSASM
|
||||||
version = 0.0.1a2
|
version = 0.0.1
|
||||||
author = sup39
|
author = sup39
|
||||||
author_email = sms@sup39.dev
|
author_email = sms@sup39.dev
|
||||||
description = A tool to make gecko code from ASM
|
description = A tool to make Gecko code from ASM for SMS
|
||||||
long_description = file: README.md
|
long_description = file: README.md
|
||||||
long_description_content_type = text/markdown
|
long_description_content_type = text/markdown
|
||||||
url = https://github.com/sup39/supGeckoASM
|
url = https://github.com/sup39/supSMSASM
|
||||||
license = MIT
|
license = MIT
|
||||||
project_urls =
|
project_urls =
|
||||||
Bug Tracker = https://github.com/sup39/supGeckoASM/issues
|
Bug Tracker = https://github.com/sup39/supSMSASM/issues
|
||||||
classifiers =
|
classifiers =
|
||||||
Programming Language :: Python :: 3
|
Programming Language :: Python :: 3
|
||||||
License :: OSI Approved :: MIT License
|
License :: OSI Approved :: MIT License
|
||||||
|
@ -27,4 +27,4 @@ where = src
|
||||||
|
|
||||||
[options.entry_points]
|
[options.entry_points]
|
||||||
console_scripts =
|
console_scripts =
|
||||||
supGeckoASM = supGeckoASM.cli:main
|
supSMSASM = supSMSASM.cli:main
|
||||||
|
|
|
@ -18,6 +18,8 @@ def pbcopy(content):
|
||||||
win32clipboard.SetClipboardText(content)
|
win32clipboard.SetClipboardText(content)
|
||||||
win32clipboard.CloseClipboard()
|
win32clipboard.CloseClipboard()
|
||||||
|
|
||||||
|
logger = logging.getLogger('supGeckoCode')
|
||||||
|
|
||||||
def normalize_dolver(s):
|
def normalize_dolver(s):
|
||||||
if re.match(r'^(?:JP?|N(?:TSC)?[-_]?J)(?:1\.?0|\.0)?$|^1\.0$', s):
|
if re.match(r'^(?:JP?|N(?:TSC)?[-_]?J)(?:1\.?0|\.0)?$|^1\.0$', s):
|
||||||
return 'NTSC-J_1.0'
|
return 'NTSC-J_1.0'
|
||||||
|
@ -97,7 +99,7 @@ def asm2gecko(fnIn, dolver):
|
||||||
if sec == '.text':
|
if sec == '.text':
|
||||||
asmSymbs[name] = addr
|
asmSymbs[name] = addr
|
||||||
else:
|
else:
|
||||||
if name == '$$' and int(addr) == 0:
|
if name == '$$' and int(addr, 16) == 0:
|
||||||
isC2 = True
|
isC2 = True
|
||||||
m = re.match(r'\$(bl?|C2)\$(.*)', name)
|
m = re.match(r'\$(bl?|C2)\$(.*)', name)
|
||||||
if m is None: continue
|
if m is None: continue
|
||||||
|
@ -185,7 +187,6 @@ def asm2gecko(fnIn, dolver):
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
logging.basicConfig()
|
logging.basicConfig()
|
||||||
logger = logging.getLogger('supGeckoCode')
|
|
||||||
|
|
||||||
# check required bin
|
# check required bin
|
||||||
for exe in ['powerpc-eabi-as', 'powerpc-eabi-ld', 'powerpc-eabi-objdump', 'powerpc-eabi-objcopy']:
|
for exe in ['powerpc-eabi-as', 'powerpc-eabi-ld', 'powerpc-eabi-objdump', 'powerpc-eabi-objcopy']:
|
Reference in a new issue