close

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

曾在 2017 年寫過一篇文章「親手打造任天堂紅白機遊樂器」體驗 DIY 的樂趣之後,相信「紅白機掌機化」是有搞頭的。不久之後創客圈出現了「ODROID-GO」這種 DIY 掌上型遊戲機,但據說體驗極差,又不夠便宜(USD $32),所以很快就 Discontinued 消聲匿跡了。其實「紅白機掌機化」方案近年來有如雨後春筍般的紛紛冒出,但基於更好的遊戲體驗與操作手感為由,這類開源掌機始終存在一定的體積和份量,很難方便直覺的收納在身上任何一處口袋並隨時掏出來玩。時間來到 2020 年,「紅白機掌機化」總算迎來真正意義上的實現,紅白機的本家廠商「任天堂」,以「35 週年活動」為由,於 2020 和 2021 年,先後發表「超級瑪莉兄弟」與「薩爾達傳說」兩款 Game&Watch 遊戲掌機,日幣 4,980 円,目前台灣官方的定價 1,450 元。 (官網註明「超級瑪利歐兄弟」款式已於 2021 年 3 月 31 日結束生產)

Game&Watch 掌機是 1980 ~1991 年之間,由任天堂推出的掌上型遊戲機,上市年代比紅白機更為久遠,在當時的學齡人口之間廣為流行,如今已是許多中年成人的童年回憶。「35 週年活動」發表的兩款 Game&Watch 更是完全復刻當年的外型風格,外觀尺寸 67mm x 112mm x 12.5mm,比成年人的手掌略小,重量僅 68 克,可輕鬆放入身上任何一處口袋。遊戲內容則是各自挑選了幾款紅白機與昔日 Game&Watch 的經典代表作,薩爾達款更多了 GameBoy 和新的計時小遊戲,機體外觀上薩爾達款也比瑪莉歐款多兩顆按鈕。在 Game&Watch 掌機框架上遊玩紅白機遊戲,又是任天堂本家公司的產品,可說是 100% 根正苗紅、血統純正,真正意義上「紅白機掌機化」的最佳方案。唯一的遺憾是,收錄的內置遊戲實在太少了,所以這款產品的收藏價值遠大於實用性,估計這也是廠商滿滿的套路,說不定哪天「寶可夢 N 週年活動」、「星之卡比 N 週年」,或是跟某 K 遊戲商一起來合搞「惡魔城 N 週年」、「魂斗羅 N 週年」等等,再以相同手法推出對應的 Game&Watch 掌機,一次又一次收割中年韭菜的懷舊之情,屆時也不意外。

坦白說 1,450 元的定價,只能玩特定幾款遊戲,又是「限定發行」,本來對我沒什麼吸引力。差不多在今年 9 月上旬的時候,臉書社團的人分享摸摸電商的消息,Game&Watch 薩爾達款出現歷史低價只要 888 元,然後又很不小心 G (Google) 到這台掌機的「黑工玩法」,加上當時又有信用卡與電商合作贈送的 100 元折價券,各種敗家誘因的驅使之下,忍不住就剁手了,以 788 元購入一台來搞搞看。

G 過之後才知道,「35 週年活動」Game&Watch 掌機經由某些黑工改造之後,不僅能玩紅白主機遊戲,還能玩上 PC-Engine、SEGA MegaDrive、Game Gear、GameBoy ... 等其他平台的遊戲。若對自己的焊工手藝有點自信的話,還能擴增內置空間,搞出「原廠+自製」雙系統來玩玩。由於 G 到的相關黑客工具有些已經更新,發現大部分網路教程如今已經有點過時,或是有些沒寫清楚的,所以自己也來寫篇教學文章更新一下。

本文內容主要分成以下幾個部分:

  1. 前置作業概述
  2. 安裝 OpenOCD 與 ToolChain 工具
  3. 備份原廠韌體、解鎖 Game&Watch、還原原廠韌體
  4. 編譯安裝自製韌體(retro-go 客製化模擬器)
  5. 擴充 Game&Watch 內置記憶體容量
  6. 原廠與 retro-go 雙系統:必須擴充容量後才能使用
  7. 額外補充:轉換成 retro-go 可運行的 Game&Watch 遊戲

準備工具:

  • 人字螺絲起子:拆解 Game & Watch 
  • 杜邦線三條:連接樹莓派(或 ST-LINK)與 Game & Watch 掌機
  • 樹莓派,或是 ST-LINK 讀寫器:連接 Game & Watch 掌機並上傳韌體。本篇文章所使用的 ST-LINK 是 V2 版。 
  • USB Type-C 電源供應器:Game&Watch 上傳韌體的過程中,有些時候必須斷電重開機(power-cycle),所以要斷開鋰電池,改以 Type-C 供電。 若想偷懶的話,可以直接用電腦或樹莓派的 USB 埠作為 Game&Watch 的 Type-C 供電來源。
  • 一台 Linux 的電腦:用來編譯 Game&Watch 的客製化韌體,樹莓派安裝官方 Raspbian 32bit OS 亦可視為 Linux 電腦。若要以虛擬機安裝 Linux ,不建議使用 Paralkels Desktop,因為 ST-LINK 不能跳接至虛擬機內。
  • 電腦一台(可選):整理 ROM 檔、安裝樹莓派作業系統,或是連線到樹莓派下指令之類的雜項用途。

所需技能:

  • 基本的 Linux 指令操作、小螺絲起子拆解物品。

如果要搞雙系統,需求如下:

  • 晶片拆解與焊接工具:焊槍或熱風槍,以及其他相關工具(鑷子、焊錫/錫油/錫膏...)。
  • Flash 記憶體晶片 16MB 或 32MB 或 64MB:看個人的需求,三種容量的 Flash IC 有兩種外觀。32MB 與 64MB 可能需要熱風槍。型號後文中詳述。

個人覺得不搞雙系統的話難度不高,對於常玩樹莓派、或是習慣使用 Linux 的人來說,這種難度根本是小菜一碟,僅需具備一點點 Linux 系統下操作指令的基礎即可。而雙系統的難度,主要在於個人的焊工手藝,不是每個人都會拿焊槍,不過對我個人來說這部分難度也不高,比上次 GPi Case 更換晶片的難度偏低許多。這次改機除了倒楣買到故障的 ST-LINK V2,其他一切都很順利,幾乎沒踩到什麼坑。

若對以上的部分沒啥問題,想繼續看下去的話,底下的內容可能很長,請繫好安全帶,要發車了。

1、前置作業概述

