【譯制】紅白機(jī)NTSC制式PPU——Ricoh 2C02技術(shù)參考(第一部分)
紅白機(jī)NTSC制式PPU
——Ricoh 2C02技術(shù)參考

Brad Taylor(BTTDgroup@hotmail.com)
譯者:某科學(xué)的小姚同志(bilibili@某科學(xué)的小姚同志)
第五版,2004年4月23日,譯者修正了一些錯(cuò)誤
譯者技術(shù)及翻譯水平有限,若有錯(cuò)誤懇請(qǐng)大家指正!
向NES開(kāi)發(fā)社區(qū)致謝,網(wǎng)址:http://nesdev.parodius.com
Neal Tew提供了關(guān)于屏幕卷動(dòng)(Scrolling)的信息,向他表示特別感謝!
推薦文獻(xiàn):任天堂PPU的專(zhuān)利文件(U.S.#4,824,106)
?
注意:為了正確顯示該文檔,您的文本閱讀器應(yīng)該能夠:
1、支持傳統(tǒng)VGA文本模式顯示,具有含256個(gè)字符的字符集,能顯示線(xiàn)條畫(huà)字符;
2、支持自動(dòng)換行,將字體切換為終端風(fēng)格的Windows記事本程序能輕松滿(mǎn)足這兩項(xiàng)要求

在下文中,將會(huì)討論
2C02內(nèi)部集成部件列表
2C02引腳命名法和信號(hào)描述
2C02的編程模型
視頻信號(hào)的產(chǎn)生
PPU的基本時(shí)序
PPU的其他雜項(xiàng)信息
PPU的顯存訪問(wèn)周期
幀渲染細(xì)節(jié)
掃描線(xiàn)渲染細(xì)節(jié)
畫(huà)面內(nèi)精靈(Sprite/Object)的判定
背景渲染流水線(xiàn)的細(xì)節(jié)
精靈樣式(Pattern)的取出和渲染細(xì)節(jié)
關(guān)于那些“多一個(gè)周期”的幀
MMC3的掃描線(xiàn)計(jì)數(shù)器
PPU像素優(yōu)先級(jí)的一些”怪事“(BUGs)
PPU屏幕卷動(dòng)和尋址簡(jiǎn)述

內(nèi)部集成部件列表?
- 控制寄存器和雜項(xiàng)寄存器
- 像素和掃描線(xiàn)計(jì)數(shù)器
- 彩色突發(fā)信號(hào)(Colorburst)發(fā)生器
- 顯存(VRAM)地址鎖存和計(jì)數(shù)器
- VRAM地址緩沖器,也稱(chēng)圖塊(Tile)索引字節(jié)
- VRAM讀寫(xiě)緩沖器
- 精靈屬性?xún)?nèi)存(OAM,Object Attribute Memory)
- OAM指針寄存器/計(jì)數(shù)器
- OAM臨時(shí)內(nèi)存和掃描線(xiàn)比較器
- 精靈垂直和水平翻轉(zhuǎn)邏輯
- 精靈像素緩沖器
- 背景像素緩沖器
- 多路復(fù)用器
- 系統(tǒng)調(diào)色板ROM和用戶(hù)調(diào)色板RAM
- 屏幕卷動(dòng)寄存器和計(jì)數(shù)器
- 電平譯碼器/相位(Phase)選擇器/數(shù)模轉(zhuǎn)換器(DAC)
- 地址/數(shù)據(jù)引腳復(fù)用字節(jié)指針觸發(fā)器

