A whole bunch of stuff that I've slowly gathered over my time hacking EB.
Tools, documentation, scripts... Things by me, things by other people...
Discord won't be around forever, so all the handy stuff lying around in the PK Hack server needs to be archived.
Links that look like file names will take you directly to the file. Links that don't will take you to another webpage.
The EB devs wrote the game script in a format they called "MSG" which probably stands for "Message" and not "Monosodium glutamate". In 2021, localization development files were recovered, including an almost-complete dump of the game script! It contains comments (mostly in Japanese) and labels which could make it a more useful script reference. Plus it's cool. The amazing Catador also made a list of the commands in the MSG format compared to their CCScript equivalents.
This Python script turns a beats-per-minute value into the tempo byte that EBMusEd takes. It was written by Crafty.
JTolmar wrote this little step-by-step guide on how to expand any standard table you like via CCScript. Here it is:
find every reference to the table (just search its name on ebsrc eg https://github.com/Herringway/ebsrc/search?q=SCREEN_TRANSITION_CONFIG_TABLE) find the addresses of those references to it for each address: if it's a whole address in one spot (rare), do ROM[address of table reference] = { long MyExpandedTable } if it's broken up into two, ROM[address of high bytes] = { short[0] MyExpandedTable } and ROM[address of low bytes] = { short[1] MyExpandedTable } the usual way EB loads pointers is already a macro in asm65816 - ASMLoadAddress06() (find the start of the inevitable LDA const STA $06 LDA const STA $08 in the asm, ROM[start of that] = { ASMLoadAddress06(MyExpandedTable) }. ebsrc also has a macro for this, so you'll just see LOADPTR const instead of LDA const STA $06 LDA const STA $08
ROM[address of table reference] = { long MyExpandedTable }
ROM[address of high bytes] = { short[0] MyExpandedTable }
ROM[address of low bytes] = { short[1] MyExpandedTable }
ASMLoadAddress06()
LDA const STA $06 LDA const STA $08
ROM[start of that] = { ASMLoadAddress06(MyExpandedTable) }
LOADPTR const
Coops's converter of ebsrc code to a bunch of text files. The bonus is that the address of every single line is included, which makes it a very useful reference for ASM hacks.
Takes a CCScript-outputted summary.txt and creates a file of debug symbols that Mesen can read. Run it as the last step of your build scripts.
summary.txt
This program looks at an image and tells you how many unique tiles there are, and where they are. Use it to reduce the amount of unique tiles before running png2fts.
CRC32 and MD5 hashes for various "clean" EB ROMs and a tool to quickly calculate them. The Python script will get the hashes of every *.sfc in the current directory.
*.sfc
Catador provided a disassembly of the game's sound driver, and I modified it to work nicer with CoilSnake. That's the one on the wiki. Here is the unmodified driver, which will compile to a byte-perfect copy of the vanilla one. Use Asar to compile it.
Vittorio made this neat tool which helps with quickly drafting battle background distortion settings. Until somebody figures out how to perfectly replicate the effects, this is the best way to do it.
A tool originally by Catador which takes a ROM and dumps the script in a readable format (more readable than CCSWriter, anyway...). JTolmar modified it to output to HTML, and then I modified that to split it over several files.
Useful webpages that I come back to frequently when writing assembly.
Standard definitions, command reference, and language spec.
Take a look at what hackers were up to a few decades ago.
I made these icons which you can use for file types common to EB hacking like CCS, BRR, and EBM. It's a little annoying to set up this stuff on Windows but you can look up how to do it.