任天堂產(chǎn)品系統(tǒng)介紹_第1頁
任天堂產(chǎn)品系統(tǒng)介紹_第2頁
任天堂產(chǎn)品系統(tǒng)介紹_第3頁
任天堂產(chǎn)品系統(tǒng)介紹_第4頁
任天堂產(chǎn)品系統(tǒng)介紹_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 任天堂產(chǎn)品系統(tǒng)文件(Pinokio163. 譯、編 2002/10/10)目錄 _ 1、系統(tǒng)簡(jiǎn)介任天堂主機(jī)由6502處理器和一個(gè)特制的圖形處理器組成。CPU是6502,而不是傳言中的65C02(CMOS)。PPU的顯存是和CPU的存是分離的,可以通過對(duì)特殊端口的讀/寫來操作。卡帶可能包含的容有位于處理器地址$8000-$FFFF的ROM,和位于PPU地址$0000-$1FFF的VROM。由于NES只有2K的RAM,因此變量的可用的變量空間只有從$0000到$07FF共8個(gè)頁面。在開機(jī)之后RAM和VRAM中的容是0,但是注意:復(fù)位并不改變其中的容。在更小的卡帶,比如只有16KB的ROM,它占有

2、$C000-$FFFF,而$8000-$BFFF的空間是不用的。那些大于32KB的卡帶,它被特殊的電路分頁到一定的地址空間。一些卡帶在$6000-$7FFF有SRAM,那是電池存儲(chǔ)的位置??◣ROM被用來做圖案表(例如 Tile 表, 角色發(fā)生器等等)。通常的數(shù)量是8KB,包含兩個(gè)圖案表。大于8KB 的VROM被特殊的電路分頁到一定的地址空間。部的VRAM在 PPU 存里定位于$2000-$3FFF,它用來存儲(chǔ)命名表(例如屏幕緩沖)。雖然PPU 支持4個(gè)命名表,但只能支持兩個(gè)的存放空間。另外的兩個(gè)是開始兩個(gè)的鏡像。NES共有154條指令。在本文本里,你將遇到如下形式的符號(hào):“Dn"

3、 (5 位,3 位,等等)。位是按從最低位(0 位)到最高位(7 位)。所有的十六進(jìn)制都在前面加上一個(gè)美圓符號(hào)($)($2002,$4026,等等)是在6502處理器匯編里常用的符號(hào),二進(jìn)制前面加上一個(gè)百分號(hào)%。 2、縮寫表NES 任天堂娛樂系統(tǒng) Famicom 任天堂家用計(jì)算機(jī),即FC FDS 任天堂磁碟機(jī)系統(tǒng) CPU 中央處理器,NES使用一個(gè)定制的6502(NMOS)芯片,有些型號(hào)為6527 PPU 圖像處理器,用來處理背景,精靈和其他圖像特性,通常為6538 APU 聲音處理器,集合在CPU部,包含4個(gè)模擬通道和1個(gè)數(shù)字通道 MMC ROM和VROM的擴(kuò)容控制,用來控制訪問超過6502

4、限制的64K地址,同樣,也可以擴(kuò)容VROM VRAM 圖像RAM,PPU專用,2K字節(jié) VROM 圖像ROM,儲(chǔ)存圖像數(shù)據(jù)的地方,可以由MMC切換到VRAM里 ROM 程序ROM,實(shí)際程序儲(chǔ)存的地方,擴(kuò)容部分可以通過MMC切換到PRGRAM里 RAM 程序RAM,和ROM同義,不同的是它是RAM SPRRAM 精靈RAM,RAM中的256字節(jié),專用于儲(chǔ)存精靈,它不屬于VRAM或ROM SRAM 電池RAM,卡帶上用來保存游戲記錄的EPROM電擦寫ROM DMC 三角波調(diào)制通道,APU用來處理數(shù)字聲音的,也寫作PCM通道 EXRAM 擴(kuò)展VRAM,用在MMC5里,可以擴(kuò)展VRAM容量 3、中央處

5、理器NES定制的6502部特別加上了聲音處理單元。NTSC制式的NES使用1.7897725MHz主頻,PAL制式使用1.773447MHz主頻。CPU存映像:開始地址 用途 結(jié)束地址 $0000 2K字節(jié)RAM,做4次鏡象(即$0000-$07FF可用) $1FFF $2000 寄存器 $2007 $2008 寄存器($2000-$2008的鏡像,每8個(gè)字節(jié)鏡像一次) $3FFF $4000 寄存器 $401F $4020 擴(kuò)展ROM $5FFF $6000 卡帶的SRAM(需要有電池支持) $7FFF $8000 卡帶的下層ROM $BFFF $C000 卡帶的上層ROM $FFFF 中斷

6、:6502有3個(gè)中斷IRQ/BRK、NMI和RESET,每個(gè)中斷都有一個(gè)16位的向量,即指針,用來存放該中斷發(fā)生時(shí)中斷服務(wù)函數(shù)的地址。中斷發(fā)生時(shí)CPU都會(huì)把狀態(tài)標(biāo)志和返回地址壓棧,然后調(diào)用中斷服務(wù)程序。IRQ/BRK中斷由一下兩種情況產(chǎn)生:一是軟件通過BRK指令產(chǎn)生,一是硬件通過IRQ引腳產(chǎn)生。RESET在開機(jī)的時(shí)候觸發(fā),這是ROM被裝入,6502跳到RESET向量指向的地址沒有寄存器被修改,沒有存被清空,這些都只在開機(jī)是發(fā)生。NMI指不可屏蔽中斷,它在VBlank即屏幕刷新時(shí)發(fā)生,持續(xù)時(shí)間根據(jù)系統(tǒng)(NTSC/PAL)不同而不同。NTSC是每秒60次,而PAL是每秒50次。6502的中斷延時(shí)是

