2012-03-23 20:30:31 +00:00
< html >
< head >
< title > NES Scrolling 1< / title >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" >
2012-08-08 15:00:14 +00:00
< meta name = "generator" content = "HelpNDoc Personal Edition 3.6.0.345" >
2012-03-23 20:30:31 +00:00
< link type = "text/css" rel = "stylesheet" media = "all" href = "css/reset.css" / >
< link type = "text/css" rel = "stylesheet" media = "all" href = "css/base.css" / >
< link type = "text/css" rel = "stylesheet" media = "all" href = "css/hnd.css" / >
<!-- [if lte IE 8]>
< link type = "text/css" rel = "stylesheet" media = "all" href = "css/ielte8.css" / >
<![endif]-->
2012-07-01 14:11:24 +00:00
< style type = "text/css" >
#topic_header
{
background-color: #EFEFEF;
}
< / style >
2012-03-23 20:30:31 +00:00
< script type = "text/javascript" src = "js/jquery.min.js" > < / script >
< script type = "text/javascript" src = "js/hnd.js" > < / script >
2012-08-08 15:00:14 +00:00
< script type = "text/javascript" >
2012-03-23 20:30:31 +00:00
if (top.frames.length == 0)
2012-07-01 14:11:24 +00:00
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "fceux.html?" + sTopicUrl;
}
2012-03-23 20:30:31 +00:00
else if (top & & top.FrameTOC & & top.FrameTOC.SelectTocItem)
2012-07-01 14:11:24 +00:00
{
top.FrameTOC.SelectTocItem("NESScrolling1");
}
2012-03-23 20:30:31 +00:00
< / script >
< / head >
< body >
< div id = "topic_header" >
< div id = "topic_header_content" >
< h1 > NES Scrolling 1< / h1 >
< div id = "topic_breadcrumb" >
< a href = "Technicalinformation.html" > Technical Information< / a > › › < a href = "NESProcessor.html" > NES Processing< / a > › › < / div >
< / div >
< div id = "topic_header_nav" >
< a href = "NESProcessor.html" > < img src = "img/arrow_up.png" alt = "Parent" / > < / a >
< a href = "PPU.html" > < img src = "img/arrow_left.png" alt = "Previous" / > < / a >
< a href = "NESScrolling2.html" > < img src = "img/arrow_right.png" alt = "Next" / > < / a >
< / div >
< div class = "clear" > < / div >
< / div >
< div id = "topic_content" >
< p > Subject: [nesdev] the skinny on nes scrolling< / p >
< p > Date: Tue, 13 Apr 1999 16:42:00 -0600< / p >
< p > From: loopy < zxcvzxcv@netzero.net> < / p >
< p > Reply-To: nesdev@onelist.com< / p >
< p > To: nesdev@onelist.com< / p >
2012-08-08 15:00:14 +00:00
< p > < br / > < / p >
2012-03-23 20:30:31 +00:00
< p > From: loopy < zxcvzxcv@netzero.net> < / p >
2012-08-08 15:00:14 +00:00
< p > < br / > < / p >
2012-03-23 20:30:31 +00:00
< p > ---------< / p >
< p > the current information on background scrolling is sufficient for most games;< / p >
< p > however, there are a few that require a more complete understanding.< / p >
2012-08-08 15:00:14 +00:00
< p > < br / > < / p >
2012-03-23 20:30:31 +00:00
< p > here are the related registers:< / p >
< p > (v) vram address, a.k.a. 2006 which we all know and love. (16 bits)< / p >
< p > (t) another temp vram address (16 bits)< / p >
< p > (you can really call them 15 bits, the last isn't used)< / p >
< p > (x) tile X offset (3 bits)< / p >
2012-08-08 15:00:14 +00:00
< p > < br / > < / p >
2012-03-23 20:30:31 +00:00
< p > the ppu uses the vram address for both reading/writing to vram thru 2007,< / p >
< p > and for fetching nametable data to draw the background. as it's drawing the< / p >
< p > background, it updates the address to point to the nametable data currently< / p >
< p > being drawn. bits 0-11 hold the nametable address (-$2000). bits 12-14 are< / p >
< p > the tile Y offset.< / p >
2012-08-08 15:00:14 +00:00
< p > < br / > < / p >
2012-03-23 20:30:31 +00:00
< p > ---------< / p >
< p > stuff that affects register contents:< / p >
< p > (sorry for the shorthand logic but i think it's easier to see this way)< / p >
2012-08-08 15:00:14 +00:00
< p > < br / > < / p >
2012-03-23 20:30:31 +00:00
< p > 2000 write:< / p >
< p > t:0000110000000000=d:00000011< / p >
< p > 2005 first write:< / p >
< p > t:0000000000011111=d:11111000< / p >
< p > x=d:00000111< / p >
< p > 2005 second write:< / p >
< p > t:0000001111100000=d:11111000< / p >
< p > t:0111000000000000=d:00000111< / p >
< p > 2006 first write:< / p >
< p > t:0011111100000000=d:00111111< / p >
< p > t:1100000000000000=0< / p >
< p > 2006 second write:< / p >
< p > t:0000000011111111=d:11111111< / p >
< p > v=t< / p >
< p > scanline start (if background and sprites are enabled):< / p >
< p > v:0000010000011111=t:0000010000011111< / p >
< p > frame start (line 0) (if background and sprites are enabled):< / p >
< p > v=t< / p >
2012-08-08 15:00:14 +00:00
< p > < br / > < / p >
2012-03-23 20:30:31 +00:00
< p > note! 2005 and 2006 share the toggle that selects between first/second< / p >
< p > writes. reading 2002 will clear it.< / p >
2012-08-08 15:00:14 +00:00
< p > < br / > < / p >
2012-03-23 20:30:31 +00:00
< p > note! all of this info agrees with the tests i've run on a real nes. BUT< / p >
< p > if there's something you don't agree with, please let me know so i can verify< / p >
< p > it.< / p >
2012-08-08 15:00:14 +00:00
< p > < br / > < / p >
< p > < br / > < / p >
< p class = "rvps2" > < span class = "rvts13" > Created with the Personal Edition of HelpNDoc: < / span > < a class = "rvts14" href = "http://www.helpndoc.com" > Free EPub and documentation generator< / a > < / p >
2012-03-23 20:30:31 +00:00
< / div >
< div id = "topic_footer" >
< div id = "topic_footer_content" >
2012< / div >
< / div >
< / body >
< / html >