這台機器不能外插記憶卡,Type-C 口也只有充電功能,想對它上下其手的話,必須先脫了它的...外殼。不過 Game&Watch 外殼由 4 顆特製的人字螺絲固定,得用特殊工具拆解,所幸這種螺絲與任天堂 Switch 的 Joy-Con 手把的外殼螺絲一模一樣,還相同都是鋁製螺絲,很容易崩牙。受惠於 Joy-Con 的高銷量與高維修率,網路賣場搜尋「Joy Con 維修工具」會跑出一大堆,價格也很便宜。建議買一整組的(人字、十字、鑷子、翹棒),在本文中這 4 個工具全都用得上。

人字:拆裝外殼螺絲。十字:主板拆裝。鑷子:排線固定、更換 Flash 晶片。翹棒:撬開鋰電池接頭、螢幕排線黑色壓版。

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

拆開之後還可發現 Game&Watch 使用的喇叭與 Nintendo Switch 同款,鋰電池也和 Joy-Con 同款。受惠於 Nintendo Switch 與 Joy-Con 的高銷量與高維修率,將來 Game&Watch 電池跟喇叭故障也不用擔心,很容易買得到零件更換。上面提到易崩牙的人字鋁製螺絲,也能找到鐵製十字的替代品。

Game&Watch 的處理器是 STM32H7B0VBT6,280Mhz Cortex-M7 核心,內部搭載 1376KB 主記憶體與 128KB Flash RAM,外部 Flash 記憶體為 MX25U 系列的 1.8v SPI NOR Flash,薩爾達版本容量為 4MB,瑪利歐版本為 1MB,通過 QSPI 模式與處理器連接。處理器附近有一排 DEBUG 接口,薩爾達版本為 7 孔,瑪利歐版本為 5 孔,排列順序相同(下圖中薩爾達版左 5 孔與瑪利歐版相同)。DEBUG 接口就是這次用來和 ST-LINK 或樹莓派對接的地方,其他詳細的細節可參考這段影片

與 Game&Watch 連接有兩種方法,依照自身的狀況擇一即可:

方法(1):使用 ST-LINK 搭配 LINUX 的電腦(樹莓派搭載 Raspbian OS 32bit 也可視為 LINUX 電腦)。ST-LINK 有很多種版本形式,本文使用的是下圖的 ST-LiNK V2 版,接法如下(連接前務必先斷開鋰電池):

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

方法(2):使用樹莓派 GPIO,接法如下(連接前務必先斷開鋰電池):

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

兩種我都試過了,我個人建議使用 ST-LINK 搭配安裝 Ubuntu 22.04 64-bit 的電腦,會少走一些冤枉路。用個人電腦編譯 Game&Watch 韌體的速度比樹莓派還快上許多,用 ST-LINK 刷寫韌體的速度也比樹莓派 GPIO 明顯快上不少,可節省超過一半的時間,ST-LINK 刷寫時也有燈號可判斷,比樹莓派 GPIO 刷寫時更直觀,以及在「製作雙系統」時,樹莓派會特別遇到套件版本不相容的問題須額外處理。

注意:千萬不可以將 ST-LINK 或樹莓派上 VDD 端連接到 Game&Watch 主板 VDD 端,因為 ST-LINK 或樹莓派的 VDD 輸出是 3.3V 或 5V,會燒毀 Flash 記憶體晶片( Flash 晶片只支援 1.65~2 V)。

另外,連接的時候可不需焊上,只用膠帶固定住即可,方便完工後拆除,不過得注意接觸不良的問題。連接實作如下圖:

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

ST-LINK 的品質似乎也有差。從淘寶順便買回來的 ST-LINK V2 竟然不能用,只好再買一個

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

連接好之後,接下來就是 Linux 電腦(或安裝 Raspbian 32-bit OS 的樹莓派)的事了。以下的 Linux 指令中,藍底白字的部分,請自行依情況不同而逕行修改。如何修改可參考 #白底藍字 的相關說明。

上述前置作業完成之後,接下來就是進行 Linux  指令操作的部分了。要提醒的是,隨著時間推進,以下內文中某些指令很可能會發生錯誤,例如在某個時間點本來是可以、指令是沒問題的,後來過了一段時間之後,重來一次就突然不行了,這也是許多使用者對 Linux 望而卻步的地方:「明明別人可以,為何我就不行!?」這類問題的原因,多半是某些套件版本或程式碼內容發生變化,而導致的語法不相容錯誤,我會盡可能找出修正指令的方法,並補上黃底紅字說明。

2、安裝 OpenOCD 與 ToolChain 工具

Game&Watch 的處理器採用 STM32 開源方案,OpenOCD(Open On-Chip Debugger)則是開源晶片的調試軟體,可直接視為刷寫韌體的工具軟體。

先安裝相依套件:

sudo apt update && sudo apt upgrade -y
sudo apt install binutils-arm-none-eabi python3 libftdi1 -y
sudo apt install python3-pip python3-pil git cmake -y

2.1 安裝 OpenOCD

操作原理是下載 OpenOCD 的原始碼進行編譯安裝,大約需要幾分鐘到十幾分鐘。指令如下:

cd ~
git clone https://github.com/kbeckmann/ubuntu-openocd-git-builder
cd ~/ubuntu-openocd-git-builder/
git checkout c1003f4
git submodule update --init --recursive
./build.sh
sudo dpkg -i openocd-git_*_*.deb
sudo apt -y -f install
export OPENOCD="/opt/openocd-git/bin/openocd"

執行完畢之後 /opt 底下會生成 openocd-git 目錄,重點是會產生一個執行檔 /opt/openocd-git/bin/openocd。如果沒有這個檔案,表示失敗了。

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

以後要開始進行寫錄韌體前,可以先執行一次 export OPENOCD="/opt/openocd-git/bin/openocd" 

2.2 下載並安裝設定 ToolChain

ToolChain 工具鏈是用來編譯 STM32 韌體的工具軟體。Ubuntu 64-bit 電腦和樹莓派 Raspbian OS 32-bit 使用的工具鏈不同。下載安裝 ToolChain 的操作方法如下:

# ToolChain 平台:linux-x64 - Ubuntu 64bit, linux-arm - 樹莓派 Raspbian OS 32bit
export arch=linux-x64

# GCC 版本
export gccver=10.3.1-2.3

cd ~
wget https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v${gccver}/xpack-arm-none-eabi-gcc-${gccver}-${arch}.tar.gz
mkdir -p ~/gnw
cd ~/gnw
tar xvf ../xpack-arm-none-eabi-gcc-${gccver}-${arch}.tar.gz xpack-arm-none-eabi-gcc-${gccver}