7、7個(gè)時(shí)鐘周期,也就是說,進(jìn)入和離開中斷都需要7個(gè)時(shí)鐘周期。它產(chǎn)生于PPU的每一幀結(jié)束,NMI中斷可以由$2000的第7位的1/0控制允許/禁止。大部分中斷應(yīng)該使用RTI指令返回,但是有些游戲不用,例如最終幻想1。它用一個(gè)很奇怪的方式:手工修改堆棧指針,然后執(zhí)行RTS指令。這種方法在技術(shù)上是可行的,但是應(yīng)該盡量避免。以上中斷在ROM有以下對(duì)應(yīng)的地址: 中斷地址 中斷 優(yōu)先權(quán) $FFFA NMI 中 $FFFC RESET 高 $FFFE IRQ/BRK 低 特別說明:NES的6502不支持10進(jìn)制。雖然CLD和SED指令都正常工作,但是ADC和SBC都不使用CPU狀態(tài)標(biāo)志的“D”位。由于復(fù)位后“

8、D”位的狀態(tài)是不確定的,所以游戲通常在程序開始時(shí)使用一個(gè)CLD指令。聲音寄存器映射到CPU部,所有波形發(fā)生的工作都在CPU部完成。注意那兩個(gè)分開的16K ROM段,它們可能是連續(xù)的,但是它們根據(jù)卡帶的大小扮演不同的角色。有的卡帶只有一個(gè)16K ROM,那么它就同時(shí)被裝入$8000和$COOO。所有游戲都將它們自己裝入$8000,使用32K RAM,但是它們都能夠通過存映射把多于一個(gè)16K ROM裝入$8000。VROM也是同樣的道理。當(dāng)BRK中斷發(fā)生的時(shí)候,CPU把狀態(tài)標(biāo)志壓入堆棧,同時(shí)設(shè)置“B”標(biāo)志。而IRQ中斷發(fā)生時(shí),CPU把狀態(tài)標(biāo)志壓入堆棧,同時(shí)清除“B”標(biāo)志。這是因?yàn)?502使用同一個(gè)

9、向量來處理兩種中斷,用“B”標(biāo)志來區(qū)分它們。你可以用以下程序來區(qū)別兩種中斷:    C134: PLA ;                 拷貝CPU狀態(tài)標(biāo)志到A    C135: PHA ;               

10、0; 把狀態(tài)標(biāo)志還回給堆棧    C136: AND #$10 ;            檢查“B”標(biāo)志    C138: BNE is_BRK_opcode;    如果設(shè)置了,就是軟件中斷(BRK)在NMI里指向BRK會(huì)導(dǎo)致已經(jīng)被壓棧的“B”標(biāo)志被設(shè)置。6502的$6C指令(間接絕對(duì)跳轉(zhuǎn))有一個(gè)BUG,當(dāng)?shù)臀蛔止?jié)是$FF時(shí)CPU將不能正確計(jì)算有效地址。例如:   

11、 C100: 4F    C1FF: 00    C200: 23    .    D000: 6C FF C1 - JMP ($C1FF)本來它是應(yīng)該跳到$2300的,但是在計(jì)算高位字節(jié)的時(shí)候,在頁面邊界處地址是不能再增加的,所以實(shí)際將跳轉(zhuǎn)到$4F00。需要注意的是,頁面越界不會(huì)在變址間接尋址模式發(fā)生。由于0頁面的限制,由于0頁面的限制,所有變址間接尋址的讀寫都應(yīng)該在計(jì)算有效地址之后和#$FF進(jìn)行邏輯與操作。例如:    C000: LDX #

12、3 ;         從 $0002+$0003 讀變址地址,    C002: LDA ($FF,X) ;    不是 $0102+$0103._ 4、圖形處理器PPU時(shí)序:NTSC制式PAL制式基頻(Base clock)21477270.0Hz21281364.0HzCPU主頻(Cpu clock)1789772.5Hz1773447.0Hz總掃描線數(shù)(Total scanlines)262312掃描線總周期(Scanline total cycl

13、es)1364(15.75KHz)1362(15.625KHz)水平掃描周期(H-Draw cycles)10241024水平空白周期(H-Blank cycles)340338結(jié)束周期(End cycles)42幀周期(Frame cycles)1364*2621362*312幀IRQ周期(FrameIRQ cycles)2983035469幀率(Frame rate)60(59.94Hz)50Hz幀時(shí)間(Frame period)1000.0/60.0(ms)1000.0/50.0(ms)鏡像是指通過硬件映射特殊的存地址或圍的一個(gè)過程。PPU存映像:開始地址 用途 結(jié)束地址 $0000 圖

14、案表0(256x2x8,可能是VROM) $0FFF $1000 圖案表1(256x2x8,可能是VROM) $1FFF $2000 命名表0(32x30塊)(鏡像,見命名表鏡像) $23BF $23C0 屬性表0(鏡像,見命名表鏡像) $23FF $2400 命名表1(32x30塊)(鏡像,見命名表鏡像) $27BF $27C0 屬性表1(鏡像,見命名表鏡像) $27FF $2800 命名表2(32x30塊)(鏡像,見命名表鏡像) $2BBF $2BC0 屬性表2(鏡像,見命名表鏡像) $2BFF $2C00 命名表3(32x30塊)(鏡像,見命名表鏡像) $2FBF $2FC0 屬性表3(

15、鏡像,見命名表鏡像) $2FFF $3000 $2000-$2EFF的鏡像 $3EFF $3F00 背景調(diào)色板#1 $3F0F $3F10 精靈調(diào)色板#1 $3F1F $3F20 鏡像,(見調(diào)色板鏡像) $3FFF $4000 $0000-$3FFF的鏡像 $7FFF 命名表:NES的圖像通過Tile矩陣來顯示,這個(gè)網(wǎng)格就叫命名表。一個(gè)命名表和字符模式下的屏幕緩沖比較相象,它包含字符的代碼,也就是30列的32Byte長(zhǎng)度。每個(gè)Tile有8x8個(gè)象素,每個(gè)命名表有32x30個(gè)Tile,也就是256x240象素。PPU支持4個(gè)命名表,他們?cè)?2000,$2400,$2800,$2C00。在NTSC

