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