GoNES是一款通過GO語言編寫的NES模擬器模擬器,這款模擬器可以讓你在電腦上運行大家熟悉的紅白機游戲。紅白機是大家小時候最值得懷念的游戲時光,可能很多人用的是國內(nèi)的山寨小霸王,不過玩的東西都一樣,這款GoNES模擬器讓你在電腦上能重溫當年的那些游戲了。
開發(fā)說明:
上個月在 V 站看到有同學發(fā)布了一個 Rust 寫的 Gameboy 模擬器。當時我恰好在系統(tǒng)化學習 Go 語言,作為馬里奧 /馬力歐 /瑪麗(誤)的忠實粉絲,就想著自己能不能用 Go 寫個模擬器玩玩。于是我瞄準了 NES 模擬器,考慮到 NES 是上個世紀 80 年代的古董硬件,可能比較容易實現(xiàn)。
接下來我開始在網(wǎng)上搜索關于 NES 硬件的信息。忽然有一個神奇的網(wǎng)站出現(xiàn)在我眼前,它就是 nesdev.com 。這個網(wǎng)站有一個Wiki,里面的內(nèi)容包羅萬象,有 NES 的硬件細節(jié),也有 NES 游戲開發(fā)的教程。對照著文檔,大概用了一天的時間完成了 INES ROM 文件(網(wǎng)上下到的.nes 文件都是這種格式)的讀取,然后用了不到一周的業(yè)余時間就基本實現(xiàn)了 NES CPU ( 6502 )指令解釋器。NES 的 PPU (類似顯卡)是難點,大概陸陸續(xù)續(xù)寫個幾個星期才完成基本功能。主要因為 NES 的硬件太弱,很多游戲為了壓榨機能在開發(fā)過程中用了大量的 hack,如果對 PPU 的模擬必須不夠精確,游戲運行時就會出現(xiàn)各種奇怪的現(xiàn)象。用的 GUI 庫是 fyne.io ,在部分操作系統(tǒng)上會內(nèi)存泄漏,打算之后換個其他的庫試試( Go 語言目前好像沒有成熟的 GUI 庫)。另外 APU (類似聲卡)的模擬還沒有實現(xiàn)(主要我對聲學一竅不通,也暫時不想隨便引用個第三方庫解決,就先拖著了)。
另外一個難點是卡帶的模擬。NES 原生只有 2kB 內(nèi)存+2kB 顯存,為了拓展內(nèi)存和顯存的容量,很多游戲的卡帶帶有一個俗稱 Mapper 的芯片。配合卡帶上額外的 ROM 或 RAM 芯片,Mapper 可以將卡帶上 ROM 或 RAM 的一部分空間(稱為 bank )映射進 NES 的內(nèi)存或顯存地址空間,還可以在游戲運行中動態(tài)切換。麻煩的是,不同的游戲使用的 Mapper 芯片是不同的,你必須先實現(xiàn)了對某種 Mapper 的模擬,才能運行使用這種 Mapper 的游戲 ROM,然而已知的 Mapper 種類就有幾百種。目前我的模擬器只實現(xiàn)了 INES 文件格式定義的 0-3 號 Mapper,但已經(jīng)可以運行不少游戲了(包括超級馬力歐兄弟一代和魂斗羅)。
使用方法:
從終端運行gones:
gones <game> .nes
或者,如果您使用的是GUI,只需將.NES文件拖到gones二進制文件即可。
然后游戲將開始