




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 任天堂產(chǎn)品系統(tǒng)文件(Pinokio163. 譯、編 2002/10/10)目錄 _ 1、系統(tǒng)簡介任天堂主機由6502處理器和一個特制的圖形處理器組成。CPU是6502,而不是傳言中的65C02(CMOS)。PPU的顯存是和CPU的存是分離的,可以通過對特殊端口的讀/寫來操作??◣Э赡馨娜萦形挥谔幚砥鞯刂?8000-$FFFF的ROM,和位于PPU地址$0000-$1FFF的VROM。由于NES只有2K的RAM,因此變量的可用的變量空間只有從$0000到$07FF共8個頁面。在開機之后RAM和VRAM中的容是0,但是注意:復位并不改變其中的容。在更小的卡帶,比如只有16KB的ROM,它占有
2、$C000-$FFFF,而$8000-$BFFF的空間是不用的。那些大于32KB的卡帶,它被特殊的電路分頁到一定的地址空間。一些卡帶在$6000-$7FFF有SRAM,那是電池存儲的位置。卡帶VROM被用來做圖案表(例如 Tile 表, 角色發(fā)生器等等)。通常的數(shù)量是8KB,包含兩個圖案表。大于8KB 的VROM被特殊的電路分頁到一定的地址空間。部的VRAM在 PPU 存里定位于$2000-$3FFF,它用來存儲命名表(例如屏幕緩沖)。雖然PPU 支持4個命名表,但只能支持兩個的存放空間。另外的兩個是開始兩個的鏡像。NES共有154條指令。在本文本里,你將遇到如下形式的符號:“Dn"
3、 (5 位,3 位,等等)。位是按從最低位(0 位)到最高位(7 位)。所有的十六進制都在前面加上一個美圓符號($)($2002,$4026,等等)是在6502處理器匯編里常用的符號,二進制前面加上一個百分號%。 2、縮寫表NES 任天堂娛樂系統(tǒng) Famicom 任天堂家用計算機,即FC FDS 任天堂磁碟機系統(tǒng) CPU 中央處理器,NES使用一個定制的6502(NMOS)芯片,有些型號為6527 PPU 圖像處理器,用來處理背景,精靈和其他圖像特性,通常為6538 APU 聲音處理器,集合在CPU部,包含4個模擬通道和1個數(shù)字通道 MMC ROM和VROM的擴容控制,用來控制訪問超過6502
4、限制的64K地址,同樣,也可以擴容VROM VRAM 圖像RAM,PPU專用,2K字節(jié) VROM 圖像ROM,儲存圖像數(shù)據(jù)的地方,可以由MMC切換到VRAM里 ROM 程序ROM,實際程序儲存的地方,擴容部分可以通過MMC切換到PRGRAM里 RAM 程序RAM,和ROM同義,不同的是它是RAM SPRRAM 精靈RAM,RAM中的256字節(jié),專用于儲存精靈,它不屬于VRAM或ROM SRAM 電池RAM,卡帶上用來保存游戲記錄的EPROM電擦寫ROM DMC 三角波調(diào)制通道,APU用來處理數(shù)字聲音的,也寫作PCM通道 EXRAM 擴展VRAM,用在MMC5里,可以擴展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個字節(jié)鏡像一次) $3FFF $4000 寄存器 $401F $4020 擴展ROM $5FFF $6000 卡帶的SRAM(需要有電池支持) $7FFF $8000 卡帶的下層ROM $BFFF $C000 卡帶的上層ROM $FFFF 中斷
6、:6502有3個中斷IRQ/BRK、NMI和RESET,每個中斷都有一個16位的向量,即指針,用來存放該中斷發(fā)生時中斷服務(wù)函數(shù)的地址。中斷發(fā)生時CPU都會把狀態(tài)標志和返回地址壓棧,然后調(diào)用中斷服務(wù)程序。IRQ/BRK中斷由一下兩種情況產(chǎn)生:一是軟件通過BRK指令產(chǎn)生,一是硬件通過IRQ引腳產(chǎn)生。RESET在開機的時候觸發(fā),這是ROM被裝入,6502跳到RESET向量指向的地址沒有寄存器被修改,沒有存被清空,這些都只在開機是發(fā)生。NMI指不可屏蔽中斷,它在VBlank即屏幕刷新時發(fā)生,持續(xù)時間根據(jù)系統(tǒng)(NTSC/PAL)不同而不同。NTSC是每秒60次,而PAL是每秒50次。6502的中斷延時是
7、7個時鐘周期,也就是說,進入和離開中斷都需要7個時鐘周期。它產(chǎn)生于PPU的每一幀結(jié)束,NMI中斷可以由$2000的第7位的1/0控制允許/禁止。大部分中斷應(yīng)該使用RTI指令返回,但是有些游戲不用,例如最終幻想1。它用一個很奇怪的方式:手工修改堆棧指針,然后執(zhí)行RTS指令。這種方法在技術(shù)上是可行的,但是應(yīng)該盡量避免。以上中斷在ROM有以下對應(yīng)的地址: 中斷地址 中斷 優(yōu)先權(quán) $FFFA NMI 中 $FFFC RESET 高 $FFFE IRQ/BRK 低 特別說明:NES的6502不支持10進制。雖然CLD和SED指令都正常工作,但是ADC和SBC都不使用CPU狀態(tài)標志的“D”位。由于復位后“
8、D”位的狀態(tài)是不確定的,所以游戲通常在程序開始時使用一個CLD指令。聲音寄存器映射到CPU部,所有波形發(fā)生的工作都在CPU部完成。注意那兩個分開的16K ROM段,它們可能是連續(xù)的,但是它們根據(jù)卡帶的大小扮演不同的角色。有的卡帶只有一個16K ROM,那么它就同時被裝入$8000和$COOO。所有游戲都將它們自己裝入$8000,使用32K RAM,但是它們都能夠通過存映射把多于一個16K ROM裝入$8000。VROM也是同樣的道理。當BRK中斷發(fā)生的時候,CPU把狀態(tài)標志壓入堆棧,同時設(shè)置“B”標志。而IRQ中斷發(fā)生時,CPU把狀態(tài)標志壓入堆棧,同時清除“B”標志。這是因為6502使用同一個
9、向量來處理兩種中斷,用“B”標志來區(qū)分它們。你可以用以下程序來區(qū)別兩種中斷: C134: PLA ; 拷貝CPU狀態(tài)標志到A C135: PHA ;
10、0; 把狀態(tài)標志還回給堆棧 C136: AND #$10 ; 檢查“B”標志 C138: BNE is_BRK_opcode; 如果設(shè)置了,就是軟件中斷(BRK)在NMI里指向BRK會導致已經(jīng)被壓棧的“B”標志被設(shè)置。6502的$6C指令(間接絕對跳轉(zhuǎn))有一個BUG,當?shù)臀蛔止?jié)是$FF時CPU將不能正確計算有效地址。例如:
11、 C100: 4F C1FF: 00 C200: 23 . D000: 6C FF C1 - JMP ($C1FF)本來它是應(yīng)該跳到$2300的,但是在計算高位字節(jié)的時候,在頁面邊界處地址是不能再增加的,所以實際將跳轉(zhuǎn)到$4F00。需要注意的是,頁面越界不會在變址間接尋址模式發(fā)生。由于0頁面的限制,由于0頁面的限制,所有變址間接尋址的讀寫都應(yīng)該在計算有效地址之后和#$FF進行邏輯與操作。例如: C000: LDX #
12、3 ; 從 $0002+$0003 讀變址地址, C002: LDA ($FF,X) ; 不是 $0102+$0103._ 4、圖形處理器PPU時序: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幀時間(Frame period)1000.0/60.0(ms)1000.0/50.0(ms)鏡像是指通過硬件映射特殊的存地址或圍的一個過程。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矩陣來顯示,這個網(wǎng)格就叫命名表。一個命名表和字符模式下的屏幕緩沖比較相象,它包含字符的代碼,也就是30列的32Byte長度。每個Tile有8x8個象素,每個命名表有32x30個Tile,也就是256x240象素。PPU支持4個命名表,他們在$2000,$2400,$2800,$2C00。在NTSC
16、制式下,上面和下面的8象素通常不顯示出來,只有256x224象素;在PAL制式下,屏幕有256x240象素。需要說的是,雖然PPU支持4個命名表,任天堂主機只支持2個命名表。另外兩個被做了鏡像。命名表保存了Tile的編號,而Tile存在圖案表里。計算命名表里Tile號對應(yīng)的實際地址的公式是:(Tile號×16)由$2000端口指定的圖案表地址 命名表鏡像:NES只有2048字節(jié)($800)的VRAM給命名表使用,但是如前表所示,NES有能力尋址到4個命名表。缺省情況下,NES卡帶都帶有水平和垂直鏡像,允許你改變命名表指向PPU的VRAM位置。這種方式同時影響兩個命名表,你不能單獨改變
17、其中的一個。每個卡帶都控制著PPU地址線的A10 和A11。它可能將他們設(shè)置成以下4種可能的方式的1種。下面這個圖表有助于理解NES里的各種鏡像,指向PPU VRAM中命名表的12位地址相當于“$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個命名表物理上獨立的 1 1 單屏幕 $X00 $X00 $X00 $X00 所有的命名表指一樣的VRAM區(qū)域,X=0、4、8、C 0 0 VROM鏡像 Mapper 68#游戲映射VROM到PPU VRAM的命名表,這使得命名表是基于VROM的,你不能寫它但卻可以通過mapper自己來控制是否使用這種特性 圖案表:圖
19、案表儲存了實際8x8象素的Tile,同時也儲存了用來指向NES調(diào)色板全部16種顏色的4位元矩陣的低兩位。PPU支持兩個圖案表在$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 點表示0號顏色,數(shù)字表示實際調(diào)色板顏色代號 注意在圖案表里存儲的是每個點的2個位。其他兩個由屬性表得到。所以,在屏幕上總體出現(xiàn)的顏色數(shù)是16,而每個塊里只有4種顏色。 屬性表:每個命名表有它自己的屬性表。屬性表的每一個字節(jié)代表了屏幕上的一組4x4的Tile,一共有8x8個字節(jié)。有幾種方法來描述屬性表里一個字節(jié)的功能: *保存
21、32x32象素方格的高2位顏色,每16x16象素用2位; *保存16個8x8 Tile的高2位顏色; *保存4個4x4 Tile格子的高2位顏色??匆韵聝蓚€圖表幫助理解:1、一個16x16 象素的格子:#0-F 代表了一個8x8 Tile,方塊 x 代表了4個8x8 Tile, 方塊 0 #0 #1 #2 #3 方塊 1 #4 #5 #6 #7 方塊 2 #8 #9 #A #B 方塊 3 #C #D #E #F 2、屬性表一個字節(jié)的實際格式定義如下(對應(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有兩個調(diào)色板,背景調(diào)色板和精靈調(diào)色板。調(diào)色板不包含實際的RGB值,它們更象一個索引表。寫到$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ù)會被鏡像到$3F10,$3F04鏡像到$3F14。背景和精靈的最高3個調(diào)色板的0號色盤定義為透明,存在那里的顏色不會被畫出來。PPU使用放在$3F00里的顏色作為背景色,詳細如下: *$0D被寫到$3F00(鏡像到$3F10); *$03被寫到$3F08(鏡像到$3F18); *$1A被寫到$3F18; *$3F08被讀到累加器。PPU使用$0D作為背
24、景顏色,盡管$3F08有一個顏色$03(因為0號顏色在所有的調(diào)色板里都定義為透明)。最后,累加器上有一個值$1A,這是從$3F18映像過來的。又一次,這個$1A值沒有被畫出,因為所有的調(diào)色板的0號顏色被定義為透明。整個背景和精靈調(diào)色板同時也映像到VRAM的其他區(qū)域,$3F20-$3FFF全部都是這兩個調(diào)色板分別的映像。寫到$3F00-$3FFF的D6D7字節(jié)被忽略。 背景滾動:NES可以通過預(yù)提取命名表,圖案表和屬性表來使背景滾動,背景是獨立于精靈而位于最下層的??梢运胶痛怪睗L動。 水平滾動 垂直滾動 0 512 A B A 0480 B 命名表
25、A通過$2000的D1-D0指定,B是跟在后面的一個命名表,根據(jù)鏡像不同B是動態(tài)的。這個不能工作在水平和垂直同時滾動的游戲里。背景會跨越多個命名表,如下所示: 命名表#2($2800) 命名表#3($2C00) 命名表#0($2000) 命名表#1($2400) 在$2005里寫到水平滾動的值可以從0256,寫到垂直滾動的值從0239,239是考慮了負值的結(jié)果,例如248代表8。 屏幕和精靈分層:下面是NES畫圖的循序: 前臺 后臺 CI OBJs 0-63 BG OBJs 0-63 EXT 精靈RAM BGPRI=0 精靈RAMBGPRI=1 CI代表顏色亮
26、度,相當于$2001的D7-D5;BG是背景;EXT是擴展口的圖像信號。BGPRI代表VRAM里背景優(yōu)先權(quán)位,每個精靈都有的,即第二字節(jié)的D5位。OBJ數(shù)代表了實際精靈的,不是Tile索引值。前臺高于任何其他層,最后被畫上,后臺低于任何其他層,最先被畫上。 精靈和精靈RAM:NES用一個頁面(256字節(jié))來存放動畫,每個精靈4個字節(jié),一共可以有64個動畫/精靈,它們可以是8x8或8x16象素。動畫/精靈圖案被存儲在VRAM的圖案表其中一個里面。精靈屬性,例如翻轉(zhuǎn)和優(yōu)先權(quán)被儲存在一個特殊的256字節(jié)的精靈RAM,它不是CPU或PPU的地址的一部分。整個精靈RAM可以通過$4014的DMA方式來寫
27、,寫一個8位的數(shù)到$4014就將這個8位數(shù)所指定的存頁面整個拷貝到精靈RAM上。也可以通過把開始地址放在$2003然后讀/寫于$2004(每次存取地址自動加一),它是一個一個字節(jié)存取的。動畫/精靈的屬性格式是:動畫/精靈屬性RAM:| 精靈#0 | 精靈#1 | . | 精靈#62 | 精靈#63 | 字節(jié) 位 描述 0 YYYYYYYY 精靈左上角的Y坐標1 1 IIIIIIII Tile索引號 2 vhp000cc v垂直翻轉(zhuǎn)(1翻轉(zhuǎn)) h水平翻轉(zhuǎn)(1翻轉(zhuǎn)) p背景優(yōu)先權(quán)(0前臺1后臺) c顏色的高2位 3 XXXXXXXX 精靈左上角的X
28、坐標 Tile索引號就和命名表里的一樣。精靈圖案可以象Tile圖案對于背景圖片一樣抓取。唯一的不同是在8x16的精靈時,上半部分(偶數(shù))的Tile索引由精靈圖案表的$0000開始,而下半部分(奇數(shù))由$1000開始。$2000寄存器對8x16精靈無效。全部64個精靈有自己部的優(yōu)先權(quán),0號最高(最后被畫),63號最低(最先被畫)。每條掃描線只能顯示8個精靈,每個精靈RAM條目都會被檢查是否處于其他精靈的水平圍。注意,這是基于掃描線的,不是基于精靈的,也就是說,會進行256次檢查,而不是256/8或256/16次。在一個真實的NES芯片里,如果精靈被禁止($2001的D4是0)很長一段時間,精靈數(shù)
29、據(jù)會漸漸消失??梢岳斫鉃榫`RAM是一個DRAM,D4控制了DRAM的周期刷新信號。 碰撞標志:碰撞標志是PPU狀態(tài)寄存器($2002)的第6位(D6)。PPU能夠找出0號精靈的位置,然后設(shè)置D6,它是這樣工作的:PPU掃描出背景圖案象素和精靈象素同時不是透明的第一個地方。比如,屏幕的背景是一個非透明顏色(顏色號>0),0號精靈的坐標是(12,34),它只是在第4行的開始才有象素,那么,碰撞標志在屏幕刷新到(12,37)時才被設(shè)置。要記住,0號顏色被定義為透明。引起D6被設(shè)置的象素必須是已經(jīng)被畫出來的。下面的例子能幫助理解,這是兩個Tile,下劃線表示透明的0號顏色,*號表示碰撞標志被設(shè)
30、置。 精靈 + 背景 = 結(jié)果 *會用2號顏色畫出 _1111_111111_11222211112_211112_21111222211_111111_1111_ _2_21_211_2111_21111_211111_2111111 _1111_111111211222211112_*11112_221111222211_1111111_2111111 這個例子說的是背景精靈,但是對于靠近背景的精靈也通用,即精靈精靈,通過設(shè)置背景優(yōu)先權(quán)來實現(xiàn)。D6不可以通過讀PPU的狀態(tài)來復位,只在每次VBlank之后被清零。Hit標志可以用在水平或者垂直屏幕分割的時候,還有許多好
31、玩的效果。 水平和垂直消隱:所有的游戲機都有一個刷新動作,用來重新定位電子槍顯示可見的數(shù)據(jù)。最通用的顯示設(shè)備是電視機,它分為每秒刷新60次的NTSC制式和50次的PAL制式。電子槍從左到右畫出象素,它每次只能畫一條掃描線,畫下一條之前要先回到左面并且做好準備,這之間有一段時間叫做水平消隱(HBlank)。在畫完全部256條掃描線之后它又回到屏幕左上角準備下一次畫屏幕(幀),這之間的一段時間就是垂直消隱(VBlank)。電子槍就是一個不斷的走之字形的過程。VBlank標志就是$2002的D7,它表明PPU是否在VBlank期間,當VBlank標志存在時,你就可以通過$2006和$2007訪問PP
32、U存。一個程序可以通過讀$2002來使D7復位。在屏幕刷新期間,我們不能訪問PPU,而PPU會在CPU背后修改VRAM指針,這樣我們很容易在寫入VRAM時出錯,為了讓PPU停下來,可以對$2000和$2001寫00。 訪問PPU RAM:在一個任天堂主機,訪問PPU存只可以在VBlank期間。當在屏幕刷新時訪問會破壞刷新地址寄存器,一般它經(jīng)常用來做隱含的“分割屏幕”效果(見“在屏幕刷新的時候訪問VRAM”)。很多小些的ROM用只讀存儲體(VROM)用做圖案表。在這種情況下,你不可以寫PPU地址,只可以讀。寫PPU記憶體: a) 寫高位地址字節(jié)到$2006
33、160; b) 寫低位地址字節(jié)到$2006 c) 寫數(shù)據(jù)到$2007。每一個寫操作后,地址會增加1($2000的第二位是0)或增加32($2000的第二位是1)。讀PPU記憶體: a) 寫高位地址字節(jié)到$2006 b) 寫低位地址字節(jié)到$2006 c) 從$2007讀數(shù)據(jù)。從$2007讀到的第一個字節(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這個只適用于$0000-$FEFF,訪問調(diào)色板數(shù)據(jù)沒
36、有這種現(xiàn)象。 在屏幕刷新的時候訪問VRAM:前面說過,在屏幕刷新的時候存取VRAM的地址和數(shù)據(jù)是不合法的。許多程序存取這些寄存器來制造不同的滾動效果。比如,一些游戲從屏幕底部開始滾動,那么它可能向$2006寫第一行的狀態(tài)來復位屏幕滾動。更好的詭計是PPU在屏幕刷新時用VRAM的地址寄存器來儲存當前地址。通過向$2006修改地址以與讓PPU從一個不同的地方接著刷新。關(guān)于$2007如何影響屏幕刷新仍不了解。 當不知道向$2006中寫什么數(shù)據(jù)時,看下面的圖表。 寫到$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里包含了一個4聲道的聲音處理器(2A03),為播放音樂提供準模擬的聲音。4個聲道分別是:2個方波,一個三角波和一個噪聲發(fā)生通道,每個聲道的特性都不一樣。聲道:方波聲道能夠產(chǎn)生54.6Hz到12.4KHz的方波,它的主要特性是頻率掃略功能和調(diào)整輸出的占空周期;三角波聲
38、道可產(chǎn)生27.3Hz到55.9KHz分辨率是4位(16級)的三角波,它的主要特性是輸出模擬三角波和線性計數(shù)器(可用來定時關(guān)閉聲道);噪聲通道能產(chǎn)生29.3Hz到44.7KHz的隨機噪聲,它的主要特性是產(chǎn)生偽隨機數(shù),在聲道輸出隨機頻率。幀計數(shù)器:2A03有一個含的幀計數(shù)器,它能夠產(chǎn)生60Hz(1/1幀率)、120Hz(1/2幀率)和240Hz(1/4幀率)的信號,提供給其他一些聲音硬件使用。1/4幀率的信號是由CPU頻率乘以2即3579545Hz再除以14915得到的。聲音硬件延遲:在2A03復位之后,到各個聲音硬件開始接收時鐘信號之間有2048個時鐘周期的延遲。當這2K個時鐘周期之后,聲音開始
39、正常工作,輸出使能有效。這種現(xiàn)象只發(fā)生在系統(tǒng)復位之后的2048個時鐘周期。這個資料的準確性有待驗證??刂萍拇嫫鳎?A03的聲音控制寄存器在CPU分配的特殊地址如下:寄存器地址 描述 $4000-$4003 方波1 $4004-$4007 方波2 $4008-$400B 三角波 $400C-$400F 噪聲 $4015 聲道使能、音長計數(shù)狀態(tài) 只有$4015是可讀可寫的,其他都是只能夠?qū)懙模绻阕x這些寄存器最可能得到的是$40(因為NES數(shù)據(jù)線的重負荷)。讀這些只寫寄存器對寄存器本身和聲道都沒有任何影響。每個聲音通道都有4個寄存器,具體描述如下:寄存器位 0 1 2 3 4 5 6 7 $40
40、00/$4004/$400C 音量衰減率 無衰減 音長計數(shù)中止/衰減循環(huán)使能 占空周期類型 $4001/$4005 右移量 1減少/0增加波長 掃描更新率 掃描使能 $4002/$4006/$400A 波長低八位 $4003/$4007/$400B/$400F 波長高三位 音長計數(shù)值 $4008 線性計數(shù)值 音長計數(shù)中止/線性計數(shù)開始 $4009/$400D 未使用 $400E 播放采樣率 未使用 隨機數(shù)類型發(fā)生 $4015:音長狀態(tài)(讀) 方1 方2 三角 噪聲 DMC 未使用 DMC的IRQ狀態(tài) $4015:通道使能(寫) 方1 方2 三角 噪聲 DMC 未使用 聲道結(jié)構(gòu)體系:總表:設(shè)備
41、三角波 噪聲 方波 三角階梯發(fā)生器 線性計數(shù)器 可編程定時器 音長計數(shù)器 4位DAC 音量衰減單元 掃頻單元 占空周期發(fā)生器 波長轉(zhuǎn)換器 隨機數(shù)發(fā)生器 三角階梯發(fā)生器:這是一個5位的單向的計數(shù)器,只存在于三角波通道,計數(shù)器輸出的低4位分別通到一個XNOR(異或非)門。4個XNOR門被同一個選通信號控制,當選通是0時,計數(shù)器輸出的4個低位在門電路的輸出端反相;當選通是1時,不反相。選通信號連到計數(shù)器的最高位,這樣就可以在XNOR門的輸出端產(chǎn)生一個計數(shù)序列,就造出了一個比較理想的三角階梯信號發(fā)生器。XNOR門的輸出反饋到一個4位的DAC輸入端。當三角波的音長計數(shù)器或線性計數(shù)器是0時,這個5位的計算
42、器會暫停,同時鎖定,計數(shù)器不會被重設(shè)置到某一個特定的狀態(tài)。在系統(tǒng)復位的時候,計數(shù)器裝入0。計數(shù)器的時鐘輸入直接連接到三角波通道一個11位的可編程定時器的輸出端,這樣,這個5位的三角波階梯信號發(fā)生器的輸出頻率就是通道可編程定時器頻率的1/32。線性計數(shù)器:($4008)這是一個7位的遞減計數(shù)器,只存在于三角波通道,計數(shù)器減到0時輸出。計數(shù)器的時鐘是240Hz(1/4幀率),用幀來計算長度就是0.25×N,其中N是預(yù)先裝入的7位的值。計數(shù)器會保持計數(shù)狀態(tài)直到輸出0,這時線性計數(shù)器和三角階梯發(fā)生器的時鐘信號被禁止,導致兩個計數(shù)器被鎖定,線性計數(shù)器的輸出保持是0,聲道因此而出現(xiàn)靜音。線性計算
43、器有兩種工作模式:裝入和計數(shù)。在裝入模式,所有的輸入(寫到$4008)的值都會在傳送到輸出,也就沒有計數(shù);在計數(shù)模式,計數(shù)器會從當前值向下減,在$4008的數(shù)會被忽略。下表表示了如何通過$4008的最高位設(shè)置計數(shù)器:舊值 新值 模式 0 X 計數(shù) 1 0 在寫周期沒有變化,計數(shù) 1 1 沒有變化 可編程定時器($4002/3、$4006/7、$400A/B、$400F):這是一個11位可預(yù)設(shè)的遞減計數(shù)器,每個聲音通道都有,但是注意在噪聲通道不是直接可用的,詳見“波長轉(zhuǎn)換器”。這個計數(shù)器在計數(shù)完成的時候自動重載,因此它在減到0前會計算N1個時鐘周期,其中N是預(yù)裝入的11位值。這個計數(shù)器直接使用6
44、502的頻率(1.79MHz)作為時鐘,輸出頻率是1.79MHz/(N1)。當?shù)竭_計數(shù)終點的時候會產(chǎn)生一個1時鐘周期的脈沖,而輸出頻率會被反饋到對應(yīng)于聲音通道的特殊設(shè)備。對于方波,這個計數(shù)終點脈沖會被送到占空周期發(fā)生器;對于三角波,會被送到三角階梯發(fā)生器;對于噪聲,會被送到隨機數(shù)發(fā)生器。音長計數(shù)器($4003、$4007、$400B、$400F):這是一個7位的遞減計數(shù)器,時鐘是60Hz,每個聲音通道都有。當計數(shù)器減到0,計數(shù)停止,相應(yīng)的通道出現(xiàn)靜音??梢酝ㄟ^設(shè)置音長計數(shù)時鐘的禁止位來暫停計數(shù),寫1則中止計數(shù),0則允許計數(shù)。在不同的寄存器里,這個位的位置不同,見寄存器表。計數(shù)值通過$4003、
45、$4007、$400B和$400F的37位來寫入。輸入的5位值通過下面2個表轉(zhuǎn)換到計數(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 音長計數(shù)器的狀態(tài)可以通過$4015來讀取,0表示計數(shù)器處于0狀態(tài)(停止在0),1表示處于非0狀態(tài)。通過寫0到$4015可以令音長計數(shù)器永遠處于0狀
46、態(tài),使得聲道被禁止;寫1可以取消禁止狀態(tài),但它不會改變計數(shù)器里面的值。在系統(tǒng)復位時這個寄存器全部5個使用的位都被設(shè)置為0。4位DAC:這是一個標準的4位DAC(數(shù)模轉(zhuǎn)換)單元,有16級輸出電壓,4個聲道共用。在2A03里,方波1和方波2混合通過引腳1輸入,三角波和噪音通過引腳2輸入。這些模擬量輸出需要一個負的電流源,以使得電壓的級輸出變成平滑的聲音信號。因為NES只外置了一個100歐姆的下拉電阻,使得輸出波形的幅值很小,但是也獲得最小的不平滑度。這個不平滑度小到難以發(fā)現(xiàn),就算用示波器也不明顯。音量衰減單元($4000、$4004、$400C):音量衰減器只存在于方波和噪聲通道。當衰減禁止位(第
47、4位)被設(shè)置為1,當前的音量值(03位)被直接送到DAC。在下列情況中,音量值會被忽略,而直接送0到DAC。·聲道硬件要停止聲音,例如音長計數(shù)器或掃頻單元;·處于占空周期或隨機數(shù)發(fā)生器輸出頻率信號的負值部分,也即在聲音使能的時候送到DAC的或者是音量值或者是0(無聲)。當衰減禁止位被清零,03位當前的值就是衰減率。衰減率是指音量從最大值向下線性衰減的速度,衰減速度是240/(N+1),N的值從$0$F。當衰減到0之后,根據(jù)寄存器第5位的狀態(tài)將發(fā)生兩種情況: 第5位 行為 0 音量停在0,聲道靜音 1 音量循環(huán)不斷從最大值減到0 只有通過對寄存器進行寫操作才能重新設(shè)置硬件的衰
48、減狀態(tài),否則就一直按當前狀態(tài)進行衰減甚至循環(huán),即使寄存器的第4位被設(shè)置成禁止衰減也沒有用。掃頻單元:這個東西只存在在方波通道中。當寄存器的第7位被設(shè)為1,掃頻被激活,波長會實時地增加或減少(對應(yīng)頻率降低或提高)。波長的值通過$4002/3和$4006/7被不斷的讀入和更新,寫到那里的值會立刻反應(yīng)到聲音里。第46位代表了頻率掃略速度,或者說$4002/3和$4006/7里波長值被改變的頻率。刷新率是120Hz/(N+1),N是寫入的值,從07。第3位控制掃頻的模式,1表示波長減少,0表示波長增加。第02位是右移量,用來控制波長增量的右移量,見下表: 第3位 表達式,N是右移量從07 0 波長波長
49、(波長>>N) 1 波長波長(波長>>N) 當滿足以下3個條件,波長寄存器每個周期都會被更新:·第7位被設(shè)置,即掃頻使能;·右移量不等于0;·音量計數(shù)器的值非0。以下兩種情況會暫停掃描時鐘,使聲道靜音,而不管掃描刷新率是多少或掃描使能位是否設(shè)置:·11位的波長值小于$008;·掃頻處于增加模式,而進位標志1。硬件在波長寄存器被更新之前總要檢查進位標志的。 占空周期發(fā)生器($4000、$4004):占空周期發(fā)生器只存在于方波通道,它使用可編程定時器的輸出頻率作為時鐘,使用4位計數(shù)器來產(chǎn)生4種類型的占空周期,因此它的輸出頻率
50、是可編程定時器的1/16,輸出信號反饋到音量衰減器。占空類型見下表: 6、7位 一個時鐘周期里的占空周期(正/負) 00 2/14 01 4/12 10 8/8 11 12/4 波長轉(zhuǎn)換器($400E):這個東西只存在于噪聲通道,用來將一個給定的4位值轉(zhuǎn)換成11位的波長,然后送到可編程定時器。下表是轉(zhuǎn)換關(guān)系: 03位 音度 音階 CPU時鐘周期(11位波長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 隨機數(shù)發(fā)生器($400E):噪聲通道有一個1位的偽隨機數(shù)發(fā)生器,它是由一個15位的移位寄存器和一個異或門組成,它能夠提供長和短兩種類型的偽隨機數(shù)序列:當寄存器第7位是0時,產(chǎn)生32767位的長序列(32K模式);是1時,產(chǎn)生93位的短序列(93位模式)。93位模式通常在聲道中產(chǎn)生較高頻率的聲音回放。下表說明了在移位寄存器的那些位里進行異或: 模式 EDCBA9876543210<-< 32K * 93位 * * 當前的異或結(jié)果在下一個
52、移位周期之前送到移位寄存器的0位,1個位的隨機數(shù)從E引腳輸出,反相然后送到音量衰減器。移位寄存器每接收到兩個可編程定時器的時鐘脈沖就移位一次,所以它的頻率是可編程定時器的一半,也就是低一個音度。系統(tǒng)復位的時候移位寄存器被裝入值1。6、手柄、控制器和擴展口NES支持很多種輸入設(shè)備,主要有手柄,光槍、4適配器和搖桿。兩個手柄分別通過$4016和$4017訪問,用選通脈沖對手柄復位,即對$4016或$4017先寫1后寫0,這將在游戲手柄的電路里發(fā)生個脈沖,然后可以在$4016或$4017讀取了。每次讀取將返回一個單一的按鈕的狀態(tài),在第0位(1表示按下,0表沒有)。第1位表示了游戲棒是否和端口連接。如
53、果連接就置0,否則是1。第6和7位的$4016/$4017好像有一樣的重要性,不知是什么,有些游戲期望當一個按鈕按下的時候在$4016/$4017得到$41。復位的時候返回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鍵 選擇 開始 上 下 左 右 忽略 信號 0 0 0 0 信號用來檢測是4端口的接入狀態(tài): %0000:沒有連接設(shè)備 %0001:只有$4016手柄 %0010:只
54、有$4017手柄光槍:只是簡單地使用了$4016或$4017的D0、D3和D4位,完全有可能同時接兩支光槍。4適配器:將手柄擴展到4個,支持4手柄的游戲有:Tengen的Gauntlet II和Nintendo的RC Pro Am 2。全部4個控制器使用$4016或$4017的D0位。對于$4016端口,讀18字節(jié)是手柄1,916字節(jié)是手柄3,$4017則對應(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右 信號 0 0 0 0 搖桿:有的游戲使用搖桿,例如Taito的Arkanoid。搖桿的位置通過$4017的D1來讀取,第一個讀的是MSB,第8個讀的是LSB,有效值的圍是98242,98代表了,搖桿完全是被逆時針轉(zhuǎn)的。讀到的數(shù)據(jù)要取反,例如讀到%01101011,取反是%10010100,即146。搖桿還帶有一個按鈕,通過$4016的D1來讀取,1代表按鈕被按下。擴展口:NES都有一個擴展口,用來接手柄或雙手柄。手柄初始化需要寫1和0,如果初始化沒有完成,或者循序錯了,擴展口就可以用來通訊,例如: LDA #%00000001 STA $4016 STA $4017
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年財經(jīng)類專業(yè)畢業(yè)生考試試題及答案
- 2025年項目經(jīng)濟管理考試題及答案
- 2025年中級會計職稱考試試卷及答案透徹解讀
- 2025年汽車銷售與市場營銷考試試卷及答案
- 2025年生物醫(yī)藥行業(yè)發(fā)展與政策考試試題及答案
- 環(huán)保產(chǎn)業(yè)供應(yīng)商可持續(xù)發(fā)展合作協(xié)議
- 教材版權(quán)授權(quán)與多媒體教育產(chǎn)品開發(fā)合同
- 智能家居系統(tǒng)安裝與維保服務(wù)補充協(xié)議
- 環(huán)保建筑工程合同糾紛仲裁服務(wù)協(xié)議書
- 抖音平臺火花教育行業(yè)獨家合作協(xié)議
- 中考英語情景交際和看圖寫話
- 知道智慧網(wǎng)課《科學社會主義概論》章節(jié)測試答案
- 2024國有土地房屋買賣合同
- QB/T 2660-2024 化妝水(正式版)
- 《養(yǎng)老護理員》-課件:自然災(zāi)害的應(yīng)對處理知識
- 新思想引領(lǐng)新征程新青年建功新時代 (修改版)
- 跨部門協(xié)調(diào)與部門間合作
- 飼料添加劑(全)課件
- 《田間藥效試驗》課件
- 勞務(wù)外包服務(wù)方案(技術(shù)方案)
- JJG 443-2023燃油加油機(試行)
評論
0/150
提交評論