16、制式下,上面和下面的8象素通常不顯示出來,只有256x224象素;在PAL制式下,屏幕有256x240象素。需要說的是,雖然PPU支持4個(gè)命名表,任天堂主機(jī)只支持2個(gè)命名表。另外兩個(gè)被做了鏡像。命名表保存了Tile的編號(hào),而Tile存在圖案表里。計(jì)算命名表里Tile號(hào)對(duì)應(yīng)的實(shí)際地址的公式是:(Tile號(hào)×16)由$2000端口指定的圖案表地址 命名表鏡像:NES只有2048字節(jié)($800)的VRAM給命名表使用,但是如前表所示,NES有能力尋址到4個(gè)命名表。缺省情況下,NES卡帶都帶有水平和垂直鏡像,允許你改變命名表指向PPU的VRAM位置。這種方式同時(shí)影響兩個(gè)命名表,你不能單獨(dú)改變

17、其中的一個(gè)。每個(gè)卡帶都控制著PPU地址線的A10 和A11。它可能將他們?cè)O(shè)置成以下4種可能的方式的1種。下面這個(gè)圖表有助于理解NES里的各種鏡像,指向PPU VRAM中命名表的12位地址相當(dāng)于“$2xxxx”:                                 名字 命名 表

18、#0 命名 表#1 命名 表#2 命名 表#3 說明  地址線A11 地址線A10 水平 $000 $000 $400 $400 1 0 垂直 $000 $800 $000 $800 0 1 4屏幕鏡像 $000 $400 $800 $C00 卡帶里有2K VRAM,4個(gè)命名表物理上獨(dú)立的 1 1 單屏幕 $X00 $X00 $X00 $X00 所有的命名表指一樣的VRAM區(qū)域,X=0、4、8、C 0 0 VROM鏡像 Mapper 68#游戲映射VROM到PPU VRAM的命名表,這使得命名表是基于VROM的,你不能寫它但卻可以通過mapper自己來控制是否使用這種特性 圖案表:圖

19、案表儲(chǔ)存了實(shí)際8x8象素的Tile,同時(shí)也儲(chǔ)存了用來指向NES調(diào)色板全部16種顏色的4位元矩陣的低兩位。PPU支持兩個(gè)圖案表在$0000和$1000。他們有以下格式: VRAM地址 圖案表容 顏色效果 $0000.$0007 %00010000 = $10%00000000 = $00%01000100 = $44%00000000 = $00%11111110 = $FE%00000000 = $00%10000010 = $82%00000000 = $00 組 0 .1.2.2.3.3.2.2.1111111.2.2.3.3. $0008.$000F %00000000 = $00%00

20、101000 = $28%01000100 = $44%10000010 = $82 %00000000 = $00%10000010 = $82 %10000010 = $82%00000000 = $00 組 1 點(diǎn)表示0號(hào)顏色,數(shù)字表示實(shí)際調(diào)色板顏色代號(hào) 注意在圖案表里存儲(chǔ)的是每個(gè)點(diǎn)的2個(gè)位。其他兩個(gè)由屬性表得到。所以,在屏幕上總體出現(xiàn)的顏色數(shù)是16,而每個(gè)塊里只有4種顏色。 屬性表:每個(gè)命名表有它自己的屬性表。屬性表的每一個(gè)字節(jié)代表了屏幕上的一組4x4的Tile,一共有8x8個(gè)字節(jié)。有幾種方法來描述屬性表里一個(gè)字節(jié)的功能:    *保存

21、32x32象素方格的高2位顏色,每16x16象素用2位;    *保存16個(gè)8x8 Tile的高2位顏色;    *保存4個(gè)4x4 Tile格子的高2位顏色。看以下兩個(gè)圖表幫助理解:1、一個(gè)16x16 象素的格子:#0-F 代表了一個(gè)8x8 Tile,方塊 x 代表了4個(gè)8x8 Tile, 方塊 0 #0 #1 #2 #3 方塊 1 #4 #5 #6 #7 方塊 2 #8 #9 #A #B 方塊 3 #C #D #E #F 2、屬性表一個(gè)字節(jié)的實(shí)際格式定義如下(對(duì)應(yīng)于上面的例子): 位 描述 0、1 方塊 0的高兩位顏色(Tile #

