一、何為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