遊戲機模擬器的具體原理是什麼?

3DS的citra,PSP的ppsspp,Wii的dolphin,Wii U的cemu等。這些模擬器的運作原理是什麼?能夠系統的描述一下嗎?


「遊戲機模擬器」 注重的是 「嚴格模擬硬體」,要精確,可以對照 MAME代碼,所有問題都能在裡面找到對應答案:

1. 模擬 CPU:

MAME里實現了各種 68000, z80,mips, sparc, arm,pic16c5x,nec, alpha,等 100 多款你見過的或者沒見過的主從協處理器的模擬,雖然都是 switch case opcode,但是不像 lua虛擬機。MAME的 CPU模擬重點在 「精確實現硬體」,除了指令集實現外,還有各種軟硬終端/trap/異常處理/IO實現。舉個簡單例子,一個遊戲主機需要 4MHz 的 z80晶元,你就得給我真的按照 4Mhz來跑,每條指令計算周期,不能多也不能少,你要把 4Mhz跑成 8Mhz,遊戲玩起來節奏就不一樣了。比如以前老遊戲機上敵人一多,就會慢下來,你實現模擬器,也得把這種慢下來給實現了。另外很多街機是雙處理器,比如一塊 68000 + z80,你不能復原老主機的運行速度,一些寫的粗糙的遊戲 ROM可能會出錯。

模擬 CPU重點是 「精細」,比如浮點數誤差最好一致,比如中斷優先順序你得模擬出來,模擬器由於按照 interval 來運行,更容易產生同時多個硬體中斷被觸發,比如 「手柄按鍵」 ,多核通信之類各種東西加在一起,某個核滿負荷運行的情況下,優先順序低的可能永遠得不到處理,弄錯了可能遊戲就沒法玩了。

2. 模擬匯流排:

匯流排也有好多規格需要實現,不同基板的匯流排鏈接不同cpu 和外設的方式都不一樣,還是需要 「精確模擬」,比如 ROM /RAM / IO 地址映射,一些大容量遊戲需要 ROM 的 BANK 切換,還有一些遊戲會在卡帶上帶有擴展內存,除此之外還要正確模擬各種異常,比如某些 RAM,讀寫奇數地址會出錯,要給對應 CPU發送異常信號,某些老點的 RAM只能讀寫 16bit的 WORD,不能讀寫 DWORD或者 BYTE,否則都無效。這些你都得模擬到位了,有些有 BUG的遊戲,錯誤的寫了內存,在真實主機上,寫操作直接被硬體忽略掉了,沒有損傷,但軟體模擬不注意執行了那條指令結果就不一致了。

3. 外設模擬:

音頻晶元,I/O,圖形加速晶元,隨機數發生器,音視頻輸出,搖桿,時鐘等。有些外設是有bug的,你也要把這些歷史上的硬體bug給模擬進去,不然遊戲可能行為不一致。

4. 調試系統:

提供終端和介面可以內存 DUMP,反彙編,修改指令和數據,保存現場之類的。

有史以來出現過的遊戲機硬體數不勝數,但是他們用到的晶元或者硬體是有限的,比如z80和 68000這類流行的晶元,具體每台主機其實就是一份配置文件,包含使用那種匯流排,哪些cpu,分別按照什麼速度來運行,內存I/O布局,關聯哪些外設,BIOS和啟動載入等信息。

總之是個辛苦活,你需要一本硬體手冊,然後邊查邊弄。

如果你嫌 MAME太複雜龐大,再推薦一個 gens 的代碼,只針對世嘉16位機的 Windows實現,條理很清晰,很多比世嘉簡單的 FC模擬器寫的都沒有 gens那麼結構清晰,簡單易讀。它就不像MAME那麼大而全,很多步驟實現的很直接不需要配置那麼多,代碼量也不大。

現在新進的模擬器很多,沒機會逐一查看他們的實現細節,只記得有幾款比較新的模擬器都是直接裁剪 MAME的部分代碼來弄的,因為 MAME裡面幾乎實現了所有遊戲能用的晶元了,拿出來改改參數加點指令集就可以用,比如 MAME裡面模擬了 mips,我們裁剪出來實現 PSP模擬器,個別指令有些區別需要改一下,然後我們著重自己實現 PSP裡面 MAME沒有的硬體部分。

--


不知題主對計算機系統了解程度如何,我就簡單說一下。一般我們使用的計算機是這樣,操作系統運行在計算機硬體基礎上,為應用程序抽象了一些功能介面,然後我們使用應用程序進行工作或娛樂。

---應用程序---
---操作系統---
---計算機硬體---

遊戲機模擬器是一個應用程序,運行在操作系統之上,而這個程序能夠載入運行相應的遊戲程序。就變成了:

----------------
---應用程序---
---操作系統---(如果有的話)
---模擬硬體---
----------------
---操作系統---
---計算機硬體---

其中應用程序、操作系統都是軟體,和真正遊戲機上運行的沒有區別。關鍵之處就在於模擬器用代碼實現了硬體的功能

比如內存,功能是存儲代碼與數據,就可以簡單在程序里申請一個相應大小的全局數組,把要運行的二進位代碼載入這個數組裡,寄存器類似。

再比如CPU,功能是取指,解碼,執行。我們就可以在上面這個內存數組裡取出PC指針指向的一個位元組二進位代碼(opcode),分析它後執行相應的操作(內存里某個地址的值加一、PC指針跳轉到內存的某處等等)。

……

如果有興趣,可以去完成南京大的這個大作業,會知道很多細節上的東西。

如何閱讀《深入理解計算機系統》這本書? - 回答作者: YangminZ http://zhihu.com/question/20402534/answer/124344760


偏個題,現在一般人口中的模擬器其實應該是emulation(模擬器),真正的模擬器是simulation。其實弄清他倆的區別也就明白工作原理了。


推薦閱讀:

Nintendo Switch使用卡帶有哪些合理的因素?
外國遊戲機進入中國市場會不會影響中國遊戲市場的正版化進程?
gpd的這篇抨擊任天堂岩田聰的文章存在什麼問題?
想在電視屏幕上用遊戲手柄打遊戲,怎麼辦到的?需要買些什麼?
比較一下 Xbox One, Play Station 4 Wii U三個遊戲平台?

TAG:操作系統 | 任天堂3DS | 遊戲機 | 模擬器 |