探究NES遊戲中的ROM(Read Only Memory)

一、何為NES機?

NES全稱為Nintendo Entertainment System,是任天堂在1983年發布的一款遊戲機。它是首個將遊戲從家庭電腦院子里轉移到客廳的遊戲平台,也可以稱之為家用電腦。它的操作系統擁有冗餘性,並使用了所謂的ROM卡制式。

二、ROM的定義

ROM是只讀存儲器(Read Only Memory)的縮寫,指的是一組與操作系統緊密相關的硬體存儲和映射。它的特點是不同於RAM,ROM的內容一旦寫入則不可更改,是非易失性的存儲器。

三、NES ROM概述

對於NES遊戲機,ROM主要包含兩部分,一部分是遊戲ROM,另外一部分是NES的內置軟體(系統ROM)。這兩部分ROM位於不同的地址空間,且大小也不一樣。遊戲ROM的大小通常是從16KB到步進2倍遞增(32KB, 64KB, 128KB等),而系統ROM大約為40KB左右。

; NES ROM(遊戲ROM)的地址空間
$0000-$7FFF: 遊戲ROM, 可變大小
$8000-$FFFF: 系統地址空間

四、NES ROM格式

NES遊戲ROM格式通常為iNES文件格式,該格式又被稱為NES 8-bit ROM格式。iNES文件包含了一些NES遊戲的許多信息,比如遊戲的作者、版本號、遊戲的映射方式等等。

; iNES文件格式
位元組     含義
------------------------------ 
0-3      常數 $4E $45 $53 $1A (「NES」後加一個 DOS 結束符)
4        大小為16KB的PRG ROM 塊數(代碼)
5        大小為8KB的CHR ROM 塊數 (圖形)
6        bit 0     1-垂直鏡像(水平捲軸) 0-水平鏡像(垂直捲軸)
         bit 1     1-有SRAM 0-無SRAM
         bit 2     1-有512位元組的Trainer 0-無Trainer
         bit 3-15  保留
7        bit 0     1-開啟512位元組的Trainer 0-不開啟Trainer
         bit 1-3   保留
         bit 4-7   Mapper編號
8        塊大小3,保留

五、Mapper

Mapper指的是一種將ROM緩存在主存中的軟體手段,由於NES的ROM是只讀存儲器,所以在存儲器空間不夠的時候就需要使用Mapper技術實現ROM在主內存中的動態緩存。搭配相應的硬體可以實現掛載大容量存儲以及實現一些硬體加速。

六、NES模擬器

PC上通常使用NES模擬器模擬來運行NES遊戲。模擬器負責將遊戲ROM載入到內存中,同時模擬NES的硬體器件。如果模擬器錯誤地實現了NES硬體,在運行某些ROMs時會出現不正常的問題。

; 一段簡單的NES模擬器核心 
class NESMachine {
    public:
        NESMachine() {
            // 初始化CPU, PPU, APU等硬體
            cpu.reset();
            ppu.reset();
            apu.reset();
            rom.reset();

            // 導入ROM文件到內存中
            // 初始化Mapper
            rom.loadFromFile("mario.rom");
            int mapper_number = rom.getMapperNumber();
            mapper.reset(new Mapper_000(mapper_number);
        }

        void runOneFrame() {
            // 運行CPU指令
            cpu.runOneFrame();
            // 更新PPU
            ppu.runOneFrame();
            // 更新APU
            apu.runOneFrame();
        }

    private:
        CPU cpu;
        PPU ppu;
        APU apu;
        ROM rom;
        unique_ptr mapper;
}

七、總結

在NES遊戲中,ROM是不可變的,它對遊戲機性能產生了很大的影響。ROM的格式和Mapper的實現直接影響了遊戲的性能,模擬器也必須實現正確的映像方式,才能準確模擬出NES遊戲的運行。

原創文章,作者:MWNI,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/136454.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
MWNI的頭像MWNI
上一篇 2024-10-04 00:16
下一篇 2024-10-04 00:16

相關推薦

  • Virtual Camera在遊戲中的應用

    一、Virtual Camera簡介 Virtual Camera是指虛擬相機,它可以在遊戲中替代現實工作中的攝影機來實現遊戲畫面的拍攝與演出。在遊戲開發中,它被廣泛應用於遊戲場景…

    編程 2025-04-02
  • Virtual Camera在遊戲中的應用

    一、Virtual Camera簡介 Virtual Camera是指虛擬相機,它可以在遊戲中替代現實工作中的攝影機來實現遊戲畫面的拍攝與演出。在遊戲開發中,它被廣泛應用於遊戲場景…

    編程 2025-04-02
  • 深入理解Memory Network

    一、概述 Memory Network是一種基於記憶的神經網路,由Yoshua Bengio等人於2015年提出,用於解決問答、自然語言生成等任務。它的核心思想是使用外部記憶模塊來…

    編程 2025-02-05
  • 了解Direct Memory Access

    一、DMA的概念 DMA(Direct Memory Access)是一種可以提高計算機數據傳輸速度的技術。使用DMA技術,外設設備可以直接訪問系統內存進行數據讀寫,而不需要中央處…

    編程 2024-12-30
  • Cannotfind在編程和遊戲中的應用

    一、cannotfind怎麼讀 Cannotfind是英文單詞,讀音為[kænˈnɒtfaind]. 二、冒險島cannotfind 在遊戲《冒險島》中,Cannotfind是一個…

    編程 2024-12-06
  • php中修改memory,php增刪改

    本文目錄一覽: 1、在php.ini中把memory_limit改成256M了,都重啟伺服器了,在phpinfo()中還是顯示128M,是怎回事? 2、如何增加PHP的內存memo…

    編程 2024-12-02
  • 包含php的memory的詞條

    本文目錄一覽: 1、PHP管理內存函數 memory_get_usage()使用介紹 2、如何修改PHP的memory 3、如何獲知PHP程序佔用多少內存memory 4、phps…

    編程 2024-11-26
  • rom和ram不同點

    最簡單的區分,無論是電腦還是手機,容量小的那個一定是內存RAM,容量大的一定是存儲(快閃記憶體)ROM。 rom和ram不同點: 比如手機的4GB+64GB、6GB+64GB、6GB+1…

    2024-11-22
  • rom和ram對比介紹

    rom與ram是我們在選擇手機、電腦時比較重要的參考因素,兩者都可以叫做內存,但卻是完全不同的,有些時候我們會被商家的各種介紹給弄暈,比如8+128內存很多人就不知道什麼意思,那麼…

    2024-11-22
  • RAM和ROM的作用與區別詳細說明

    隨機存取記憶體(Random Access Memory,或稱為RAM),是一種在電腦中用來暫時保存數據的元件。它可以隨時讀寫,而且速度很快,通常作為作業系統或其他正在運行中的程式…

    2024-11-21

發表回復

登錄後才能評論