close

OpenEmu 是 macOS 上的模擬器,支援的遊戲平台不少,使用簡單,Rom 和存檔的管理功能極佳,容易上手,堪稱是 macOS 上最強的模擬器,可在 OpenEmu 官網下載安裝。然而這款模擬器預設不能玩 Sega DreamCast(以下稱 DC) 的遊戲,不過 OpenEmu 在 Github 上的專案原始碼中,卻有 Reicast 的 Core ,這意味 OpenEmu 應該是可以使用 Reicast Core 運行 Sega DC 的遊戲才對。

研究了一下,OpenEmu 是開放框架,要讓 OpenEmu 能玩上某一款主機遊戲,只要加掛兩個支援 OpenEmu 的元件檔案:插件(PlugIn)與核心(Core)。官網在 WIKI 中提到 DreamCast 屬於「Work-In-Progress ports」項目,所以在正式釋出的版本中,並未包含 DC 的 PlugIn 與 Core 檔案,所以才不能玩。既然如此,只能上網找找看了。

可惜天不從人願,找了半天始終找不到這兩個檔案,只好從原始碼下手了。而 Github 上的專案 WIKI 有編譯 OpemEmu 主程式的教學,但是編譯 Core 教學從 2014 年至今都沒再補完,網路上也沒有前人的心得,只好自己踹踹看。

踹了一整天終於成功了。從結果論來說,操作不難,步驟不多,但說真的如果沒人教你,保證一定是不斷失敗鬼打牆 LOOP ,過程中還真是 TMD 痛苦,所以才決定寫這篇文章紀錄一下,免得哪天又忘記。

