FC遊戲合卡ROM製作教程

本教程主要講述Mapper52的合卡製作教程。

  1. 選擇宿主遊戲

Mapper52是Mapper4的合卡Mapper,爲了實現菜單功能,需要選擇一個合適的宿主遊戲來插入菜單指令然後實現菜單功能。作爲宿主遊戲,這個遊戲必須是TLROM(Mapper4)並且大小爲256KB(128KPRG+128CHR)。下面我們以熱血格鬥傳說(HERO FIGHT)爲例進行講解。

 

                                                     

2. 將宿主遊戲的PRG和CHR進行擴容

爲了操作方便專門開發了一個擴容還原的小工具,工具界面如下圖:

                                                        

 

點擴容按鈕,然後找到第一步選好的宿主遊戲”HERO FIGHT.nes”,擴容完成後會在HERO FIGHT.nes所在的同文件夾下面生成擴容後的文件”擴容後_HERO FIGHT.nes”.操作完成後再用模擬器打開擴容後的文件,查看文件信息如下:  

                                               

 

擴容後的PRG和CHR都翻了一倍,遊戲的大小變成了512KB(256PRG+256CHR).

3.尋找可以插入菜單指令的空白區域

宿主遊戲必須有足夠的空白區域來插入菜單指令。所謂的空白區域是指用十六進制編輯器打開ROM後連續的FF或者00的區域。注意:尋找空白區域一定要在擴容的區域找,PRG的擴容區域在ROM地址(不是PRG內存地址)的$020010~$040010區域,CHR的擴容區域在ROM內存的$060010~$080010區域。 下面是詳細查找的方法:

 

3.1 菜單入口指令的區域

這段指令大概需要30h 字節的空白區域(用16進制編輯器查看大概是3行)。這段空白區域有個限制就是必須在PRG內存地址(不是ROM內存地址)的$C000~$FFFF區域找。以”HERO FIGHT.nes“爲例,首先用FCEUX模擬器打開”擴容後_HERO FIGHT.nes“,然後從模擬器的菜單欄找到:調試->十六進制編輯器->查看->NES內存(也就是我們常說的PRG內存)。把滾動條拖到$C000~$FFFF找到有至少3行以上的FF空間,我喜歡從底部往上倒退着找,然後一下子就找到了適合的區域如下:

 

很明顯$00FFA0~00FFCF這段區間符合我們的要求,搞定!

 

3.2菜單執行邏輯指令的PRG區域

這個區域大概需要600h 字節,並且要保證這600h字節都在同一個bank區域內。記住:一個TLROM(Mapper4)遊戲PRG bank的大小是2000h字節。以” 擴容後_HERO FIGHT.nes”爲例子:用FCEUX模擬器打開” 擴容後_HERO FIGHT.nes”, 然後從模擬器的菜單欄找到:調試->十六進制編輯器->查看->ROM文件(也就是我們常說的ROM內存),注意:上面已經說過,一定要在擴容的PRG區域($020010~$040010)找,找到的區域如下:

 

從$037880~$37E80(600h字節)這個區域都是連續的FF,正好符合我們的要求。

 

 

3.3. 菜單字模的CHR區域

    菜單用到的字模ascii.chr文件如下:

 

所以菜單的字模需要三行的空白區域。找菜單的空白區域同樣需要在擴容區域找, CHR的擴容區域在ROM文件的$060010~$080010區域。以” 擴容後_HERO FIGHT.nes”爲例,作步驟如下:

用字模工具YY-CHR打開” 擴容後_ HERO FIGHT.nes”,把進度條拖到$060010區域如下:

 

然後開始找至少三行以上的空白區域來插入菜單需要用到的那三行字模。使用YY-CHR這個軟件可以使用鍵盤上的Pg-Up和Pg-Dn來上下翻頁,這樣每按下一次切換的是一整頁方便後期的內存計算。查找之後發現從ROM地址$068010開始有足夠的空白區域(CHR的空白區域只要是純色的沒有任何圖案就可以,不一定是下圖這樣的)插入字模:

 

 

到此爲止,菜單入口空白區域、PRG空白區域、CHR空白區域都已經找到,那麼這個遊戲就可以作爲宿主遊戲來hack菜單了。如果這三個區域只要有一個沒有足夠的空白區域那麼對於我們的教程來說這個遊戲就無法hack菜單(也可以有別的辦法,但是不在我們這個教程討論的範圍之內)。

 

 

4. 調整菜單代碼

(建議用nodepad)打開menu.asm文件,找到下面幾個非常重要的變量:

PRG_BANK : 菜單PRG所在的bank 號,PRG_BANK=PRG空白區域起始地址/$2000 (這裏的/是數學上的除以)

