It does this by checking for duplicate tiles in a CHR-ROM file. It can then mark the tile with a box, or eliminate it altogether and compress the remaining tiles.
The infile is the CHR-ROM file that you want to optimize. It should be precisely 4096 bytes large, if you're dealing with just one array of tiles to fit into a single NES pattern table. Of course, a single valid CHR-ROM bank is 8192 bytes, but if you use the [-c] option with a file larger than 4096 bytes, CHARlie will try to fit as much as it can from that file into the smallest space possible in the outfile. Not using the [-c] option will not affect the positioning of graphics in CHR banks that might be 8k or larger.
By default, CHARlie will replace a redundant character tile with a square marker. You can then use the space provided by all the markers for more graphics data in your NES programs. But, if you provide the [-c] argument on the command line, CHARlie will not use those markers. Instead, when it finds a duplicate tile, it will just eliminate that tile, and move all other tiles up to fill that gap. This will compress all the tiles into as little space as possible, freeing up more room at the bottom of the character array.
Here is an example of what CHARlie does to CHR ROMs. The leftmost image is the original array of NES tiles. The second image is the file after CHARlie has filled the redundant spaces with marker tiles. The third image is the file after CHARlie has compressed the graphics in the CHR-ROM, using the [-c] option.
This program is just a small little utility, so I didn't spend (much) of a long time coding it. As such, it is again in my favourite flavour of spaghetti-code. The C source code is included, if you want to improve on it at all. Go ahead. Caveat emptor. Have fun!
Download CHARlie Amiga executable and C source code.
Download CHARlie MS-DOS executable. (Kindly provided by Fractal)