add GCI Loader; support GCI as download format (NTSC-J 1.0 only)
This commit is contained in:
parent
c6fad5f383
commit
918eb0eb50
10 changed files with 150 additions and 46 deletions
57
Codes.xml
57
Codes.xml
|
@ -4658,4 +4658,61 @@
|
||||||
040eb024 60000000
|
040eb024 60000000
|
||||||
</source>
|
</source>
|
||||||
</code>
|
</code>
|
||||||
|
<code>
|
||||||
|
<category>misc</category>
|
||||||
|
<title lang="en-US">GCI Loader</title>
|
||||||
|
<author>sup39(サポミク)</author>
|
||||||
|
<version>0.1</version>
|
||||||
|
<date>Nov 11, 2022</date>
|
||||||
|
<description lang="en-US">
|
||||||
|
Execute Gecko code loaded from GCI file.
|
||||||
|
::: warning
|
||||||
|
You will need to reset the game if you hotplug your memory card
|
||||||
|
:::
|
||||||
|
</description>
|
||||||
|
<source version="GMSJ01">
|
||||||
|
C21069F4 0000001C
|
||||||
|
9421FFF0 7C0802A6
|
||||||
|
BFC10008 7C9F2378
|
||||||
|
38800001 90010014
|
||||||
|
7C7E1B78 3D808010
|
||||||
|
618C7B50 7D8803A6
|
||||||
|
4E800021 2C030000
|
||||||
|
40820084 807E0000
|
||||||
|
48000009 67637400
|
||||||
|
7C8802A6 7FE5FB78
|
||||||
|
3D80800A 618C3CAC
|
||||||
|
7D8803A6 4E800021
|
||||||
|
2C030000 40820058
|
||||||
|
38A00000 38C00000
|
||||||
|
60A5E000 3C80817F
|
||||||
|
7FE3FB78 3D80800A
|
||||||
|
618C4640 7D8803A6
|
||||||
|
4E800021 2C030000
|
||||||
|
40820018 3D20817F
|
||||||
|
3D40534D 6129DFFC
|
||||||
|
614A53FF 91490000
|
||||||
|
7FE3FB78 3D80800A
|
||||||
|
618C3E24 7D8803A6
|
||||||
|
4E800021 80010014
|
||||||
|
7FE4FB78 7FC3F378
|
||||||
|
83E1000C 83C10008
|
||||||
|
38210010 3D808010
|
||||||
|
618C72F4 7D8803A6
|
||||||
|
4E800021 00000000
|
||||||
|
C0000000 0000000C
|
||||||
|
3CA0803E 88A56008
|
||||||
|
28050004 4D800020
|
||||||
|
3CA0534D 60A553FF
|
||||||
|
3C608180 8003DFFC
|
||||||
|
7C002840 4C820020
|
||||||
|
3CA000D0 60A5C0DE
|
||||||
|
3C608180 8403B000
|
||||||
|
7C002840 4C820020
|
||||||
|
80030004 7C002840
|
||||||
|
4C820020 7C0F2214
|
||||||
|
9003FFFC 39E30008
|
||||||
|
7DE47850 4E800020
|
||||||
|
</source>
|
||||||
|
</code>
|
||||||
</codes>
|
</codes>
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
## Nov 11, 2022
|
||||||
|
- Add GCI Loader (NTSC-J 1.0 only)
|
||||||
|
- Support GCI as download format (NTSC-J 1.0 only)
|
||||||
|
|
||||||
## Nov 9, 2022
|
## Nov 9, 2022
|
||||||
### Added 'Fast Piantissimo'
|
### Added 'Fast Piantissimo'
|
||||||
To make Piantissimo go as fast as he will in a level, you need to beat him with an in-game time under 25 seconds and grab his Shine. Or you could just use this code.
|
To make Piantissimo go as fast as he will in a level, you need to beat him with an in-game time under 25 seconds and grab his Shine. Or you could just use this code.
|
||||||
|
|
|
@ -86,6 +86,9 @@ export default {
|
||||||
this.alertDolphinCodeSize(codeSize);
|
this.alertDolphinCodeSize(codeSize);
|
||||||
this.generateCheatManagerTXT(c, fileName);
|
this.generateCheatManagerTXT(c, fileName);
|
||||||
break;
|
break;
|
||||||
|
case 'gci':
|
||||||
|
this.generateGCI(c, fileName);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
alertGCTCodeSize(size) {
|
alertGCTCodeSize(size) {
|
||||||
|
@ -144,6 +147,35 @@ export default {
|
||||||
|
|
||||||
this.downloadFile(data, `${version}.txt`);
|
this.downloadFile(data, `${version}.txt`);
|
||||||
},
|
},
|
||||||
|
generateGCI(codes, version) {
|
||||||
|
if (!['GMSJ01'].includes(version)) {
|
||||||
|
alert('GCI format is not yet supported for versions other than GMSJ01');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let code = '00D0C0DE00D0C0DE';
|
||||||
|
codes.forEach((c) => (code += c.source));
|
||||||
|
code += 'F000000000000000';
|
||||||
|
|
||||||
|
const blockCount = 7; // TODO
|
||||||
|
const gciSize = 0x40+0x2000*blockCount;
|
||||||
|
const padSize = 0xB040; // TODO
|
||||||
|
let rawData = new Uint8Array(gciSize);
|
||||||
|
|
||||||
|
for (let iD=padSize, iC=0; iD<rawData.length; iD++, iC+=2) {
|
||||||
|
rawData[iD] = parseInt(code.slice(iC, iC+2), 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
// game id
|
||||||
|
[...new TextEncoder().encode(version), 0xff, 0x00].forEach((e, i) => rawData[i] = e);
|
||||||
|
// file name
|
||||||
|
[...new TextEncoder().encode('gct')].forEach((e, i) => rawData[0x8+i] = e);
|
||||||
|
// block count
|
||||||
|
rawData[0x39] = blockCount;
|
||||||
|
// ff*6
|
||||||
|
for (let i=0x3A; i<0x40; i++) rawData[i] = 0xff;
|
||||||
|
|
||||||
|
this.downloadFile(rawData, `01-${version.slice(0, 4)}-gct.gci`);
|
||||||
|
},
|
||||||
downloadFile(data, filename) {
|
downloadFile(data, filename) {
|
||||||
var file = new Blob([data], {
|
var file = new Blob([data], {
|
||||||
type: 'application/octet-stream',
|
type: 'application/octet-stream',
|
||||||
|
|
|
@ -114,7 +114,10 @@ const makeInstXS = (op, op2) => (rA, rS, rB, Rc) => InstX(op, rA, rS, rB, op2, +
|
||||||
/** @type {(op: number) => InstM} */
|
/** @type {(op: number) => InstM} */
|
||||||
const makeInstM = (op) => (rA, rS, SH, MB, ME, Rc) => InstM(op, rA, rS, SH, MB, ME, +Rc);
|
const makeInstM = (op) => (rA, rS, SH, MB, ME, Rc) => InstM(op, rA, rS, SH, MB, ME, +Rc);
|
||||||
/** @type {(op: number) => InstI} */
|
/** @type {(op: number) => InstI} */
|
||||||
const makeInstI = (op) => (LL, LK, AA = 0) => InstI(op, LL >> 2, +AA, +LK);
|
const makeInstI =
|
||||||
|
(op) =>
|
||||||
|
(LL, LK, AA = 0) =>
|
||||||
|
InstI(op, LL >> 2, +AA, +LK);
|
||||||
|
|
||||||
export const ASM = {
|
export const ASM = {
|
||||||
// store rT, rA, D
|
// store rT, rA, D
|
||||||
|
|
|
@ -10,5 +10,9 @@
|
||||||
{
|
{
|
||||||
"target": "gcm",
|
"target": "gcm",
|
||||||
"i18nKey": "generatorconfig.downloadformat.options.gcm"
|
"i18nKey": "generatorconfig.downloadformat.options.gcm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "gci",
|
||||||
|
"i18nKey": "generatorconfig.downloadformat.options.gci"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -44,7 +44,8 @@
|
||||||
"options": {
|
"options": {
|
||||||
"gct": "GCT",
|
"gct": "GCT",
|
||||||
"dolphin": "Dolphin INI",
|
"dolphin": "Dolphin INI",
|
||||||
"gcm": "CheatManager TXT"
|
"gcm": "CheatManager TXT",
|
||||||
|
"gci": "GCI"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"categories": {
|
"categories": {
|
||||||
|
|
|
@ -44,7 +44,8 @@
|
||||||
"options": {
|
"options": {
|
||||||
"gct": "GCT",
|
"gct": "GCT",
|
||||||
"dolphin": "Dolphin INI",
|
"dolphin": "Dolphin INI",
|
||||||
"gcm": "CheatManager TXT"
|
"gcm": "CheatManager TXT",
|
||||||
|
"gci": "GCI"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alert": {
|
"alert": {
|
||||||
|
|
|
@ -29,7 +29,8 @@
|
||||||
"options": {
|
"options": {
|
||||||
"gct": "GCT",
|
"gct": "GCT",
|
||||||
"dolphin": "Dolphin INI",
|
"dolphin": "Dolphin INI",
|
||||||
"gcm": "CheatManager TXT"
|
"gcm": "CheatManager TXT",
|
||||||
|
"gci": "GCI"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -29,7 +29,8 @@
|
||||||
"options": {
|
"options": {
|
||||||
"gct": "GCT",
|
"gct": "GCT",
|
||||||
"dolphin": "Dolphin INI",
|
"dolphin": "Dolphin INI",
|
||||||
"gcm": "CheatManager TXT"
|
"gcm": "CheatManager TXT",
|
||||||
|
"gci": "GCI"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alert": {
|
"alert": {
|
||||||
|
|
Loading…
Reference in a new issue