1. 當年的Fc《魂斗羅》《瑪麗》是用什麼工具做的。如何反編譯。
匯編和c都可以,這里有個編程器http://pocket.92wy.com/fc_info_33534.html
任夭堂游戲編程探密(文字版)
第一章 任天堂游戲結構概論
長期以來,由於任天堂公司在技術上的封鎖和國內游戲開發工具的久缺.任天堂游戲
蒙上了一層神密的面紗,中國人只能玩任天堂游戲.而不能象蘋果機、中華學習機那樣了解
游戲程序、自己動手編寫游戲。近年來,隨著任夭堂系列游戲機配套鍵盤的問世,逐步創造了
揭開這層面紗的條件.特別是配有列印機介面的「裕興」、「金字塔」等高檔游戲機鍵盤的陸續
推出,用戶僅僅編寫一個簡單的反匯編程序就可列印出系統軟體的源程序,從而為探索任天
堂游戲軟體的奧秘提供了有效的手段。
有人疑問任夭堂游戲機的中央處理器同中華學習機一樣也是八位的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開啟。
2. excel公式編譯,在有三個隨機變數的情況下,怎麼保證計算結果控制在一個范圍內。
不是已經答過了嗎?!
在A1中輸入以下公式
=MEDIAN(3.5,(B1-C1)/D1*100,4.5)
下拉填充。
3. android surfaceview視頻播放如何讓視頻翻轉90
《android逆向視頻》網路網盤資源免費下載
鏈接:https://pan..com/s/1W1NAE-AeKbz0bb6E4mdXfA
4. c++(隨機數問題),visual studio上編譯的
1、Error 2 error C4700: uninitialized local variable 'm'
變數'm' 為初始化,直接用會導致程序崩潰,版本低一點的visual studio這個應該只是個警告。
2、Warning 1 warning C4244: '=' : conversion from 'time_t' to 'int', possible loss of data
這個只是個警告,意思是說轉換的時候會導致數據丟失,若你確認這個對你的數據沒有什麼影響,可以不用理會。
5. vcs怎麼編譯產生隨機激勵的systemverilog語句
pspice,可以對眾多元器件構成的電路進行模擬分析,這些元器件以符號、模型和封裝三種形式分別存放在擴展名為slb、lib和plb三種類型的庫文件中。*.slb庫中的元器件符號用於繪制電路圖;*.lib庫中的元器件模型用於電路模擬分析;*.plb庫中的元器件封裝形式用於繪制印刷電路板的版圖
Protel包含了電原理圖繪制、模擬電路與數字電路混合信號模擬、多層印製電路板設計(包含印製電路板自動布線)、可編程邏輯器件設計、圖表生成、電子表格生成、支持宏操作等功能,並具有Client/Server (客戶/伺服器)體系結構,同時還兼容一些其它設計軟體的文件格式,如ORCAD,PSPICE,EXCEL等,亦可做PCB板,
Proteus(海神)的ISIS是一款Labcenter出品的電路分析實物模擬系統,可模擬各種電路和IC,並支持單片機,元件庫齊全,使用方便
高頻模擬是MATLAB
6. 正太分布的隨機數 程序清單 這怎樣才能用C編譯出來呢需要怎麼改編這個C++程序 求指教啊
public class RegisterAction extends BaseAction
{
private static final long serialVersionUID = 1L;
private transient Logger log = LogManager.getLogger(this.getClass());
private IRegisterService registerService;
private UserBean userbean;
public String addUser()
{
JSONObject jsonObject = new JSONObject();
try
{
registerService.addUser(userbean.getUsername(), userbean.getPassword());
jsonObject.put("operflag", "success");
jsonObject.put("user",userbean);
ajaxResponseForRequest(jsonObject);
}
catch(Exception e)
{
jsonObject.put("operflag", "fasle");
ajaxResponseForRequest(jsonObject);
}
return null;
}
public String checkName()
{
JSONObject jsonObject = new JSONObject();
try
{
// HttpServletRequest request = this.getRequest();
// String referer = request.getHeader("Referer");
// if (StringUtils.isNotBlank(referer)
// && referer.indexOf("marketingmgr/bl_imdection/queryActivityInfo.action") == -1)
// {
// log.error("Referer=" + referer + ",跨站點請求偽造");
// jsonObject.put("operFlag", "false");
// ajaxResponseForRequest(jsonObject);
// }
// else
// {
if (StringUtils.isNotBlank(userbean.getUsername()))
{
userbean.setUsername(URLDecoder.decode(userbean.getUsername(),"utf-8"));
}
int count = registerService.queryUser(userbean);
jsonObject.put("count", count);
jsonObject.put("operFlag","success");
ajaxResponseForRequest(jsonObject);
//}
}
catch(Exception e)
{
log.error(e);
}
return null;
}
public IRegisterService getRegisterService() {
return registerService;
}
public void setRegisterService(IRegisterService registerService) {
this.registerService = registerService;
}
public UserBean getUserbean()
{
return userbean;
}
public void setUserbean(UserBean userbean)
{
this.userbean = userbean;
}
}
7. 如何用C語言產生1~35之間的7個不同隨機數(在VC++6.0里編譯),非常感謝!
代碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//產生一個min~max之間的數,包含min,max
intrand(intmin,intmax)
{
returnrand()%(max-min+1)+min;
}
intmain()
{
srand((unsignedint)time(NULL));
//定義一個數組,存放產生的7個隨機數
intnumbers[7];
for(inti=0;i<7;i++)
numbers[i]=rand(1,35);
//輸出
for(inti=0;i<7;i++)
printf("%d",numbers[i]);
printf(" ");
system("pause");
return0;
}
8. 求大神!!C語言出不來呀。。。。看看怎麼改 我要將名和姓隨機搭配 我用VC++6.0編譯的 是亂碼
符合您自己的思路,我幫你改的:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
char *fn;
char *n;
char a[][3]={"張", "王", "李", "趙"};
char b[][3]={"明", "強", "成", "國", "建"};
int i, j, k=100;
while (k)
{
i = rand()%(4);
fn=&a[i][0];
j = rand()%(5);
n=&b[j][0];
printf("%s%s\n",fn, n);
k--;
}
}
9. 求隨機數 - - 編譯的時候,在」Would you like to play again(y/n)」時輸入y無法繼續循環,直接退出
int main()
{
srand(time(NULL));
int randnumber,num;
while(1)
{
char ch;
randnumber=1+rand()%100;
f(randnumber,num);
printf("Would you like to play again(y/n)?");
scanf("%c",&ch);
if(ch!='y')break;
}
return 0;
}