22、0,1,2,3) 2、3 方塊 1的高兩位顏色(Tile #4,5,6,7) 4、5 方塊 2的高兩位顏色(Tile #8,9,A,B) 6、7 方塊 3的高兩位顏色(Tile #C,D,E,F) 調(diào)色板:NES有兩個(gè)調(diào)色板,背景調(diào)色板和精靈調(diào)色板。調(diào)色板不包含實(shí)際的RGB值,它們更象一個(gè)索引表。寫到$3F00-$3FFF的D6D7字節(jié)被忽略。  30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D  20 21 22 23 24 25 26 27 28 29 2A 2B 2C 10 11 12 13 14 15 16 17 18 19 1A

23、1B 1C  調(diào)色板鏡像:鏡像發(fā)生在背景調(diào)色板和精靈調(diào)色板之間,例如所有寫到$3F00的數(shù)據(jù)會(huì)被鏡像到$3F10,$3F04鏡像到$3F14。背景和精靈的最高3個(gè)調(diào)色板的0號(hào)色盤定義為透明,存在那里的顏色不會(huì)被畫出來。PPU使用放在$3F00里的顏色作為背景色,詳細(xì)如下:    *$0D被寫到$3F00(鏡像到$3F10);    *$03被寫到$3F08(鏡像到$3F18);    *$1A被寫到$3F18;    *$3F08被讀到累加器。PPU使用$0D作為背

24、景顏色,盡管$3F08有一個(gè)顏色$03(因?yàn)?號(hào)顏色在所有的調(diào)色板里都定義為透明)。最后,累加器上有一個(gè)值$1A,這是從$3F18映像過來的。又一次,這個(gè)$1A值沒有被畫出,因?yàn)樗械恼{(diào)色板的0號(hào)顏色被定義為透明。整個(gè)背景和精靈調(diào)色板同時(shí)也映像到VRAM的其他區(qū)域,$3F20-$3FFF全部都是這兩個(gè)調(diào)色板分別的映像。寫到$3F00-$3FFF的D6D7字節(jié)被忽略。 背景滾動(dòng):NES可以通過預(yù)提取命名表,圖案表和屬性表來使背景滾動(dòng),背景是獨(dú)立于精靈而位于最下層的??梢运胶痛怪睗L動(dòng)。 水平滾動(dòng) 垂直滾動(dòng) 0    512 A B A 0480 B 命名表

25、A通過$2000的D1-D0指定,B是跟在后面的一個(gè)命名表,根據(jù)鏡像不同B是動(dòng)態(tài)的。這個(gè)不能工作在水平和垂直同時(shí)滾動(dòng)的游戲里。背景會(huì)跨越多個(gè)命名表,如下所示: 命名表#2($2800) 命名表#3($2C00) 命名表#0($2000) 命名表#1($2400) 在$2005里寫到水平滾動(dòng)的值可以從0256,寫到垂直滾動(dòng)的值從0239,239是考慮了負(fù)值的結(jié)果,例如248代表8。 屏幕和精靈分層:下面是NES畫圖的循序: 前臺(tái) 后臺(tái) CI OBJs 0-63 BG OBJs 0-63 EXT  精靈RAM BGPRI=0  精靈RAMBGPRI=1 CI代表顏色亮

26、度,相當(dāng)于$2001的D7-D5;BG是背景;EXT是擴(kuò)展口的圖像信號(hào)。BGPRI代表VRAM里背景優(yōu)先權(quán)位,每個(gè)精靈都有的,即第二字節(jié)的D5位。OBJ數(shù)代表了實(shí)際精靈的,不是Tile索引值。前臺(tái)高于任何其他層,最后被畫上,后臺(tái)低于任何其他層,最先被畫上。 精靈和精靈RAM:NES用一個(gè)頁面(256字節(jié))來存放動(dòng)畫,每個(gè)精靈4個(gè)字節(jié),一共可以有64個(gè)動(dòng)畫/精靈,它們可以是8x8或8x16象素。動(dòng)畫/精靈圖案被存儲(chǔ)在VRAM的圖案表其中一個(gè)里面。精靈屬性,例如翻轉(zhuǎn)和優(yōu)先權(quán)被儲(chǔ)存在一個(gè)特殊的256字節(jié)的精靈RAM,它不是CPU或PPU的地址的一部分。整個(gè)精靈RAM可以通過$4014的DMA方式來寫

27、,寫一個(gè)8位的數(shù)到$4014就將這個(gè)8位數(shù)所指定的存頁面整個(gè)拷貝到精靈RAM上。也可以通過把開始地址放在$2003然后讀/寫于$2004(每次存取地址自動(dòng)加一),它是一個(gè)一個(gè)字節(jié)存取的。動(dòng)畫/精靈的屬性格式是:動(dòng)畫/精靈屬性RAM:| 精靈#0 | 精靈#1 | . | 精靈#62 | 精靈#63 |      字節(jié) 位 描述 0 YYYYYYYY 精靈左上角的Y坐標(biāo)1 1 IIIIIIII Tile索引號(hào) 2 vhp000cc v垂直翻轉(zhuǎn)(1翻轉(zhuǎn)) h水平翻轉(zhuǎn)(1翻轉(zhuǎn)) p背景優(yōu)先權(quán)(0前臺(tái)1后臺(tái)) c顏色的高2位 3 XXXXXXXX 精靈左上角的X

28、坐標(biāo) Tile索引號(hào)就和命名表里的一樣。精靈圖案可以象Tile圖案對(duì)于背景圖片一樣抓取。唯一的不同是在8x16的精靈時(shí),上半部分(偶數(shù))的Tile索引由精靈圖案表的$0000開始,而下半部分(奇數(shù))由$1000開始。$2000寄存器對(duì)8x16精靈無效。全部64個(gè)精靈有自己部的優(yōu)先權(quán),0號(hào)最高(最后被畫),63號(hào)最低(最先被畫)。每條掃描線只能顯示8個(gè)精靈,每個(gè)精靈RAM條目都會(huì)被檢查是否處于其他精靈的水平圍。注意,這是基于掃描線的,不是基于精靈的,也就是說,會(huì)進(jìn)行256次檢查,而不是256/8或256/16次。在一個(gè)真實(shí)的NES芯片里,如果精靈被禁止($2001的D4是0)很長(zhǎng)一段時(shí)間,精靈數(shù)

29、據(jù)會(huì)漸漸消失。可以理解為精靈RAM是一個(gè)DRAM,D4控制了DRAM的周期刷新信號(hào)。 碰撞標(biāo)志:碰撞標(biāo)志是PPU狀態(tài)寄存器($2002)的第6位(D6)。PPU能夠找出0號(hào)精靈的位置,然后設(shè)置D6,它是這樣工作的:PPU掃描出背景圖案象素和精靈象素同時(shí)不是透明的第一個(gè)地方。比如,屏幕的背景是一個(gè)非透明顏色(顏色號(hào)>0),0號(hào)精靈的坐標(biāo)是(12,34),它只是在第4行的開始才有象素,那么,碰撞標(biāo)志在屏幕刷新到(12,37)時(shí)才被設(shè)置。要記住,0號(hào)顏色被定義為透明。引起D6被設(shè)置的象素必須是已經(jīng)被畫出來的。下面的例子能幫助理解,這是兩個(gè)Tile,下劃線表示透明的0號(hào)顏色,*號(hào)表示碰撞標(biāo)志被設(shè)

30、置。 精靈 +  背景 = 結(jié)果 *會(huì)用2號(hào)顏色畫出  _1111_111111_11222211112_211112_21111222211_111111_1111_ _2_21_211_2111_21111_211111_2111111 _1111_111111211222211112_*11112_221111222211_1111111_2111111 這個(gè)例子說的是背景精靈,但是對(duì)于靠近背景的精靈也通用,即精靈精靈,通過設(shè)置背景優(yōu)先權(quán)來實(shí)現(xiàn)。D6不可以通過讀PPU的狀態(tài)來復(fù)位,只在每次VBlank之后被清零。Hit標(biāo)志可以用在水平或者垂直屏幕分割的時(shí)候,還有許多好

31、玩的效果。 水平和垂直消隱:所有的游戲機(jī)都有一個(gè)刷新動(dòng)作,用來重新定位電子槍顯示可見的數(shù)據(jù)。最通用的顯示設(shè)備是電視機(jī),它分為每秒刷新60次的NTSC制式和50次的PAL制式。電子槍從左到右畫出象素,它每次只能畫一條掃描線,畫下一條之前要先回到左面并且做好準(zhǔn)備,這之間有一段時(shí)間叫做水平消隱(HBlank)。在畫完全部256條掃描線之后它又回到屏幕左上角準(zhǔn)備下一次畫屏幕(幀),這之間的一段時(shí)間就是垂直消隱(VBlank)。電子槍就是一個(gè)不斷的走之字形的過程。VBlank標(biāo)志就是$2002的D7,它表明PPU是否在VBlank期間,當(dāng)VBlank標(biāo)志存在時(shí),你就可以通過$2006和$2007訪問PP

32、U存。一個(gè)程序可以通過讀$2002來使D7復(fù)位。在屏幕刷新期間,我們不能訪問PPU,而PPU會(huì)在CPU背后修改VRAM指針,這樣我們很容易在寫入VRAM時(shí)出錯(cuò),為了讓PPU停下來,可以對(duì)$2000和$2001寫00。 訪問PPU RAM:在一個(gè)任天堂主機(jī),訪問PPU存只可以在VBlank期間。當(dāng)在屏幕刷新時(shí)訪問會(huì)破壞刷新地址寄存器,一般它經(jīng)常用來做隱含的“分割屏幕”效果(見“在屏幕刷新的時(shí)候訪問VRAM”)。很多小些的ROM用只讀存儲(chǔ)體(VROM)用做圖案表。在這種情況下,你不可以寫PPU地址,只可以讀。寫PPU記憶體:    a) 寫高位地址字節(jié)到$2006&#