PRG_ADDR_OF_RAM : 菜單PRG的起始內存地址(這裏是NES內存地址不是ROM地址)PRG_ADDR_OF_RAM= PRG空白區域起始地址% $2000 + $8000 (這裏的%是數學上的求餘數)

CHR_BANK: 菜單CHR所在的bank號,CHR_BANK= (TLP Page down count * 4 --> Convert to hex)(就是用Tile Layer Pro這個軟件打開擴容後的宿主文件,然後一直按鍵盤上的Page Down鍵,直到找到符合要求的空白區域,並且記下按Page Down鍵的次數,再將這個次數乘以4,最後轉換成16進制的值就是這個CHR_BANK了)

ORG_RST :宿主遊戲的原始復位向量

HARD_FREE :宿主遊戲菜單入口的PRG內存地址

下面以“擴容後_ HERO FIGHT.nes”爲例詳解介紹上面的幾個變量是怎麼計算的。

(1)PRG_BANK

在第3部分中,我們已經找到了合適的PRG空白區域,起始地址爲ROM內存的$037880。這裏要注意的是,ROM文件的頭文件(10h字節)是用來給模擬器使用的,對物理機來說沒有頭文件這麼一說,是不存在的,所以我們要跳過這10h字節,所以正在的空白區域起始地址應該是$037880-$010 = $037870。按照我們上面給出的計算公式:

PRG_BANK = $037870 / $2000 = $1B

(2)PRG_ADDR_OF_RAM

          在第3部分中,我們已經找到了合適的PRG空白區域,起始地址爲ROM內存的$037880。這裏要注意的是,ROM文件的頭文件(10h字節)是用來給模擬器使用的,對物理機來說沒有頭文件這麼一說,是不存在的,所以我們要跳過這10h字節,所以正在的空白區域起始地址應該是$037880-$010 = $037870。按照我們上面給出的計算公式:

      PRG_ADDR_OF_RAM =  $037870 % $2000 + $8000 = $9870

 (3)CHR_BANK

       在第3部分中,我們已經找到了合適的CHR空白區域,然後我記錄了一下,從打開文件到找到合適的空白區域共按下了 40次Page Down按鍵(注意:由於是在擴容區域找在按下Page Down的過程中可能出現兩次上面找到的空白區域,第二次出現時按下的按鍵次數纔是咱們需要的值),按照上面的公式:

       CHR_BANK = 40 * 4 = 160(10進制) = $A0(16進制)

(4)ORG_RST

           遊戲的復位向量,固定在PRG內存的倒數第3和第4字節。用FCEUX模擬器打開“擴容後_ HERO FIGHT.nes”,然後從模擬器的菜單欄找到:調試->十六進制編輯器->查看->NES內存,拖到最底部如下圖:

 

發現最後兩個字節是F4和FF,又由於6502CPU是低字節序,即低字節在前高字節在後,所以復位向量應該是FFF4而不是F4FF。那麼對於“擴容後_ HERO FIGHT.nes”這個遊戲來說他的原始復位向量(ORG_RST)就是FFF4

                           ORG_RST = $FFF4

(5)HARD_FREE

         復位向量是遊戲的入口,當FC遊戲機接通電源或者按下復位鍵時,CPU執行指令的順序都會重定向到復位向量所指向的內存地址然後向下直接。單個遊戲的復位向量就是我們上面提到的ORG_RST,現在我們要做合卡,所以當接通電源或者按下復位鍵時不能再讓CPU從遊戲原來的復位向量執行了而是應該讓CPU從我們的菜單入口的內存地址開始執行,這個地址很簡單,就是我們第3部分苦苦尋找的菜單入口指令的區域的起始地址,對於” 擴容後_ HERO FIGHT.nes”來說是FFA0.

                         HARD_FREE = $FFA0

 

最後還有一處要修改的,在menu.asm代碼文件中找到如下代碼做修改:

 

對於” 擴容後_ HERO FIGHT.nes”來說是PRG_ADDR_OF_RAM的值爲$9870,所以設置如上圖。

 

 

5. 設計菜單

用YY-CHR軟件打開” 擴容後_ HERO FIGHT.nes”文件,找到第3部分我們找到的CHR空白區域,

 

  1. 點鼠標右鍵選中左上角的第一個方塊如上圖
  2. 然後鬆開鼠標右鍵再按住鼠標右鍵不放拖動白色方塊直到選中整個CHR頁如下圖:

                                                    

  1. 複製選中的CHR頁到粘貼板
  2. 執行: 文件->新建,然後把剪貼板的內容粘貼到新建的文件裏面,將文件保存爲menu.chr。(對於上面的示例熱血格鬥來說可能是純顏色什麼都沒有,但是對於其他遊戲來說可能會有很多圖案,這會不理解也沒關係,多操作以後就明白了)
  3. 用YY-CHR打開ascii.chr,點鼠標右鍵選中左上角第一個方塊,然後按住右鍵不放拖拽選中使用到的字模如下圖,然後將選中的部分複製到粘貼板

 

  1. 用YY-CHR打開本節第4步中新建的menu.chr文件,然後把從ascii.chr複製的那部分字模粘貼到menu.chr中,保存menu.chr,這樣menu.chr就算製作完成了。
  2. 運行菜單編輯器.bat,接下來菜單長啥樣就盡情的設計吧,設計完了之後按Ctrl+S進行保存,菜單編輯器生成的menu.nam就是命名錶+屬性表數據。如果顏色不夠用修改menu.pal進行修改。

 

