<!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.0.0.199"> <meta name="viewport" content="width=device-width, initial-scale=1" /> <link rel="icon" href="favicon.ico"/> <title>NES Scrolling 1</title> <meta name="description" content="" /> <meta name="keywords" content=""> <!-- Twitter Card data --> <meta name="twitter:card" content="summary"> <meta name="twitter:title" content="NES Scrolling 1"> <meta name="twitter:description" content=""> <!-- Open Graph data --> <meta property="og:title" content="NES Scrolling 1" /> <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="NESScrolling1" data-hnd-context="34" data-hnd-title="NES Scrolling 1" > <div class="navigation"> <ol class="breadcrumb"> <li><a href="Technicalinformation.html">Technical Information</a></li><li><a href="NESProcessor.html">NES Processing</a></li> </ol> <div class="nav-arrows"> <div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="NESProcessor.html" title="NES Processing" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="PPU.html" title="PPU - 2C02" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="NESScrolling2.html" title="NES Scrolling 2" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div> </div> </div> <a id="main-content"></a> <h2>NES Scrolling 1</h2> <div class="main-content"> <p></p> <p class="rvps2"><span class="rvts6">Subject: [nesdev] the skinny on nes scrolling</span></p> <p class="rvps2"><span class="rvts6">Date: Tue, 13 Apr 1999 16:42:00 -0600</span></p> <p class="rvps2"><span class="rvts6">From: loopy <zxcvzxcv@netzero.net></span></p> <p class="rvps2"><span class="rvts6">Reply-To: nesdev@onelist.com</span></p> <p class="rvps2"><span class="rvts6">To: nesdev@onelist.com</span></p> <p class="rvps2"><span class="rvts6"><br/></span></p> <p class="rvps2"><span class="rvts6">From: loopy <zxcvzxcv@netzero.net></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">the current information on background scrolling is sufficient for most games;</span></p> <p class="rvps2"><span class="rvts6">however, there are a few that require a more complete understanding.</span></p> <p class="rvps2"><span class="rvts6"><br/></span></p> <p class="rvps2"><span class="rvts6">here are the related registers:</span></p> <p class="rvps2"><span class="rvts6"> (v) vram address, a.k.a. 2006 which we all know and love. (16 bits)</span></p> <p class="rvps2"><span class="rvts6"> (t) another temp vram address (16 bits)</span></p> <p class="rvps2"><span class="rvts6"> (you can really call them 15 bits, the last isn't used)</span></p> <p class="rvps2"><span class="rvts6"> (x) tile X offset (3 bits)</span></p> <p class="rvps2"><span class="rvts6"><br/></span></p> <p class="rvps2"><span class="rvts6">the ppu uses the vram address for both reading/writing to vram thru 2007,</span></p> <p class="rvps2"><span class="rvts6">and for fetching nametable data to draw the background. as it's drawing the</span></p> <p class="rvps2"><span class="rvts6">background, it updates the address to point to the nametable data currently</span></p> <p class="rvps2"><span class="rvts6">being drawn. bits 0-11 hold the nametable address (-$2000). bits 12-14 are</span></p> <p class="rvps2"><span class="rvts6">the tile Y offset.</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">stuff that affects register contents:</span></p> <p class="rvps2"><span class="rvts6">(sorry for the shorthand logic but i think it's easier to see this way)</span></p> <p class="rvps2"><span class="rvts6"><br/></span></p> <p class="rvps2"><span class="rvts6">2000 write:</span></p> <p class="rvps2"><span class="rvts6"> t:0000110000000000=d:00000011</span></p> <p class="rvps2"><span class="rvts6">2005 first write:</span></p> <p class="rvps2"><span class="rvts6"> t:0000000000011111=d:11111000</span></p> <p class="rvps2"><span class="rvts6"> x=d:00000111</span></p> <p class="rvps2"><span class="rvts6">2005 second write:</span></p> <p class="rvps2"><span class="rvts6"> t:0000001111100000=d:11111000</span></p> <p class="rvps2"><span class="rvts6"> t:0111000000000000=d:00000111</span></p> <p class="rvps2"><span class="rvts6">2006 first write:</span></p> <p class="rvps2"><span class="rvts6"> t:0011111100000000=d:00111111</span></p> <p class="rvps2"><span class="rvts6"> t:1100000000000000=0</span></p> <p class="rvps2"><span class="rvts6">2006 second write:</span></p> <p class="rvps2"><span class="rvts6"> t:0000000011111111=d:11111111</span></p> <p class="rvps2"><span class="rvts6"> v=t</span></p> <p class="rvps2"><span class="rvts6">scanline start (if background and sprites are enabled):</span></p> <p class="rvps2"><span class="rvts6"> v:0000010000011111=t:0000010000011111</span></p> <p class="rvps2"><span class="rvts6">frame start (line 0) (if background and sprites are enabled):</span></p> <p class="rvps2"><span class="rvts6"> v=t</span></p> <p class="rvps2"><span class="rvts6"><br/></span></p> <p class="rvps2"><span class="rvts6">note! 2005 and 2006 share the toggle that selects between first/second</span></p> <p class="rvps2"><span class="rvts6">writes. reading 2002 will clear it.</span></p> <p class="rvps2"><span class="rvts6"><br/></span></p> <p class="rvps2"><span class="rvts6">note! all of this info agrees with the tests i've run on a real nes. BUT</span></p> <p class="rvps2"><span class="rvts6">if there's something you don't agree with, please let me know so i can verify</span></p> <p class="rvps2"><span class="rvts6">it.</span></p> <p class="rvps2"><span class="rvts6"><br/></span></p> <p class="rvps2"><span class="rvts6"><br/></span></p> <p></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/feature-tour/create-help-files-for-the-qt-help-framework">Qt Help documentation made easy</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>