INES

From NESdev Wiki
Revision as of 05:24, 12 March 2015 by Tepples (talk | contribs) (→‎iNES file format: Variant comparison)
Jump to navigationJump to search

The iNES file format (file name suffix .nes) is the de facto standard for distribution of NES binary programs, with use even in licensed emulators such as commercialized PocketNES and Wii Virtual Console. It was made popular by Marat Fayzullin's NES emulator, iNES . A revised version of this file format, NES 2.0, was created to fix many shortcomings and support in emulators is being added.

iNES emulator

iNES was an early NES emulator developed by Marat Fayzullin. Its most lasting contribution to the NES scene was its popularization of the iNES ROM file format and mapper numbering system. The iNES emulator is distributed as freeware on several UNIX platforms and as highly crippled shareware on MS-DOS and Microsoft Windows.

Name of file format

This file format is commonly referred to as the iNES file format/iNES header format. The file extension is .nes, so it is sometimes referred to as the .nes file format, and files in it as .nes files. Now that the NES 2.0 file format exists, which uses the same .nes extension, a .nes file/the .nes file format could mean the iNES file format or NES 2.0 format, so the full format names should be used where the differences in the formats are relevant, like specifications or format support.

iNES file format

An iNES file consists of the following sections, in order:

  1. Header (16 bytes)
  2. Trainer, if present (0 or 512 bytes)
  3. PRG ROM data (16384 * x bytes)
  4. CHR ROM data, if present (8192 * y bytes)
  5. PlayChoice INST-ROM, if present (0 or 8192 bytes)
  6. PlayChoice PROM, if present (16 bytes Data, 16 bytes CounterOut) (this is often missing, see PC10 ROM-Images for details)

Some ROM-Images additionally contain a 128-byte (or sometimes 127-byte) title at the end of the file.

The format of the header is as follows:

  • 0-3: Constant $4E $45 $53 $1A ("NES" followed by MS-DOS end-of-file)
  • 4: Size of PRG ROM in 16 KB units
  • 5: Size of CHR ROM in 8 KB units (Value 0 means the board uses CHR RAM)
  • 6: Flags 6
  • 7: Flags 7
  • 8: Size of PRG RAM in 8 KB units (Value 0 infers 8 KB for compatibility; see PRG RAM circuit)
  • 9: Flags 9
  • 10: Flags 10 (unofficial)
  • 11-15: Zero filled

Flags 6

76543210
||||||||
||||+||+- 0xx0: vertical arrangement/horizontal mirroring (CIRAM A10 = PPU A11)
|||| ||   0xx1: horizontal arrangement/vertical mirroring (CIRAM A10 = PPU A10)
|||| ||   1xxx: four-screen VRAM
|||| |+-- 1: SRAM in CPU $6000-$7FFF, if present, is battery backed
|||| +--- 1: 512-byte trainer at $7000-$71FF (stored before PRG data)
++++----- Lower nybble of mapper number

In the iNES format, cartridge boards are divided into classes called "mappers" based on similar board hardware and behavior, and each mapper has a number from 0 to 255.

Some mappers, such as MMC1, MMC3, and AxROM, can control nametable mirroring. They ignore bit 0. On the other hand, if bit 3 is true, the cart has 4 KiB of RAM at PPU $2000-$2FFF, and it ignores the mapper's CIRAM A10 output (as in Rad Racer 2). One exception is #218, which uses the four-screen bit to switch between one-screen and V/H mirroring.

Unlike the PowerPak, Famicom copiers did not implement even the most popular Famicom mappers. Instead, games for the copiers were patched to use the mappers that the copier supported, and some of these patches relied on extra code called a "trainer" that the copier loaded into PRG RAM before starting the game. One of these copiers was made by Front Fareast Industrial; hence the nickname "FFE" for these mapper hacks. It is probably not worth the effort to support FFE hacks in future emulators or copiers because substantially all games available with an FFE hack also have a good dump without a trainer.

Flags 7

76543210
||||||||
|||||||+- VS Unisystem
||||||+-- PlayChoice-10 (8KB of Hint Screen data stored after CHR data)
||||++--- If equal to 2, flags 8-15 are in NES 2.0 format
++++----- Upper nybble of mapper number

The PlayChoice-10 bit is not part of the official specification, and most emulators simply ignore the extra 8KB of data. PlayChoice games are designed to look good with the 2C03 RGB PPU, which handles color emphasis differently from a standard NES PPU.

Vs. games have a coin slot and different palettes. The detection of which palette a particular game uses is left unspecified.

NES 2.0 is a more recent extension to the format that allows more flexibility in ROM and RAM size, among other things.

Flags 9

76543210
||||||||
|||||||+- TV system (0: NTSC; 1: PAL)
+++++++-- Reserved, set to zero

Though in the official specification, very few emulators honor this bit as virtually no ROM images in circulation make use of it.

Flags 10

76543210
  ||  ||
  ||  ++- TV system (0: NTSC; 2: PAL; 1/3: dual compatible)
  |+----- SRAM in CPU $6000-$7FFF is 0: present; 1: not present
  +------ 0: Board has no bus conflicts; 1: Board has bus conflicts

This byte is not part of the official specification, and relatively few emulators honor it.

The PRG RAM Size value (stored in byte 8) was recently added to the official specification; as such, virtually no ROM images in circulation make use of it.

Older versions of the iNES emulator ignored bytes 7-15, and several ROM management tools wrote messages in there. Commonly, these will be filled with "DiskDude!", which results in 64 being added to the mapper number.

A general rule of thumb: if the last 4 bytes are not all zero, and the header is not marked for NES 2.0 format, an emulator should either mask off the upper 4 bits of the mapper number or simply refuse to load the ROM.

Variant comparison

Over the years, the header. There are three discernable generations:

Legacy iNES
Created by Marat and used in very old versions of iNES and in NESticle. ROM conversion and auditing tools tended to store signature strings at offsets 7-15.
iNES
Created by Marat when the scene discovered the diversity of NES cartridge hardware. Used in current versions of iNES; some support in other emulators.
NES 2.0
Created by kevtris for the FPGA Kevtendo and maintained by the NESdev community. Some support in several emulators
Thing Archaic iNES iNES NES 2.0
Byte 7 Unused Mapper high nibble, Vs. Mapper high nibble, NES 2.0 signature, PlayChoice, Vs.
Byte 8 Unused Total WRAM size (linear) Mapper highest nibble, mapper variant
Byte 9 Unused TV system Upper bits of ROM size
Byte 10 Unused Unused WRAM size (logarithmic; battery and non-battery)
Byte 11 Unused Unused VRAM size (logarithmic; battery and non-battery)
Byte 12 Unused Unused TV system
Byte 13 Unused Unused Vs. PPU variant
Mappers supported 0-15 0-255 0-4095

See also

References