當年的Fc《魂鬥羅》《瑪麗》是用什麽工具做的。如何反編譯。
任夭堂遊戲編程探密(文字版)
第壹章 任天堂遊戲結構概論
長期以來,由於任天堂公司在技術上的封鎖和國內遊戲開發工具的久缺.任天堂遊戲
蒙上了壹層神密的面紗,中國人只能玩任天堂遊戲.而不能象蘋果機、中華學習機那樣了解
遊戲程序、自己動手編寫遊戲。近年來,隨著任夭堂系列遊戲機配套鍵盤的問世,逐步創造了
揭開這層面紗的條件.特別是配有打印機接口的“裕興”、“金字塔”等高檔遊戲機鍵盤的陸續
推出,用戶僅僅編寫壹個簡單的反匯編程序就可打印出系統軟件的源程序,從而為探索任天
堂遊戲軟件的奧秘提供了有效的手段。
有人疑問任夭堂遊戲機的中央處理器同中華學習機壹樣也是八位的CPU.但為什麽
它能夠產生出如此絢麗多彩的動畫、美妙動聽的音響、栩栩如生的角色,其效果遠遠勝過美
國的“雅達利“,更強過中華學習機的遊戲呢?究其原因,關鍵在於任天堂遊戲機的設計者們
在傳統的八位機上獨具匠心、另辟蹊徑,從硬件上進行了獨創的改造,在軟件上進行了大膽
的嘗試,使壹個CPU發揮了兩個CPU的功效,產生了絕妙非凡的藝術效果.從而以物美價
廉的絕對優勢迅速占領了遊戲機市場,掀起了家庭娛樂領域的第三次浪潮。本文擬從分析任
天堂遊戲的軟、硬件特點出發,揭開任天堂遊戲編程的秘密.以壹與廣大同好切磋。
1·1 任天堂遊戲機的硬件特點
1·1·1電路原理框圖
任天堂遊戲機的硬件***分兩部分:主要部分是遊戲機.從屬部分是遊戲卡。遊戲機提供
遊戲的運行環境,遊戲卡提供支持遊戲的軟件,其電路原理框圖如圖1壹1。
上圖中6527 CPU為中央處理器,田於它的任務是處理程序,所以壹般把與它相連的部
件加以前綴"P".故CPU的地址總線表示為PADD,數據總線表示為PDATA,CPU管理的
存儲器表示為PRAM,PROM等。同樣.6528 PPU的任務是處理圖像,所以凡與它相關的部
件均加以前綴“V”。
1·1·2 中央處理器6527 CPU
1.CPU的內部結構
6527 CPU是壹個八位單片機,在它的內部除固化有6502系列的CPU外,還有壹個
可編程音響發生器PSG(Programable Sound Generator)和24個八位只寫寄存器,其地址空
間分配為$4000-$4017.主要用於CPU的I/O操作,PSG音響發生器的工作就是由這些
寄存器控制完成的.
1·1·4 遊戲卡
1、遊戲卡的基本組成
普通的單節目遊戲卡壹般由兩片ROM或EPROM組成,ROM的容量由遊戲程序量的
大小決定.最簡單的任天堂遊戲為24K,故這種卡內有塊16K的ROM存放程序,壹塊
8K的ROM存圖形字模(目前有軟封裝的IC,它把兩塊ROM封在壹起)。典型的任天堂
遊戲程序量為40K,它使用壹塊32K的ROM存程序、壹塊8K的ROM存字模。當程序量大
於40K時則要對ROM進行容量擴充.
2、遊戲卡各腳的功能
遊戲卡是壹60腳的接插件,各腳功能見圖1壹4。
3、常用 ROM引腳功能簡介
遊戲卡中常用ROM或EPROM的型號有27C64(8 X 8K)、27C128(8X l6K)、27C256(8
X 32K), 27C512 (8 X 64 K ), 27C1000 (8 X 128K),或後綴數字相同而前綴不同的其它公
司產品,盒卡中還有2兆位(8 x 256K)至8兆位(8X 1000K)的芯片。其中27C64~27C512為28
腳的芯片,27C1000或更大容量的芯片為32腳(個別的27C1000仍為28腳,它使用了OE.
CE中的壹個腳作為地址線).
1·2 任夭堂遊戲軟件的特點
目前流行的任夭堂遊戲軟件有數百種,內容已涉及及到政治、經濟、軍事、戰爭、教育、管
理、體育、娛樂等各個領域.可以說任天堂遊戲已兼顧了男、女、老、中、青、少、幼各個年齡階
層,深受世界各國人民所喜愛。也許這就是它迅速普及的主要原因。但是,任天堂遊戲盡管
內容千變萬化、情節各異,其軟件結構和處理方法則是基本相同的,它們有著***同的特點。
1·2·1 任天堂遊戲的軟件結構
歸納起來,任天堂遊戲軟件結構可分為兩大類:基本結構和擴展結構.
壹、基本結構
基本的任夭堂遊戲軟件容分為40K字節(標準卡標註為LB)。典型遊戲如,《1942》、《超
級瑪麗》、《拆屋工》等.其中32k為遊戲控制程序,供CPU執行;8K為圖形字模,由PPU處
理。另外還有壹種低配置結構,軟件容量為24K{標註為LA),這是壹種早期軟件。其中控制
程序為16K;字模為8K。典型遊戲有《火箭車》、《馬戲團》、《金塊Ⅰ、Ⅱ》等。
40K軟件的控制程序存放地址在CPU管理的$8000壹$FFFF空間;字模地址在PPU
管理的$0000-$1FFF空間。16K軟件的控制程序存放地址為$C000-$FFFF;字模地
址也是$0000壹$1FFF。
二、擴展結構
容量在40K以上的軟件均為擴展結構。它們在基本結構的基礎上或者擴展控制程序
區、或者擴展字模區。擴展方法是在某段地址範圍進行空間存儲體切換。壹般程序區在
$8000-$BFFF空間切換;字模區在$0000-$1FFF空間切換。切換種類以軟件容量的
大小略有不同:
對於48K卡(標註為LC〕,其程序部分為32K;宇模部分為16K,分兩個8K存儲體.
典型遊戲有《七寶奇謀》、《影子傳說》等。
通常把24k-48K容量的遊戲卡稱為低檔卡或低檔遊戲。
對於64K卡(標註為LD)有兩種結構:壹種是其程序部分為32K;字模部分為32x,分
為四個8K存儲體.典型遊戲有《迷宮組曲》,《智慧城》、《沙羅曼蛇壹代》、《北鬥神拳壹代》
等;第二種則是程序與字模***用64k,分為四個存儲體.典型遊戲有《米老鼠大冒險》、《冒險
島》、《俄羅斯方塊1、2》等。
80K的遊戲不多(標註為LE),常見的有《中國拳》、《金牌瑪麗》等。其程序部分為48K,
前32K分為兩個16k存儲體;字模部分為32k,分為四個8k存儲體。
通常稱64k、80K的遊戲為中檔卡。
對於128K卡(標註為LF),其程序部分與字模部分棍合***用128k,分為八個16K存儲
體,其中前七個存儲體地址映射於$8000-$BFFF:最後壹個存儲體(稱為HOME BANK)
映射於$0000壹$FFFF,典型遊戲有《魔界村》、《怒》、《火之鳥方》、《未來戰士》、《洛克人》、
《1943》 《1944 》《嵌特殊部隊》、《沖撞霹靂機車》等。
這類遊戲卡中壹般都配有壹塊8K的RAM(動態隨機存儲器〕存儲當前使用的字模。
對於160k卡(標註為LG),其程序部分為128K;字模部分為32K。典型遊戲有《倚天屠
龍記》、《立體大賽車》、《歡樂叮當》等。
對於256K卡(標註為LH),其程序部分為128K;字模部分為128K。典型遊戲有《柯拉
米世界》、《惡魔城》、《雙截龍》、《松鼠歷險記》《人間兵器》、《聯合大作戰)等。另外,還有《魂
鬥羅》、《赤色要塞》、《綠色兵團》、《立體籃球》《荒野大鏢客》等256K遊戲被壓縮為128K遊
戲,目前這類遊戲的256K版已不多見,常見的均為128K的壓縮版;
通常稱128K壹256K容量的遊戲為高檔卡或強卡。
對於高於256K容是的遊戲則稱為特卡,如《不動明王傳》,《戰斧》、《孔雀王》,《大旋風》
等遊戲容量已達2M-4M。但由於任天堂系列遊戲機的CPU的處理速度、畫面的解析度、音
域音色等方面的限制,即使軟件容量再增大,遊戲效果也不會提高多少.總達不到街機的水
平,故目前單個遊戲的容量大於256K的尚不多見。
1·3 任天堂遊戲的圖像處理方法
本節簡要介紹任天堂遊戲的圖像處理方法。
1·3·1屏幕顯示原理
任天堂遊戲機中的CPU雖然仍屬65系列的CPU,但它的顯示方式與中華學習機截然
不同。其顯示屏幕由三類四層顯示頁面鉤成。三類顯示頁依次為:卡通(角色或動畫)頁、背
景頁、底背景頁。卡通頁用於顯示遊戲中的角色,它有兩個頁面:卡通零頁——使角色顯示於
背景之前;卡通壹頁——使角色顯示於背景之後。卡通員的顯示分辨率為256x240點,卡通
可以點為單位移動。背景頁主要用於遊戲畫面的顯示,它***有四個顯示頁面,每頁的兩邊互
相相連並排成“田”字,采取字符顯示方式,顯示分辨率為32列* 30行,每幅畫面由$60個
圖形塊構成,遊戲中可任取壹個頁面顯示。底背景頁主要用於大面積的單色顯示,以襯托出
蘭天、草地、沙漠、大海等效果,顯示分辨率為1x1。 四層顯示頁的排列由前向後依次為:卡
通零頁、背景頁、卡通壹頁、底背景頁(見圖1壹6)。系統默認的排列方式為背景00頁與卡通
賈、底背景頁四層頁面重疊,前面顯示頁的內容可以遮住後面顯示頁的內容,因而很容易構
成具有壹定景深次序的立體畫面。
1·3·2背景處理技術
任天堂遊戲中的背景畫面顯示采用字符方式,每個字符通常稱為背景圖形塊。每個圖
形塊為8*8點陣,其字模數據存放在由PPU管理的壹段內存中,稱為背景字庫,壹般使用
$1000壹$1FFF地址,***4K字節.每個字模由連續的16個單元組成,故壹次最多可定義
256個字符,序號依次為0~255.顯示字符時,只要把字符序號置入屏幕對應的顯示單元中
即可。
任關堂遊戲中的背景處理由PPU獨立完成,每壹個背景頁面對應PPU的1024個單
元,為順序對應關系。背景00頁對應PPU地址為$2000--$23FF,其中$2000壹$23BF
對應於960個圖形顯示單元,$23C0--23FF為該顯示頁的配色單元;背景10頁對應的
PPU地址為$2400壹$27FF;同樣,後面的兩頁依次對應$2800---$2BFF、$2C00
$2FFF。由於遊戲機中只有壹塊2K的VRAM(PPU使用的RAM),故壹般只使用前兩個
頁面,通常稱其為背景零頁和背景壹頁。遊戲中可通過設置軟開關的方法控制畫面的橫、縱
向,以使兩幅面面橫向並列或縱向銜接。
在實際遊戲中,要經常用到背景畫面的橫向卷動和縱向滾動。如(魂鬥羅,遊戲中的卻
壹、五、六、七、八關是橫向卷動,第三關則是縱向滾動。這些畫面位移效果是如何實現的呢?
我們知道,中華學習機中的畫面位移是通過反復改寫顯示映射單元的內容而實現的,這種方
法處理速度慢、控制程序冗長。任天堂則采取了截然不同的方法。它通過硬件的待殊處理,
引入了顯示窗口的概念。畫面位移時,每個顯示單元的內容不變,而令顯示窗口向相反的方
向移動,從而實現了畫面的橫向卷動和縱向滾動。如《魂鬥羅》中第壹關橫向卷動的控制方法
是.令兩個背景頁橫向銜接,遊戲開始時,背景零頁繪滿32列,而背景壹頁僅繪制12列,令
顯示窗口對正零頁,當遊戲中的角色前進到畫面右邊的壹定位置時,則令顯示窗口右移壹
格,同時繪制壹頁的第13列;這樣,顯示窗口每右移壹格,畫面繪制壹列,從而使遊戲畫面連
綿不絕,每移出壹頁畫面(32列)令頁數計數器加壹,當累計到壹定頁數時則令窗口不再移
動,進行關底處理。這壹畫面的位移控制極為簡單,僅通過向位移軟開關$2005置入移位數
據就可實現。F BASIC的控制程序為:
POKE &H2005,x:POKE &H2005,0
x為位移參數。其機器語言的控制程序為:
LDA x
STA $ 2005
LDA #$00
STA $ 2005
畫面的縱向位移則更為簡單,如《魂鬥羅》的第三關——瀑布天險是壹個縱版畫面,角色要從
最底層跳升到最頂層與關底魔頭決鬥,遊戲進程中畫面隨看角色的跳躍不停的上滾。實際--
這壹位移過程是在壹頁面面中進行的,控制方法是,每當角色前進到畫面上方某壹位置時,
改寫畫面最底行的圖形數據,使其為即將移入畫面的壹行.然後令顯示窗口向上移壹格,由
於窗口是在壹個顯示頁上移動,故最底行即是最頂行(這時可把壹頁面面理解為上、下邊連
接的圓筒,顯示窗口是套在畫面圓筒外面稍大的壹個圓筒,窗口移動壹格就是向上旋轉壹
格)。F BASIC控制程序為,
POKE &H2005,0:POKE &H2005,Y
Y為位移參數。相應的機器語言程序為,
LDA #$00
STA $2005
LDA Y
STA $2005
以上畫面的送效、位移操作都是在CPU響應非屏蔽中斷期間完成的(非屏蔽中斷是在
電視機的場回掃期間發出和響應的,這時的電視屏是黑的),所以我們感覺布道位移的痕跡。
關於任天堂遊戲中背景畫面的繪制 移動及畫面的分裂位移和扭曲等效果的實現,將在第六章詳細討論。
1·3·3動畫處理技術
組成任天堂遊戲中動畫的最小單位是卡通塊,每個卡通塊為8X8點陣.與壹個字符同
樣大小。卡通塊也有壹個圖形字庫,對應的PPU地址為$0000-$OFFF。每個個卡通塊的字
模數據也由連續的16個單元組成,故壹次最多可定義256個卡通塊,序號依次為0-255
6527CPU規定.在壹幅畫面上只允許同時顯示64個8x8點陣的卡通塊〔這是由PPU
內卡通定義區的RAM分配決定的〕,如《超級瑪麗》中,瑪麗在吃紅蘑菇之前為16x16點
陣大小(即由4個卡通塊組成),當吃了紅蘑菇之後身體長大壹倍,變為32X 32點陣(即由
16個卡通塊組成〕的卡通。但實際遊戲中要求顯示的卡通塊數往往遠遠超過這壹限制,如目
前較流行的打鬥遊戲《街霸》中,壹個卡通即為128*64點陣(由128個卡通塊組成)有時還
更大,這是怎麽實現的呢?
原來在實際遊戲中,對卡通進行了分時控制。所謂分時控制就是在不同的時間裏顯示半
通的不同部分,依靠人眼的視覺惰性產生連續的感覺。如《魂鬥羅》遊戲中的卡通顯示(兩個
正面角色、敵人、發射的子彈、暗堡的閉合與開啟都是卡通)就是每壹次中斷顯示卡通的二分
之壹實現的。
卡通的定義操作極其簡單,系統規定壹個卡通塊由連續的四個內存單元定義,第壹寸
單元指定卡通顯示的Y坐標、第二個為卡通塊在字庫中的序號、第三個為卡通塊的顯示狀
態〔配色組合、左右翻轉、上下顛倒以及顯示於那個卡通頁面,,第四個為顯示的X坐標。編
程中可任意指定定義卡通的內存頁面(壹般選二頁或三頁,即$200壹$2FF, $300
$3FF)。
關於任天堂遊戲中的卡通的定義及運動控制將在第七章討論。
1·4 任天堂遊戲的音響處理
在大部分任天堂遊戲的過程始、終,壹直伴奏著和諧動聽的背景音樂;隨巖遊戲的進行
和角色的動作還不時發出逼真的效果音響,而且這些音響的發出與背景的移動、角色的運動
三者並行工作,互不幹擾,許多朋友玩過中華機上的遊戲,如《警察抓小偷》《富士山決戰》
等,這些遊戲中的音響發出與角色的動作是不能同時進行的,即角色動作時沒有音響;發出
音響時角色的動作要停下來.任天堂遊戲中的音響處理確有獨到之處.由於在6527 CPU內
固化有可編程音響發生器,所以音響控制程序特別簡潔,任天堂遊戲的發聲系統由五個聲部
組成,對應於CPU管理的$40DO——$4013二十個單元,每個聲部使用四個單元,它們的作
用依次為音色音量、音形包絡、音調細調、音調粗調。第壹、二、三聲部可進行和聲旋律演奏,
也可以選取任壹聲部發出效果音,如執行F BASIC程序
POKE &H4015,1:POKE &H4000. 255,255,255,255
就可發出長達三分鐘的頻率由低到高的警報聲。第四聲部可以模仿連續不斷的噪聲,如風
聲 雨聲 鐘生 腳步聲 火車聲等等 第五聲部則可模仿出人的講話聲。任天堂遊戲中
背景音樂壹般都是使用前三個聲部演奏的,演奏程序也是放在中斷中處理的.五個聲部的發
聲總開關由$4015控制,$4015的D0——D4位依次控制翻第壹至第五聲部的工作狀態,置
0關閉、置1開啟。