VM技术(一)NES模拟器VM综述
游戲和女朋友誰重要?當(dāng)然是游戲(手動(dòng)狗頭),游戲是每一個(gè)時(shí)代的記憶,從最早的LED點(diǎn)陣上的游戲發(fā)展到LED屏,同時(shí)游戲也不斷的推動(dòng)著計(jì)算機(jī)的發(fā)展,現(xiàn)在,時(shí)代已經(jīng)過去,游戲機(jī)除了在古董市場(chǎng),已經(jīng)無從獲得,但是我們可以通過VM技術(shù)去重新構(gòu)建一個(gè)借助虛擬化技術(shù)可玩的設(shè)備,追逐舊夢(mèng)。 本系列將結(jié)合前面的Python VM系列虛擬機(jī)將知識(shí)融會(huì)貫通,總結(jié)一下偉大的虛擬化技術(shù)。
起步——認(rèn)識(shí)iNES文件格式
要入手一個(gè)模擬器,首先得從如何解析.nes的游戲文件開始。
iNES 文件(拓展名 .nes,大小寫均可)是 NES 游戲分發(fā)的事實(shí)標(biāo)準(zhǔn)。該文件標(biāo)準(zhǔn)的最初是由 Marat Fayzullin 為其模擬器 iNES 而開發(fā)的文件格式。
| N | E | S | ^Z | PRG | CHR | MAP/SW | MAP/0(always) |
| 4E | 45 | 53 | 1A | 10 | 20 | E1 | 40 |
第 0 ~ 3 個(gè)字節(jié)指定了文件的格式
0 = 0x4E (N)
1 = 0x45 (E)
2 = 0x53 (S)
3 = 0x1A (^Z)
第4個(gè)字節(jié)指定了 PRG(程序) ROM 塊的個(gè)數(shù),PRG ROM 塊每個(gè)大小為 16KB
第5個(gè)字節(jié)指定了 CHR(圖塊) ROM 塊的個(gè)數(shù),CHR ROM 塊每個(gè)大小為 8 KB
第6個(gè)字節(jié)為指定卡帶屬性的字節(jié)。各個(gè)比特位的含義如下:
- 0 -> Mirror Type ( 1 為水平, 0 為垂直)
- 1 -> 是否存在 battery-backed RAM ( 1 則為存在,映射到 $6000-$7FFF)
- 2 -> 是否存在 trainer (同上,映射到 $7000-$71FF)
- 3 -> 是否存在 VRAM
- 4-7 -> Mapper Type 的低四位
第 7 個(gè)字節(jié)還是指定卡帶屬性的字節(jié)。各個(gè)比特位的含義如下:
- 0 -> 卡帶是否含有 VS-System
- 1-3 -> 保留,但必須全為 0
- 4-7 -> Mapper Type 的高四位
第 8 個(gè)字節(jié)指定了 RAM 塊的個(gè)數(shù),每塊為 8KB,如果為 0 ,則假設(shè)只有一個(gè) RAM 塊。
第 9 個(gè)字節(jié)指定了視頻制式,如果其第 0 個(gè)比特值為 0,則為 PAL,否則為 NTSC 制式。
第 10-15 字節(jié)為保留區(qū)域,必須為 0 通過010editor打開下載[2]的ROM文件可以看到
C++中我們可以定義一個(gè)讀取文件頭的結(jié)構(gòu)體
const NESMagicMumber = 0x1a53454e //"NES^Z" typedef struct _NesHeader{uint32_t MagicNumber;// NES Magic Number,must be 0x1a53454echar PRGNum; // PRG-ROM banks numberchar CHRNum; // CHR-ROM banks numberchar Ctrl1; // Controlchar Ctrl2; // Control toochar RAMNum; // RAM number (8KB each)char[7] _null; // Empty bytes. Not used at this tume but MUST BE ALL ZEROS or games will not work. }NesHeader參考資料:
轉(zhuǎn)載于:https://my.oschina.net/VenusV/blog/3081591
總結(jié)
以上是生活随笔為你收集整理的VM技术(一)NES模拟器VM综述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 对接顺丰快递进行寄件操作 (
- 下一篇: 6.3.3 延迟缓存