2C02引腳命名法和信號(hào)描述
???????????????? ___ ? ? ?? ___
??????? ? ? ? ? |? * ? ? \/? ? ? ? |
R/W? >01]???? ? ? ? ? ?? ? [40<? VCC
?? D0? [02]?????? ? ? ? ? ?? [39>? ALE
??? D1? [03]???? ? ? ? ? ? ? [38]? AD0
??? D2? [04]?? ? ? ? ? ? ??? [37]? AD1
??? D3? [05]??? ? ? ? ? ? ?? [36]? AD2
??? D4? [06]???? ? ? ? ? ? ? [35]? AD3
??? D5? [07]???? ? ? ? ? ? ? [34]? AD4
??? D6? [08]????? ? ? ? ? ?? [33]? AD5
??? D7? [09]?? ? ? ? ? ? ? ? [32]? AD6
??? A2? >10]??? 2C02 ?? [31]? AD7
???? A1? >11]????????????????? [30>? A8
??? A0? >12]??? ? ? ? ? ? ?? [29>? A9
?? /CS? >13]???? ? ? ? ? ? ? [28>? A10
?EXT0? [14]??? ? ? ? ? ? ?? [27>? A11
?EXT1?? [15]??? ? ? ? ?? ?? [26>? A12
?EXT2? [16]???? ? ? ? ? ? ? [25>? A13
?EXT3? [17]???? ? ? ? ? ? ? [24>? /R
? CLK? >18]?? ? ? ? ? ? ??? [23>? /W
?/VBL? <19]?? ? ? ? ? ? ??? [22<? /SYNC
? VEE? >20]????? ? ? ? ? ?? [21>? VOUT
?? ? ? ?? ??????? |_________|
?
R/W, D0-D7, A2-A0, /CS:
這些是PPU的控制總線(xiàn)信號(hào),通過(guò)這些信號(hào)來(lái)編程2C02的內(nèi)部寄存器。R/W控制數(shù)據(jù)傳輸方向(低電平代表向PPU寫(xiě)數(shù)據(jù))。通過(guò)A0-A2來(lái)選擇要讀寫(xiě)的PPU內(nèi)部寄存器。當(dāng)/CS(片選信號(hào))為低電平時(shí),D0-D7被用作與選中的寄存器收發(fā)數(shù)據(jù)(若/CS為高電平,則D0-D7為高阻態(tài))。文檔的下一章節(jié)將詳細(xì)介紹PPU內(nèi)部寄存器的操作。
EXT0-EXT3:
這些引腳可用作像素輸入(用作將外部產(chǎn)生的圖像與2C02產(chǎn)生的圖像疊合),也可用用作輸出(驅(qū)動(dòng)另一片PPU)。通過(guò)對(duì)2C02編程,可配置這些引腳的功能(輸入/輸出)。NES/FC主板將這些引腳接地(全黑像素),因此它們通常被編程為輸入模式。
CLK:此引腳為2C02的21.48MHz時(shí)鐘信號(hào)輸入。
/VBL:
此引腳在PPU進(jìn)入場(chǎng)消隱期(VBLANK)時(shí)變化為低電平,并在低電平維持長(zhǎng)達(dá)20條掃描線(xiàn)的時(shí)間。它常常與2A03 CPU的/NMI(不可屏蔽中斷)引腳相連,用于在每幀前產(chǎn)生一次不可屏蔽中斷。我們可以通過(guò)軟件快速清零/置位PPU寄存器中/VBL位來(lái)響應(yīng)這個(gè)中斷,故此中斷信號(hào)的持續(xù)時(shí)間往往不足一條掃描線(xiàn)。此引腳內(nèi)部為開(kāi)集(Open-collector)連接方式。
VEE, VCC:對(duì)應(yīng)為接地和5V直流電源輸入。
VOUT:
此引腳為2C02無(wú)緩沖的復(fù)合視頻信號(hào)輸出端。它通常與一個(gè)兩級(jí)的共集電極三極管放大器連接,從而將視頻信號(hào)放大到1V峰-峰值,驅(qū)動(dòng)75歐姆的負(fù)載。
/SYNC:
當(dāng)此引腳為低電平時(shí),PPU內(nèi)部的顏色突發(fā)控制、掃描線(xiàn)和像素計(jì)數(shù)器/觸發(fā)器都會(huì)被復(fù)位到一個(gè)確定的狀態(tài)。當(dāng)兩片2C02通過(guò)EXT引腳以主-從方式相連時(shí),雙方通過(guò)此引腳進(jìn)行同步,即主PPU的/VBL引腳產(chǎn)生場(chǎng)消隱信號(hào),該信號(hào)輸入到從PPU到/SYNC端口。在Famicom主機(jī)中,該引腳被接于邏輯高電平上,
而在NES主機(jī)中,該引腳于2A03 CPU到復(fù)位信號(hào)相連,這導(dǎo)致當(dāng)復(fù)位按鍵被按住時(shí)無(wú)圖像輸出。
/R, /W, ALE, AD0-AD7, A8-A13:
這些引腳用來(lái)控制PPU相關(guān)的數(shù)據(jù)總線(xiàn)(與顯存相連)。PPU將地址第0-7位放在AD總線(xiàn)上時(shí),ALE輸出高電平(通常用一片74LS373鎖存器來(lái)鎖存地址總線(xiàn)低八位的數(shù)據(jù))。/R或/W引腳低電平有效,指示PPU的AD總線(xiàn)上連接的存儲(chǔ)器將14位地址信號(hào)(A0-A7由外部鎖存器提供,A8-A13由PPU直接提供)譯碼,并根據(jù)傳輸方向的指示提供數(shù)據(jù)(/R信號(hào)有效表示將數(shù)據(jù)送入2C02,/W信號(hào)有效則相反)。/R、/W和ALE信號(hào)在同一時(shí)間至多有一個(gè)有效。

?2C02的編程模型
本章節(jié)將討論2C02的端口(寄存器)和可編程顯存的組織結(jié)構(gòu)。文檔中這些端口使用$200加上末尾的一位數(shù)來(lái)表示(例如$2002)。此處未說(shuō)明的內(nèi)容將在下文解釋。
?

可寫(xiě)的2C02端口
端口編號(hào)?? 位???? 描述
-------- ? ? --???? ----
0?? ???? ? ? ? ? 0??? ? 水平命名表選擇
??? ?????????????? 1??? ? 垂直命名表選擇
?????????????? (0-1兩位共同選擇了2*2的4個(gè)命名表中的一個(gè)作為當(dāng)前命名表)
??? ?????????????? 2??? ? 7號(hào)端口訪問(wèn)時(shí)的PPU地址自增選擇(0:自增1-橫向,1:自增32-縱向)
??? ?????????????? 3??? ? 精靈樣式表選擇(第5位為0時(shí)該選擇才有效)
??? ?????????????? 4??? ? 背景樣式表選擇
??? ???? ? ? ? ? ? 5??? ? 精靈高度選擇(0:8線(xiàn)精靈,1:16線(xiàn)精靈)
??? ?????????????? 6??? ? EXT引腳數(shù)據(jù)方向(0:輸入,1:輸出)
??? ?????????????? 7??? ? /VBL信號(hào)無(wú)效控制(為0)
1?? ???? ? ? ? ?? 0??? ? 禁用復(fù)合視頻信號(hào)的彩色突發(fā)(1為禁用),會(huì)產(chǎn)生灰度圖像
??? ?????????????? 1??? ? 最左側(cè)8列背景像素裁剪(0為有效)
??? ?????????????? 2??? ? 最左側(cè)8列精靈像素裁剪(0為有效)
??? ?? ? ? ? ? ? ? 3??? ? 打開(kāi)背景顯示(1為有效)
??? ? ? ? ? ?? ??? 4? ????打開(kāi)精靈顯示(1為有效)
??? ? ? ? ? ?? ??? 5??? ? 紅色通道亮度強(qiáng)調(diào)/補(bǔ)償
??? ? ? ? ? ? ? ?? 6??? ? 綠色通道亮度強(qiáng)調(diào)/補(bǔ)償
??? ? ? ? ? ? ? ?? 7??? ? 藍(lán)色通道亮度強(qiáng)調(diào)/補(bǔ)償
3?? ??? ? ? ? ??? -??? ? OAM(在PPU內(nèi)部)索引指針(64個(gè)表項(xiàng),每個(gè)32位,訪問(wèn)粒度為字節(jié))
4?? ??? ? ? ? ? ? -??? ? OAM數(shù)據(jù)寫(xiě)入端口(寫(xiě)入地址通過(guò)3號(hào)端口設(shè)置,寫(xiě)入后地址自增)
5?? ??? ? ? ? ? ? -??? ? 屏幕卷動(dòng)偏移設(shè)置端口
6?? ? ? ? ? ?? ?? -??? ? VRAM讀/寫(xiě)地址端口(通過(guò)7號(hào)端口訪問(wèn)VRAM)
7?? ??? ? ? ? ? ? -??? ? VRAM數(shù)據(jù)寫(xiě)入端口

可讀的2C02寄存器
端口編號(hào)?? 位??? 描述
-------? ? ? --??? -----
2?? ??? ? ? ? ?? 5??? ?指示讀取前最后一幀中單一掃描線(xiàn)上檢測(cè)到了多于8個(gè)精靈
??? ?? ? ? ? ?? ? 6??? ?指示讀取前最后一幀中最高優(yōu)先級(jí)的精靈(0號(hào)精靈)與背景非0像素發(fā)生碰撞(重合)
??? ????????????? 7??? ?場(chǎng)消隱標(biāo)志
4?? ??? ? ? ??? -??? ?OAM數(shù)據(jù)讀出端口(讀出地址通過(guò)3號(hào)端口設(shè)置,讀出后地址自增)
7?? ??????????? -??? ?VRAM數(shù)據(jù)讀出端口
?

精靈屬性結(jié)構(gòu)體(OAM表項(xiàng),一個(gè)精靈占用4個(gè)字節(jié))
字節(jié)?? ? 位???? 描述
---?? ? ?? --? ? -----
0???????? ? -???? 精靈頂部的坐標(biāo)(Y坐標(biāo)),用(掃描線(xiàn)坐標(biāo)-1)表示
1??????????? - ??? 精靈的樣式表(VRAM中)索引號(hào),當(dāng)使用16線(xiàn)高度的精靈時(shí),該字節(jié)的第0位用于選擇樣式表
2?????????? 0???? 精靈調(diào)色板項(xiàng)選擇(第2位)
???????????? 1????? 精靈調(diào)色板項(xiàng)選擇(第3位)
??? (第0-1位相當(dāng)于該精靈的屬性表;調(diào)色板項(xiàng)第0、1位存放在精靈的樣式表中)
??????????? 5????? 精靈相對(duì)于背景的優(yōu)先級(jí)(0:優(yōu)先級(jí)高于背景,1:優(yōu)先級(jí)低于背景)
?? ? ? ? ?? 6???? 水平翻轉(zhuǎn)精靈(將從樣式表取出每一字節(jié)數(shù)據(jù)的位順序反轉(zhuǎn))
??????????? 7???? 垂直翻轉(zhuǎn)精靈(訪問(wèn)樣式表時(shí),將8線(xiàn)矮精靈訪問(wèn)地址的第3位或16線(xiàn)高精靈訪問(wèn)地址的第4位取反)
3????????? -???? 精靈左側(cè)邊的坐標(biāo)(X坐標(biāo)),用掃描線(xiàn)坐標(biāo)表示

視頻信號(hào)的產(chǎn)生
一個(gè)21.48MHz的時(shí)鐘信號(hào)被輸入2C02作為其主時(shí)鐘,同時(shí)該時(shí)鐘也被2A03 CPU共享。
在PPU的內(nèi)部,21.48MHz時(shí)鐘被用來(lái)驅(qū)動(dòng)一個(gè)三位的約翰遜(紐環(huán))計(jì)數(shù)器(6種有效狀態(tài):000->100->110->111->011->001)。計(jì)數(shù)器每一位都由一個(gè)主-從D觸發(fā)器實(shí)現(xiàn)。這3位對(duì)應(yīng)主-從觸發(fā)器的主、從兩部分的輸出合起來(lái)正好可以編碼產(chǎn)生6*2=12個(gè)相位(Phase)彼此不同的時(shí)鐘信號(hào),其中每個(gè)信號(hào)的周期都是3.58MHz(=21.48MHz/6,為NTSC彩色突發(fā)周期,彩色突發(fā)信號(hào)為顯示器給出了用來(lái)區(qū)分用來(lái)代表不同色相的相位的基準(zhǔn)相位)。這12個(gè)相位不同的信號(hào)是PPU產(chǎn)生彩色復(fù)合視頻輸出信號(hào)的基礎(chǔ)。
當(dāng)用戶(hù)編程改變像素對(duì)應(yīng)用戶(hù)調(diào)色板所索引的系統(tǒng)調(diào)色板的低四位時(shí),相位信號(hào)1-12之一就會(huì)被路由到PPU的視頻輸出引腳上(這決定了視頻信息中的色相)。系統(tǒng)調(diào)色板低四位色相中的0和13則被簡(jiǎn)單地硬連接到高電平或低電平以產(chǎn)生灰階(消色)像素信號(hào)。
系統(tǒng)調(diào)色板顏色號(hào)的第4和第5位選擇線(xiàn)性直流電壓偏置信號(hào)1-4之一,該偏置作用于像素的色相信號(hào)上,決定了視頻信息中的亮度。
色相選擇14和15在任何亮度選擇下都產(chǎn)生黑色像素。
亮度選擇0和色相選擇13會(huì)產(chǎn)生一種“比黑色還要黑”的像素顏色。這種超級(jí)黑的像素的輸出電平接近場(chǎng)/行同步脈沖,因此,使用這種黑色的游戲(游戲精靈Game Genie就是最好的例子)會(huì)導(dǎo)致某些顯示器產(chǎn)生畫(huà)面撕裂或失真。此時(shí),這種掃描線(xiàn)內(nèi)的偽同步脈沖被顯示器當(dāng)作正常的同步脈沖,將行掃描時(shí)序打斷。這種現(xiàn)象不會(huì)損壞顯示器,但我們?nèi)孕枰苊馐褂玫竭@種“超級(jí)黑色”,防止產(chǎn)生圖像失真。
系統(tǒng)調(diào)色板低四位選出的色相信號(hào)的交流幅值始終保持恒定,不隨著系統(tǒng)調(diào)色板第4位和第5位的改變而改變。因此,我們沒(méi)有辦法調(diào)節(jié)特定顏色的飽和度。

PPU的基本時(shí)序
除了三位約翰遜計(jì)數(shù)器,21.48MHz的并不被其他PPU硬件組成部分直接使用。然而,此信號(hào)被四分頻,得到5.37MHz時(shí)鐘,作為PPU時(shí)序的最小單位。如無(wú)特殊說(shuō)明,本文檔以下所有PPU時(shí)鐘周期都是以該時(shí)鐘基準(zhǔn)為單位的。
?
- 像素渲染的速度與PPU基礎(chǔ)時(shí)鐘一致,即1像素=1時(shí)鐘周期
- 341個(gè)PPU時(shí)鐘周期(折合341/3個(gè)CPU時(shí)鐘周期)為一個(gè)典型的掃描線(xiàn)周期
- 1幀包含262條掃描線(xiàn),也就是說(shuō)一幀有341*262個(gè)PPU時(shí)鐘周期(除以3即為對(duì)應(yīng)CPU的時(shí)鐘周期)

PPU的顯存訪問(wèn)周期
所有PPU顯存訪問(wèn)周期都是兩個(gè)時(shí)鐘周期長(zhǎng)的,且可以連續(xù)發(fā)生(通常在渲染期間完成)。顯存訪問(wèn)可以拆分為以下步驟:
在訪存周期的起始,目標(biāo)地址的高位被更新到PPU地址線(xiàn)A8-A13上。這些地址信號(hào)將被保持直至下一次訪存周期到來(lái)。
為了減少PPU的引腳數(shù)目,PPU低8位地址線(xiàn)的和數(shù)據(jù)總線(xiàn)復(fù)用。在訪存的第一個(gè)時(shí)鐘周期,地址A0-A7被放在PPU的數(shù)據(jù)總線(xiàn)上,同時(shí)ALE(地址鎖存使能)信號(hào)在后半個(gè)周期有效。這一操作使得低8位地址進(jìn)入受ALE信號(hào)控制的外部8位鎖存器(一般使用74LS373鎖存器)。
在第二個(gè)時(shí)鐘周期,/RD或/WR信號(hào)有效,并在整個(gè)周期中保持有效。此時(shí),相應(yīng)數(shù)據(jù)被VRAM放在數(shù)據(jù)總線(xiàn)上。

PPU的其他雜項(xiàng)信息
- 通過(guò)讀寫(xiě)地址在 $3Fxx范圍內(nèi)的端口,可以訪問(wèn)PPU內(nèi)部含有25個(gè)元素的用戶(hù)調(diào)色板RAM。該地址的第四位用來(lái)指定訪問(wèn)背景調(diào)色板(0)還是精靈調(diào)色板(1)。地址的第3-2位用來(lái)索引調(diào)色板表項(xiàng)(0-3),而第1-0位用來(lái)索引調(diào)色板表項(xiàng)的元素(0或1)。當(dāng)?shù)刂返牡?-3位均為0時(shí),會(huì)訪問(wèn)相同且唯一(共享)的一個(gè)透明色(背景色)調(diào)色板元素。
- 從端口 $2002 讀取數(shù)據(jù)會(huì)清除第七位的場(chǎng)消隱標(biāo)志,并復(fù)位PPU內(nèi)部 $2005/6 端口的觸發(fā)器(寄存器/緩沖器)。向 $2002 寫(xiě)數(shù)據(jù)則沒(méi)有這樣的效果。
- 2C02的引腳 /VBL的輸出信號(hào)是 $2002 寄存器的第七位和 $2000寄存器 的第七位做與非邏輯運(yùn)算產(chǎn)生的。
- $2002 寄存器的第五位和 $2002 寄存器的第六位被PPU內(nèi)部邏輯置位后會(huì)相對(duì)于場(chǎng)消隱信號(hào)于新一幀的開(kāi)始處保持20個(gè)掃描線(xiàn)的長(zhǎng)度。
- 用戶(hù)調(diào)色板RAM在背景渲染期間會(huì)被PPU內(nèi)部所訪問(wèn)(期間用戶(hù)調(diào)色板的地址和數(shù)據(jù)不可能出現(xiàn)在VRAM總線(xiàn)上)。哪怕是此時(shí)程序員通過(guò)編程控制CPU訪問(wèn) $2006/7 端口以試圖訪問(wèn)用戶(hù)調(diào)色板RAM,雖然被訪問(wèn)的調(diào)色板地址確實(shí)被放在了VRAM地址總線(xiàn)上,但VRAM的讀寫(xiě)信號(hào) /RD 和 /WR 也不會(huì)有效。這個(gè)機(jī)制原本設(shè)計(jì)的用意是防止像素渲染期間讀寫(xiě)VRAM鏡像地址區(qū)修改命名表,導(dǎo)致渲染出錯(cuò)(PPU內(nèi)部的命名表RAM地址譯碼器是一個(gè)連接在VRAM A13地址線(xiàn)上的非門(mén),這導(dǎo)致讀寫(xiě)VRAM $2000-$3FFF地址區(qū)均被判定為讀寫(xiě)命名表)。
- PPU在設(shè)計(jì)上無(wú)法直接使用CPU通過(guò) $2007 端口給出的VRAM地址去訪問(wèn)VRAM,而是經(jīng)過(guò)一個(gè)內(nèi)部緩沖器實(shí)現(xiàn)的,緩沖器本質(zhì)上是一個(gè)只有一級(jí)的流水線(xiàn)。當(dāng)有VRAM讀取請(qǐng)求時(shí),緩沖器的內(nèi)容會(huì)被返回給CPU。此后,PPU會(huì)盡快于PPU時(shí)序讀VRAM的周期里從VRAM將請(qǐng)求的數(shù)據(jù)取回并放入讀緩沖器中。通過(guò) $2007 端口向VRAM寫(xiě)入數(shù)據(jù)也是經(jīng)過(guò)流水線(xiàn)緩沖的,但目前還不確定數(shù)據(jù)流經(jīng)的緩沖區(qū)和讀緩沖器是否為同一個(gè)緩沖器(猜測(cè)可以通過(guò)向 $2007 端口寫(xiě)入數(shù)據(jù)并迅速讀回?cái)?shù)據(jù),檢查兩個(gè)數(shù)據(jù)是否一致來(lái)簡(jiǎn)單地判斷)。

幀渲染細(xì)節(jié)
以下描述說(shuō)明了PPU在一幀共262條有效掃描線(xiàn)中的行為。對(duì)應(yīng)每一條有效(如存在圖像渲染行為)的掃描線(xiàn),PPU分別有如下描述的動(dòng)作:
?
第0-19條掃描線(xiàn):自場(chǎng)消隱標(biāo)志VINT被設(shè)置(同時(shí)產(chǎn)生NMI不可屏蔽中斷信號(hào))而開(kāi)始,20條掃描線(xiàn)組成了習(xí)慣上被成為場(chǎng)消隱期的時(shí)期。在此期間,PPU不訪問(wèn)VRAM(命名表、樣式表等)。
第20條掃描線(xiàn):自VINT場(chǎng)消隱標(biāo)志被置位20條掃描線(xiàn)的時(shí)間過(guò)后(場(chǎng)消隱結(jié)束),PPU開(kāi)始渲染掃描線(xiàn)。此后第一條掃描線(xiàn)(第20條)是“啞掃描線(xiàn)”,盡管在此期間會(huì)和那些顯示圖像的掃描線(xiàn)一樣從VRAM按順序取回?cái)?shù)據(jù),但屏幕上并沒(méi)有可見(jiàn)像素被渲染出來(lái),因而此時(shí)從VRAM取回的背景數(shù)據(jù)也是無(wú)關(guān)緊要的。在該掃描線(xiàn)的第256個(gè)時(shí)鐘周期處水平和垂直卷動(dòng)寄存器的內(nèi)容被裝入對(duì)應(yīng)計(jì)數(shù)器(據(jù)猜測(cè))。除此之外,這條掃描線(xiàn)的行為與其它掃描線(xiàn)有很大區(qū)別,其主要原因在于此掃描線(xiàn)的存在被用作啟動(dòng)精靈渲染流水線(xiàn),即它會(huì)花費(fèi)256個(gè)時(shí)鐘周期的時(shí)間來(lái)判斷第一條可見(jiàn)掃描線(xiàn)(第21條)上是否存在及存在哪些精靈。
第21-260條掃描線(xiàn):在渲染完一條“啞掃描線(xiàn)”后,PPU開(kāi)始渲染實(shí)際可見(jiàn)的掃描線(xiàn),將實(shí)際的顯示數(shù)據(jù)輸出到顯示屏上。這一階段會(huì)渲染240條掃描線(xiàn)(NES/FC的分辨率為256*240)。
?
第261條掃描線(xiàn):在最后一條可見(jiàn)掃描線(xiàn)渲染完成后,PPU會(huì)等待一條掃描線(xiàn)的時(shí)間且沒(méi)有動(dòng)作(起“補(bǔ)償”作用,使編程者能得到“完美的”場(chǎng)消隱中斷周期)。此掃描線(xiàn)結(jié)束時(shí),場(chǎng)消隱標(biāo)志VINT被置位,開(kāi)始下一場(chǎng)(幀)的第一條掃描線(xiàn)的計(jì)時(shí)。

(未完待續(xù))