2.3 將 ToolChain 加入路徑中

# GCC 版本
export gccver=10.3.1-2.3
export PATH=$PATH:/home/${USER}/gnw/xpack-arm-none-eabi-gcc-${gccver}/bin/

以後要進行編譯時,要先確認 ToolChain 在 PATH 路徑中。如果沒有的話,執行上面最後兩行即可。

要驗證 ToolChain 有沒有加入 PATH 路徑時,除了 echo $PATH 查看搜尋路徑,還可以輸入 arm-none-eabi- 之後按 TAB 鍵,會列出可執行的指令集。重點是要有底下紅框內的 gcc 和 gdb,因為它是編譯 STM32 自製韌體的必要工具。

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

3.備份、解鎖、還原 Game&Watch 韌體

提醒:每一台 「Game&Watch 35 週年款」掌機,若想要在日後自行寫錄韌體,都必須先經歷「備份、解鎖、還原」全一輪操作。

先確認步驟 1. 的連接是否妥當。Game&Watch 插入 Type-C 電源,開機停在時鐘畫面。執行指令如下:

cd ~
mkdir -p ~/gnw
cd ~/gnw
git clone https://github.com/ghidraninja/game-and-watch-backup.git
cd ~/gnw/game-and-watch-backup

# 連接方式:rpi - 樹莓派 , stlink - ST-LINK 
export ADAPTER=stlink
# Game&Watch 機型 : mario - 瑪利歐款, zelda - 薩爾達款  
export gnw_tg=zelda

# 設定 OPENOCD 執行路徑
export OPENOCD="/opt/openocd-git/bin/openocd"

# 1_檢查 OpenOCD
./1_sanity_check.sh ${ADAPTER} ${gnw_tg}
# 若 OpenOCD 設定正常,會回應 Running sanity checks...Looks good!

# 2_備份第1階段
./2_backup_flash.sh ${ADAPTER} ${gnw_tg}

# 英文會提示先把 Game&Watch 切換到時鐘畫面,確定後按 Enter

完成之後,~/gnw/game-and-watch-backup/backups 目錄底下會產生 flash_backup_zelda.bin 與 itcm_backup_zelda.bin 兩個檔案,Game&Watch 的畫面全黑。繼續以下的動作:

# 3_備份第2階段
./3_backup_internal_flash.sh ${ADAPTER} ${gnw_tg}

這個步驟比較容易出錯。若是正常進行,中間會出現「Flash successfully programmed. Now do the following procedure:  - Disconnect power from the device ...」提示,要把 Game&Watch 斷電重開(斷開 Type-C 再接上,然後按電源鍵),此時 Game&Watch 的畫面是整片藍色,按 Enter 繼續。這個步驟完成之後, backups 目錄下會產生 internal_flash_backup_zelda.bin 檔案。

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

倘若失敗的話,Game&Watch 把 Type-C 斷電重開後會回到時鐘畫面。接著按住 Game&Watch 的電源鍵不放,再執行一次,若進入刷寫程序的話,約 5 秒就能放開電源鍵。總之要看到上面的「Flash successfully programmed. Now do...」的提示訊息、power-cycle 斷電重開後螢幕藍色才算正常。接著繼續:

# 4_解鎖裝置
./4_unlock_device.sh ${ADAPTER} ${gnw_tg}

完成後會出現「Congratulations, your device has been unlocked. Please power-cycle it for the changes to take full effect.」。通常不會有什麼問題。每一台 Game&Watch 只需做一次解鎖即可。跟著提示做一次 power-cycle (斷開 Type-C 電源再接上,按下 Gamw&Watch 電源鈕),繼續最後一個還原動作:

# 5_還原成原始韌體內容
./5_restore.sh ${ADAPTER} ${gnw_tg}

完成之後會提示「Success, your device should be running the original firmware again! (You should power-cycle the device now)」,提示把裝置再一次 power-cycle(斷電再開機)。開機之後會回到原廠韌體的時鐘畫面。

做到這裡,整個步驟 3 就完成了, 如同「開光典禮」般,這台 Game&Watch 經過解鎖步驟的「成年禮」之後,以後便可直接刷寫其他韌體,不需再解鎖。

指令 #1~#5 備份、解鎖、還原的整個流程正常畫面如下:

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

在 ~/gnw/game-and-watch-backup/backups 目錄底下一共會產生三個檔案:

  • flash_backup_zelda.bin
  • internal_flash_backup_zelda.bin
  • itcm_backup_zelda.bin

請務必妥善保存這三個檔案。以後這台 Game&Watch 掌機,不論先前刷寫了哪些內容,只需執行指令「#5_還原成原始韌體內容」就能恢復原廠韌體。

補充說明:
1. 擴容至 64MB 者,「#5_還原成原始韌體內容」 指令不支援,會報錯。
2. stlink 的用戶若遇到「Error: libusb_open() failed with LIBUSB_ERROR_ACCESS」的問題(記錄在 logs 中),可執行以下指令後重開機試試看:

sudo usermod -a -G plugdev `whoami`

 

4. 編譯安裝自製韌體(retro-go 客製化模擬器)

目前網路上的中文教學大多是採用 olderzeus 的版本,不過在撰寫本文的時候,發現另一個作者 sylverb 的版本更完善。sylverb 的版本從 olderzeus fork 出來,已包含 olderzeus 的 NewUI 分支(支援多語系和顯示遊戲封面),支援更多的模擬器(包含 SEGA MD),並支援超頻(PC-E 與 MD 遊戲適用)。所以本文以安裝 sylverb 的版本為準。

提醒:sylverb 版的程式碼更動頻繁,某些版本可能會導致編譯失敗,所以下面 4.1 步驟操作指令中,有特別 checkout 切換至可編譯運作的版本。(2023.02.14 補充)另外,作者 sylverb 似乎於近日完成了任天堂模擬器 fceumm 的移植,終於可以玩任天堂磁碟機(FDS)的遊戲了。

4.1 下載 sylverb 版 retro-go 原始碼並設置編譯環境

操作指令如下:

