Peanut-GB 是基於 GameBoy 模擬器的單檔頭 Game Boy 模擬器庫。目的是製作一個高速且可移植的 Game Boy (DMG) 模擬器庫,可用於任何具有 C99 編譯器的平台。
這個模擬器速度非常快。以至於它可以在 Raspberry Pi Pico 上全速運行!請參閱 BENCHMARK.md 以了解 Peanut-GB 的基準測試。
目前僅支援原始 Game Boy (DMG),但支援 Game Boy Color 的初步工作已經完成(請參閱#50)。
該模擬器仍在開發中,可能不準確(儘管它確實通過了 Blargg 的 CPU 指令和指令計時測試)。因此,某些遊戲可能無法正常運作或根本無法運作。如果準確性很重要,請尋找替代模擬器。
花生_sdl.c 中給出了旗艦範例實現,它使用 SDL2 繪製螢幕並接受輸入。在./examples/sdl2/資料夾中執行cmake
或make
進行編譯。
運行peanut-sdl
,它會建立一個拖放區窗口,您可以將 ROM 檔案拖放到其中。或者,使用peanut-sdl game.gb
在終端中運行,如果找不到遊戲,它將自動創建遊戲的保存檔案game.sav
。或者,執行peanut-sdl game.gb save.sav
來指定儲存檔案。
注意:此處顯示的動畫 GIF 僅限於 50 fps,而模擬則以本機 ~60 fps 運行。這是因為流行的 GIF 解碼器將最大 FPS 限制為 50。
行動 | 鍵盤 | 手把 |
---|---|---|
一個 | z | 一個 |
乙 | x | 乙 |
開始 | 返回 | 開始 |
選擇 | 退格鍵 | 後退 |
方向鍵 | 方向鍵 | DPAD |
重複A | 一個 | |
重複B | s | |
正常速度 | 1 | |
渦輪 x2(保持) | 空間 | |
Turbo X2(切換) | 2 | |
Turbo X3(切換) | 3 | |
Turbo X4(切換) | 4 | |
重置 | r | |
改變調色板 | p | |
重置調色板 | Shift + p | |
全螢幕 | F11/f | |
跳幀(切換) | 哦 | |
隔行掃描(切換) | 我 | |
轉儲 BMP(切換) | 乙 |
預設情況下,跳幀和隔行掃描模式均處於關閉狀態。 Frameskip 在 60 FPS 和 30 FPS 之間切換。
按“b”會將每個訊框轉儲為目前資料夾中的 24 位元點陣圖檔案。請參閱 /screencaps/README.md 以了解更多資訊。
以下項目使用 Peanut-GB,排名不分先後,並非詳盡無遺。
函數原型的文件可以在花生_gb.h 的底部找到。
前端實作必須向庫提供許多函數。這些函數在呼叫 gb_init 時設定。
可以定義以下可選函數以實現更多功能。
LCD繪圖需要此功能。使用 gb_init_lcd 設定此函數,並透過在包含花生_gb.h 之前將 ENABLE_LCD 定義為 1 來啟用 Peanut-GB 中的 LCD 功能。如果之前未定義,ENABLE_LCD 預設為 1。如果未呼叫 gb_init_lcd 或 lcd_draw_line 設定為 NULL,則停用 LCD 繪製。
傳送到 lcd_draw_line 的像素資料帶有陰影和圖層資料。前兩個最低有效位元是陰影資料(黑色、深色、淺色、白色)。位元 4 和位元 5 是圖層資料(OBJ0、OBJ1、BG),可用於為遊戲添加更多顏色,就像 Game Boy Color 對舊版 Game Boy 遊戲所做的那樣。
這些功能是音訊仿真和輸出所必需的。 Peanut-GB 不包含音訊仿真,因此必須使用外部函式庫。在包含花生_gb.h 之前,必須定義這些函數,並且必須透過將 ENABLE_SOUND 定義為 1 來啟用音訊輸出。
這些功能是串行通訊所必需的。使用 gb_init_serial 設定這些函數。如果未設定這些功能,則模擬將如同未連接鏈路電纜一樣運作。
這些功能由 Peanut-GB 提供。
此功能會重置正在玩的遊戲,就像控制台已關閉然後再打開一樣。 gb_reset由gb_init呼叫來初始化CPU暫存器。
此函數傳回正在玩的遊戲的保存大小。如果遊戲不使用任何保存數據,則此函數傳回 0。
此函數運行 CPU,直到將全幀渲染到 LCD 上。
此函數計算遊戲標題的雜湊值。此雜湊值的計算方式與 Game Boy Color 相同,為 Game Boy 遊戲添加顏色。
該函數傳回遊戲的名稱。
設定實時時鐘 (RTC) 的時間。有些遊戲使用此 RTC 數據。
已棄用:不使用。 RTC 在內部勾選。
重置時執行 bootrom 映像。呼叫 gb_set_bootrom 後必須執行重設才能使這些變更生效。這是因為gb_init呼叫了gb_reset,但是gb_set_bootrom必須在gb_init之後呼叫。 bootrom 必須是 DMG 或 MGB bootrom。
該項目已獲得 MIT 許可證的許可。