You can use some sort of binary diff tool (for example,
bsdiff or
xdelta) and patch using its respective patcher. bsdiff and xdelta are designed to handle one file at a time, so you’ll probably want to write some sort of program or script to handle multiple files as a batch job (and make backups, etc.). Not the most pleasant process imaginable, but it beats writing a custom patcher, and it will be an honest-to-God patch instead of just including the files.
People use IPS for ROM’s because it’s convenient for many ROM-related patching needs, not because it’s a good end-all be-all format. It’s not that great for PC-app changes because it concentrates on one file at a time (okay, so it’s not really that different from anything else in that regard). It’s technically useless for any file bigger than 16MB. It is designed for simplicity, so you don’t really get much of a compression bonus out of it, nor does it check to see if you’re patching the right file. But, I suppose if none of those are limitations, you could use it.
And then there’s UPS....