33、160;   b) 寫低位地址字節(jié)到$2006    c) 寫數(shù)據(jù)到$2007。每一個(gè)寫操作后,地址會(huì)增加1($2000的第二位是0)或增加32($2000的第二位是1)。讀PPU記憶體:    a) 寫高位地址字節(jié)到$2006    b) 寫低位地址字節(jié)到$2006    c) 從$2007讀數(shù)據(jù)。從$2007讀到的第一個(gè)字節(jié)是無效的(見下例)。然后每讀一次地址就增加一($2000的第二位是0)或增加    

34、60;  32($2000的第二位是1)。例子:VRAM的$2000里有$AA $BB $CC $DD。VRAM的增量是1。執(zhí)行效果如下:    LDA #$20    STA $2006    LDA #$00    STA $2006 ; VRAM 地址設(shè)為 $2000    LDA $2007 ; A=?  VRAM 緩沖=$AA    LDA $2007 ; A=$AA VRAM 緩沖=$

35、BB    LDA $2007 ; A=$BB VRAM 緩沖=$CC    LDA #$20    STA $2006    LDA #$00    STA $2006 ; VRAM 地址設(shè)為 $2000    LDA $2007 ; A=$CC VRAM 緩沖=$AA    LDA $2007 ; A=$AA VRAM 緩沖=$BB這個(gè)只適用于$0000-$FEFF,訪問調(diào)色板數(shù)據(jù)沒

36、有這種現(xiàn)象。 在屏幕刷新的時(shí)候訪問VRAM:前面說過,在屏幕刷新的時(shí)候存取VRAM的地址和數(shù)據(jù)是不合法的。許多程序存取這些寄存器來制造不同的滾動(dòng)效果。比如,一些游戲從屏幕底部開始滾動(dòng),那么它可能向$2006寫第一行的狀態(tài)來復(fù)位屏幕滾動(dòng)。更好的詭計(jì)是PPU在屏幕刷新時(shí)用VRAM的地址寄存器來儲(chǔ)存當(dāng)前地址。通過向$2006修改地址以與讓PPU從一個(gè)不同的地方接著刷新。關(guān)于$2007如何影響屏幕刷新仍不了解。    當(dāng)不知道向$2006中寫什么數(shù)據(jù)時(shí),看下面的圖表。    寫到$2006的地址 位 描述 04 Tiles的水平偏移量(例如1

37、 = 8象素);水平位置水平偏移量×8 59 Tiles的垂直偏移量(例如1 = 8象素);垂直位置垂直偏移量×8 A、B 命名表的($2000,$2400,$2800,$2C00); C、D 附加的垂直偏移量,單位:象素(0.3);掃描線垂直偏移量附加的垂直偏移量 E、F 00 5、聲音處理器NES的集成CPU里包含了一個(gè)4聲道的聲音處理器(2A03),為播放音樂提供準(zhǔn)模擬的聲音。4個(gè)聲道分別是:2個(gè)方波,一個(gè)三角波和一個(gè)噪聲發(fā)生通道,每個(gè)聲道的特性都不一樣。聲道:方波聲道能夠產(chǎn)生54.6Hz到12.4KHz的方波,它的主要特性是頻率掃略功能和調(diào)整輸出的占空周期;三角波聲

38、道可產(chǎn)生27.3Hz到55.9KHz分辨率是4位(16級(jí))的三角波,它的主要特性是輸出模擬三角波和線性計(jì)數(shù)器(可用來定時(shí)關(guān)閉聲道);噪聲通道能產(chǎn)生29.3Hz到44.7KHz的隨機(jī)噪聲,它的主要特性是產(chǎn)生偽隨機(jī)數(shù),在聲道輸出隨機(jī)頻率。幀計(jì)數(shù)器:2A03有一個(gè)含的幀計(jì)數(shù)器,它能夠產(chǎn)生60Hz(1/1幀率)、120Hz(1/2幀率)和240Hz(1/4幀率)的信號(hào),提供給其他一些聲音硬件使用。1/4幀率的信號(hào)是由CPU頻率乘以2即3579545Hz再除以14915得到的。聲音硬件延遲:在2A03復(fù)位之后,到各個(gè)聲音硬件開始接收時(shí)鐘信號(hào)之間有2048個(gè)時(shí)鐘周期的延遲。當(dāng)這2K個(gè)時(shí)鐘周期之后,聲音開始

