Batocera 解決 Dosbox-Staging Illegal instruction 問題

Batocera 在 v40 (x64) 以後的版本含最新的 v4.3 版本, Dosbox-Staging 一直都存在著無法正常執行的問題或著是執行到某特定點就閃退。此問題在 Github 上早有人反應問題,只是官方以無法重現問題而結案。而本篇文章是要教你如果解決此問題。

了解原因

Illegal instruction 出現的原因多為編譯時所引用的指令碼在運行的電腦上並不支援。所以程式一但執行到某點時就有可能出現錯誤然後就直接閃退。個人的猜想應該是 Batocera 編譯的主機應該有最新的電腦指令集,所以程式在作編譯最佳化時如果沒特別指定對舊電腦最佳化它就會以編譯的主機作最佳化。以簡單的話來說就是假設編譯主機是 i9-14900K 當它最佳化時有使用到 FMA3 (支援浮點乘加運算) BMI1/BMI2 (位元操作指令) 它產生的程式就無法在無該指令指的電腦上使用,如 I5 7代以下 8 代應該也不行。之所以官方人員回應無法重現問題大概是使用的電腦都有最新的指令集所以在測試的時候就不會出現 Illegal instruction 問題。下圖為我用 i5-7400 測試時產生的 Illegal instruction 問題 (V43版)。

Batocera dosbox-staging shows Illegal instruction error on i5-7400

解決方式

1:使用其它的模擬器

在不使用 MIDI 下其實使用原裝的 DosBox 即可。基本上玩老遊戲沒差。一但有 MIDI 就不一樣了。以下為 MIDI 的比較表。

版本General MIDIMT‑32 模擬外部 MIDI 支援特殊功能
DOSBox (原版)有,但較基本有,需外部 MT‑32 ROM可透過系統 MIDI 裝置功能有限,更新少
DOSBox‑Staging完整支援 (FluidSynth + SoundFont)libmt32emu 精準模擬支援外部硬體 (WinMM, ALSA, CoreMIDI)改良音效、低延遲、跨平台一致性
DOSBox‑X完整支援 (FluidSynth, TiMidity++)MT‑32/CM‑32L 模擬,可載入 ROM廣泛支援:ALSA、OSS、CoreAudio、CoreMIDI、Microsoft GS Wavetable內建 DOSMID 播放器,可直接播放 MIDI/RMI/MUS 檔
Libretro DOSBox‑Pure有基本 General MIDI (依 RetroArch 音源)無完整 MT‑32 模擬外部支援有限,依 RetroArch plugin強調簡化操作,非專業 MIDI 模擬

Batocera 預設是為沒 MT32 跟 FluidSynth 的服務。所以只剩 DOSBox‑XLibretro DOSBox‑PureLibretro 版本 MT32 會爆音 (我測魔法門3 時就感覺到)。所以只剩 DOSBox‑X 。但 DOSBox‑X 設定對新手不友善。

2:使用我自已編的 Dosbox-Staging

我自已從 Batocera V43 的 source code 編的。在我的 i5-4690 上編譯。原汁原味無任何修改。按這裡下載 。下載完成後解壓縮 copy 至 /usr/bin 下 蓋過原本的檔案。完成後再執行 batocera-save-overlay 存檔。技術好的人也可考慮用 service 方式處理,要不要蓋檔可由 ES 上的 service 上勾選。

Batocera My Service Menu
blog.ocam.live
blog.ocam.live

關注科技新聞、SEO、人工智慧、電玩模擬器、程式設言、與 IT 日常等議題,深入簡出文章的說明並持續追蹤相關新聞的發展與報導。