Home

Awesome

PinMAME NVRAM Maps

The goal of this project is to document the contents of the .nv files PinMAME uses to store the contents of a game's non-volatile RAM. At a basic level, it's useful to know how a game stores its high scores so other programs (like a game launcher) can parse and display that information.

Going further and documenting adjustments and audits allows for the development of alternate interfaces (like a web browser) to view audits and change game settings without using the service menu.

This project started in October 2015, and should be considered "alpha" quality. As people map more games, the file format may change to support additional requirements.

I chose to use JSON as a simple yet flexible file format for this project. If necessary, other projects should be able to convert the map files to alternate formats. The JSON website describes the file format and includes links to parsing libraries in many programming languages.

Project home

License

This project is licensed under the GNU Lesser General Public License v3.0 (LGPL). LGPL requires that derived works be licensed under the same license, but works that only link to it do not fall under this restriction.

My intent is for the map files (.nv.json) to remain open and for everyone to benefit from updates, yet allow for their use in closed-source projects with attribution. Please include a GitHub link to the original project (or your fork of it), along with the description, "This program makes use of content from the PinMAME NVRAM Maps project."

Sample Code

My preference is to keep this project dedicated to just the JSON files so other projects can incorporate it as a git submodule.

A related project currently includes a Python program (nvram_parser.py) that works as a standalone application to dump a parsed .nv file, or as a class (ParseNVRAM) you can use from other programs.

Mapping New Games

Start PinMAME and write down all the high scores, and then exit. Open the game's .nv file in a hex editor and search for the initials. It should be possible to find each set of initials, with the corresponding score nearby.

For adjustments, make a list of each setting, its default value, the range of accepted values, and whether certain values have special meaning (like OFF or DISABLED). I make use of a modified version of PinMAME that monitors an address range and dumps any changes it detects to that range. It's a simple matter to change a setting and see the modified location in the NVRAM file.

Audits are a bit more difficult, and I intend to build a tool to modify portions of the NVRAM file to aid in matching audits to file locations. Setting each 6-byte grouping to its starting address should allow for quickly mapping each audit.

File Format

The JSON file is essentially a big dictionary or associative array, with the following key/value pairs. It may help to review one or more of the included files as an example of the file format while reading this section of the documentation.

In cases where this specification isn't clear, please use existing maps or the nvram_parser.py sample as a guide.

Numbers can appear as decimal values (1234) or hexadecimal values inside of strings ("0x4D2"). Most map files will only use hex for file offsets.

Meta Data

Note that keys starting with underscore describe the file itself, and not the contents of the corresponding NVRAM file.

Descriptors

The map file contains objects describing sections of the .nv file and how to interpret them. They're comprised of the following key/value pairs:

File Map

Keys that don't start with an underscore typically have groups of descriptors as their values.

Checksums

The objects used for the last two entries in the file are slightly different from the other descriptors. They have the required start field, require either an end (preferred) or length, and label is optional. They introduce an optional groupings key used to treat a single descriptor as a list of equally-sized groupings.

(On WPC games, the audits are a series of 6-byte entries, each with an 8-bit checksum as the last byte.)

Version History