39、正常工作,輸出使能有效。這種現(xiàn)象只發(fā)生在系統(tǒng)復(fù)位之后的2048個(gè)時(shí)鐘周期。這個(gè)資料的準(zhǔn)確性有待驗(yàn)證??刂萍拇嫫鳎?A03的聲音控制寄存器在CPU分配的特殊地址如下:寄存器地址 描述 $4000-$4003 方波1 $4004-$4007 方波2 $4008-$400B 三角波 $400C-$400F 噪聲 $4015 聲道使能、音長(zhǎng)計(jì)數(shù)狀態(tài) 只有$4015是可讀可寫的,其他都是只能夠?qū)懙?,如果你讀這些寄存器最可能得到的是$40(因?yàn)镹ES數(shù)據(jù)線的重負(fù)荷)。讀這些只寫寄存器對(duì)寄存器本身和聲道都沒有任何影響。每個(gè)聲音通道都有4個(gè)寄存器,具體描述如下:寄存器位 0 1 2 3 4 5 6 7 $40

40、00/$4004/$400C 音量衰減率 無衰減 音長(zhǎng)計(jì)數(shù)中止/衰減循環(huán)使能 占空周期類型 $4001/$4005 右移量 1減少/0增加波長(zhǎng) 掃描更新率 掃描使能 $4002/$4006/$400A 波長(zhǎng)低八位 $4003/$4007/$400B/$400F 波長(zhǎng)高三位 音長(zhǎng)計(jì)數(shù)值 $4008 線性計(jì)數(shù)值 音長(zhǎng)計(jì)數(shù)中止/線性計(jì)數(shù)開始 $4009/$400D 未使用 $400E 播放采樣率 未使用 隨機(jī)數(shù)類型發(fā)生 $4015:音長(zhǎng)狀態(tài)(讀) 方1 方2 三角 噪聲 DMC 未使用 DMC的IRQ狀態(tài) $4015:通道使能(寫) 方1 方2 三角 噪聲 DMC 未使用 聲道結(jié)構(gòu)體系:總表:設(shè)備

41、三角波 噪聲 方波 三角階梯發(fā)生器 線性計(jì)數(shù)器 可編程定時(shí)器 音長(zhǎng)計(jì)數(shù)器 4位DAC 音量衰減單元 掃頻單元 占空周期發(fā)生器 波長(zhǎng)轉(zhuǎn)換器 隨機(jī)數(shù)發(fā)生器 三角階梯發(fā)生器:這是一個(gè)5位的單向的計(jì)數(shù)器,只存在于三角波通道,計(jì)數(shù)器輸出的低4位分別通到一個(gè)XNOR(異或非)門。4個(gè)XNOR門被同一個(gè)選通信號(hào)控制,當(dāng)選通是0時(shí),計(jì)數(shù)器輸出的4個(gè)低位在門電路的輸出端反相;當(dāng)選通是1時(shí),不反相。選通信號(hào)連到計(jì)數(shù)器的最高位,這樣就可以在XNOR門的輸出端產(chǎn)生一個(gè)計(jì)數(shù)序列,就造出了一個(gè)比較理想的三角階梯信號(hào)發(fā)生器。XNOR門的輸出反饋到一個(gè)4位的DAC輸入端。當(dāng)三角波的音長(zhǎng)計(jì)數(shù)器或線性計(jì)數(shù)器是0時(shí),這個(gè)5位的計(jì)算

42、器會(huì)暫停,同時(shí)鎖定,計(jì)數(shù)器不會(huì)被重設(shè)置到某一個(gè)特定的狀態(tài)。在系統(tǒng)復(fù)位的時(shí)候,計(jì)數(shù)器裝入0。計(jì)數(shù)器的時(shí)鐘輸入直接連接到三角波通道一個(gè)11位的可編程定時(shí)器的輸出端,這樣,這個(gè)5位的三角波階梯信號(hào)發(fā)生器的輸出頻率就是通道可編程定時(shí)器頻率的1/32。線性計(jì)數(shù)器:($4008)這是一個(gè)7位的遞減計(jì)數(shù)器,只存在于三角波通道,計(jì)數(shù)器減到0時(shí)輸出。計(jì)數(shù)器的時(shí)鐘是240Hz(1/4幀率),用幀來計(jì)算長(zhǎng)度就是0.25×N,其中N是預(yù)先裝入的7位的值。計(jì)數(shù)器會(huì)保持計(jì)數(shù)狀態(tài)直到輸出0,這時(shí)線性計(jì)數(shù)器和三角階梯發(fā)生器的時(shí)鐘信號(hào)被禁止,導(dǎo)致兩個(gè)計(jì)數(shù)器被鎖定,線性計(jì)數(shù)器的輸出保持是0,聲道因此而出現(xiàn)靜音。線性計(jì)算

43、器有兩種工作模式:裝入和計(jì)數(shù)。在裝入模式,所有的輸入(寫到$4008)的值都會(huì)在傳送到輸出,也就沒有計(jì)數(shù);在計(jì)數(shù)模式,計(jì)數(shù)器會(huì)從當(dāng)前值向下減,在$4008的數(shù)會(huì)被忽略。下表表示了如何通過$4008的最高位設(shè)置計(jì)數(shù)器:舊值 新值 模式 0 X 計(jì)數(shù) 1 0 在寫周期沒有變化,計(jì)數(shù) 1 1 沒有變化 可編程定時(shí)器($4002/3、$4006/7、$400A/B、$400F):這是一個(gè)11位可預(yù)設(shè)的遞減計(jì)數(shù)器,每個(gè)聲音通道都有,但是注意在噪聲通道不是直接可用的,詳見“波長(zhǎng)轉(zhuǎn)換器”。這個(gè)計(jì)數(shù)器在計(jì)數(shù)完成的時(shí)候自動(dòng)重載,因此它在減到0前會(huì)計(jì)算N1個(gè)時(shí)鐘周期,其中N是預(yù)裝入的11位值。這個(gè)計(jì)數(shù)器直接使用6

