dsm
is the movie capture format of DeSmuMe, a Nintendo DS emulator.
DSM file format description
- It is completely text based; allowing easy movie editing/splicing
- An embedded GUID so DeSmuMe can tell if a savestate belongs to a movie file
- Records stylus input
Format
DSM is ascii plain text. It is derived from the FCEUX FM2 format.
It consists of several key-value pairs followed by an inputlog section.
The inputlog section can be identified by its starting with a | (pipe).
The inputlog section terminates at eof.
Newlines may be \r\n or \n
Key-value pairs consist of a key identifier, followed by a space separator, followed by the value text. Value text is always terminated by a newline, which the value text will not include. The value text is parsed differently depending on the type of the key. The key-value pairs may be in any order, except that the first key must be version.
Integer keys (also used for booleans, with a 1 or 0) will have a value that is a simple integer not to exceed 32bits
- version (required) - the version of the movie file format; for now it is always 3
- emuVersion (required) - the version of the emulator used to produce the movie
- rerecordCount (optional) - the rerecord count
Header
String keys have values that consist of the remainder of the key-value pair line. As a consequence, string values cannot contain newlines.
- romFilename (required) - the name of the file used to record the movie
- comment (optional) - simply a memo.
- by convention, the first token in the comment value is the subject of the comment.
- by convention, subsequent comments with the same subject will have their ordering preserved and may be used to approximate multiline comments.
- by convention, the author of the movie should be stored in comment(s) with a subject of: author
Hex string keys (used for binary blobs) will have a value that is like 0x0123456789ABCDEF...
- romChecksum (required) - this is currently unused.
GUID keys have a value which is in the standard guid format: 452DE2C3-EF43-2FA9-77AC-0677FC51543B
- guid (required) - a unique identifier for a movie, generated when the movie is created, which is used when loading a savestate to make sure it belongs to the current movie.
Header sync information
The following keys are used (0.9.6 and later) to check sync:
- useExtBios - External BIOS, 0 if not used.
- advancedTiming - Advanced timing, 0 if not used.
- useExtFirmware - External Firmware, 0 if not used.
- firmNickname - Firmware Nickname.
- firmMessage - Firmware Message.
- firmFavColour - Firmware favorite color (0-15).
- firmBirthMonth - Firmware birth month (1-12).
- firmBirthDay - Firmware birth day (1-31).
- firmLanguage - Firmware language (0-5).
- rtcStart - Real Time Clock, default is
2009-01-01T00:00:00Z
.
Inputlog
The inputlog section consists of lines beginning and ending with a | (pipe).
The fields are as follows, except as noted in note C.
The fields are as follows, except as noted in note C.
|c|.............XXX YYY Z|
'R','L','D','U','T','S','B','A','Y','X','W','E','G'
Field c is a variable length decimal integer which is a bitfield corresponding to miscellaneous input states which are valid at the start of the frame.
- microphone input
- reset
- lid switch
The format of the main section is as follows:
- the field begins with 13 characters which constitute a bitfield.
- any character other than ' ' or '.' means that the button was pressed.
- by convention, the following mnemonics will be used in a column to remind us of which button corresponds to which column:
- RLDUTSBAYXWEG (Right,Left,Down,Up,selecT,Start,B,A,Y,X,lshoulder,rshoulder,debuG)[1]
- This ordering is based on FCEUX to a certain extent, and arbitrary after that.
- W and E were chosen for shoulders to suggest West and East for Left and Right.
- The emulator also allows the actions 'lid', 'blow', and 'reset', which are supported (as commands) in movies.
- XXX: %03d, the x position of the stylus (0,0 topleft, 255,191 bottomright)
- YYY: %03d, the y position of the stylus
- Z: %1d, 1 if the stylus is pressed; 0 if not
Additional fields after this main section may be added later without breaking the file format.
Notes
- There is no key-value pair that indicates the length of the movie. This must be read by scanning the inputlog and counting the number of lines.
- All movies start from power-on.
- The emulator uses these framerate constants
- arm7_cycles_per_frame = 560190
- frames_per_second = 59.8261
[1]: This order is intended to have sTart before Select, but due to a bug in DeSmuMe these are effectively reversed.
See also: EmulatorResources, frequently asked questions