View Page Source

Revision (current)
Last Updated by CasualPokePlayer on 12/14/2021 2:49 AM
Back to Page

{{dsm}} is the movie capture format of [EmulatorResources|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


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.%%%
 |c|.............XXX YYY Z|


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], [FAQ|frequently asked questions]