44、502的頻率(1.79MHz)作為時(shí)鐘,輸出頻率是1.79MHz/(N1)。當(dāng)?shù)竭_(dá)計(jì)數(shù)終點(diǎn)的時(shí)候會(huì)產(chǎn)生一個(gè)1時(shí)鐘周期的脈沖,而輸出頻率會(huì)被反饋到對(duì)應(yīng)于聲音通道的特殊設(shè)備。對(duì)于方波,這個(gè)計(jì)數(shù)終點(diǎn)脈沖會(huì)被送到占空周期發(fā)生器;對(duì)于三角波,會(huì)被送到三角階梯發(fā)生器;對(duì)于噪聲,會(huì)被送到隨機(jī)數(shù)發(fā)生器。音長(zhǎng)計(jì)數(shù)器($4003、$4007、$400B、$400F):這是一個(gè)7位的遞減計(jì)數(shù)器,時(shí)鐘是60Hz,每個(gè)聲音通道都有。當(dāng)計(jì)數(shù)器減到0,計(jì)數(shù)停止,相應(yīng)的通道出現(xiàn)靜音。可以通過設(shè)置音長(zhǎng)計(jì)數(shù)時(shí)鐘的禁止位來暫停計(jì)數(shù),寫1則中止計(jì)數(shù),0則允許計(jì)數(shù)。在不同的寄存器里,這個(gè)位的位置不同,見寄存器表。計(jì)數(shù)值通過$4003、

45、$4007、$400B和$400F的37位來寫入。輸入的5位值通過下面2個(gè)表轉(zhuǎn)換到計(jì)數(shù)器的7位值:第3位0 46位的值 幀 第7位0 第7位1 0 05 06 1 0A 0C 2 14 18 3 28 30 4 50 60 5 1E 24 6 07 08 7 0E 10 第3位1 47位 幀 0 7F 1 01 2 02 3 03 4 04 5 05 6 06 7 07 8 08 9 09 A 0A B 0B C 0C D 0C E 0E F 0F 音長(zhǎng)計(jì)數(shù)器的狀態(tài)可以通過$4015來讀取,0表示計(jì)數(shù)器處于0狀態(tài)(停止在0),1表示處于非0狀態(tài)。通過寫0到$4015可以令音長(zhǎng)計(jì)數(shù)器永遠(yuǎn)處于0狀

46、態(tài),使得聲道被禁止;寫1可以取消禁止?fàn)顟B(tài),但它不會(huì)改變計(jì)數(shù)器里面的值。在系統(tǒng)復(fù)位時(shí)這個(gè)寄存器全部5個(gè)使用的位都被設(shè)置為0。4位DAC:這是一個(gè)標(biāo)準(zhǔn)的4位DAC(數(shù)模轉(zhuǎn)換)單元,有16級(jí)輸出電壓,4個(gè)聲道共用。在2A03里,方波1和方波2混合通過引腳1輸入,三角波和噪音通過引腳2輸入。這些模擬量輸出需要一個(gè)負(fù)的電流源,以使得電壓的級(jí)輸出變成平滑的聲音信號(hào)。因?yàn)镹ES只外置了一個(gè)100歐姆的下拉電阻,使得輸出波形的幅值很小,但是也獲得最小的不平滑度。這個(gè)不平滑度小到難以發(fā)現(xiàn),就算用示波器也不明顯。音量衰減單元($4000、$4004、$400C):音量衰減器只存在于方波和噪聲通道。當(dāng)衰減禁止位(第

47、4位)被設(shè)置為1,當(dāng)前的音量值(03位)被直接送到DAC。在下列情況中,音量值會(huì)被忽略,而直接送0到DAC。·聲道硬件要停止聲音,例如音長(zhǎng)計(jì)數(shù)器或掃頻單元;·處于占空周期或隨機(jī)數(shù)發(fā)生器輸出頻率信號(hào)的負(fù)值部分,也即在聲音使能的時(shí)候送到DAC的或者是音量值或者是0(無聲)。當(dāng)衰減禁止位被清零,03位當(dāng)前的值就是衰減率。衰減率是指音量從最大值向下線性衰減的速度,衰減速度是240/(N+1),N的值從$0$F。當(dāng)衰減到0之后,根據(jù)寄存器第5位的狀態(tài)將發(fā)生兩種情況: 第5位 行為 0 音量停在0,聲道靜音 1 音量循環(huán)不斷從最大值減到0 只有通過對(duì)寄存器進(jìn)行寫操作才能重新設(shè)置硬件的衰

48、減狀態(tài),否則就一直按當(dāng)前狀態(tài)進(jìn)行衰減甚至循環(huán),即使寄存器的第4位被設(shè)置成禁止衰減也沒有用。掃頻單元:這個(gè)東西只存在在方波通道中。當(dāng)寄存器的第7位被設(shè)為1,掃頻被激活,波長(zhǎng)會(huì)實(shí)時(shí)地增加或減少(對(duì)應(yīng)頻率降低或提高)。波長(zhǎng)的值通過$4002/3和$4006/7被不斷的讀入和更新,寫到那里的值會(huì)立刻反應(yīng)到聲音里。第46位代表了頻率掃略速度,或者說$4002/3和$4006/7里波長(zhǎng)值被改變的頻率。刷新率是120Hz/(N+1),N是寫入的值,從07。第3位控制掃頻的模式,1表示波長(zhǎng)減少,0表示波長(zhǎng)增加。第02位是右移量,用來控制波長(zhǎng)增量的右移量,見下表: 第3位 表達(dá)式,N是右移量從07 0 波長(zhǎng)波長(zhǎng)