零、準備工作

  • 一台具備網際網路連線,且運作 macOS 的電腦:本文以目前的 macOS 10.14.4 為例。
  • 已安裝 Xcode:本文以最新的 Xcode 10.2.1 為例。
  • 已安裝 GitHub 桌面應用(下載),並且登入 GitHub 帳號。(沒有帳號的話,免費註冊一個
  • 硬碟空間剩餘 10 GB 以上。
  • DreamCast 的 BIOS 檔案:dc_bios.bin(md5: e10c53c2f8b90bab96ead2d368858623)與 dc_flash.bin(md5: 74e3f69c2bb92bc1fc5d9a53dcf6ffe2)。
  • DreamCast 遊戲映像檔:我用的是莎木 I。(以前寫的介紹文

零、檢查工作

檢查電腦與 GitHub 的 SSH 連線是否正常。開啟終端機,執行指令:

ssh -T git@github.com

如果回應「Hi xxxxx! You've successfully authenticated, but GitHub does not provide shell access.」表示可以繼續以下步驟。若出現「permission denied」之類的,那麼得必須先處理掉,(見本文末最下方「補充:解決 GitHub 的 SSH 連線問題」),否則接下來的步驟很快就會卡關。

一、下載並編譯 OpenEmu 原始碼:操作過程參考 WIKI

1. 下載並安裝 Xcode(準備工作)

2. 取得 OpenEmu 的原始碼

有兩種方式,選擇其中任何一種即可:

方法(1):使用 Github 桌面工具下載:

先將 Github 桌面工具安裝妥當之後,用瀏覽器開啟  OpenEmu 原始碼網頁,點擊綠色的 Clone or Downloaded,再點擊「Open in Desktop」,

undefined

(註:如果點擊網頁不會自動開啟 Github 桌面工具,請在網頁上登入 Github)

然後選擇目錄 

undefined

原始碼容量很大,有 2~5.x GB,如果沒有,表示檢查工作 Github 的 SSH 連線有問題沒搞定(參考「補充:解決 GitHub 的 SSH 連線問題」來解決)。

方法(2):使用 git 指令

開啟終端機視窗,執行

$ git clone https://github.com/OpenEmu/OpenEmu.git
$ cd OpenEmu
$ git submodule update --init --recursive

原始碼容量很大,有 2~5.x GB,如果沒有,表示檢查工作 Github 的 SSH 連線有問題沒搞定(參考「補充:解決 GitHub 的 SSH 連線問題」來解決)。

3. Xcode 開啟 「OpenEmu.xcworkspace」。

undefined

4. 確認編譯的對象是 OpenEmu -> My Mac

專案的部分,依下圖點擊選擇紅框的位置

1556996978-3274782099_n.png

這張項目則是支援的插件列表。點擊列表下面的 + 號

然後選擇加入 Products 內的插件(*.oesystemplugin)。可以發現插件中有一個 Dreamcast.oesystemplugin ,就是上面提到的 DC 插件。

功能表 Product -> Build For -> Profiling

大約幾分鐘之後就編譯完成了。

在編譯輸出的「DerivedData/OpenEmu/Build/Products/Release」目錄下,落落長一段。

裡面有兩個最重要的東西:Dreamcast.oesystemplugin 和 OpenEmuBase.framework。

Dreamcast.oesystemplugin 就是 DC 的插件(PlugIn)。還少一個 DC 的核心(Core)檔案。我們需要 OpenEmuBase.framework 來編譯核心。

5. Xcode 關閉 OpenEmu 專案。把上個步驟產生的 OpenEmuBase.framework 複製到 Reicast 目錄下。

6. Xcode 開啟 Reicast.xcodeproj

把剛剛複製過來的 OpenEmuBase.framework 拉進專案內

7. 功能表 Product -> Build For -> Profiling

如果一切順利,編譯輸出的 DerivedData/Reicast/Build/Products/Release 就會有我們要的 DC 核心檔案 Reicast.oecoreplugin 。

8. 部署 DC 的插件、核心、BIOS 檔案:

DC 插件檔案 Dreamcast.oesystemplugin 放到 OpenEmu 的主程式內(OpenEmu.app/Contents/PlugIns/Systems)

DC 核心檔案 Reicast.oecoreplugin 放到 [Home]/Library/Application\ Support/OpenEmu/Cores 目錄下

DC 的 BIOS 檔案(dc_bios.bin 與 dc_flash.bin)放到 [Home]/Library/Application\ Support/OpenEmu/BIOS 目錄下

9. 進入 OpenEmu 之後,編輯左側的模擬器清單,勾選 Dreamcast。

貼上的影像_2022_8_13_下午11_32.png

最後,終於可以用 OpenEmu 玩 DreamCast 遊戲啦~

補充:解決 GitHub 的 SSH 連線問題(來源參考)。

如果 ssh -T git@github.com 指令沒有出現 「Hi xxxxx! You've successfully authenticated, but GitHub does not provide shell access.」的訊息,依照以下方式修正:

0.(可選)如果出現 timeout 的訊息,則編輯 ~/.ssh/config 檔案。加上底下三行

Host github.com
  Hostname ssh.github.com
  Port 443

1. 產生一個新的 SSH Key

ssh-keygen -t rsa -b 4096 -C "xxxxx@example.com"

E-mail 好像可以隨意填。後面幾個問答,一直按 Enter 即可。

2. 編輯 ~/.ssh/config,內容如下:

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_rsa

3. 執行指令

ssh-add -K ~/.ssh/id_rsa

4. 執行 pbcopy < ~/.ssh/id_rsa.pub

意思是將 key 內容複製到剪貼簿。

5. 將 key 新增到 GitHub 帳號:點擊帳號下方 Settings

Settings icon in the user bar

點擊左邊功能區 SSH and GPG keys

Authentication keys

點擊 New SSH key

SSH Key button

然後在 key 貼上剪貼簿的內容,Title 隨便取(可以用自己的電腦名稱,表示哪一台電腦產生的 key)。

The key field

最後點擊 Add SSH key

The Add key button

最後會詢問 GitHub 的密碼進行確認

Sudo mode dialog

輸入正確的密碼。完成後再執行 ssh -T git@github.com 確認 SSH 是否成功。

2021.05.22 補充:底下留言中,有網友提到 OpenEmu 執行超任中文化遊戲會出現亂碼的問題,並提供網路找到的解法,需要修改 SNES9x 的 Core 原始碼後重新編譯。我自己是找了幾個中文化的 SFC ROM 檔:最終幻想(舊名太空戰士)5.6 繁體中文、聖火降魔錄3.4.5,結果只有最終幻想 6 繁體中文版無法執行,會出現黑畫面,其他的中文化 SFC ROM 倒是沒什麼亂碼的問題。

接著我依照網友的方法,自行重新編譯了一個 SNES9x Core 檔,最終幻想 6 繁體中文也能用 OpenEmu 執行了。
截圖 2021-05-23 上午1.04.31.png

編譯 SNES9x 的核心檔案(SNES9x.oecoreplugin)和上述文章中編譯 DreamCast 的核心檔(Reicast.oecoreplugin)操作方式都一樣,快速帶一下做法:

1. 將編譯 OpeEmu 時得到的 OpenEmuBase.framework 複製到原始碼 OpenEmu\SNES9x 目錄下。

2. 使用 Xcode 開啟原始碼 OpenEmu\SNES9x\SNES9x.xcodeproj 專案檔

3. 將 OpenEmuBase.framework 拉到專案內

以上三個操作細節,可參考上述文章編譯 Reicast.oecoreplugin 內容。

4. 修改原始碼:依下圖的操作流程,找到 SNESGameCore.mm 原始碼,將 Settings.BlockInvalidVRAMAccessMaster = true 改為 false(大約在第 120 行的位置)。

貼上的影像_2021_5_23_上午1_46.png

5. 編譯核心:Xcode 的功能表 Product -> Build For -> Profiling

順利的話,最終會得到 SNES9x.oecoreplugin 這個檔案。

截圖_2021-05-23_上午1_56_47.png

6. 把 SNES9x.oecoreplugin 複製到 ~/Library/Application\ Support/OpenEmu/Cores 底下,蓋掉原來的 SNES9x.oecoreplugin 即可(記得將原來的 SNES9x.oecoreplugin 備份)。

arrow
arrow

    benjenq 發表在 痞客邦 留言(10) 人氣()