UNIF is the Universal NES Interchange Format, a format for storing NES and Famicom game ROMs efficiently.

Currently, the most popular format for storing ROMs (ripped or homebrew) is iNES ROM format. It is a rather simple format to work with. iNES format, however, has some small drawbacks. First and foremost is its reliance to "mapper numbers" - basically, there are hundreds of different NES game pak board combinations and chipsets, each identified with a number.

UNIF, specified by Tennessee Carmel-Veilleux (http://www.parodius.com/~veilleux/), is a bit more complex but far more expressive format than iNES. It draws its inspiration from IFF files: The file consists of header with magic number and UNIF version number, followed by any number of "chunks" that have a four-character identifier, four-byte size field, followed by data. The chunks can be practically in any order in the file.

The usual game data (code and graphics) are stored quite simply in chunks called PRG0 and CHR0 - there are more chunks called PRG1, PRG2 and so on, of course.

Instead of mapper numbers, UNIF files have MAPR chunk that has zero-terminated board name. Board name tells the emulator everything there is to know about the stuff on cartridge. For example, "NROM" board is the classic no-frills board used by early games (such as SMB), equivalent to not using a mapper at all (mapper 0 in iNES). There's also MIRR chunk for storing ROM mirroring information, since it can be different even on same boards.

UNIF has also far more powerful metadata. NAME chunk contains the human-readable ROM name, and READ can include a whole "read me" file, which might be especially useful for homebrew games. DINF chunk contains the name of the person who dumped the ROM and dumping date (or, I presume, author and build date for homebrews).

UNIF is more complex to build than iNES for homebrew stuff - It's far less feasible to store the actual file format contents in the assembler source. However, if you use external tools to cook up the UNIF file (I wrote some small Perl scripts to do the job), it's far more fun format to work with than iNES, and it won't require any special feats from the assembler that way, either. Even xa could handle just plain assembling to PRG0 file. There are also tools for converting iNES to UNIF and back - for example, ucon64 can do this, though you may need to know the board name too.