文件說明:

     menu.chr菜單字模文件

     menu.nam菜單命名錶+屬性表

     menu.pal調色盤

編譯菜單代碼必須有這三個文件且需要把這三個文件放在和代碼的同一個目錄下面。

 

 

6. 編譯菜單代碼

     運行生成菜單.bat會把menu.asm,men.chr,menu.nam,menu.pal進行處理,最後生成menu.nes。這個menu.nes文件就是編譯後的菜單了。這樣編譯之後菜單指令和字模是單獨的文件,並不在宿主文件“擴容後_ HERO FIGHT.nes”上,接着往下看。

7. 將菜單指令、字模hack到宿主遊戲上

7.1 hack菜單入口指令

       用FCEUX模擬器打開編譯好的menu.nes文件,然後從模擬器的菜單欄找到:調試->十六進制編輯器->查看->NES內存,找到菜單入口指令的起始地址,對應我們的示例遊戲來說,菜單入口的內存起始地址是FFA0:

 

        將這三行指令複製,然後新建一個記事本把這段指令臨時保存到記事本上。

接着找PRG指令代碼。我們在上面已經計算出來PRG_ADDR_OF_RAM的值是$9870,所以拖進度條到9870處找到PRG指令,如下圖:

 

 將這段指令全部複製(至於怎麼判斷指令到哪結尾這個很簡單,當出現連續FF的時候就結尾了)粘貼到臨時記事本上面,如下:

 

 複製到記事本上之後用FCUEX模擬器打開宿主遊戲” 擴容後_ HERO FIGHT.nes”, 然後從模擬器的菜單欄找到:調試->十六進制編輯器->查看->NES內存,找到菜單入口HARD_FREE變量指向的內存地址$FFA0,選中地址FFA0,點鼠標右鍵->轉到ROM文件對應位置

 

這樣就從PRG內存轉到了ROM內存對應的位置,PRG內存的FFA0對應ROM內存的3FFB0。從剛纔保存的臨時記事本上面把菜單入口指令複製到粘貼板上,然後粘貼到這個位置,這樣宿主遊戲的菜單入口指令就加上了。

 

 

              添加菜單入口指令前                                                                                            添加菜單入口指令後

7.2 hack PRG指令

     從模擬器的菜單欄找到:調試->十六進制編輯器->查看->NES文件,參照我們3.2章節找到的空白區域起始地址,對於“擴容後_ HERO FIGHT.nes”來說是$0378800(這裏不需要減掉nes頭文件的10h字節,因爲我們就是在nes文件上修改的),其他的遊戲根據實際找到的確定。打開保存菜單指令的那個臨時記事本,複製菜單PRG指令,然後粘貼到ROM文件的地址$0378800(這個地址根據上面找到的PRG空白起始區域來確定每個遊戲都不同)處保存。

7.3hack CHR

     用YY-CHR打開ascii.chr,複製那三行字模到粘貼板。再用YY-CHR打開” 擴容後_ HERO FIGHT.nes”,按Page Down鍵找到chr空白的起始區域,把粘貼板的三行字模粘貼到空白區域。這樣字模也就hack到宿主遊戲” 擴容後_ HERO FIGHT.nes”上面了。

7.4修改復位向量

     到目前爲止,” 擴容後_ HERO FIGHT.nes”每次啓動或者按下復位鍵之後開始的內存地址依然是正常遊戲的內存地址,並不是菜單指令的地址,所以需要把復位向量改成菜單指令的起始地址,操作步驟如下:

      用FCEUX模擬器打開” 擴容後_ HERO FIGHT.nes”, 從模擬器的菜單欄找到:調試->十六進制編輯器->查看->NES內存,拖到最底部,

 

修改前:

 

選擇倒數第3個字節F4,右鍵->轉到ROM文件對應位置,修改後(注意字節順序):

8.生成最終模擬器可運行的Mapper52的NES文件

    用擴容還原工具將擴容+hack的ROM進行還原,將宿主遊戲放在第2個位置就可以生成Mapper52的rom了

 

 

用到的相關工具和代碼:https://download.csdn.net/download/liuweihang/12475570

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章