android 开源fc模拟器_用 Go 撸了一个 NES/FC/红白机模拟器——GoNES
上個月在 V 站看到有同學(xué)發(fā)布了一個 Rust 寫的 Gameboy 模擬器。當(dāng)時我恰好在系統(tǒng)化學(xué)習(xí) Go 語言,作為馬里奧 /馬力歐 /瑪麗(誤)的忠實(shí)粉絲,就想著自己能不能用 Go 寫個模擬器玩玩。于是我瞄準(zhǔn)了 NES 模擬器,考慮到 NES 是上個世紀(jì) 80 年代的古董硬件,可能比較容易實(shí)現(xiàn)。
接下來我開始在網(wǎng)上搜索關(guān)于 NES 硬件的信息。忽然有一個神奇的網(wǎng)站出現(xiàn)在我眼前,它就是 nesdev.com 。這個網(wǎng)站有一個Wiki,里面的內(nèi)容包羅萬象,有 NES 的硬件細(xì)節(jié),也有 NES 游戲開發(fā)的教程。對照著文檔,大概用了一天的時間完成了 INES ROM 文件(網(wǎng)上下到的.nes 文件都是這種格式)的讀取,然后用了不到一周的業(yè)余時間就基本實(shí)現(xiàn)了 NES CPU ( 6502 )指令解釋器。NES 的 PPU (類似顯卡)是難點(diǎn),大概陸陸續(xù)續(xù)寫個幾個星期才完成基本功能。主要因為 NES 的硬件太弱,很多游戲為了壓榨機(jī)能在開發(fā)過程中用了大量的 hack,如果對 PPU 的模擬必須不夠精確,游戲運(yùn)行時就會出現(xiàn)各種奇怪的現(xiàn)象。用的 GUI 庫是 fyne.io ,在部分操作系統(tǒng)上會內(nèi)存泄漏,打算之后換個其他的庫試試( Go 語言目前好像沒有成熟的 GUI 庫)。另外 APU (類似聲卡)的模擬還沒有實(shí)現(xiàn)(主要我對聲學(xué)一竅不通,也暫時不想隨便引用個第三方庫解決,就先拖著了)。
另外一個難點(diǎn)是卡帶的模擬。NES 原生只有 2kB 內(nèi)存+2kB 顯存,為了拓展內(nèi)存和顯存的容量,很多游戲的卡帶帶有一個俗稱 Mapper 的芯片。配合卡帶上額外的 ROM 或 RAM 芯片,Mapper 可以將卡帶上 ROM 或 RAM 的一部分空間(稱為 bank )映射進(jìn) NES 的內(nèi)存或顯存地址空間,還可以在游戲運(yùn)行中動態(tài)切換。麻煩的是,不同的游戲使用的 Mapper 芯片是不同的,你必須先實(shí)現(xiàn)了對某種 Mapper 的模擬,才能運(yùn)行使用這種 Mapper 的游戲 ROM,然而已知的 Mapper 種類就有幾百種。目前我的模擬器只實(shí)現(xiàn)了 INES 文件格式定義的 0-3 號 Mapper,但已經(jīng)可以運(yùn)行不少游戲了(包括超級馬力歐兄弟一代和魂斗羅)。
目前這個項目還比較初期,只能慢慢完善了。如果很多人感興趣的話我打算寫幾篇文章,做個自制 NES 模擬器的教程。
演示
演示游戲為 Nova The Squirrel,是一個仿星之卡比系列的開源山寨游戲。
總結(jié)
以上是生活随笔為你收集整理的android 开源fc模拟器_用 Go 撸了一个 NES/FC/红白机模拟器——GoNES的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: String字符串中数字排序(Java)
- 下一篇: java基于springboot+vue