49、(波長(zhǎng)>>N) 1 波長(zhǎng)波長(zhǎng)(波長(zhǎng)>>N) 當(dāng)滿足以下3個(gè)條件,波長(zhǎng)寄存器每個(gè)周期都會(huì)被更新:·第7位被設(shè)置,即掃頻使能;·右移量不等于0;·音量計(jì)數(shù)器的值非0。以下兩種情況會(huì)暫停掃描時(shí)鐘,使聲道靜音,而不管掃描刷新率是多少或掃描使能位是否設(shè)置:·11位的波長(zhǎng)值小于$008;·掃頻處于增加模式,而進(jìn)位標(biāo)志1。硬件在波長(zhǎng)寄存器被更新之前總要檢查進(jìn)位標(biāo)志的。 占空周期發(fā)生器($4000、$4004):占空周期發(fā)生器只存在于方波通道,它使用可編程定時(shí)器的輸出頻率作為時(shí)鐘,使用4位計(jì)數(shù)器來產(chǎn)生4種類型的占空周期,因此它的輸出頻率

50、是可編程定時(shí)器的1/16,輸出信號(hào)反饋到音量衰減器。占空類型見下表: 6、7位 一個(gè)時(shí)鐘周期里的占空周期(正/負(fù)) 00 2/14 01 4/12 10 8/8 11 12/4 波長(zhǎng)轉(zhuǎn)換器($400E):這個(gè)東西只存在于噪聲通道,用來將一個(gè)給定的4位值轉(zhuǎn)換成11位的波長(zhǎng),然后送到可編程定時(shí)器。下表是轉(zhuǎn)換關(guān)系: 03位 音度 音階 CPU時(shí)鐘周期(11位波長(zhǎng)1) 0 15 A 002 1 14 A 004 2 13 A 008 3 12 A 010 4 11 A 020 5 11 D 030 6 10 A 040 7 10 F 050 8 10 C 065 9 9 A 07F A 9 D 0BE

51、 B 8 A 0FE C 8 D 17D D 7 A 1FC E 6 A 3F9 F 5 A 7F2 隨機(jī)數(shù)發(fā)生器($400E):噪聲通道有一個(gè)1位的偽隨機(jī)數(shù)發(fā)生器,它是由一個(gè)15位的移位寄存器和一個(gè)異或門組成,它能夠提供長(zhǎng)和短兩種類型的偽隨機(jī)數(shù)序列:當(dāng)寄存器第7位是0時(shí),產(chǎn)生32767位的長(zhǎng)序列(32K模式);是1時(shí),產(chǎn)生93位的短序列(93位模式)。93位模式通常在聲道中產(chǎn)生較高頻率的聲音回放。下表說明了在移位寄存器的那些位里進(jìn)行異或: 模式 EDCBA9876543210<-< 32K * 93位 *     * 當(dāng)前的異或結(jié)果在下一個(gè)

52、移位周期之前送到移位寄存器的0位,1個(gè)位的隨機(jī)數(shù)從E引腳輸出,反相然后送到音量衰減器。移位寄存器每接收到兩個(gè)可編程定時(shí)器的時(shí)鐘脈沖就移位一次,所以它的頻率是可編程定時(shí)器的一半,也就是低一個(gè)音度。系統(tǒng)復(fù)位的時(shí)候移位寄存器被裝入值1。6、手柄、控制器和擴(kuò)展口NES支持很多種輸入設(shè)備,主要有手柄,光槍、4適配器和搖桿。兩個(gè)手柄分別通過$4016和$4017訪問,用選通脈沖對(duì)手柄復(fù)位,即對(duì)$4016或$4017先寫1后寫0,這將在游戲手柄的電路里發(fā)生個(gè)脈沖,然后可以在$4016或$4017讀取了。每次讀取將返回一個(gè)單一的按鈕的狀態(tài),在第0位(1表示按下,0表沒有)。第1位表示了游戲棒是否和端口連接。如

53、果連接就置0,否則是1。第6和7位的$4016/$4017好像有一樣的重要性,不知是什么,有些游戲期望當(dāng)一個(gè)按鈕按下的時(shí)候在$4016/$4017得到$41。復(fù)位的時(shí)候返回0。讀取 # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 按鍵 A鍵 B鍵 選擇 開始 上 下 左 右 忽略 信號(hào) 0 0 0 0 信號(hào)用來檢測(cè)是4端口的接入狀態(tài):    %0000:沒有連接設(shè)備    %0001:只有$4016手柄    %0010:只

54、有$4017手柄光槍:只是簡(jiǎn)單地使用了$4016或$4017的D0、D3和D4位,完全有可能同時(shí)接兩支光槍。4適配器:將手柄擴(kuò)展到4個(gè),支持4手柄的游戲有:Tengen的Gauntlet II和Nintendo的RC Pro Am 2。全部4個(gè)控制器使用$4016或$4017的D0位。對(duì)于$4016端口,讀18字節(jié)是手柄1,916字節(jié)是手柄3,$4017則對(duì)應(yīng)手柄2和4。讀取 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 按鍵 1P A 1P B 1P選擇 1P開始 1P上 1P下 1P左 1P右 2P A 2P

55、B 2P選擇 2P開始 2P上 2P下 2P左 2P右 信號(hào) 0 0 0 0 搖桿:有的游戲使用搖桿,例如Taito的Arkanoid。搖桿的位置通過$4017的D1來讀取,第一個(gè)讀的是MSB,第8個(gè)讀的是LSB,有效值的圍是98242,98代表了,搖桿完全是被逆時(shí)針轉(zhuǎn)的。讀到的數(shù)據(jù)要取反,例如讀到%01101011,取反是%10010100,即146。搖桿還帶有一個(gè)按鈕,通過$4016的D1來讀取,1代表按鈕被按下。擴(kuò)展口:NES都有一個(gè)擴(kuò)展口,用來接手柄或雙手柄。手柄初始化需要寫1和0,如果初始化沒有完成,或者循序錯(cuò)了,擴(kuò)展口就可以用來通訊,例如:    LDA #%00000001    STA $4016    STA $4017

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論