472 lines
49 KiB
HTML
472 lines
49 KiB
HTML
|
|
|
|
<!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.9.1.631">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<link rel="icon" href="favicon.ico"/>
|
|
|
|
<title>NES RAM (Mapping/Finding Values)</title>
|
|
<meta name="description" content="" />
|
|
<meta name="keywords" content="2C02 PPU memory map,Game RAM Details,Memory Map,NES Mapping">
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Twitter Card data -->
|
|
<meta name="twitter:card" content="summary">
|
|
<meta name="twitter:title" content="NES RAM (Mapping/Finding Values)">
|
|
<meta name="twitter:description" content="">
|
|
|
|
<!-- Open Graph data -->
|
|
<meta property="og:title" content="NES RAM (Mapping/Finding Values)" />
|
|
<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>
|
|
<style type="text/css">.navigation #inline-toc { width: auto !important}</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="NESRAMMappingFindingValues"
|
|
data-hnd-context="36"
|
|
data-hnd-title="NES RAM (Mapping/Finding Values)"
|
|
>
|
|
|
|
<div class="navigation">
|
|
<ol class="breadcrumb">
|
|
<li><a href="FAQGuides.html">FAQ / Guides</a></li>
|
|
</ol>
|
|
<div class="nav-arrows">
|
|
<div class="btn-group btn-group" role="group"><a class="btn btn-default" href="FAQGuides.html" title="FAQ / Guides" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="ROMHacking.html" title="ROM Hacking" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="Technicalinformation.html" title="Technical Information" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<a id="main-content"></a>
|
|
|
|
<h2>NES RAM (Mapping/Finding Values)</h2>
|
|
|
|
<div class="main-content">
|
|
|
|
<p class="rvps2"><span class="rvts22">NES Mapping</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">This guide gives a map of the addresses in the NES cpu and explains each portion in detail. </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">It also provides information for the basic layout of ram values in typical NES games. This info can be used to quickly map and find useful values in the game's ram.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts17">Contents</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts64">Memory Map</span></p>
|
|
<p class="rvps2"><span class="rvts6"> </span><span class="rvts6">Gives a diagram of the 2A03 CPU memory map .</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts64">2C02 PPU memory map</span></p>
|
|
<p class="rvps2"><span class="rvts6"> </span><span class="rvts6">Gives more detailed info about each section of the Memory map diagram</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts64">Game Ram Details</span></p>
|
|
<p class="rvps2"><span class="rvts6"> </span><span class="rvts6">On board RAM Map ($000-$07FF) Map (gives specific info on the how NES games typically layout their ram values)</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts64">Online Resources</span></p>
|
|
<p class="rvps2"><a class="rvts23" href="http://en.wikibooks.org/wiki/NES_Programming">NES Programming - Wikipedia</a></p>
|
|
<p class="rvps2"><a class="rvts23" href="http://everything2.com/e2node/NES%20memory%20map">NES Memory Map</a></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts17"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts17">Memory Map </span><span class="rvts15">(NES RAM/ROM)</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">2A03 CPU memory map</span></p>
|
|
<p class="rvps2"><span class="rvts6">2A03 CPU is a 6502-compatible CPU without the decimal mode (CLD and SED do nothing). It has an on-die sound generator, very limited DMA capability, and an input device controller that can be accessed through the 2A03 registers.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6"> </span></p>
|
|
<p class="rvps2"><span class="rvts56">6502 CPU Memory Map </span></p>
|
|
<p class="rvps2"><span class="rvts6">Address Range </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Size in bytes</span><span class="rvts6"> </span><span class="rvts6">Notes (Page size = 256bytes)</span></p>
|
|
<p class="rvps2"><span class="rvts20">(Hexadecimal)</span><span class="rvts20"> </span><span class="rvts20"> </span><span class="rvts20"> </span><span class="rvts20"> </span><span class="rvts20"> </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">$0000 - $07FF</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">2048</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Game Ram</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">($0000 - $00FF)</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">256 </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Zero Page - Special Zero Page addressing modes give faster memory read/write access</span></p>
|
|
<p class="rvps2"><span class="rvts6">($0100 - $01FF)</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">256 </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Stack memory</span></p>
|
|
<p class="rvps2"><span class="rvts6">($0200 - $07FF)</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">1536 </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">RAM</span></p>
|
|
<p class="rvps2"><span class="rvts20"> </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">$0800 - $0FFF </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">2048 </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Mirror of $0000-$07FF </span><span class="rvts6"> </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">($0800 - $08FF)</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">256 </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6"> Zero Page</span></p>
|
|
<p class="rvps2"><span class="rvts6">($0900 - $09FF) </span><span class="rvts6"> </span><span class="rvts6">256 </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Stack</span></p>
|
|
<p class="rvps2"><span class="rvts6">($0A00 - $0FFF)</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">1024</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Ram</span></p>
|
|
<p class="rvps2"><span class="rvts20"> </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">$1000 - $17FF</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">2048 bytes</span><span class="rvts6"> </span><span class="rvts6">Mirror of $0000-$07FF</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">($1000 - $10FF)</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">256</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Zero Page</span></p>
|
|
<p class="rvps2"><span class="rvts6">$1100 - $11FF</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">256</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Stack</span></p>
|
|
<p class="rvps2"><span class="rvts6">$1200 - $17FF </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">1024</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">RAM</span></p>
|
|
<p class="rvps2"><span class="rvts20"> </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">$1800 - $1FFF </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">2048 bytes </span><span class="rvts6"> </span><span class="rvts6">Mirror of $0000-$07FF </span><span class="rvts6"> </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">($1800 - $18FF)</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">256</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Zero Page</span></p>
|
|
<p class="rvps2"><span class="rvts6">($1900 - $19FF)</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">256</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Stack</span></p>
|
|
<p class="rvps2"><span class="rvts6">($1A00 - $1FFF) </span><span class="rvts6"> </span><span class="rvts6">1024</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">RAM</span></p>
|
|
<p class="rvps2"><span class="rvts20"> </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">$2000 - $2007 </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">8 bytes </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Input / Output registers</span></p>
|
|
<p class="rvps2"><span class="rvts6">$2008 - $3FFF </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">8184 bytes </span><span class="rvts6"> </span><span class="rvts6">Mirror of $2000-$2007 (mulitple times)</span></p>
|
|
<p class="rvps2"><span class="rvts20"> </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">$4000 - $401F </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">32 bytes </span><span class="rvts6"> </span><span class="rvts6">Input / Output registers</span></p>
|
|
<p class="rvps2"><span class="rvts6">$4020 - $5FFF </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">8160 bytes </span><span class="rvts6"> </span><span class="rvts6">Expansion ROM - Used with Nintendo's MMC5 to expand the capabilities of VRAM.</span></p>
|
|
<p class="rvps2"><span class="rvts20"> </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">$6000 - $7FFF </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">8192 bytes </span><span class="rvts6"> </span><span class="rvts6">SRAM - Save Ram used to save data between game plays.</span></p>
|
|
<p class="rvps2"><span class="rvts20"> </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">$8000 - $BFFF </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">16384 bytes </span><span class="rvts6"> </span><span class="rvts6">PRG-ROM lower bank - executable code</span></p>
|
|
<p class="rvps2"><span class="rvts6">$C000 - $FFFF </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">16384 bytes </span><span class="rvts6"> </span><span class="rvts6">PRG-ROM upper bank - executable code</span></p>
|
|
<p class="rvps2"><span class="rvts6">$FFFA - $FFFB </span><span class="rvts6"> </span><span class="rvts6">2 bytes </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Address of Non Maskable Interrupt (NMI) handler routine</span></p>
|
|
<p class="rvps2"><span class="rvts6">$FFFC - $FFFD </span><span class="rvts6"> </span><span class="rvts6">2 bytes </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Address of Power on reset handler routine</span></p>
|
|
<p class="rvps2"><span class="rvts6">$FFFE - $FFFF </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">2 bytes </span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">Address of Break (BRK instruction) handler routine</span></p>
|
|
<p class="rvps2"><span class="rvts20"> </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="rvts17">2C02 PPU memory map</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">2C02 PPU is a character generator with sprites, designed by Nintendo specifically for the NES.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6"> __________________________________________</span></p>
|
|
<p class="rvps2"><span class="rvts6">0000| Pattern table 0 |</span></p>
|
|
<p class="rvps2"><span class="rvts6"> |__________________________________________|</span></p>
|
|
<p class="rvps2"><span class="rvts6">1000| Pattern table 1 |</span></p>
|
|
<p class="rvps2"><span class="rvts6"> |__________________________________________| _____ _____</span></p>
|
|
<p class="rvps2"><span class="rvts6">2000| Nametable 0 | | | |</span></p>
|
|
<p class="rvps2"><span class="rvts6"> |__________________________________________| | 0 | 1 |</span></p>
|
|
<p class="rvps2"><span class="rvts6">2400| Nametable 1 | |_____|_____|</span></p>
|
|
<p class="rvps2"><span class="rvts6"> |__________________________________________| | | |</span></p>
|
|
<p class="rvps2"><span class="rvts6">2800| Nametable 2 | | 2 | 3 |</span></p>
|
|
<p class="rvps2"><span class="rvts6"> |__________________________________________| |_____|_____|</span></p>
|
|
<p class="rvps2"><span class="rvts6">2c00| Nametable 3 |</span></p>
|
|
<p class="rvps2"><span class="rvts6"> |__________________________________________|</span></p>
|
|
<p class="rvps2"><span class="rvts6">3000| Mirror of $2000-$2eff |</span></p>
|
|
<p class="rvps2"><span class="rvts6"> |__________________________________________|</span></p>
|
|
<p class="rvps2"><span class="rvts6">3f00| Palette |</span></p>
|
|
<p class="rvps2"><span class="rvts6"> |__________________________________________|</span></p>
|
|
<p class="rvps2"><span class="rvts6">3f20| Mirrors of $3f00-$3f1f |</span></p>
|
|
<p class="rvps2"><span class="rvts6"> |__________________________________________|</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">The NES PPU has enough RAM for two nametables (0 and 3); it brings some PPU nametable address lines to the cart edge so that the cart can decide whether to map 0 onto 2 and 1 onto 3 (vertical mirroring as in Super Mario Brothers and Contra) or 0 onto 1 and 2 onto 3 (horizontal mirroring as in Kid Icarus and Ikari), all screens to either 0 or 3 (as in many Rare games such as Battletoads and Jeopardy!), or all screens to RAM on the cartridge (as in Gauntlet). Split-screen games that scroll in all four directions (such as Super Mario Brothers 3 and Kirby's Adventure) often use vertical or one-screen mirroring (with a small amount of screen corruption at the sides due to tiles wrapping around the sides) and stick the status bar in some random unused area of the screen. </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="rvts17">Game RAM Details</span></p>
|
|
<p class="rvps2"><span class="rvts6"> </span><span class="rvts6">Mapping RAM/Finding Ram</span></p>
|
|
<p class="rvps2"><span class="rvts6"> </span><span class="rvts6">Written by: adelikat</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">This guide is written specifically for finding useful values for TAS </span><a class="rvts23" href="MovieRecording.html">movie making</a><span class="rvts6">. </span></p>
|
|
<p class="rvps2"><span class="rvts6">It does not tell you how to use specific tools to find values. For that refer to </span><a class="rvts23" href="HexEditor.html">Hex editor</a><span class="rvts6">, </span><a class="rvts23" href="CheatSearch.html">Cheat Search</a><span class="rvts6">, and </span><span class="rvts23">RAM filter</span><span class="rvts6">.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">Most games use the basic on board ram. The address range of this ram is $0000-$07FF. This translates to 2048 possible ram values.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts64">Pages</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">This ram is broken down into 8 pages. A "page" is a block of 256 ram values.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">I will refer to these values as such:</span></p>
|
|
<p class="rvps2"><span class="rvts6">Block 0</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">$00xx</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">($0000-$00FF)</span></p>
|
|
<p class="rvps2"><span class="rvts6">Block 1</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">$01xx</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">($0100-$01FF)</span></p>
|
|
<p class="rvps2"><span class="rvts6">Block 2</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">$02xx</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">($0200-$02FF)</span></p>
|
|
<p class="rvps2"><span class="rvts6">Block 3</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">$03xx</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">($0300-$03FF)</span></p>
|
|
<p class="rvps2"><span class="rvts6">Block 4</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">$04xx</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">($0400-$04FF)</span></p>
|
|
<p class="rvps2"><span class="rvts6">Block 5</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">$05xx</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">($0500-$05FF)</span></p>
|
|
<p class="rvps2"><span class="rvts6">Block 6</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">$06xx</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">($0600-$06FF)</span></p>
|
|
<p class="rvps2"><span class="rvts6">Block 7</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">$07xx</span><span class="rvts6"> </span><span class="rvts6"> </span><span class="rvts6">($0700-$07FF)</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">Each block will be organized will similar data. For instance, all sprite data will be in the same block. Enemy/Player statistics (energy, coordinates, speed, etc.) will be in another. For instance, if you find the main character's HP and it is located in block 3, you know that the remaining stats for the character are also in that block. This can significantly cut down time when trying to find related values.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">There are always the following blocks:</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts49">Sprite Data</span><span class="rvts49"> </span><span class="rvts49"> </span><span class="rvts6">Block 2</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">I've yet to see map a game that does not use this block solely for sprite data. It will contain the "ID" numbers for all the items currently on the screen. Simply put, this data is precisely the data you see on the screen. For making TAS movies this is not useful data. If you are using cheat search and have narrowed it down your search to a few values, you can immediately discard any $02xx values.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">In games with a lot of sprite data, I've seen blocks 1 & 3 also reserved for sprite data.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts49">Music & Sound FX</span><span class="rvts49"> </span><span class="rvts6">Block 1 or 7, generally</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">This one has more deviation, but almost all games reserve an entire block for memory allocated to the game's Music and Sound FX. Again, for TAS purposes these values are not *useful. By finding even 1 of these values, you can eliminate that block from your search possibilities. Finding which block is reserved for music is often quite simple with the </span><a class="rvts23" href="HexEditor.html">Hex editor</a><span class="rvts6">. Watching the ram values with the game playing, you can see which addresses "move to the beat". </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">*Actually they can come in handy for "dancing to the beat"</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts49">Player & Enemy Stats</span><span class="rvts6"> </span><span class="rvts6">Blocks 1,3,4,5 generally (any or all of these)</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">This is your "sweet spot" for movie making, as often you will be wanting to track the players speed or coordinates, enemy energy, or enemy coordinates.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">These values rarely (if at all) reside outside blocks 1, 3, 4, or 5. This knowledge already reduces your search possibilities in half!</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts64">Rows </span></p>
|
|
<p class="rvps2"><span class="rvts64"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">Each block is broken down into 16 "rows" of addresses. For example, in block 3, the first row is $030x ($0300-$030F).</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">Each row of 16* will contain similar data. For instance all x coordinates will generally be in the same row. So xxx0 might be the main characters x position. xxxx1 would be "enemy 1" (1st enemy loaded onto the screen), and so on.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">The y coordinates would be in another row, x subpixel values in yet another row, etc.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">*Super Mario Bros. 2 (U) is a rare example that uses rows of 10</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts64">Columns</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">A column would be all the values of a block that share the same last digit. So a column would be 16 addresses such as $0300, $0310, $0320, etc.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">For enemy/player stats, columns usually refer to the same player or enemy.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">So for example, if a player's energy was stored in $0300. The remaining row will be other player/enemy's energy. </span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">If the next row ($031x) is x positions. $0310 would be the player's x position. The remaining positions of that row would correspond to the other player/enemy x positions in line with the hp values of the previous row.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts64">Example</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">These distinctions are easier to see in a visual example. This is the enemy/player stats as they are mapped in the game </span><span class="rvts44">Teenage Mutant Ninja Turtles</span><span class="rvts6">.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts49">Block 4</span></p>
|
|
<p class="rvps2"><span class="rvts120"> </span><span class="rvts120"> </span><span class="rvts120"> P W1 W2 W3 E1 E2 E3 E4 E5 E6 E7 E8 X X X X </span></p>
|
|
<p class="rvps2"><span class="rvts43">Sprite ID: 040x: 09 00 00 00 00 9E 9E 9E 9E 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">ID counter: 041x: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">Timer/sp change: 042x: 02 00 00 00 00 03 03 03 03 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">hit animation: 043x: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">characteristics: 044x: 00 00 00 00 00 8D 8D 8D 8D 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">characteristics: 045x: C2 00 00 00 00 C2 C2 C3 C3 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">Y position: 046x: 4C 00 00 00 00 B4 B4 64 B4 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">Y subpixel: 047x: 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">X position: 048x: 50 00 00 00 00 79 B9 CC CC 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">X subpixel: 049x: 80 00 00 00 00 C0 C0 C0 00 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">Not used: 04ax: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">Y pix speed: 04bx: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">Y subpix speed: 04cx: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">Not used: 04dx: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">X pix speed: 04ex: 00 00 00 00 00 01 01 FE FE 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts43">X subpix speed: 04fx: 00 00 00 00 00 60 60 A0 A0 00 00 00 00 00 00 00</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">P = current turtle (player)</span></p>
|
|
<p class="rvps2"><span class="rvts6">W = weapon (up to 3 on the screen at one time)</span></p>
|
|
<p class="rvps2"><span class="rvts6">E = enemy (up to 8 on the screen at one time)</span></p>
|
|
<p class="rvps2"><span class="rvts6">X = no use</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">E1 = "Enemy slot 1" which will be the first enemy on the screen loaded into memory. The 2nd will be placed in "Enemy slot 2". When enemy 1 is removed from memory (killed or goes off screen), the next enemy will be loaded into that slot. Enemy's always take the lowest available slot when loaded. Note: usually enemy slots are in reverse order. So the first addresses is usually the last enemy slot loaded into memory. TMNT is an exception.</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">All object (player, weapon, enemy) characteristics reside in block 4.</span></p>
|
|
<p class="rvps2"><span class="rvts6">Each row is a different characteristic of each object on the screen (040x refers to a sprite ID of an object)</span></p>
|
|
<p class="rvps2"><span class="rvts6">Each column corresponds to a specific object on the screen. (All 04x0 's refer to the player).</span></p>
|
|
<p class="rvps2"><span class="rvts6"><br/></span></p>
|
|
<p class="rvps2"><span class="rvts6">See also, </span><a class="rvts23" href="MemoryWatch.html">Memory Watch</a><span class="rvts6">, </span><a class="rvts23" href="HexEditor.html">Hex Editor</a><span class="rvts6">,</span><a class="rvts23" href="CheatSearch.html"> Cheat Search</a><span class="rvts6">, </span><span class="rvts23">Ram Filter</span><span class="rvts6">, </span><a class="rvts23" href="MovieRecording.html">Movie Making</a><span class="rvts6">, </span><a class="rvts23" href="ToolAssistedSpeedruns.html">Tool Assisted Speedruns</a></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">Easy CHM and documentation editor</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({
|
|
searchEngineMinChars: 3
|
|
});
|
|
// Update translations
|
|
hnd_ut(app);
|
|
// Instanciate imageMapResizer
|
|
imageMapResize();
|
|
// Custom JS
|
|
|
|
// Boot the app
|
|
app.Boot();
|
|
});
|
|
</script>
|
|
|
|
|
|
|
|
</body>
|
|
|
|
</html>
|
|
|