代码拉取完成,页面将自动刷新
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="generator" content="HelpNDoc Personal Edition 7.3.0.348">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="favicon.ico"/>
<title>Code/Data Logger</title>
<meta name="description" content="" />
<meta name="keywords" content="Code/Data Logger">
<!-- Twitter Card data -->
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Code/Data Logger">
<meta name="twitter:description" content="">
<!-- Open Graph data -->
<meta property="og:title" content="Code/Data Logger" />
<meta property="og:type" content="article" />
<meta property="og:description" content="" />
<meta property="og:site_name" content="FCEUX Help" />
<!-- Bootstrap core CSS -->
<link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head>
<body class="md-nav-expanded">
<div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>FCEUX Help</h1>
</header>
<nav id="panel-left" class="md-nav-expanded">
<!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="CodeDataLogger"
data-hnd-context="39"
data-hnd-title="Code/Data Logger"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="Debug.html">Debug</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group" role="group"><a class="btn btn-default" href="Debug.html" title="Debug" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="TraceLogger.html" title="Trace Logger" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="GameGenieEncoderDecoder.html" title="Game Genie Encoder/Decoder" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>Code/Data Logger</h2>
<div class="main-content">
<p class="rvps2"><span class="rvts22">代码数据日志(Code/Data Logger)</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts21">简介Introduction</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">Code/Data Logger可以很方便的逆向NES的ROMS文件.最为简单的原因是NES返回去无法区分可执行的代码和可读取的数据.而Code/Data Logger会跟踪游戏过程触发的指令的执行和数据的读取,然后将代码和数据保存到一个.cdl文件,通过一个掩位码 </span><span class="rvts45">mask</span><span class="rvts6"> 区分ROM中的代码和数据.这个文件可以配合合适的反汇编器处理真正的游戏代码,最终得到一个代码和数据分离的干净的源代码.</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts21">使用记录器 Using the Code/Data Logger</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">Code/Data Logger会跟踪ROM的每个字节,然后区分代码和数据.</span></p>
<p class="rvps2"><span class="rvts6">可以将日志功能和其他功能配合使用:</span></p>
<ul style="text-indent: 0px; padding: 0; margin: 0 0 0 24px; list-style-position: outside; list-style-type: disc;">
<li class="rvps2"><span class="rvts6">与调试器</span><a class="rvts90" href="Debugger.html">Debugger</a><span class="rvts6"> 配合,查看代码的分支执行情况</span></li>
<li class="rvps2"><span class="rvts6">与追踪器</span><a class="rvts90" href="TraceLogger.html">Trace Logger</a><span class="rvts6">配合记录选取的代码</span></li>
<li class="rvps2"><span class="rvts6">与PPU查看器</span><a class="rvts90" href="PPUViewer.html">PPU Viewer</a><span class="rvts6">配合来查看界面显示的内容</span></li>
<li class="rvps2"><span class="rvts6">与十六进制编辑器</span><a class="rvts90" href="HexEditor.html">Hex Editor</a><span class="rvts6">配合提供更为智能的代码高亮 (so you can observe which bytes are used by the game and how/when they are used)</span></li>
<li class="rvps2"><span class="rvts6">与贴图查看器配合,combine with (an external) Tile Viewer to see which graphics was used during certain play session, and which was not</span></li>
<li class="rvps2"><span class="rvts6">与ROM Corruptor配合 combine with (an external) ROM Corruptor to make it only corrupt data, but not code</span></li>
<li class="rvps2"><span class="rvts6">与其它反汇编器配合 分离代码和数据combine with (an external) Disassembler to help it separate code from data</span></li>
</ul>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">如上所示,是一项非常有用的工具,可以用来查找特定的数据或者查看代码的指向.可以给调试器提供更为直观的体验,轻松区分出哪些分支会执行哪些不会 It also makes debugging work more visual, since you can always see which lines of the disassembled code were executed and which weren't.</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">另外,记录器运行时,代码编辑器</span><a class="rvts90" href="HexEditor.html">Hex Editor</a><span class="rvts6">会高亮代码和数据内容:</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">For PRG ROM:</span></p>
<p class="rvps2"><span class="rvts82">Dark-yellow</span><span class="rvts6"> - the byte is code</span></p>
<p class="rvps2"><span class="rvts83">Blue</span><span class="rvts6"> - the byte is data</span></p>
<p class="rvps2"><span class="rvts84">Cyan</span><span class="rvts6"> - the byte is PCM audio data</span></p>
<p class="rvps2"><span class="rvts81">Green</span><span class="rvts6"> - the byte is both code and data</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">For CHR ROM:</span></p>
<p class="rvps2"><span class="rvts85">Yellow</span><span class="rvts6"> - the byte was rendered</span></p>
<p class="rvps2"><span class="rvts86">Light-blue</span><span class="rvts6"> - the byte was read programmatically</span></p>
<p class="rvps2"><span class="rvts87">Light-green</span><span class="rvts6"> - the byte was both rendered and read programmatically</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">Code/Data Logger可以被用来输出干净的NESROM.</span></p>
<p class="rvps2"><span class="rvts6">"Stripped" NES ROM是一个ROM文件,其中包含有用的代码和数据.可以在编辑器和贴图查看器查看游戏过程使用过的内容.另外可以通过游玩感兴趣的部分产生对应的记录ROM.</span></p>
<p class="rvps2"><span class="rvts45">使用指南 Example of such usage:</span></p>
<p class="rvps2"><span class="rvts6">1.打开记录器,点击`Start`开始记录.</span></p>
<p class="rvps2"><span class="rvts6">2. Perform a soft and a hard reset while logging, in order to capture the ROM's startup sequence. If you don't do so, you can distribute a save-state file so they will start from within the game.</span></p>
<p class="rvps2"><span class="rvts6">3. If the game has Save-RAM (e.g. Zelda), you will need to capture the game's Save-RAM initialization routines; you can try to do so by deleting the game's *.sav file and then perform a soft and hard reset again while logging.</span></p>
<p class="rvps2"><span class="rvts6">4. Play through whatever levels you want present in the demo ROM. Be sure to perform every move, get every item, etc., so that the code and data necessary for those things are logged. If, for example, you fail to perform some special move, and then someone plays the stripped ROM and attempts to perform that move, the game may very well crash or glitch up, because there are zeros in the stripped ROM instead of the code responsible for handling this special move.</span></p>
<p class="rvps2"><span class="rvts6">5. Save the stripped NES ROM.</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">Alternatively, you can save Unused Data (a ROM which is the opposite to the Stripped ROM). For example, you can play through the game, then save Unused Data ROM and watch it in a Tile Viewer to find unused graphics (possibly stumble upon secrets and easter eggs).</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">Note: When you "Load" another .cdl file, it does not clear the current log; instead, it combines ("arithmetical OR") it with the information in the file. This can be useful if you're trying to obtain a complete log of certain game, as multiple people can play through the game and keep own code/data logs, and then the results can be combined into an all-encompassing log. But if you would like to actually clear the code/data log, press the "Reset Log" button.</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">CDL文件是一个ROM的掩码记录,与ROM具有相同的大小,每个字节对应ROM的响应字节.其中的二进制格式是:</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">RPG的ROM:</span></p>
<div class="rvps2">
<table width="256" border="1" cellpadding="1" cellspacing="1" style="border-color: #000000; border-style: solid; border-spacing: 1px;">
<tr valign="middle">
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">x</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">P</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">d</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">c</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">A</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">A</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">D</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">C</span></p>
</td>
</tr>
</table>
</div>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6"></span><span class="rvts6"> </span></p>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6">C = 是否作为代码.</span></p>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6">D = 是否作为数据.</span></p>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6">AA = bank的编号:</span></p>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6">00 = $8000-$9FFF</span><span class="rvts6"> </span><span class="rvts6">01 = $A000-$BFFF</span></p>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6">10 = $C000-$DFFF</span><span class="rvts6"> </span><span class="rvts6">11 = $E000-$FFFF</span></p>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6">c = 是否作为代码被间接访问.</span></p>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6">(e.g. as the destination of a JMP ($nnnn) instruction)</span></p>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6">d = 是否作为数据被间接访问.</span></p>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6">(e.g. as the destination of an LDA ($nn),Y instruction)</span></p>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6">P = 是否作为PCM格式的音频数据</span></p>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"> </span><span class="rvts6">x = 未使用 unused.</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">CHR ROM For CHR ROM:</span></p>
<div class="rvps2">
<table width="256" border="1" cellpadding="1" cellspacing="1" style="border-color: #000000; border-style: solid; border-spacing: 1px;">
<tr valign="middle">
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">x</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">x</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">x</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">x</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">x</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">x</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">R</span></p>
</td>
<td valign="middle" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps3"><span class="rvts6">D</span></p>
</td>
</tr>
</table>
</div>
<p class="rvps2"><span class="rvts6"> </span><span class="rvts6"> </span></p>
<p class="rvps2"><span class="rvts6"> </span><span class="rvts6">D = 是否被渲染过</span></p>
<p class="rvps2"><span class="rvts6"> </span><span class="rvts6">R = 是否经$2007读取过 Whether it was read programmatically using port $2007</span></p>
<p class="rvps2"><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">(e.g. Argus_(J).nes checks if the bankswitching works by reading the same byte of CHR data before and after switching)</span></p>
<p class="rvps2"><span class="rvts6"> </span><span class="rvts6">x = unused.</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">CDL是的以前难以实现的事情成为可能.首先,PCM数据可以通过P位分离出来.另外还可以仅仅输出数据内容通过D位.更为常见的是,吉利区可以发现游戏中更为有趣的内容.另一个有趣的可能就是NSF文件的操作. It should be noted that this capability, though tested and working on private builds, is detrimental to the process of fixing broken NSF files. For this reason, data logging is allowed for NSF files, but stripping NSF files of unused data is disabled.</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">Code/Data Logger记录器成为最为有用的工具用来创建游戏源代码,配合IDA和其他反汇编器.可以通过自定义的IDC脚本通过MakeCode()/MakeData()区分代码和数据,然后反汇编数据中的代码. Making full and working/reassemblable disassembly becomes really easy this way.</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"></span><span class="rvts6"></span></p>
<p class="rvps4" style="clear: both;"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="https://www.helpndoc.com/create-epub-ebooks">Free EPub producer</a></p>
</div>
<div id="topic_footer"><div id="topic_footer_content">2020</div></div>
</div> <!-- /#topic-content -->
</article>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。