CPS2 Utils is a package for working with CPS2 ROMs in the MAME format in a browser. It supports unzipping, validating, decrypting, encrypting, patching with MiSTer .mra
files, and more.
npm i cps2-utils
cps2-utils exposes a few classes for working with ROMs generally, but the main one you'll be using is Cps2Rom
. It contains interfaces to functionality such as decryption, combining binary files, patching, and more.
To instantiate a Cps2Rom
, supply it with the MAME ROM .zip
and then invoke read()
. It's probably a good idea to invoke processExecutable()
after that, which will give you access to patching, decryption, etc.
async getDecryptedRom(zipFile: File): Promise<Uint8Array> {
const rom = await this.getRom(zipFile);
await rom.decryptOpcodes();
const decryptedOpcodes = rom.getDecryptedOpcodes();
if (!(decryptedOpcodes && decryptedOpcodes.length)) {
return Promise.reject('Something went wrong');
}
return Promise.resolve(decryptedOpcodes);
}
async getRom(zipFile: File): Promise<Cps2Rom> {
const rom = new Cps2Rom(zipFile);
await rom.read();
await rom.processExecutable();
return Promise.resolve(rom);
}
Cps2Rom
also supports chaining its operations:
async getDecryptedRom(zipFile: File): Promise<Uint8Array> {
const rom = await new Cps2Rom(zipFile).read();
const decryptedOpcodes = (await rom.processExecutable()).getDecryptedOpcodes();
if (!(decryptedOpcodes && decryptedOpcodes.length)) {
return Promise.reject('Something went wrong');
}
return Promise.resolve(decryptedOpcodes);
}
Using a library like l8
to make the chains fluid is probably not the worst idea.
See DarkMrSoft for a concrete example of using this library.
.ips
to .mra
.mra
to .ips
.zip
.bin
Generated using TypeDoc