cd ~
mkdir -p ~/gnw
cd ~/gnw
git clone https://github.com/sylverb/game-and-watch-retro-go.git
cd ~/gnw/game-and-watch-retro-go
git checkout 70b8f1a
git submodule update --init --recursive
make clean
chmod a+x scripts/*.sh
python3 -m pip install -r requirements.txt

4.2 整理 ROM 檔

Game&Watch 並不能外接記憶卡等裝置,遊戲的部分必須和韌體一併打包。整理遊戲 ROM 檔沒有特定做法,可依個人的習慣,選擇適合的方式進行。在 ~/gnw/game-and-watch-retro-go/roms 目錄底下有 a7800、...gb、gc...nes...pce 等遊戲主機平台的子目錄,將想玩的遊戲放入不同的子目錄中,最終會和韌體一併編譯封裝。遊戲如果是 .zip 檔,必須解壓縮,遊戲副檔名和遊戲子目錄名稱保持相同。另外 sylverb 的版本是從 olderzeus 的版本 fork 出來的,也支援遊戲封面和中文檔名顯示。在相同的遊戲目錄下放入遊戲封面縮圖(.jpg 或 .png 或 .bmp),封面圖的主檔名必須和遊戲主檔名一致,不要使用中文檔名。如果有任天堂紅白機的磁碟機遊戲(副檔名為 .fds),一樣放在 nes 目錄下(副檔名依樣維持 .fds 即可),遊戲封面圖檔和遊戲檔名一致,磁碟機系統必備的 BIOS 檔案(disksys.rom)放在 nes_bios\ 目錄下即可。若該遊戲有作弊碼(.ggcode),主檔名也和遊戲檔名一致。以紅白機 ROM 為例,整理如下圖:

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

遊戲 rom、縮圖、作弊碼(如果有的話)都就定位放置好之後,執行以下指令產生遊戲設定檔:

cd ~/gnw/game-and-watch-retro-go

# GCC 版本
# export gccver=10.3.1-2.3
# export PATH=$PATH:/home/${USER}/gnw/xpack-arm-none-eabi-gcc-${gccver}/bin/

make romdef ROMINFOCODE=UTF-8

執行完後,在 cd ~/gnw/game-and-watch-retro-go 目錄底下會有一系列 xx.json 檔案,例如 gb.json、nes.json、md.json... 等等。

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

可以用文書編輯器開啟,自行編輯修改每個遊戲的中文名稱。

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

小技巧:如果不擅於在 Linux 作業系統環境中編輯文字檔,可以將 json 檔以自己知道的方式(如 ssh,vnc,上傳雲端同步...等等)傳到電腦上進行編輯。編輯完記得要再一次確認以 UTF-8 格式存檔,否則中文會出問題。遊戲封面的製作亦然,以熟用的電腦製作完成後,再傳回 Linux 電腦的 ~/gnw/game-and-watch-retro-go/roms/[模擬器] 目錄下。

.json 檔中的參數說明:

  • enable_save:該遊戲是否支援自動存檔?1:是 0:否。適用於 make 參數 STATE_SAVING=0 時個別指定遊戲才會生效。
  • publish:該遊戲是否要打包入韌體檔?1:是 0:否。倘若整理出來的遊戲太多,導致編譯韌體大於 Flash 容量而編譯失敗,可利用此設定調整遊戲數量。
  • _cover_height 與 _cover_width :封面的長寬。_cover_width 介於 64 ~ 180,_cover_height 介於 64 ~ 136 。每個 .json 檔案內只有一組,意即每一種遊戲主機平台只有一組封面長寬設定。例如 pce 的遊戲封面多為近正方形,md 的遊戲多為直立矩形,那麼 pce.json 與 md.json 內的 _cover_height 與 _cover_width 的值就可以不相同。

(2024.01.14 新增)最新的 retro-go 版本新增支援兩款特定的超任遊戲「超級瑪利歐世界」與「薩爾達傳說 - 眾神的三角力」。不過整理遊戲的方式與其他復古遊戲有些不同,方法在文章最下方「補充項目」中說明。

整理好 ROM 檔之後,下一步動作就是編譯 Game&Watch 的 retro-go 包含遊戲的自製韌體。

提醒:如果都沒有 ROM 檔,下一步的編譯韌體動作就會出現錯誤「No roms found! Please add .....」。

4.3 編譯並上傳 retro-go 自製韌體到 Game&Watch

# 先 echo $PATH 確認 ToolChain 有沒有在路徑中,如果沒有的話先執行:
export gccver=10.3.1-2.3
export PATH=$PATH:/home/${USER}/gnw/xpack-arm-none-eabi-gcc-${gccver}/bin/

# 接著執行以下指令
export OPENOCD="/opt/openocd-git/bin/openocd"
# 連接方式:rpi - 樹莓派 , stlink - ST-LINK
export ADAPTER=stlink
# Game&Watch 機型 : mario - 瑪利歐款, zelda - 薩爾達款
export gnw_tg=zelda

cd ~/gnw/game-and-watch-retro-go
# 清除前次的編譯結果
make clean
# 下面這行中,拿掉 flash 表示只編譯韌體,不進入刷寫程序。
make GCC_PATH=/home/${USER}/gnw/xpack-arm-none-eabi-gcc-${gccver}/bin/ COVERFLOW=1 CHEAT_CODES=1 COMPRESS=lzma CODEPAGE=950 EXTFLASH_SIZE_MB=4 OVERCLOCKING_LEVEL=2 GNW_TARGET=${gnw_tg} -j8 flash

make 編譯參數說明:

  • flash: 韌體編譯完成後繼續進行刷寫。如果參數中沒有 flash 則只是編譯韌體,可用來檢查編譯韌體的過程中有沒有其他問題,免得出錯時誤會是晶片壞了燒不進去。
  • COVERFLOW:是否包含遊戲封面?1:是 0:否
  • CODEPAGE:950 為顯示中文
  • EXTFLASH_SIZE_MB:Flash 容量,瑪利歐款為 1(MB),薩爾達款為 4(MB)。若有更換 Flash 晶片擴容,則必須填入擴容後的數字。如果韌體容量大於該數字的話(例如遊戲放太多)則編譯會失敗。
  • OVERCLOCKING_LEVEL:超頻?0:預設不超頻 1:微超頻 2:最大超頻。經測試,薩爾達原廠 4MB 可以最大超頻,但是自行擴容不一定能最大超頻(會當機停住),受限於晶片體質,得試過才知道。另外,PC-E 與 SEGA MD 的某些遊戲則需要超頻,才能跑得更順。
  • EXTFLASH_FORCE_SPI=1:禁用 quad 模式。禁用之後,retro-go 的「調試選項 - 存儲晶片」會顯示 Unknow。一般來說,原廠未改裝過的 Flash 晶片不用加上這個參數,如果改裝的擴容晶片運行時脈較低(例如下面提到的 16MB / 32MB 擴容晶片),且啟用超頻的話,可以嘗試加入這個參數試試。
  • CHEAT_CODES=1:作弊碼。可以到這裡這裡找,或是到這裡用遊戲英文名搜尋。任天堂的作弊碼支援 Game Genie 格式(長度為 8 的字串)與基本格式(格式為 xxxx:xx),與遊戲相同主檔名,放在同一目錄即可。(此參數在 2022.12.2 的 7968d42 版以前為 GAME_GENIE=1)。
  • FORCE_NOFRENDO=1:(2023.02.14 新增)強迫使用 nofrendo 核心,而不使用 fceumm 核心。nofrendo 和 fceumm 都是任天堂紅白機的模擬器核心,主要差別在於 fceumm 對 CPU 的使用負載比 nofrendo 高很多(所以建議超頻),但 fceumm 能玩的紅白機遊戲更多,還能玩磁碟機(.fds)遊戲。沒有此參數時,預設使用 fceumm 核心。
  • DISABLE_SPLASH_SCREEN=1:(2023.03.23 新增)關閉 retr-go 啟動圖片。參數 =0 或是沒有此參數時為啟用啟動圖片。關閉時可縮短 retro-go 的啟動時間。

提示:倘若刷寫出現錯誤,先拿掉 make 的 flash 參數看看編譯韌體的動作有沒有問題。如果加入 flash 指令後出現 openocd .... 之類的錯誤,先檢查連接是否正常,並拔除 Game&Watch 的 Type-C 電源之後再接上,按下 Game&Watch 電源鈕開機後再試。若一直失敗,則除了檢查接觸不良的情況,也可以嘗試接上 Type-C 電源之後按下 Game&Watch 電源鈕不放,接著執行 make 指令。

進入刷寫動作時, Game&Watch 螢幕會顯示進度和狀態如下(此時 Game&Watch 電源鈕如果是按住時,可以放手了):

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

刷寫完成若一切順利,retro-go 的部分就完成了。最後移除連接線,鋰電池接上,鎖上外殼,一台客製化的 Game&Watch 就此誕生。以薩爾達款 4MB 來說,差不多能放 20 多個紅白機遊戲。PC-E 或 MD 的遊戲就比較佔空間,例如 MD 知名神作「怒之鐵拳」全系列 1~3 代三款遊戲加起來就超過 4MB,「快打旋風 II Turbo」容量就高達 3MB,想玩 PCE 或 MD 遊戲的話 4MB 一定不夠用,這時候就可以考慮擴充升級內置記憶體的容量了。

5. 擴充 Game&Watch 內置記憶體容量

原廠 Game&Watch 內置 Flash 記憶體,瑪利歐款使用的是 MX25U8035FM2I,容量只有 8Mb(1MB),薩爾達款好一點,使用 MX25U3232FM2I02,容量 32Mb(4MB),兩者都是 8-SOP 封裝,電壓 1.65V ~ 2V,頻率 133MHz。如果覺得改成 retro-go 之後遊戲實在不夠玩,可自行更換 Flash 晶片擴容,放入更多遊戲。網路上的資訊通常提到的幾款可用型號:

  • MX25U12835FM2I-10G:容量為 128Mb(16MB),和原廠 Flash 晶片一樣的 8-SOP 封裝,電壓 1.65V ~ 2V,頻率 104Mhz。
  • MX25U25635FZ4I-10G:容量為 256Mb(32MB),8-WSON (8x6) 封裝,電壓 1.65V ~ 2V,頻率 108Mhz。
  • MX25U51245GZ4I00:容量為 512Mb(64MB),8-WSON (8x6) 封裝,電壓 1.65V ~ 2V,頻率 166Mhz。

以上 3 款 Flash 晶片在淘寶或是蝦皮上都有人販售。照理說可用的 Flash 晶片應該不只這兩款(可查看 gw_flash.c#L335 內容),也有 128MB 和 256MB 的 Flash,不過那又是另一種封裝(需使用轉換板),建議小心購買,比較不會踩到地雷。

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

本人的焊工水準平平,所以更換晶片的方式就不多說了,Youtube 搜尋「Game&Watch upgrade flash 」就能搜出好幾個。以下是心得:

  • 該台 Game&Watch 入手之後必須先做過一次解鎖(即本文的步驟 3. 中 #1~#5 全部動作),才能更換晶片。
  • 第一次拆解原廠 Flash 晶片時,建議使用焊槍施工。若要用風槍吹下,建議先用焊槍把原腳位上的錫點,用較低溫的銲錫換過一遍比較保險。例如我個人第一次拆解時並沒有用低溫錫換過原銲錫,直接用風槍吹時,溫度得開到近 400 度才能勉強把原廠晶片吹下來,這種高溫度萬一稍有不慎,就可能把附近的小元件一併溶解吹跑,或是吹壞 Flash 晶片。
  • 由於封裝方式不同,換上 8-WSON (8x6) 建議使用熱風槍施工。個人經驗建議 8-WSON 使用低溫錫施工,風槍溫度約 230 度即可。
  • 建議把主板從外殼上拆下來後再施工。主板以 10 顆十字螺絲固定。特別注意還有兩條排線,各自有黑色小板固定,小心別扯斷。細節可看下圖。

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

  • 下圖是薩爾達款的檢查點,可用來檢查焊接是否虛焊不實。

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

Flash 晶片更換完成之後,Game&Watch 在此時是完全無法開機的狀態。可接著進行以下第 6 步驟「安裝雙系統」,或是回到上面第 4 步驟安裝 Retro-Go 模擬器,記得在第 4.3 步驟中 make 參數  EXTFLASH_SIZE_MB 要填入擴容後的數字。

注意:經實測擴容至 64MB 之後,無法進行上面第 3 步驟第 5 個動作「# 5_還原成原始韌體內容」,會出現無法刷寫的錯誤。更換成 64MB 後,直接進行第 6 步驟即可。

6. 安裝雙系統

所謂雙系統,就是在已經 Flash 擴容的 Game&Watch 上,同時安裝原廠韌體和自製韌體,操作原理差不多是把原廠韌體刷寫在前面的 1MB 或 4MB 區塊,自製韌體刷寫在後面剩餘的區塊。不過若是直接把兩種韌體刷上去,就沒有辦法兩者互相切換。所以有人研究出 Patched 原廠韌體加入切換的指令(也就是刷入前 1MB 或 4MB 的原廠韌體是 Patched 過的),達到理想的雙系統的效果。這個項目建議使用 ST-LINK + 個人電腦版的 Linux 64 位元作業系統,因為使用樹莓派會遇到額外的問題需處理

操作指令如下:

sudo apt update && sudo apt upgrade -y
sudo apt install git python3-pip cmake -y
cd ~
mkdir -p ~/gnw
cd ~/gnw
git clone https://github.com/BrianPugh/game-and-watch-patch
cd ~/gnw/game-and-watch-patch
pip3 install -r requirements.txt

樹莓派 Rasbian OS 32bit 的用戶會出現安裝 keystone-engine 的錯誤(其他 Linux 用戶應該不受影響),需手動下載原始碼並進行編譯與安裝。解決方式如下:

# =========樹莓派編譯安裝 keystone-engine========

cd ~
wget https://files.pythonhosted.org/packages/0a/65/3a2e7e55cc1db188869bbbacee60036828330e0ce57fc5f05a3167ab4b4d/keystone-engine-0.9.2.tar.gz
tar -zxvf keystone-engine-0.9.2.tar.gz

接著編輯 ~/gnw/keystone-engine-0.9.2/setup.py,第 114 行

obj_dir = os.path.join(BUILD_DIR, 'llvm', 'lib')

修改成

obj_dir = os.path.join(BUILD_DIR, 'llvm', 'lib', 'arm-linux-gnueabihf')

存檔離開,然後編譯安裝 keystone-engine。以下兩種方法擇一即可。

方法一:

cd ~/keystone-engine-0.9.2
python3 -m pip install .

(補充:「python3 -m pip install . 」後面可加上 --verbose --log logfilename.txt 查看安裝訊息)

方法二:

cd ~
tar czvf keystone-engine-0.9.2mod.tar.gz keystone-engine-0.9.2
pip3 install keystone-engine-0.9.2mod.tar.gz

不論是哪個方法,編譯安裝都需要一段長時間。應該就不會有錯誤訊息了。如果是樹莓派 3(1GB)的用戶,編譯安裝時又可能會遇到記憶體容量不足的問題,得加大 swapfile 交換檔設定,方法如下:

以 sudo 權限編輯 /etc/dphys-swapfile,找到 CONF_SWAPSIZE=... 這行,把數字改成 1024(或是大於 1024 的任一數字),存檔離開。繼續以下指令:

# 重新啟用 swapfile:
sudo service dphys-swapfile restart

#檢查設定
swapon -s

加大 swapfile 生效之後,再做一次編譯安裝(上述兩方法擇一)

# ======= END OF 樹莓派編譯安裝 keystone-engine ====

做完上述的動作之後(樹莓派用戶解決 keystone-engine 的安裝問題,其他 Linux 用戶應該不受影響),繼續執行以下指令:

cd ~/gnw/game-and-watch-patch
make download_sdk

做完之後,再將第 3 步驟產生的原始備份 flash_backup_zelda.bin、internal_flash_backup_zelda.bin 與 itcm_backup_zelda.bin 三個檔案複製一份,放在 game-and-watch-patch 的根目錄下。

接著開始燒錄第一個區塊:原廠 Patch 韌體

# 連接方式:rpi - 樹莓派 , stlink - ST-LINK 
export ADAPTER=stlink

# Game&Watch 機型 : mario - 瑪利歐款, zelda - 薩爾達款  
export gnw_tg=zelda

# 設定 OPENOCD 路徑
export OPENOCD="/opt/openocd-git/bin/openocd"
# 先 echo $PATH 確認 ToolChain 是否在 $PATH 路徑中。如果沒有,執行步驟 2.3 
export gccver=10.3.1-2.3
export PATH=$PATH:/home/${USER}/gnw/xpack-arm-none-eabi-gcc-${gccver}/bin/

# 提示: 擴容 >= 64MB 時,make 參數一定要加上 LARGE_FLASH=1 ,否則會出現 Flash sector_erase failed on sector 0 的錯誤。
# make PATCH_PARAMS="--device=zelda" LARGE_FLASH=1 flash_patched

cd ~/gnw/game-and-watch-patch
make clean
make PATCH_PARAMS="--device=${gnw_tg}" flash_patched

make 參數說明如下:

  • LARGE_FLASH=1:如果擴容後的容量 >= 64MB,則必須加上這個參數,否則會出現 Flash sector_erase failed on sector 0 的錯誤而中止。
  • flash_patched:加上此參數則會刷寫 Patch 過的韌體,若不加此參數,則只會進行 Patch 韌體動作而不會進行刷寫,不加參數可用來檢查第 3 步驟取得的原廠備份韌體是否有無問題。另外,若將此參數改成 flash_stock 則是直接刷寫原廠備份韌體,作用相當於第 3 步驟的指令#5,配合 LARGE_FLASH=1 參數可將原廠韌體刷入 >=64MB 的 Flash,不過未經 Patched 的原廠韌體刷入擴容 64MB 並無任何意義,因為無法使用擴容空間。

執行畫面如下:

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

如果整個過程中沒看到上圖類似綠字的部分,表示先前的步驟有問題,可能與第 3 步驟取得的原廠韌體檔案不符有關,得回去逐一檢查看看。

如果都沒問題的話,完成之後,Game&Watch 會恢復成原廠環境,power cycle 之後會出現時鐘畫面 。

接著燒錄第二個區塊 retro-go 客製化韌體

cd ~/gnw/game-and-watch-retro-go
make clean
# GCC 版本
export gccver=10.3.1-2.3

# 編譯第二區塊的指令,為步驟 4.3 的 make 參數中, EXTFLASH_SIZE_MB 值要扣除原廠韌體的容量,再加上兩個參數 EXTFLASH_OFFSET=[偏移量] INTFLASH_BANK=2 。其他的參數都和步驟 4.3 相同。
# 例如擴容至 16MB 的 zelda 款來說,參數為 EXTFLASH_SIZE_MB=12 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2,完整 make 指令如下:

make GCC_PATH=/home/${USER}/gnw/xpack-arm-none-eabi-gcc-${gccver}/bin/ COVERFLOW=1 CHEAT_CODES=1 COMPRESS=lzma CODEPAGE=950 EXTFLASH_SIZE_MB=12 GNW_TARGET=${gnw_tg} EXTFLASH_FORCE_SPI=1 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 OVERCLOCKING_LEVEL=2 -j8 flash

和 4.3 步驟相同道理,CHEAT_CODES、CODEPAGE、EXTFLASH_FORCE_SPI 等參數可參考 4.3 的說明,make 指令不加 flash 的話只會編譯而不刷機,可用來檢視編譯過程中有無問題,沒問題時再加入 flash 進行刷機。另外再補充一點,如果有超頻(OVERCLOCKING_LEVEL=2),那麼有改裝擴容為 16MB 與 32MB 的用戶,由於該晶片的預設工作頻率較低,最好再加上 EXTFLASH_FORCE_SPI=1 參數,否則遊戲很可能會開不起來或是各種閃退。(一旦啟用 EXTFLASH_FORCE_SPI=1 ,retro-go 的「調試選項 - 存儲晶片」會顯示 Unknow,不影響使用)

開始刷機時通常會出現一行錯誤紅字「Flashing chunk 0 failed... power cycle unit and retry? (y/n)」,要求 power-cycle 一次(斷開 Game&Watch 的 Type-C 電源再接上,按電源鍵開啟),做完回到電腦按 y 繼續,正常的話就會開始刷寫第二區塊韌體。若再不行的話則多按 y 幾次(原廠時鐘畫面),或是再檢查一下有無接觸不良的情況。又或者可以按住 Game&Watch 本體的電源鍵不放的情況下,電腦按 y 繼續。有時要試個 4、5 次才會繼續。

刷寫所需的時間除了與韌體大小有關,也和使用 ST-LINK 或樹梅派刷寫有關,我個人的經驗是約 52MB 韌體使用 ST-LINK 刷寫大約是 12 分鐘就結束,網路上有人分享用樹梅派刷寫近 60MB 耗時約 50 分鐘。

做完就大功告成了。在原廠韌體畫面(即薩爾達時鐘畫面)同時按住「方向鍵左+GAME 鍵」就會進入客製韌體,按電源鍵重開機回到原廠韌體。

如果想在「Game&Watch 35 週年款」遊玩上個世紀的 Game&Watch 老遊戲的話,請繼續閱讀「轉換為 retro-go 可用的 Game&Watch 復古遊戲」。

心得後記

不少復古遊戲玩家都認為 Game&Watch 的螢幕與按鈕太小,遊戲體驗一定不好,Game&Watch 35 週年款的收藏意義大於實用價值。不過我個人體驗之後卻不這麼覺得。透過解鎖、擴容、刷寫支援更多平台的 sylverb 版自製韌體與雙系統之後,這台掌機成為了出門必備良品。體積夠小,可以隨意放在身上任何一處口袋,收取相當便利,秒開機,關機即時存檔,支援遊戲即時狀態存取,隨時隨地拿出來接續遊戲進度毫無懸念,而且非常省電。它支援遊戲的 0.5/0.75 慢速運行(MD 遊戲目前不支援慢速),玩起射擊遊戲這類即時反應的遊戲難度大幅降低。搭載的螢幕雖然不大,但是螢幕解析度 320x240 對於紅白機、PC-E、MD 這類低解析度的老主機已是綽綽有餘,螢幕發色也很不錯。最近幾天利用生活的碎片時間,一些昔日想玩卻沒玩到、當時怎麼玩都破不了關的遊戲,經由 CHEAT_CODES=1 的作弊神功加持,全都逐一在這台掌機上破關補完了,對我來說它已是實用性遠大於收藏。

不過它也是有一些缺點,例如十字鍵偏小容易誤按,A 鍵太靠近本體邊緣不好連打,喇叭聲音太小(國外有改裝耳機埠的教學),retro-go 支援的遊戲也有限(不是所有的 nes/pce/md... 都能玩,有些  PC-E 或 MD 的遊戲甚至還會固定閃退)。不過對於一台僅以 788 元入手,以及花點小錢擴容的機器來說,CP 值仍是很值得。截至撰寫本文時,摸摸電商的 888 元特價活動仍在,PCHome 上也有在販售 Wame&Watch 薩爾達款,兩台合購也只要 1,680(平均一台不到 850元),建議愛好復古遊戲者、並且對自己焊工手藝有信心和 DIY 感興趣的人,可以趁便宜時買來搞搞玩玩看。

補充:轉換為 retro-go 可用的 Game&Watch 復古遊戲

上個世紀的 Game&Watch 也可以用模擬器來運行。不過和一般的遊戲 ROM 很不同的是,最原始的 Game & Watch 的 ROM 檔並未包含(也不可能包含)圖像資料,所以模擬 Game&Watch 的遊戲還得額外載入特別製作的圖像素材(另稱「裝飾檔」)才能正常遊玩。以 Retropie 這個模擬器來說,直接載入別人已整合完成的 .gnw 檔案即可,MAME 的話就必須同時具備遊戲 ROM 的 .zip 與素材的 .zip (檔名與副檔名都相同的兩個檔案)才能正常遊玩。

至於 retro-go 採用的 Game&Watch ROM 檔,則必須使用 MAME 的格式,透過 bzhxx/LCD-Game-Shrinker 這個工具轉換成 .gw 之後,再放到  retro-go 的 roms/gw 目錄底下,轉換工具必須在 Linux 的環境下操作(建議使用 Ubuntu 22.04,樹莓派建議最新版 Raspbian GNU/Linux 11 bullseye )。詳細的操作方式可以參考 DNA64/LCD-Game-Shrinker-Guide.md 這篇文章。做法如下:

# 套件更新
sudo apt update && sudo apt upgrade -y
# 安裝 git (如已安裝可省略)
sudo apt install git python3-pip -y

# 下載與安裝 LCD-Game-Shrinker 工具

cd ~
git clone https://github.com/bzhxx/LCD-Game-Shrinker
cd ~/LCD-Game-Shrinker
python3 -m pip install -r requirements.txt

接著安裝 Inkscape ,它是知名的編修向量素材的軟體。

sudo apt install inkscape -y

繼續將 MAME 格式的 Game&Watch 遊戲檔案(有兩個,遊戲 ROM .zip素材 .zip,檔名和副檔名都一樣的兩個檔案),分別放到以下兩個目錄中

  •  ~/LCD-Game-Shrinker/input/rom:遊戲 ROM .zip
  • ~/LCD-Game-Shrinker/input/artwork:遊戲素材 .zip

(2023.02.15 補充)由於 sylverb 在最新版的 game-and-watch-retro-go/LCD-Game-Emulator 模擬器中移除對 .lz4 壓縮格式的支援,改成只支援 .lzma 格式(因為 .lzma 壓縮後體積更小,可在有限的容量中放入更多 G&W 遊戲),所以要手動修改 LCD-Game-Shrinker 轉檔程式。使用任何一種文書編輯器(nano 或 gedit)開啟 ~/LCD-Game-Shrinker/shrink_it.py ,找到下圖中紅框的兩行(第 55,56 行):

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

把這兩行前面的 # 對調:

#COMPRESS_WITH = LZ4_COMPRESSOR
COMPRESS_WITH = LZMA_COMPRESSOR

將 shrink_it.py 存檔。最後執行 LCD-Game-Shrinker:

cd ~/LCD-Game-Shrinker
python3 shrink_it.py

執行過程如下:

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

如果遊戲夠多的話(根據 WIKI 資料大約是近 60 款遊戲),全部轉完也要幾分鐘的時間。若一切順利的話,在 ~/LCD-Game-Shrinker/output 目錄下會生成 .gw 檔案,這些就是 retro-go 可用的 Game&Watch 遊戲 ROM 檔。附帶一提的是,~/LCD-Game-Shrinker/preview 目錄下是遊戲預覽圖,可用來製作遊戲封面。

不過,若是出現「returned non-zero exit status 1.」錯誤(發生於 Inkscape 0.92 版)或「FileNotFoundError: [Errno 2] No such file or directory」錯誤(發生於 Inkscape >= 1.2 版)的話,則可能是 apt 預設下載的 Inkscape 版本與 LCD-Game-Shrinker 不相容。經測試與 LCD-Game-Shrinker 相容的 Inkscape 版本是 1.0 與 1.1。有兩種方式:

方法一:apt 查詢可安裝的版本

apt policy inkscape

查詢結果如下:

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

如果出現的是 1.0 或 1.1 版,安裝時只要輸入完整的版本號碼(上圖黃框處)即可。指令如下:

sudo apt install inkscape=1.1.1-3ubuntu1~bpo20.04.1 -y
# 執行 LCD-Game-Shrinker
cd ~/LCD-Game-Shrinker
python3 shrink_it.py

方法二:如果方法一沒有出現 1.0 或 1.1 版時,就只能用這個方法了。將版本資訊加入 apt 安裝源,完整指令如下:

sudo add-apt-repository ppa:inkscape.dev/stable-1.1
sudo apt update
sudo apt install inkscape
# 執行 LCD-Game-Shrinker
cd ~/LCD-Game-Shrinker
python3 shrink_it.py

當然了,復古 Game&Watch 遊戲也可自製封面,一併放到  ~/gnw/game-and-watch-retro-go/roms/gw 底下,再透過步驟 4.3 編譯上傳。

【電玩+改造】Game&Watch掌上型任天堂紅白機-黑工程

額外項目:有限運行超任特定遊戲

如果各位的 Game & Watch 35 周年款已經黑工程成功,暢玩紅白機、PC-E、Sega MD 等第三世代第四世代的遊戲,那麼可能跟我有一樣的疑問:這台機器能不能執行同樣是第四世代的超級任天堂(SFC)遊戲呢?不久前在 Github 上發現兩個專案,分別是 marian-m12l/game-and-watch-smw 與 marian-m12l/game-and-watch-zelda3,顧名思義,是在 Game & Watch 35 週年款運行超任遊戲「超級瑪利歐世界」(美版 Super Mario World)和「薩爾達傳說:眾神的三角神力」(美版 Legend of Zelda, The - A Link to the Past ) 。不過嚴格來說它並不是一般認知的模擬器方案,而是 Rom Patched 的手段,讓遊戲移植到其他平台上運作。

我找時間依照說明試了一下,超級瑪利歐世界會出現記憶體刷寫錯誤而失敗,不過超任版薩爾達是真的可以運行,音樂和音效也都有,幀率穩定 30fps ,實在是太神奇了。可惜的是超任的按鈕比 Game & Watch 多出好幾顆,遊戲玩起來實在很憋扭。編譯刷寫的方法和 game-and-watch-retro-go 非常類似,不同的地方在於 ToolChain 的 GCC 版本必須使用 12 版以上(12.3.1-1.2),編譯時把文章中的 gccver=10.3.1-2.3 改成 gccver=12.3.1-1.2 就差不多了,有興趣的人可以試試看。

補充項目:有限運行超任遊戲「超級瑪利歐世界」與「薩爾達傳說:眾神的三角神力」

最新版的 retro-go 韌體新增支援超任的特定兩款遊戲:「超級瑪利歐世界」(美版 Super Mario World)和「薩爾達傳說:眾神的三角神力」(美版 Legend of Zelda, The - A Link to the Past )。由於這兩款遊戲是以反向工程(拆解遊戲 ROM 檔 Patched)的手段來實現移植至其他平台運行,因此兩款遊戲有各自的執行程式,並非常見的模擬器讀取 ROM 檔運作。目前 retro-go 客製韌體支援的超任遊戲也只有這兩款,整理 ROM 的方式也和其他復古遊戲有些不同。

作法如下:

1.由於是 Patched ROM 檔,所以遊戲的 ROM 檔版本有嚴格限制。

  • 「超級瑪利歐世界」必須是美版的 ROM,SHA-1 值為 6B47BB75D16514B6A476AA0C73A683A2A4C18765 ,MD5 值為 CDD3C8C37322978CA8669B34BC89C804。
  • 「薩爾達傳說:眾神的三角神力」美版 ROM 的 SHA-1 值為 6D4F10A8B10E10DBE624CB23CF03B88BB8252973,MD5 值為 608C22B8FF930C62DC2DE54BCD6EBA72。

2.「超級瑪利歐世界」的 ROM 檔名限定為 smw.sfc,放置於 retro-go 的 game-and-watch-retro-go\roms\smw 目錄下。「薩爾達傳說:眾神的三角神力」的 ROM 檔名限定 zelda3.sfc,放置在 game-and-watch-retro-go\roms\zelda3 目錄下。意即一目錄僅一個遊戲。

3.make romdef ROMINFOCODE=UTF-8 指令並不會產生這兩款遊戲的 json 文件,所以需要自行製作 smw.json 與 zelda3.json 文件。或是修改 retro-go 的 parse_romdef.py 原始檔,再交由 make romdef 產生 json 文件檔案。

4.可自行製作遊戲封面,邏輯與其他遊戲相同,即 smw.jpg 與 smw.sfc 同目錄,zelda3.jpg 與 zelda3.sfc 同目錄。封面大小可在 json 文件內自行定義(_cover_height 與 _cover_width)。

5.「薩爾達傳說:眾神的三角神力」也支援其他語系的 ROM 檔。各語系的 ROM 檔 SHA-1 可參考 util.py 原始碼

雖然 Game & Watch 35 周年款可成功運行這兩款超任遊戲,不過 Game & Watch 按鈕數量和配置與超任有些差異,這兩款遊戲玩起來感覺不太舒服,所以個人認為象徵意義大於實用體驗。希望有朝一日能移植 Gradius III 這類較少按鈕即可暢玩的超任遊戲,似乎就更完美了。

教程參考資料:

資源:

arrow
arrow

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