[翻译] WindowsPhone-GameBoy模拟器开发二--Rom文件分析
距離上一篇文章的發(fā)布已經(jīng)快一年了,在第一篇文章發(fā)布之后才發(fā)現(xiàn)原來一個(gè)模擬器真的不是一般的大,也可能和我的學(xué)藝不精有關(guān),這期間花了大量的時(shí)間來學(xué)習(xí),終于又決定繼續(xù)寫下去,不過還是一些基礎(chǔ)的東西,希望被標(biāo)題吸引過來的朋友不要太失望
卡帶頭部:
在卡帶中,內(nèi)部信息位于0100-014F的這個(gè)地址區(qū)間中。它包含以下內(nèi)容
0100-0103-入口點(diǎn)
在顯示完任天堂的LOGO后,內(nèi)置的啟動(dòng)程序會跳到這個(gè)地址(100h),然后在從這里跳轉(zhuǎn)到位于卡帶內(nèi)的實(shí)際程序。通常情況下,這個(gè)4字節(jié)的區(qū)域包含有一條JP 0150h指令,后面跟著一條NOP指令。但也并不總是如此
0104—0133—任天堂LOGO
這些字節(jié)定義了任天堂LOGO的位圖圖像,這個(gè)圖像會在gameboy啟動(dòng)是顯示。這個(gè)位圖的16進(jìn)制數(shù)據(jù)為:
CE ED 66 66 CC 0D 00 0B 03 73 00 83 00 0C 00 0D
??00 08 11 1F 88 89 00 0E DC CC 6E E6 DD DD D9 99
??BB BB 67 63 6E 0E EC CC DD DC 99 9F BB B9 33 3E
Gameboy的啟動(dòng)程序會在現(xiàn)在它們之后校驗(yàn)這些數(shù)據(jù),如果數(shù)據(jù)不對,就自己把自己鎖住。CGB只校驗(yàn)前面18個(gè)字節(jié),其他的如果pocket gameboy校驗(yàn)全部的30h個(gè)字節(jié)。
0134—0143—標(biāo)題
游戲標(biāo)題,用ASCII碼表示的大小字母。如果標(biāo)題字?jǐn)?shù)少于16個(gè)字母,余下的部分用00h填充。在開發(fā)CGB是,任天堂把這一區(qū)域縮小到15個(gè)字母,幾個(gè)月之后,他們有把它縮小到只有11個(gè)字母。新的標(biāo)題結(jié)構(gòu)的其他字節(jié)表示的意思如下:
013F—0142—制造商代碼
在老的卡帶里面,這一區(qū)域是標(biāo)題的一部分(如上所訴),在新的卡帶中,這一區(qū)域包含一個(gè)用4個(gè)大寫字母表示的制造商代碼。代碼的詳細(xì)意思未知。
0143-CGB標(biāo)志
在老的卡帶里面,這一區(qū)域是標(biāo)題的一部分(如上所訴)。在CGB卡帶中,這一標(biāo)志的高位用來設(shè)置CGB功能。這是必須的,否則,CGB把自己轉(zhuǎn)換為非CGB模式。這一標(biāo)志的典型值有:
80H—支持CGB功能的游戲,但也能在老的gameboy下工作。
C0H-只能在CGB下工作(physically the same as 80h)
如果第7位被置位,或者2、3位中的某一位被置位,gameboy會被切換到一個(gè)特殊的沒有初始化調(diào)色板的非CGB模式下。還不知道為什么要這么做,后來這一模式被用來支持在ROM的特定位置有固定調(diào)色板數(shù)據(jù)的單一色彩的游戲。
0144—0145—新的許可證代碼
指定一個(gè)2個(gè)ASCII字母的許可證代碼,用來表示游戲的發(fā)行商或者開發(fā)公司。這兩個(gè)字節(jié)只在最新的游戲中被使用(“最新”指的是在SGB發(fā)布之后上市的游戲)。老游戲只用在014B位置的的頭部條目
0146-SGB標(biāo)志
指定游戲是否支持SGB功能,常見的值有:
00H=沒有SGB功能(通常情況下只有普通gameboy或者CGB是這樣)
03H=支持SGB功能的游戲
SGB會自己把SGB的功能禁止掉,如果該值不是03H的話
0147—卡帶類型
指定在卡帶中使用了哪種內(nèi)存控制器(如果有的話),也用來指定卡帶是否使用了其他的硬件。
00h??ROM ONLY? ?? ?? ?? ?? ???13h??MBC3+RAM+BATTERY
??01h??MBC1? ?? ?? ?? ?? ?? ?? ?15h??MBC4
??02h??MBC1+RAM? ?? ?? ?? ?? ???16h??MBC4+RAM
??03h??MBC1+RAM+BATTERY? ?? ?? ?17h??MBC4+RAM+BATTERY
??05h??MBC2? ?? ?? ?? ?? ?? ?? ?19h??MBC5
??06h??MBC2+BATTERY? ?? ?? ?? ? 1Ah??MBC5+RAM
??08h??ROM+RAM? ?? ?? ?? ?? ?? ?1Bh??MBC5+RAM+BATTERY
??09h??ROM+RAM+BATTERY? ?? ?? ? 1Ch??MBC5+RUMBLE
??0Bh??MMM01? ?? ?? ?? ?? ?? ???1Dh??MBC5+RUMBLE+RAM
??0Ch??MMM01+RAM? ?? ?? ?? ?? ? 1Eh??MBC5+RUMBLE+RAM+BATTERY
??0Dh??MMM01+RAM+BATTERY? ?? ???FCh??POCKET CAMERA
??0Fh??MBC3+TIMER+BATTERY? ?? ? FDh??BANDAI TAMA5
??10h??MBC3+TIMER+RAM+BATTERY? ?FEh??HuC3
??11h??MBC3? ?? ?? ?? ?? ?? ?? ?FFh??HuC1+RAM+BATTERY
??12h??MBC3+RAM
注:BATTERY為電池,RAM為隨機(jī)存儲器
0148—卡帶的ROM容量
指定卡帶的ROM的大小,典型的計(jì)算方式為"32KB shl N".
00h -??32KByte (no ROM banking)
??01h -??64KByte (4 banks)
??02h - 128KByte (8 banks)
??03h - 256KByte (16 banks)
??04h - 512KByte (32 banks)
??05h -? ?1MByte (64 banks)??- only 63 banks used by MBC1
??06h -? ?2MByte (128 banks) - only 125 banks used by MBC1
??07h -? ?4MByte (256 banks)
??52h - 1.1MByte (72 banks)
??53h - 1.2MByte (80 banks)
??54h - 1.5MByte (96 banks)
注:bank指的是內(nèi)存塊,不是銀行哦
0149—RAM的大小
指定卡帶中額外的RAM的大小
00h - None
??01h - 2 KBytes
??02h - 8 Kbytes
??03h - 32 KBytes (4 banks of 8KBytes each)—8K字節(jié)占用一個(gè)內(nèi)存快
如果使用MBC2類型的卡帶,這個(gè)字節(jié)必須被設(shè)置為00H。盡管MBC2有自帶的512*4 個(gè)位大小的RAM
014A—目標(biāo)代碼
指定這個(gè)版本的游戲是否能在日本銷售,或者只能在其他地方銷售。只定義了兩個(gè)值:
00h - Japanese
??01h - Non-Japanese
014B—舊許可證代碼
指定游戲/發(fā)行商的代碼,范圍為00-FFh。值33h用來指明在0144-0145存在新的許可證代碼。
在SGB中,如果值不是33h,則SGB無法工作
014C-游戲版本掩碼(mask)
指定游戲的版本號,通常為00h
014D-頭部校驗(yàn)和
包含一個(gè)跨越0134-014C的大小為8位的校驗(yàn)和。校驗(yàn)和的計(jì)算方式如下:
x=0:FOR i=0134h TO 014Ch:x=x-MEM-1:NEXT
這個(gè)計(jì)算結(jié)果的底8位必須和該位置的值相等。如果校驗(yàn)和錯(cuò)誤,游戲則不會運(yùn)行。
014E—014F-全局校驗(yàn)和
包含一個(gè)跨越整個(gè)卡帶ROM的大小為16位的校驗(yàn)值。計(jì)算方式為:
除了這兩位外,把卡帶的所有位相加得到的值。如果校驗(yàn)和錯(cuò)誤,游戲則不會運(yùn)行
翻譯的原文地址為:http://nocash.emubase.de/pandocs.htm
總結(jié)
以上是生活随笔為你收集整理的[翻译] WindowsPhone-GameBoy模拟器开发二--Rom文件分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PostgreSQL在何处处理 sql查
- 下一篇: 系统集成资质培训 - 在线答疑(17:0