fceux/FM2.html

167 lines
11 KiB
HTML
Raw Normal View History

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>FM2</title>
<link href="fceux.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="Javascript/buttons.js"></script>
</head>
2009-12-05 00:05:16 +00:00
<body onload="FP_preloadImgs(/*url*/'assets/button67.jpg',/*url*/'assets/button68.jpg',/*url*/'assets/button80.jpg',/*url*/'assets/button81.jpg',/*url*/'assets/button87.jpg',/*url*/'assets/button88.jpg',/*url*/'assets/button92.jpg',/*url*/'assets/button93.jpg',/*url*/'assets/button98.jpg',/*url*/'assets/button99.jpg',/*url*/'assets/button4.jpg',/*url*/'assets/button5.jpg')">
<div id="masthead">
<span class="largerfont">FCEUX<br/></span>The all in one NES/Famicom Emulator
</div>
<div id="top_nav">
2009-12-05 00:05:16 +00:00
<a href="home.html"><img id="img1" alt="Home" height="20" onmousedown="FP_swapImg(1,0,/*id*/'img1',/*url*/'assets/button68.jpg')" onmouseout="FP_swapImg(0,0,/*id*/'img1',/*url*/'assets/button66.jpg')" onmouseover="FP_swapImg(1,0,/*id*/'img1',/*url*/'assets/button67.jpg')" onmouseup="FP_swapImg(0,0,/*id*/'img1',/*url*/'assets/button67.jpg')" src="assets/button66.jpg" style="border: 0" width="100" /><!-- MSComment="ibutton" fp-style="fp-btn: Braided Row 5; fp-bgcolor: #B7B7B7" fp-title="Home" --></a>
<a href="download.html"><img id="img2" alt="Download" height="20" onmousedown="FP_swapImg(1,0,/*id*/'img2',/*url*/'assets/button81.jpg')" onmouseout="FP_swapImg(0,0,/*id*/'img2',/*url*/'assets/button7F.jpg')" onmouseover="FP_swapImg(1,0,/*id*/'img2',/*url*/'assets/button80.jpg')" onmouseup="FP_swapImg(0,0,/*id*/'img2',/*url*/'assets/button80.jpg')" src="assets/button7F.jpg" style="border: 0" width="100" /><!-- MSComment="ibutton" fp-style="fp-btn: Braided Row 5; fp-bgcolor: #B7B7B7" fp-title="Download" --></a>
<a href="documentation.html"><img id="img6" alt="Documentation" height="20" onmousedown="FP_swapImg(1,0,/*id*/'img6',/*url*/'assets/button5.jpg')" onmouseout="FP_swapImg(0,0,/*id*/'img6',/*url*/'assets/button3.jpg')" onmouseover="FP_swapImg(1,0,/*id*/'img6',/*url*/'assets/button4.jpg')" onmouseup="FP_swapImg(0,0,/*id*/'img6',/*url*/'assets/button4.jpg')" src="assets/button3.jpg" style="border: 0" width="100" /><!-- MSComment="ibutton" fp-style="fp-btn: Braided Row 5; fp-bgcolor: #B7B7B7" fp-title="Documentation" --></a>
<a href="version.html"><img id="img3" alt="Versions" height="20" onmousedown="FP_swapImg(1,0,/*id*/'img3',/*url*/'assets/button88.jpg')" onmouseout="FP_swapImg(0,0,/*id*/'img3',/*url*/'assets/button86.jpg')" onmouseover="FP_swapImg(1,0,/*id*/'img3',/*url*/'assets/button87.jpg')" onmouseup="FP_swapImg(0,0,/*id*/'img3',/*url*/'assets/button87.jpg')" src="assets/button86.jpg" style="border: 0" width="100" /><!-- MSComment="ibutton" fp-style="fp-btn: Braided Row 5; fp-bgcolor: #B7B7B7" fp-title="Versions" --></a>
<a href="contact.html"><img id="img4" alt="Contact" height="20" onmousedown="FP_swapImg(1,0,/*id*/'img4',/*url*/'assets/button93.jpg')" onmouseout="FP_swapImg(0,0,/*id*/'img4',/*url*/'assets/button91.jpg')" onmouseover="FP_swapImg(1,0,/*id*/'img4',/*url*/'assets/button92.jpg')" onmouseup="FP_swapImg(0,0,/*id*/'img4',/*url*/'assets/button92.jpg')" src="assets/button91.jpg" style="border: 0" width="100" /><!-- MSComment="ibutton" fp-style="fp-btn: Braided Row 5; fp-bgcolor: #B7B7B7" fp-title="Contact" --></a>
<a href="links.html"><img id="img5" alt="Links" height="20" onmousedown="FP_swapImg(1,0,/*id*/'img5',/*url*/'assets/button99.jpg')" onmouseout="FP_swapImg(0,0,/*id*/'img5',/*url*/'assets/button97.jpg')" onmouseover="FP_swapImg(1,0,/*id*/'img5',/*url*/'assets/button98.jpg')" onmouseup="FP_swapImg(0,0,/*id*/'img5',/*url*/'assets/button98.jpg')" src="assets/button97.jpg" style="border: 0" width="100" /><!-- MSComment="ibutton" fp-style="fp-btn: Braided Row 5; fp-bgcolor: #B7B7B7" fp-title="Links" --></a>
</div>
<div id="container">
<div id="left_col">
</div>
<div id="page_content">
<h1>FM2 Movie file format</h1>
<p>FM2 is the movie capture format of FCEUX</p>
<h2>FM2 file format description</h2>
<p>FCEUX uses a new movie file format - .fm2</p>
<p>This differs from the previous FCE Ultra movie format (.fcm) in the following ways:</p>
2009-12-05 00:05:16 +00:00
<ul>
<li>It is completely text based; allowing easy movie editing/splicing</li>
<li>An imbedded GUID so FCEUX can tell if a savestate belongs to a particular movie file</li>
<li>Movies recorded from Start (Power-on) no longer have a redundant savestate</li>
<li>Contains mouse input for recording the Zapper and Arkanoid Paddle input</li>
</ul>
<p></p>
<h2>Format</h2>
<p>FM2 is ASCII plain text. It consists of several key-value pairs followed by an inputlog section.</p>
<p>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</p>
<p>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.</p>
<p>Integer keys (also used for Booleans, with a 1 or 0) will have a value that is a simple integer not to exceed 32bits</p>
2009-12-05 00:05:16 +00:00
<ul>
<li>version (required) - the version of the movie file format; for now it is always 3</li>
<li>emuVersion (required) - the version of the emulator used to produce the movie</li>
<li>rerecordCount (optional) - the rerecord count</li>
<li>palFlag (bool) (optional) - true if the movie uses pal timing</li>
<li>fourscore (bool) (*note C) - true if a fourscore was used</li>
<li>FDS (bool) (optional) - true if the movie was recording on a Famicom Disk System (FDS) game</li>
2009-12-05 00:05:16 +00:00
<li>port0, port1 (*note C) - indicates the types of input devices. Supported values are:
<ul>
<li>SI_GAMEPAD = 1</li>
<li>SI_ZAPPER = 2 </li>
</ul>
</li>
<li>port2 (required) - indicates the type of the FCExp port device which was attached. Supported values are:
<ul>
<li>SIFC_NONE = 0</li>
</ul>
</li>
</ul>
<h2>Header</h2>
<p>String keys have values that consist of the remainder of the key-value pair line. As a consequence, string values cannot contain newlines.</p>
2009-12-05 00:05:16 +00:00
<ul>
<li>romFilename (required) - the name of the file used to record the movie </li>
<li>comment (optional) - simply a memo.
<ul>
<li>by convention, the first token in the comment value is the subject of the comment.</li>
<li>by convention, subsequent comments with the same subject will have their ordering preserved and may be used to approximate multiline comments.</li>
<li>by convention, the author of the movie should be stored in comment(s) with a subject of: author</li>
</ul>
</li>
2009-12-05 00:05:16 +00:00
<li>subtitle (optional) - a message that will be displayed on screen when movie is played back (unless Subtitles are turned off, see Movie options).
<ul>
<li>by convention, subtitles will begin with the word subtitle</li>
<li>by convention, an integer value will proceed which will indicate the frame that the subtitle will be displayed</li>
<li>by convention, a string of text will follow which will be the string displayed</li>
<li>example:
<ul>
<li>subtitle 1000 Level Two</li>
<li>At frame 1000 the words "Level Two" will be displayed on the screen</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Hex string keys (used for binary blobs) will have a value that is like 0x0123456789ABCDEF... </p>
2009-12-05 00:05:16 +00:00
<ul>
<li>romChecksum (required) - the MD5 hash of the ROM which was used to record the movie </li>
<li>savestate (optional) - a fcs savestate blob, in case a movie was recorded from savestate</li>
</ul>
<p>GUID keys have a value which is in the standard GUID format: 452DE2C3-EF43-2FA9-77AC-0677FC51543B</p>
2009-12-05 00:05:16 +00:00
<ul><li>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.</li></ul>
<h2>Inputlog</h2>
<p>The inputlog section consists of lines beginning and ending with a | (pipe). The fields are as follows, except as noted in note C.</p>
<table border="1">
<tr>
<td>c</td>
<td>port0</td>
<td>port1</td>
<td>port2</td>
</tr>
</table>
<p>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. Current values for this are</p>
2009-12-05 00:05:16 +00:00
<ul><li>MOVIECMD_RESET = 1</li></ul>
<p>The format of port0, port1, port2 depends on which types of devices were attached.</p>
<h4>SI_GAMEPAD</h4>
2009-12-05 00:05:16 +00:00
<ul>
<li>the field consists of eight characters which constitute a bitfield.</li>
<li>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:
<ul><li>RLDUTSBA (Right,Left,Down,Up,sTart,Select,B,A)</li></ul></li>
</ul>
<h4>SI_ZAPPER</h4>
2009-12-05 00:05:16 +00:00
<ul>
<li>XXX YYY B Q Z</li>
<li>XXX: %03d, the x position of the mouse</li>
<li>YYY: %03d, the y position of the mouse</li>
<li>B: %1d, 1 if the mouse button is pressed; 0 if not</li>
<li>Q: %1d, an internal value used by the emulator's zapper code (this is most unfortunate..)</li>
<li>Z: %d, a variable-length decimal integer; an internal value used by the emulator's zapper code (this is even more unfortunate..)</li>
</ul>
<h4>SIFC_NONE</h4>
2009-12-05 00:05:16 +00:00
<ul><li>this field must always be empty</li></ul>
<h3>Notes</h3>
<p>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.</p>
<p>All movies start from power-on, unless a savestate key-value is present</p>
<p>If a fourscore is used, then port0 and port1 are irrelevant and ignored</p>
<p>If fourscore, the input types must all be gamepads
<dd>{player1 player2 player3 player4}</dd>
<dd>
<table border="1">
<tr>
<td>c</td>
<td>ABSTUDLR</td>
<td>ABSTUDLR</td>
<td>ABSTUDLR</td>
<td>ABSTUDLR</td>
<td>port2</td>
</tr>
</table>
</dd>
</p>
<p>If fourscore is not used, then port0 and port1 are <b>required</b></p>
<h2>Emulator framerate constants</h2>
<p>FCEUX uses these framerate constants:</p>
2009-12-05 00:05:16 +00:00
<ul>
<li>NTSC: 1008307711 /256/65536 = 60.099822938442230224609375</li>
<li>PAL : 838977920 /256/65536 = 50.00698089599609375</li>
</ul>
<p></p>
</div>
</div>
<div id="footer">
<a href="home.html">Home</a> | <a href="download.html">Download</a> |
<a href="documentation.html">Documentation</a> | <a href="version.html">
2009-12-04 17:01:40 +00:00
Version History</a> | <a href="contact.html">Contact</a> | <a href="links.html">Links</a>
2009-12-05 00:05:16 +00:00
<br/>We are in no way affiliated or endorsed by Nintendo or Nintendo of America. "Nintendo" is a registered trademark of Nintendo of America Inc.
<br/>©2009 adelikat
</div>
</body>
</html>