Archived
1
0
Fork 0

[v0.0.1] rename tool, update README

This commit is contained in:
sup39 2022-10-14 20:44:43 +09:00
parent 3f66f46ff3
commit 571ffde3c5
9 changed files with 117 additions and 18 deletions

View file

@ -1,2 +1,2 @@
include src/supGeckoASM/include/* include src/supSMSASM/include/*
include src/supGeckoASM/ldscript/* include src/supSMSASM/ldscript/*

114
README.md
View file

@ -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.

View file

@ -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

View file

@ -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']: