曾在 2017 年寫過一篇文章「親手打造任天堂紅白機遊樂器」體驗 DIY 的樂趣之後,相信「紅白機掌機化」是有搞頭的。不久之後創客圈出現了「ODROID-GO」這種 DIY 掌上型遊戲機,但據說體驗極差,又不夠便宜(USD $32),所以很快就 Discontinued 消聲匿跡了。近年來「紅白機掌機化」方案有如雨後春筍般的紛紛冒出,但基於更好的遊戲體驗與操作手感為由,這類開源掌機始終存在一定的體積和重量,很難方便直覺的收納在身上任何一處口袋並隨時掏出來玩。時間來到 2020 年,「紅白機掌機化」總算迎來真正意義上的實現,紅白機本家廠商「任天堂」,以「35 週年活動」為由,於 2020 和 2021 年,先後發表「超級瑪莉兄弟」與「薩爾達傳說」兩款 Game&Watch 遊戲掌機,日幣 4,980 円,台灣官方的定價 1,450 元。 (官網註明「超級瑪利歐兄弟」款式已於 2021 年 3 月 31 日結束生產)
Game&Watch 掌機(WIKI)是 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 到的相關黑客工具有些已經更新,發現大部分網路教程如今已經有點過時,或是有些沒寫清楚的,所以自己也來寫篇教學文章更新一下。
本文內容主要分成以下幾個部分:
- 前置作業概述
- 安裝 OpenOCD 與 ToolChain 工具,gnwmanager 管理套件、環境參數設置
- 備份原廠韌體、解鎖 Game&Watch、還原原廠韌體
- 編譯安裝自製韌體(retro-go 客製化模擬器)
- 擴充 Game&Watch 內置記憶體容量
- 原廠與 retro-go 雙系統:必須擴充容量後才能使用
- 額外補充:轉換成 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、前置作業概述
「35 週年活動」Game&Watch 掌機不能外插記憶卡,Type-C 口也只有充電功能,想對它上下其手的話,必須先脫了它的…外殼。不過 Game&Watch 外殼由 4 顆特製的人字螺絲固定,得用特殊工具拆解,所幸這種螺絲與任天堂 Switch 主機 Joy-Con 手把的外殼螺絲一模一樣,還相同都是鋁製螺絲,很容易崩牙。受惠於 Joy-Con 的高銷量與高維修率,網路賣場搜尋「Joy Con 維修工具」會跑出一大堆,價格也很便宜。建議買一整組的(人字、十字、鑷子、翹棒),在本文中這 4 個工具全都用得上。
人字:拆裝外殼螺絲。十字:主板拆裝。鑷子:排線固定、更換 Flash 晶片。翹棒:撬開鋰電池接頭、螢幕排線黑色壓版。
拆開之後還可發現 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 版,接法如下(連接前務必先斷開鋰電池):
2024.10.08 補充:上面斷開電源的動畫時動作務必小心放輕,否則焊在 PCB 上的電源母座很可能一併脫落。本人在近日弄掉了一次,最後使用熱風槍+低溫錫把母座成功黏回去。
方法(2):使用樹莓派 GPIO,接法如下(連接前務必先斷開鋰電池):
兩種我都試過了,我個人建議使用 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)。
另外,連接的時候可不需焊上,只用膠帶固定住即可,方便完工後拆除,不過得注意接觸不良的問題。連接實作如下圖:
ST-LINK 的品質似乎也有差。從淘寶順便買回來的 ST-LINK V2 竟然不能用,只好再買一個。
連接好之後,接下來就是 Linux 電腦(或安裝 Raspbian 32-bit OS 的樹莓派)的事了。以下的 Linux 指令中,藍底白字的部分,請自行依情況不同而逕行修改。如何修改可參考 #白底藍字 的相關說明。
上述前置作業完成之後,接下來就是進行 Linux 指令操作的部分了。要提醒的是,隨著時間推進,以下內文中某些指令很可能會發生錯誤,例如在某個時間點本來是可以、指令是沒問題的,後來過了一段時間之後,重來一次就突然不行了,這也是許多使用者對 Linux 望而卻步的地方:「明明別人可以,為何我就不行!?」這類問題的原因,多半是某些套件版本或程式碼內容發生變化,而導致的語法不相容錯誤,我會盡可能找出修正指令的方法,並補上黃底紅字說明。
2、安裝 OpenOCD 與 ToolChain 工具,gnwmanager 管理套件、環境參數設置
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。如果沒有這個檔案,表示失敗了。
以後要開始進行寫錄韌體前,可以先執行一次 export OPENOCD=”/opt/openocd-git/bin/openocd”
2025.02.03 補充:有網友反應這個辦法已經行不通了,剛剛試了一下的確如此,編譯 openocd 會出現 jimtcl 找不到的錯誤。
既然如此,也可以用 gnwmanager 來安裝 openocd。依本文操作到 2.4 安裝完 gnwmanager 之後,執行以下指令安裝 openocd 即可:
gnwmanager install openocd
2.2 下載並安裝設定 ToolChain
ToolChain 工具鏈是用來編譯 STM32 韌體的工具軟體。Ubuntu 64-bit 電腦和樹莓派 Raspbian OS 32-bit 使用的工具鏈不同。下載安裝 ToolChain 的操作方法如下:
# ToolChain 平台:linux-x64 – Ubuntu 64bit, linux-arm – 樹莓派 Raspbian OS 32bit # GCC 版本 cd ~ |
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 路徑時,除了 echo $PATH 查看搜尋路徑,還可以輸入 arm-none-eabi- 之後按 TAB 鍵,會列出可執行的指令集。重點是要有底下紅框內的 gcc 和 gdb,因為它是編譯 STM32 自製韌體的必要工具。
2.4 安裝 gnwmanager
gnwmanager 是近期橫空出世的 Game & Watch 整合製作工具,能自動偵測各種狀態(如 G&W 機型、連線方式與上述 openocd 和 toolchain 工具等)與內建管理操作指令。部份 G&W 套件已陸續改用 gnwmanager 進行操作,為避免後續操作卡關,所以還是把它安裝起來。
sudo apt update sudo apt install python3-pip python3-venv pip3 install pipx export PATH=$PATH:$HOME/.local/bin # 這行加入 ~/.bashrc 或其他等效文件 pipx install gnwmanager |
2.5 將環境參數寫入 ~/.bashrc 檔案
所有的操作指令都在終端機模式下進行,期間會使用到的環境參數例如 OpenOCD、ToolChain 的執行位置、刷機的對象機型(Mario 款或是 Zelda 款)、刷機的方法(使用樹梅派 rpi 或 ST-LINK …),這些參數若能在開啟終端機的當下就能自動設定完成,就不用每次執行時去檢查設定。對於 Debian 系列的 Linux 系統來說(如 Debian、Ubuntu、Mint、Raspberry Pi OS…),只需把環境參數寫入 ~/.bashrc 即可。
.bashrc 是一個標準的文字檔,可以用任何一種文字編輯器來修改。檔案位於家目錄「~/」,用「.」開頭表示它是一個隱藏檔,一般的情況下看不到它的存在。以下是使用 nano 開啟 ~/.bashrc 的操作指令:
cd ~ nano .bashrc |
將以下的環境參數內容,新增到 .bashrc 最下方:
# 連接方式:rpi – 樹莓派 , stlink – ST-LINK # Game&Watch 機型 : mario – 瑪利歐款, zelda – 薩爾達款 # 設定 OPENOCD 路徑 # gnwmanager 的執行路徑 # 將 ToolChain 加入 $PATH 路徑 |
接著按下 Ctrl + X,詢問是否存檔時回答 Y 再按 Enter 即可。
最後,關閉所有的終端機視窗。以後每此啟用終端機視窗時,上述環境參數會自動生效,例如終端機內輸入 echo $PATH 指令看看 ToolChain 有沒有在路徑中,輸入 arm-none-eabi- 之後按 TAB 鍵會不會跑出一堆 arm-none-eabi- 開頭的指令集等等。
3.備份、解鎖、還原 Game&Watch 韌體
提醒:每一台 「Game&Watch 35 週年款」掌機,若想要在日後自行寫錄韌體,或是換擴容晶片等,都必須先經歷一次「備份、解鎖、還原」一輪操作。重點在解鎖和備份,出廠之後必須至少做過一次,也只需做過一次即可。
先確認步驟 1. 的連接是否妥當。Game&Watch 插入 Type-C 電源,開機停在時鐘畫面。並開啟終端機,執行指令如下:
cd ~ # 1_檢查 OpenOCD # 2_備份第1階段 # 英文會提示先把 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 把 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 備份、解鎖、還原的整個流程正常畫面如下:
在 ~/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` |
3. 每一台 Game&Watch 掌機,在出廠之後只需做過一次成功解鎖即可。
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 為例,整理如下圖:
遊戲 rom、縮圖、作弊碼(如果有的話)都就定位放置好之後,執行以下指令產生遊戲設定檔:
cd ~/gnw/game-and-watch-retro-go make romdef ROMINFOCODE=UTF-8 |
執行完後,在 cd ~/gnw/game-and-watch-retro-go 目錄底下會有一系列 xx.json 檔案,例如 gb.json、nes.json、md.json… 等等。
可以用文書編輯器開啟,自行編輯修改每個遊戲的中文名稱。
小技巧:如果不擅於在 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
cd ~/gnw/game-and-watch-retro-go |
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 擴容晶片),且啟用超頻的話,可以嘗試加入這個參數試試。如果使用的是下面提到的 64MB Flash (MX25U51245GZ4I00)晶片,則更不能加上此參數,否則在刷寫韌體的過程中(第 15 處)會發生錯誤。
- 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 電源鈕如果是按住時,可以放手了):
刷寫完成若一切順利,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 (8×6) 封裝,電壓 1.65V ~ 2V,頻率 108Mhz。
- MX25U51245GZ4I00:容量為 512Mb(64MB),8-WSON (8×6) 封裝,電壓 1.65V ~ 2V,頻率 166Mhz。
以上 3 款 Flash 晶片在淘寶或是蝦皮上都有人販售。照理說可用的 Flash 晶片應該不只這兩款(可查看 gw_flash.c#L335 內容),也有 128MB 和 256MB 的 Flash,不過那又是另一種封裝(需使用轉換板),建議小心購買,比較不會踩到地雷。
本人的焊工水準平平,所以更換晶片的方式就不多說了,Youtube 搜尋「Game&Watch upgrade flash 」就能搜出好幾個。以下是心得:
- 該台 Game&Watch 入手之後必須先做過一次解鎖(即本文的步驟 3. 中 #1~#5 全部動作),才能更換晶片。
- 第一次拆解原廠 Flash 晶片時,建議使用焊槍施工。若要用風槍吹下,建議先用焊槍把原腳位上的錫點,用較低溫的銲錫換過一遍比較保險。例如我個人第一次拆解時並沒有用低溫錫換過原銲錫,直接用風槍吹時,溫度得開到近 400 度才能勉強把原廠晶片吹下來,這種高溫度萬一稍有不慎,就可能把附近的小元件一併溶解吹跑,或是吹壞 Flash 晶片。
- 由於封裝方式不同,換上 8-WSON (8×6) 建議使用熱風槍施工。個人經驗建議 8-WSON 使用低溫錫施工,風槍溫度約 230 度即可。
- 建議把主板從外殼上拆下來後再施工。主板以 10 顆十字螺絲固定。特別注意還有兩條排線,各自有黑色小板固定,小心別扯斷。細節可看下圖。
- 下圖是薩爾達款的檢查點,可用來檢查焊接是否虛焊不實。
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: #檢查設定 |
加大 swapfile 生效之後,再做一次編譯安裝(上述兩方法擇一)
# ======= END OF 樹莓派編譯安裝 keystone-engine ====
做完上述的動作之後(樹莓派用戶解決 keystone-engine 的安裝問題,其他 Linux 用戶應該不受影響),繼續執行以下指令:
cd ~/gnw/game-and-watch-patch |
做完之後,再將第 3 步驟產生的原始備份 flash_backup_zelda.bin、internal_flash_backup_zelda.bin 與 itcm_backup_zelda.bin 三個檔案複製一份,放在 game-and-watch-patch 的根目錄下。
接著開始燒錄第一個區塊:原廠 Patch 韌體
# 提示: 擴容 >= 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 參數說明如下:
- 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 並無任何意義,因為無法使用擴容空間。
執行畫面如下:
如果整個過程中沒看到上圖類似綠字的部分,表示先前的步驟有問題,可能與第 3 步驟取得的原廠韌體檔案不符有關,得回去逐一檢查看看。
如果都沒問題的話,完成之後,Game&Watch 會恢復成原廠環境,power cycle 之後會出現時鐘畫面 。
接著燒錄第二個區塊 retro-go 客製化韌體
cd ~/gnw/game-and-watch-retro-go # 編譯第二區塊的指令,為步驟 4.3 的 make 參數中, EXTFLASH_SIZE_MB 值要扣除原廠韌體的容量,再加上兩個參數 EXTFLASH_OFFSET=[偏移量] INTFLASH_BANK=2 。其他的參數都和步驟 4.3 相同。 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 遊戲目前不支援慢速),玩起射擊遊戲這類即時反應的遊戲難度大幅降低。搭載的螢幕雖然不大,但是螢幕解析度 320×240 對於紅白機、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 這篇文章。做法如下:
# 套件更新 # 下載與安裝 LCD-Game-Shrinker 工具 cd ~ |
接著安裝 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 行):
把這兩行前面的 # 對調:
#COMPRESS_WITH = LZ4_COMPRESSOR COMPRESS_WITH = LZMA_COMPRESSOR |
將 shrink_it.py 存檔。最後執行 LCD-Game-Shrinker:
cd ~/LCD-Game-Shrinker python3 shrink_it.py |
執行過程如下:
如果遊戲夠多的話(根據 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 |
查詢結果如下:
如果出現的是 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 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 這類較少按鈕即可暢玩的超任遊戲,似乎就更完美了。
教程參考資料:
- Nintendo Game & Watch 刷機完全攻略
- Zelda Game & Watch Dual System 薩爾達機刷雙系統完全攻略
- Game and Watch 破解刷机教程
- 刷全套遊戲《GAME & WATCH 專用機》一機搞定全部擁有
資源:
這篇好清楚完整!感謝分享
我完全門外漢,想和您請教
在# 2_備份第1階段
./2_backup_flash.sh ${ADAPTER} ${gnw_tg}
我使用ST-link刷機
跑一下會出現:
Attempting to dump flash using adapter stink.
Running Openocd… (This can take up to a few minutes.)
「Fatled to dump SPi flash from device. Vertfy debug connection and try agatn.」
請問有可能是什麼原因呢?
我要重複數十次前後操作一直重來都無解,想和您請教,非常感謝🥹
版主回覆:(12/11/2022 11:53:54 AM)
要看一下 LOG 內容才會知道。LOG 檔位於 game-and-watch-backup/logs 底下,應該會有一個叫 2_backup_flash.log 的檔案
謝謝板主回應!
只有找到[2_openocd.log]
請問我該重複哪個操作呢?有可能是接觸不良或是stlink有問題嗎?謝謝您
版主回覆:(12/11/2022 04:59:26 PM)
用筆記本看裡面的內容寫什麼,才會知道發生什麼事。您說的都有可能
請問爽系統要燒錄遊戲都會這樣。 Error: Unable to set adapter speed Error: init mode failed (unable to connect to the target)。 in procedure ‘program’ **OpenOCD init failed ** shutdown command invoked
版主回覆:(02/21/2023 10:08:26 AM)
參考看看 https://steward-fu.github.io/website/handheld/gw/fix_reset.htm
make GCC_PATH=/home/${USER}/gnw/xpack-arm-none-eabi-gcc-10.3.1-2.3/bin/ COVERFLOW=1 CHEAT_CODES=1 COMPRESS=lzma CODEPAGE=936 EXTFLASH_SIZE_MB=60 GNW_TARGET=zelda EXTFLASH_FORCE_SPI=1 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 OVERCLOCKING_LEVEL=2 -j8 flash
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dac.c:1:1: error: unterminated comment
1 | /**
| ^
make[1]: *** [Makefile.common:605:build/core/stm32h7xx_hal_dac.o] 错误 1
make[1]: *** 正在等待未完成的任务….
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c:390:1: error: unterminated comment
390 | /**
| ^
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c:63: error: unterminated #ifdef
63 | #ifdef HAL_DMA_MODULE_ENABLED
|
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c:74:13: warning: ‘DMA_MultiBufferSetConfig’ used but never defined
74 | static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
| ^~~~~~~~~~~~~~~~~~~~~~~~
make[1]: *** [Makefile.common:605:build/core/stm32h7xx_hal_dma_ex.o] 错误 1
make[1]: 离开目录“/home/zbabla/gnw/game-and-watch-retro-go”
make: *** [Makefile.common:750:flash] 错误 2
不知道怎么弄了。
版主回覆:(03/25/2023 11:43:23 PM)
感覺上像是某個動作沒有確實運作完成,導致後來 gcc 編譯出錯。建議檢查 gcc 的路徑
,以及 retro-go 的下載/安裝/編譯等操作重新再來一次。
已跟程序做成功解鎖, 並出現以下訊息
Congratulations, your device has been unlocked. Just a few more steps!
– The Game & Watch will not yet be functional
– Disconnect power from the device for the changes to take full effect
– Power it again
– Run the 5_restore.sh script to restore the SPI and Internal Flash.
但當我按指示斷開電源後, 卻未能重新開機, 即使長按電源鍵都沒有反應, 現在可以怎麼辦? 我有看到已產生那3個backup的檔案
版主回覆:(03/25/2023 11:36:44 PM)
看起來是剛做完第 4 步驟的解瑣,這時候 power-cycle 不能啟動是正常的。直接進行 5_restore.sh 即可。
按照楼主的方法已经做好了zelda版本的双系统,请教一下几个问题:1. 在教程4.1中“git checkout 118bf92”的意思是什么?是选择仓库中的某一历史版本吗?主要是后面我使用教程提到的“DISABLE_SPLASH_SCREEN=1:(2023.03.23 新增)關閉 retr-go 啟動圖片。參數 =0 或是沒有此參數時為啟用啟動圖片。關閉時可縮短 retro-go 的啟動時間。”参数好像没有效果,=1后,每次进入go还是有动画图片。2.楼主教程最上面的那个图片也是自己修改的吗?3.是否能针对双系统出一份存档备份和导出的教程,我试了很多次,都没有搞明白,非常感谢。
版主回覆:(03/31/2023 03:30:06 PM)
1. 是的,118bf92 是今年 3/21 的版本,支援 make 的新參數 DISABLE_SPLASH_SCREEN=1,我已經實測過,的確是把 LOGO 輪播的動畫關閉了,稍稍加快了 retro-go 的載入速度。之所以會把版號放入教學步驟的原因,是因為曾經在某個時期內,持續發生當時最新版出現編譯語法錯誤,導致無法編譯完成的問題。
2. 文章最上方第一張主圖,是用繪圖軟體合成的,素材來自網路,單純只是文章配圖的裝飾用途,而非 G&W 機器上真的能展示彩色復古主機圖。
3. 先前嘗試過,存檔備份和導出貌似與遊戲中文化衝突,所以我就沒寫這部分教程了。改天若成功的話,會再來更新補上這部分的教學。
“DISABLE_SPLASH_SCREEN=1,我已經實測過,的確是把 LOGO 輪播的動畫關閉了”这个是从原系统启动到自制系统时候,显现出来的很多机种快速切换的那个动画吗?我设置了=1,但是启动自制系统时候还是有这个画面,很奇怪了。
版主回覆:(04/01/2023 08:55:34 AM)
看一下這網址,並檢查相關的檔案,有沒有 DISABLE_SPLASH_SCREEN 這個參數
https://github.com/sylverb/game-and-watch-retro-go/commit/118bf929d4a3cf9228d2fb349a5c3c5d5d3c0a53
说起来奇怪,我在文件中也确实找到了DISABLE_SPLASH_SCREEN==0这一段了,我还特意试了DISABLE_SPLASH_SCREEN=1和DISABLE_SPLASH_SCREEN=0,结果切换到go的时候完全没有区别~还是很感谢了,这篇教程是我见过中最全面的了。现在最大的问题就是存档的备份和还原了,昨天测试的时候,加了一个游戏进去,好家伙,几天的存档白打了~!
版主回覆:(04/05/2023 10:31:11 AM)
當韌體的遊戲內容出現變化時,遊戲的相關設定包含存檔就可能出現遺失、重置的情況。
olderzeus在github回复:“存档是可以导出,但需要机器上刷机版本的elf那些个文件。
由于使用了中文名称,导出的文件名和导入的识别会出现异常,需要你自行查阅相关脚本进行调整。
scripts/saves_restore.sh 和 saves_backup.sh 文件脚本.”不知道老哥是否有相关的一些思路,谢谢
版主回覆:(04/05/2023 11:04:52 AM)
目前的研究心得分享如下….
1. retro-go 的韌體,須先把程式、遊戲/存檔/縮圖/作弊碼…等相關檔案編譯合併為 .elf 格式的文件檔案,經由 openocd 刷寫入 G&W 的 FlashRom 內韌體。而 elf 文件檔案就會包含每個遊戲的 rom 檔、縮圖、存檔紀錄、作弊碼….的 Flash 位址。
2. 遊戲存檔的匯出,saves_backup.sh 會先讀取 .elf 文件的資訊,取得遊戲的存檔 Flash 位址之後,經由 openocd 指定位址讀取的方式,連線到 G&W 設備擷取該 Flash 位址內的遊戲存檔內容。因此必須保證刷寫電腦上的 .elf 文件就是當初刷入 G&W 的那一個,這樣位址才會正確對應。
3. 遊戲中文化導致遊戲存檔失敗的原因,是因為 openocd 在取得遊戲存檔之後,試圖以中文名稱儲存在本機的系統而導致衝突錯誤,並產生長度 0 的亂碼文件名稱。
4. 若想要恢復遊戲存檔的匯出匯入,可以嘗試不要將遊戲名稱中文化,也就是 nes.json, pce.json, md.json…. 文件內容中不要使用中文。我試過「不中文化」的遊戲存檔匯出匯入是可行的。
5. 雙系統的遊戲存檔匯出匯入,匯出時一樣要加入 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 … 等和位址有關的編譯指令(最好是 make 下了哪些指令,saves_backup.sh 也要跟著有),否則會抓到錯誤的內容。
对了,关于启动画面的命令,我使用的是:“make GCC_PATH=/home/${USER}/gnw/xpack-arm-none-eabi-gcc-10.3.1-2.3/bin/ COVERFLOW=1 COMPRESS=lzma CODEPAGE=936 EXTFLASH_SIZE_MB=60 GNW_TARGET=${gnw_tg} EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 -j8 DISABLE_SPLASH_SCREEN=1 flash”,换的64MB的Flash
版主回覆:(04/05/2023 11:10:55 AM)
我的刷寫指令除了 CODEPAGE=950 其他都與您的全數相同(目前也升級至 64MB),為何 DISABLE_SPLASH_SCREEN 沒有作用我就無法理解了。其實停用 LOGO 輪播動畫,載入retro-go 速度,感覺上也不到一秒的差異。
請問燒錄fds進遊戲都是灰畫面,有放bios
版主回覆:(04/05/2023 11:20:11 AM)
在最早在 beta 版的時候我也遇到相同的問題,執行 fds 遊戲出現灰畫面,後來檢查後才發現作者當時提供 bios 的檔名資訊是錯的(當時寫 disksystem.rom 是錯的,現在作者已經改回來了)。
fds 遊戲詳細的作法如下,請逐一檢查看看:
— 遊戲副檔名 .fds,放到 roms\nes\ 目錄下
— BIOS 檔名 disksys.rom,放到 roms\nes_bios\ 目錄下
— disksys.rom 大小 8,192 byte, md5 值 ca30b50f880eb660a320674ed365ef7a
我一个群友也在玩这个GW刷机,他想整合一下LCD的老GW游戏,但是一直报错,您看是否知道是什么原因呢
gnw_zelda |——————–| 0/1 UnzipTraceback (most recent call last):
File "/usr/lib/python3.8/urllib/request.py", line 1354, in do_open
h.request(req.get_method(), req.selector, req.data, headers,
File "/usr/lib/python3.8/http/client.py", line 1256, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1302, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1251, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1011, in _send_output
self.send(msg)
File "/usr/lib/python3.8/http/client.py", line 951, in send
self.connect()
File "/usr/lib/python3.8/http/client.py", line 1418, in connect
super().connect()
File "/usr/lib/python3.8/http/client.py", line 922, in connect
self.sock = self._create_connection(
File "/usr/lib/python3.8/socket.py", line 808, in create_connection
raise err
File "/usr/lib/python3.8/socket.py", line 796, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused
版主回覆:(04/11/2023 02:22:38 PM)
ConnectionRefusedError 是網路出現錯誤,很可能是 Python 指令中某些需要下載套件的時候,發生無法下載的錯誤,在某個環節被拒絕了。據說中國大部分地區使用 Github 似乎不太順暢,若您的群友是居住在中國大陸,可能就是那個原因了。
我朋友把路由弄了一下可以访问就可以下载PY了,目前测试没有问题了。非常感谢!
我这边还想问一下:现在我使用的是64M Flash,正在使用双系统。如果我不想要原来的系统了,我可以换成单系统吗?就是在启动时候直接进入retro-go。等过了一段时间想继续用双系统的时候,还可以刷回双系统?这两个步骤是如何工作的?
版主回覆:(04/19/2023 10:34:54 AM)
64MB 可以直接刷單系統,刷寫 retro-go 的 make 指令中,修改 EXTFLASH_SIZE_MB 的數字為 64,並拿掉 EXTFLASH_OFFSET=4194304 這一串就行了,開機會直接進入 retro-go。(EXTFLASH_OFFSET=4194304 的意思是從 4MB 以後的 Flash 位址開始刷寫)
若要再改回雙系統,一樣也是步驟 6 的操作,各自把原廠 Patched 韌體和 retro-go 的韌體刷入(刷入 retro-go 時記得要把 EXTFLASH_OFFSET=4194304 放回去)。
你好,請問一下,在作雙系統時(已換32M),它會出現the adapter doesn’t support configuratble speed
版主回覆:(04/21/2023 09:48:47 AM)
我本人沒遇過這種情況,上網查了一下好像不是錯誤訊息,而是提示訊息,理論上可以不管它。
如果有同学usb的stlink不能用的话,试着升级一下stlink的固件
如果备份原始固件的时候说检测不到的话,试着按住电源键插电,再执行脚本,据说是某些廉价usb不支持复位功能…
版主回覆:(05/03/2023 09:39:07 AM)
感謝補充!
请问为什么export PATH=$PATH:/home/${USER}/gnw/xpack-arm-none-eabi-gcc-10.3.1-2.3/bin/ 这条指令键入后,在执行make flash 命令时依旧提示请使用GCC10.0或以上版本呢
版主回覆:(06/02/2023 12:26:32 PM)
抱歉不是很清楚問題在哪….試試看 export 把路徑順序改一下能否解決
export PATH=/home/${USER}/gnw/xpack-arm-none-eabi-gcc-10.3.1-2.3/bin/:$PATH
老哥啊,最近这个系统有没有更新啊,特别是存档的导入和导出部分,前阵子好像还看到有人做了GB的带时钟系统的模拟器,但是找不到呢。。,
版主回覆:(07/14/2023 12:05:22 AM)
這個專案有一段時間沒有關注了,retro-go 作者最近也少有更新(本來說好的新版 GB 模擬器從五月起也沒有下文),詳情不太清楚了,抱歉啊!
大神您好,我现在就是这种情况。
注意:經實測擴容至 64MB 之後,無法進行上面第 3 步驟第 5 個動作「# 5_還原成原始內容」,會出現無法刷寫的錯誤。
应该怎么操作呢?直接刷双系统?
版主回覆:(07/14/2023 06:48:11 PM)
您好!是的,擴容至 64MB 之後,直接刷雙系統,或是刷第三方韌體(retro-go)就行了。
第 3 步驟是解鎖流程,適用於購入後尚未擴容、計畫改機之前必須做的動作。除了解鎖G&W之外,並取得原始的出廠韌體檔案。並且「# 5_還原成原始內容」這個動作並不支援擴容至 64MB,會報錯。
如果真的想把出廠韌體寫入 64MB 擴容也是可以,必須使用「6. 安裝雙系統」中 make PATCH_PARAMS="–device=zelda" LARGE_FLASH=1 flash_stock 這個指令(flash_patched 是刷寫修改過的出場韌體,flash_stock 是刷入未修改過的出廠韌體)。不過這麼做一點意義都沒有,因為開機之後是原廠韌體運行,無法利用後方擴容的空間。
谢谢大神了
編譯第二區塊的指令,為步驟 4.3 的 make 參數中, EXTFLASH_SIZE_MB 值要扣除原廠韌體的容量,再加上兩個參數 EXTFLASH_OFFSET=[偏移量] INTFLASH_BANK=2 。其他的參數都和步驟 4.3 相同。….
不知道後來是否有改版,但我測試的結果不一樣;如果把容量設成60,再偏移4194304,那只剩下56MB 可以使用. 要設成64MB(實際容量) 才會成為60MB可以用.
版主回覆:(07/21/2023 10:33:48 AM)
BrianPugh/game-and-watch-patch 的 Github 範例內的確是這麼寫的(如下),我個人沒去注意是否出現變化。
# In this example, I’m assuming you have a 64MB flash chip (60 = 64 – 4)
make -j8 EXTFLASH_SIZE_MB=60 EXTFLASH_OFFSET=4194304 INTFLASH_BANK=2 flash
继续请教一下,我使用./scripts/saves_backup.shbuild/gw_retro_go.elf
./scripts/saves_backup.sh和./scripts/saves_backup.shbuild/gw_retro_go.elfGCC_PATH=/home/S{u
SER}/gnw/xpack-arm-none-eabi-qcc-10.3.1-2.3/bin/都会提示:“
• /scripts/saves backup.sh:行 26: arm-none-eabi-adb:未找到命令”这个是什么原因呢?谢谢
版主回覆:(07/31/2023 04:40:51 PM)
錯誤指的是操作環境中沒有 "arm-none-eabi-adb" 這個程序。這個程序照道理應該在本文步驟 2 下載的 ToolChain 裡面,並且我查了一下 saves_backup.sh 源碼,它的指令應該是 arm-none-eabi-gdb 。本文步驟 2 下載的 ToolChain 裡面有 "arm-none-eabi-gdb" 並沒有 "arm-none-eabi-adb",所以要請您自行核對是哪裡出了問題。
弱弱的問一下,請問ROM目錄下的遊戲是要自己搜尋下載嗎?謝謝!
版主回覆:(09/20/2023 03:45:37 PM)
當然啊~畢竟遊戲那麼多,要全部放進任何一台遊戲機是不可能的,所以多半是挑選自己喜歡的遊戲。 rom 還有版權問題,得自己想辦法去取得。不過取得 Rom 也不難,通常只要把遊戲名稱加關鍵字 rom download 拿去 Google 就有了。
我以為我能一路通行結果還是遇到問題了,請教大神,我在6.安裝雙系統執行 make PATCH_PARAMS="–device=${gnw_tg}" LARGE_FLASH=1 flash_patched後執行結果如下:
Binary Patching Complete!
Internal Firmware Used: 121320 bytes
Free: 9752 bytes
Compressed Memory Used: 0 bytes
Free: 0 bytes
External Firmware Used: 4194304 bytes
/opt/openocd-git/bin/openocd -f openocd/interface_"rpi".cfg \
-c "init; halt;" \
-c "program build/internal_flash_patched.bin 0x08000000 "";" \
-c "reset; exit;"
Open On-Chip Debugger 0.12.0+dev-00314-g51d4996c5-dirty (2023-09-16-21:27)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
DEPRECATED! use ‘sysfsgpio swd_nums’ not ‘sysfsgpio_swd_nums’
DEPRECATED! use ‘sysfsgpio srst_num’ not ‘sysfsgpio_srst_num’
none separate
Info : SysfsGPIO JTAG/SWD bitbang driver
Info : Note: The adapter "sysfsgpio" doesn’t support configurable speed
Error: Error connecting DP: cannot read IDR
make: *** [Makefile:274:flash_patched_int] 錯誤 1
請大神幫忙看看是哪裡錯了,感謝您!
版主回覆:(09/22/2023 11:49:40 PM)
Patched 韌體的部分看起來完成了,是後來 openocd 這個部分出錯了,連接設備出現錯誤。
可能是沒連接好,或 ST-LINK 驅動的設定錯了,或是其他可能。
https://www.cnblogs.com/zhouxingxing7920/p/17462521.html
感謝版大費心費力的幫忙解答,問題若得到解決再上來跟大家分享!
执行make COVERFLOW=1 CHEAT_CODES=1 COMPRESS=lzma CODEPAGE=936 EXTFLASH_SIZE_MB=4 OVERCLOCKING_LEVEL=2 GNW_TARGET=zelda后报如下错误,请指教,谢谢!
Entering ‘retro-go-stm32’
[ BASH ] Checking for updated roms
[ CC core ] main.c
Core/Src/main.c: In function ‘MX_OCTOSPI1_Init’:
Core/Src/main.c:968:15: error: ‘OSPI_InitTypeDef’ has no member named ‘ClkChipSelectHighTime’; did you mean ‘ChipSelectHighTime’?
968 | hospi1.Init.ClkChipSelectHighTime = 0;
| ^~~~~~~~~~~~~~~~~~~~~
| ChipSelectHighTime
make: *** [Makefile.common:652: build/core/main.o] Error 1
版主回覆:(10/12/2023 03:13:35 PM)
看起來像是 gcc 錯誤….「2.2 下載並安裝設定 ToolChain」的步驟有確實嗎? 輸入 arm-none-eabi- 之後按 Tab 鍵,有跑出 arm-none-eabi-gdb 與相關項目嗎?
感谢贴主的详细教程,已经从中构建环境,并且成功刷机,但是在打包gw的约54款游戏的时候却提示楼上一样的网络错误,折腾很多天了 还是不能成功,不知道贴主是否愿意分享一下gw 成功转档的文件,再次感谢贴主分享
版主回覆:(10/19/2023 07:01:33 PM)
更新:lzma 格式,幾天後失效,解壓密碼game&watch
http://u.pc.cd/GzhrtalK
urllib.error.URLError: <urlopen error [Errno 111] Connection refused>
gnw_lboat |——————–| 0/1 UnzipTraceback (most recent call last):
File "/usr/lib/python3.8/urllib/request.py", line 1354, in do_open
h.request(req.get_method(), req.selector, req.data, headers,
File "/usr/lib/python3.8/http/client.py", line 1256, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1302, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1251, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1011, in _send_output
self.send(msg)
File "/usr/lib/python3.8/http/client.py", line 951, in send
self.connect()
File "/usr/lib/python3.8/http/client.py", line 1418, in connect
super().connect()
File "/usr/lib/python3.8/http/client.py", line 922, in connect
self.sock = self._create_connection(
File "/usr/lib/python3.8/socket.py", line 808, in create_connection
raise err
File "/usr/lib/python3.8/socket.py", line 796, in create_connection
sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "shrink_it.py", line 153, in <module>
rom_parser.set_parameters(rom_name, rom.mame_rom_dir)
File "/home/zhiming362/LCD-Game-Shrinker/rom_parser.py", line 197, in set_parameters
urllib.request.urlretrieve(url_tested, mame_driver_file)
File "/usr/lib/python3.8/urllib/request.py", line 247, in urlretrieve
with contextlib.closing(urlopen(url, data)) as fp:
File "/usr/lib/python3.8/urllib/request.py", line 222, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.8/urllib/request.py", line 525, in open
response = self._open(req, data)
File "/usr/lib/python3.8/urllib/request.py", line 542, in _open
result = self._call_chain(self.handle_open, protocol, protocol +
File "/usr/lib/python3.8/urllib/request.py", line 502, in _call_chain
result = func(*args)
File "/usr/lib/python3.8/urllib/request.py", line 1397, in https_open
return self.do_open(http.client.HTTPSConnection, req,
File "/usr/lib/python3.8/urllib/request.py", line 1357, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [Errno 111] Connection refused>
另外贴上报错内容,如果不方便上传rom,贴主能否帮我看看能解决吗
版主回覆:(10/19/2023 07:01:18 PM)
抱歉這兩天才注意到有新的留言,網路問題的原因如同上面所說的,至於要怎麼解決我是真的不了解(網路環境不同)。全套 gw 檔案我晚上回家找找。
更新:lzma 格式,幾天後失效,解壓密碼game&watch
http://u.pc.cd/GzhrtalK
感谢贴主的分享,通过分享的文件已经成功刷入机内,至于gw原始的文档按照你的教程指向链接已经下载好游戏和素材,就不必麻烦您上传了,总之非常感谢您的帮助
請問有機會播放mp4影片嗎?
版主回覆:(01/17/2024 03:59:14 PM)
目前還沒看過有人做這個,可能還不行吧?
這裡有一些惡搞 G&W 的客製化韌體,有撥放 AVI 的,我沒試過就是了。
https://www.schuerewegen.tk/gnw/
又见大佬更新,咨询一下你最后说“5.「薩爾達傳說:眾神的三角神力」也支援其他語系的 ROM 檔。各語系的 ROM 檔 SHA-1 可參考 util.py 原始碼。”这个意思是还能换其他语言的ROM?比如说中文?
版主回覆:(01/19/2024 12:59:52 PM)
util.py 裡面的語系並不包括中文版,我的估計是這款遊戲當初官方就有發行不同語系的版本(美、德、法、西班牙…),當初並未發行中文版。現在看到的中文版 ROM 是從美版修改的,並非官方發行的版本。
我有嘗試把中文版 ROM 偽裝成英文版成功刷入G&W,沒想到在 G&W 上竟然恢復成英文版的 ROM。
至於「超級瑪利歐世界」也有中文版的 ROM,我將它偽裝成英文版之後則是無法成功刷入,所以這兩款超任遊戲的中文版我還不知道如何讓它在 G&W 上運行。
对了大佬,我看你最后面,关于刷sfc塞尔的那部分文字有一段被删掉了,是什么原因呀,那段关于软件升级的部分是必须要做的吗?谢谢
版主回覆:(01/22/2024 04:40:41 PM)
新版 retro-go 已經把支援 sfc 兩款遊戲的源碼整併進來,所以標示刪除的那一段文字是過時資訊,當成留個紀錄罷了。
在刪除的內容中提到必須升級 gcc 至 12 版,是因為刪除內容中的做法,gcc 10 (舊)版會造成編譯錯誤而失敗。
而新版 retro-go 將 sfc 遊戲源碼整併進來之後,似乎有一併做過修正,gcc 10 (舊)版、12版、最新13版全都能編譯成功,所以就沒提到必須升級 gcc 了。
原来如此,那我的retro-go是不是更新一下也就可以了呢?能方便说一下更新命令吗?谢谢
版主回覆:(01/23/2024 11:00:21 AM)
更新的指令應該是這樣
cd ~/gnw/game-and-watch-retro-go
git pull
git submodule update –init –recursive
不過,因為我會手動修改某些 retro-go 源代碼內容,可能導致 git pull 失敗,
所以我的習慣是把 roms 目錄備份之後,重新操作一次步驟 4.1 ,再把備份的 roms 覆蓋回去。
更新的指令應該是這樣
cd ~/gnw/game-and-watch-retro-go
git pull
git submodule update –init –recursive
请教一下,我试了一下这个命令,前两天都是正常的,第二条提示有很多分支,看不太懂,第三条命令执行后没有反应,不知道是什么原因呢?
版主回覆:(02/19/2024 05:41:12 PM)
第二條指令在遠端源碼發生新的變動時,就會顯示訊息。第三條指令是一併更相依的子套件,如果子套件沒有更新,則不會有任何訊息產生。
我審視了一下自己寫的指令,由於下了 check out xxxxxxx 指令,所以 git pull 有可能會失敗。如果要讓本地端的源碼維持與遠端源碼更新一致時,那麼要在指令拿掉 check out xxxxxxx 這一行
parallels@ubuntu-Linux-22-04-02-desktop:~/gnw/game-and-watch-backup$ -/3_backup_internal_flash.sh ${ADAPTER} ${gn
w_tg}
Validating IT™ dump…
This step will overwrite the contents of the SPI flash chip that we backed up in step 2.
It will be restored in step 5. Continue? (y/N)
Generating encrypted flash image from backed up data…
Programming payload to SPI flash…
(core dumped) ${OPENOCD} -f "openocd/target
00000 verify;" -c "exit;" > logs/3_openocd. log 2>81
Writing payload to SPI flash failed. Check debug connection and try again. parallels@ubuntu-linux-22-04-02-desktop:~/anw/game-and-watch-backups$
請問備份時,解鎖前第3部份失敗可以怎樣辦,原裝未改記憶的Zelda!
版主回覆:(03/22/2024 05:32:29 PM)
文章中提到第三步失敗的話,G&W重開機還是會回到時鐘畫面。如果前兩個步驟有正常產生檔案的話,可以重複進行第三步,直到成功為止。
從指令看起來,你用的是 Parallels Desktop 的 Linux 模擬機,Host 主機是 macOS 嗎?我之前試過,這個組合無法刷寫 G&W 韌體,它在 ST Link 重導至虛擬機內部時很容易出錯,是改用 VMWare Fusion 才能刷寫成功。而為了保險起見,我在舊的黑蘋果二號機(i7-3770)特別佈署一套 Ubuntu 20.04 專門用來刷寫 G&W ,捨棄虛擬機的刷寫方式。
對!! 是M2 macOS ARM, 第一及第二步是可以,第三步這個錯誤試了一百次都不成,現在才有空再試,拿一個桌機下載安裝Ubuntu試試看
例行来老哥网站看看GW有没有更新新内容:)
版主回覆:(04/29/2024 10:12:22 AM)
感謝點閱,
我有注意到 Sylver Bruneau 的 retro-go 專案項目一直都有更新,
而且變動還不小,連工具都換了,
我估計可能是加入擴充記憶卡的功能,
這些變動目前還沒合併到主分支上,
未來 G&W 新增哪些玩法,現在還不好說,
但肯定是有的。
老哥晚上好,和你请教两个问题:1.新出的windows下用的gnwmanager用过吗?有没有机会也出个教程?https://github.com/BrianPugh/gnwmanager ? 2.我去问过作者有没有可能出WS黑白机器的模拟器,作者回复:“I think my porting attempt is stored in a branch of my repository, anyone can take it and finish it by removing color support and finishing sound support. I personally prefer to see a full featured WS/SWC emulator later but I understand people would love to be able to play not color games before it happens”我对github不熟,这种分支能不能直接用?添加到现在的模拟器里面呢?谢谢
版主回覆:(11/04/2024 10:34:19 AM)
抱歉您說的問題我都沒有涉獵,所以不能很精確地回答。一般來說 Github 要使用分支的話,就是使用指令 git checkout <分支名稱> ,根據作者的說法是他有製作了支援的分支但並沒有完成,如果要用的話,切換到該分支之後,需要再做一些修改。意思是要懂一些編程技術才能操作,因此不能直接拿來用,也不適合添加(應該說是合併)到當前的模擬器。
問一下 現在mario款板面選單
可以變中文嗎?
好像說只有z款才能中文
昨天我刷完z款 解鎖&還原成功
就能直接換記憶體嗎?
還是要解鎖時換&還是都行?
只要有解鎖過就都行嗎?
是用 rpi 400刷的
版主回覆:(10/07/2024 09:36:10 AM)
1. Mario 款能改成中文嗎?理論上可以,但我沒有實際試過。NewUI 中文源碼並沒有限定 Zelda 款。
2. 解鎖還原完成之後,就可以直接關電源拆機換記憶體了。解鎖過就行了,
換完之後,機器是完全不能開機的,這時候直接刷雙系統或是 retro-go 都可以。
了解—-謝謝版大回覆
昨天也解鎖Mario款
看明天有沒時間換
64m記憶體了
roms的轉換好像比較麻煩@@!!!
看著版大文章還再研究中@@!!!
版主回覆:(10/11/2024 02:31:18 PM)
加油,等您好消息
感謝版大鼓勵
希望一次就給過@@!!!
老哥,最近看有人测试那种TF卡拷贝游戏进去的那种,您这边有了解过吗?谢谢
版主回覆:(11/04/2024 04:56:37 PM)
retro-go 作者 sylverb 在 patreon 上有新消息,目前程式專案還在測試中,硬體上也要實施物理性大改動,從原來的 Flash 或是 CPU 拉出引腳接入 TF 卡,這工程看起來太浩大了,我不打算跟進。任天堂似乎不再繼續生產,市售量也越來越少,玩壞一台就少一台,擴容已經是最大極限,64MB 也夠我玩很久,重刷也不麻煩,不太想去折騰 TF 方案。
确实64M够用很久了,但是换ROM和导存档还是相对来说麻烦一点。老任的这批塞尔达我感觉没停产啊,市面上越来越多,价格越来越便宜,在大陆通过拼多多,不到120就能包邮买到
正在重建相依關係… 完成
「正在讀取狀態資料… 完成
libftdi1-2 已是最新版本(1.5-5build3)。
libusb-0.1-4 已是最新版本(2:0.1.12-32build3)。
libusb-0.1-4 被設定為手動安裝。
pkg-config 已是最新版本(0.29.2-1ubuntu3)。
pkg-config 被設定為手動安裝。
libftdi1 已是最新版本(0.20-4ubuntu1)。
git 已是最新版本(1:2.34.1-1ubuntu1.11)。
libusb-1.0-0 已是最新版本(2:1.0.25-1ubuntu2)。
libusb-1.0-0 被設定為手動安裝。
我
問
有些套件無法安裝。這可能意謂著您的要求難以解決,或是若您使用的是 unstable 發行版,可能有些必要的套件尚未建立,或是被移出 Incoming了。
【以下的資訊或許有助於解決當前的情況:
下列的套件有未滿足的相依關係:
dpkg-dev: 相依關係: libdpkg-perl (= 1.21.1ubuntu2.1) 但1.21.1ubuntu2.3 卻將被
安裝
推薦: libalgorithm-merge-perl 但它卻將不會被安裝
libusb-1.0-0-dev: 相依關係: libusb-1.0-0 (= 2:1.0.25-1ubuntu1) 但2:1.0.25-1ub
untu2 卻將被安裝
推薦: libusb-1.0-doc 但它卻將不會被安裝
「大約需要幾分鐘到十幾分鐘。指令如下:
ocd-git-builder
42
E:無法修正問題,您保留(hold)了損毀的套件。
請問為什麼會這樣?有重裝系統
版主回覆:(12/11/2024 05:22:38 PM)
先執行 sudo apt –fix broken install 試試看
23.04.01也能刷嗎
版主回覆:(12/13/2024 09:48:17 AM)
理論上也能
【以下的資訊或許有助於解決當前的情況:
下列的套件有未滿足的相依關係:
dpkg-dev: 相依關係: libdpkg-perl (= 1.21.1ubuntu2.1) 但1.21.1ubuntu2.3 卻將被
安裝
推薦: libalgorithm-merge-perl 但它卻將不會被安裝
libusb-1.0-0-dev: 相依關係: libusb-1.0-0 (= 2:1.0.25-1ubuntu1) 但2:1.0.25-1ub
untu2 卻將被安裝
推薦: libusb-1.0-doc 但它卻將不會被安裝
「大約需要幾分鐘到十幾分鐘。指令如下:
ocd-git-builder
42
E:無法修正問題,您保留(hold)了損毀的套件。
請問為什麼會這樣?有重裝系統
先執行 sudo apt –fix broken install 試試看
我試了不行
版主回覆:(12/13/2024 09:57:51 AM)
請依照文章所給定的 Linux 版本操作看看。
我試過 Ubuntu 20, 22, 24 以及 Debian 11/12 都沒甚麼問題。
裝24還是出錯,不知道哪出錯
CC amstrad CPC ] save_amstrad.c
[CC amstrad CPC ] amstrad_catalog.c
[ CC amstrad CPC] amstrad_format.c
[CC amstrad CPC] amstrad_loader.c
[CC amstrad CPC] amstrad_video8bpp.c
[LD] gw_retro_go.elf
External flash usage
Capacity:
3964928 Bytes (3.781 MB)
Usage:
3158980 Bytes (3.013 MB)
Free:
805948 Bytes (0.769 MB)
[BIN] gw_retro_go_intflash.bin
/opt/openocd-git/bin/openocd -f scripts/interface_stlink.cfg -c "program build/g
w_retro_go_intflash.bin 0x08000000 verify reset exit"
I
Open On-Chip Debugger 0.12.0+dev-00801-9133dd9d66-dirty (2024-12-13-16:02)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Debug adapter doesn’t support ‘hla_swd’ transport
make[1]: *** [Makefile.common:932: flash_intflash] 錯誤 1
make[1]:離開目錄「/home/user/gnw/game-and-watch-retro-go」
make: *** [Makefile.common:950: flash] 錯誤 2
user@user-System-Product-Name:~/gnw/game-and-watch-retro-gos這是什麼出錯
版主回覆:(12/16/2024 08:58:51 AM)
韌體編譯成功但 openocd 寫入失敗。可能是使用的寫錄設備不支援。
如果是設備問題?要怎麼處理
版主回覆:(12/16/2024 04:55:44 PM)
更換寫錄的設備,例如我的文章內遇到的失敗經驗,最初買到一支不能用的 ST-LINK,各種嘗試刷寫韌體都失敗,也不能確認是故障還是其他原因,然而從另一個來源購買另一款就可以用了。
XPSR: 0x61000000 pc: 0x081012ca
msp: 0x2001fe50
Loading image into RAM
851968 bytes written at address 0x24025800
downloaded 851968 bytes in 13.778869s (60.382 KiB/s)
65 bytes written at address 0x20000658
downloaded 65 bytes in 0.0019525 (32.519 KiB/s)
Starting flash process
Please see the LCD for interactive status.
State: FLASHAPP_CHECK_HASH_RAM
Hash mismatch in FLASH. Flashing failed.
Flashing chunk 14 failed… power cycle unit and retry? (y/n)
y
SD
Retry count 2/10
State: FLASHAPP_ERROR
State: FLASHAPP_ERROR
State: FLASHAPP_ERROR
請問是什麼出問題
版主回覆:(12/17/2024 01:34:31 AM)
刷寫失敗,之前我有遇過,印象中有兩個原因:1. 刷 64MB 時使用了 EXTFLASH_FORCE_SPI=1 參數,這個參數必須拿掉。2. Flash 玩壞,換一顆就好了。
以上是個人經驗,可能有第三種以上的原因。
user@user-System-Product-Name: ~/LCD-Game-Shrinker
Q
X
←
python3 shrink_it.py
gnw_mickdon
—10/1 UnzipTraceback (most recent
call last):
Me
影片線
File "/home/user/LCD-Game-Shrinker/shrink_it.py", line 153, in <module> rom_parser.set_parameters(rom_name, rom.mame_rom_dir)
shri
File "/home/user/LCD-Game-Shrinker/rom_parser.py", line 548, in set_parameters importlib.import_module(module_name)
-/LCD-G
File "/usr/lib/python3.10/importlib/_init_.py", line 126, in import_module return _bootstrap._gcd_import (name [level:], package, level)
pressed with Z
49
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 883, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/home/user/LCD-Game-Shrinker/custom/gnw_mickdon.py", line 97, in <module
set_single_screen()
File "/home/user/LCD-Game-Shrinker/custom/dual2single_screen.py", line 144, in set_single_screen
x, y = rom.background_topleft_xy AttributeError: module ‘rom_config’ has no attribute ‘background_topleft_xy’. Di
d you mean: ‘background_top_file’?
請問要轉gw 出現這個錯誤
版主回覆:(01/02/2025 11:47:44 AM)
套件的版本不相容而出現語法錯誤。可以查看先前的留言中有我轉好的 gw 版本,不用自己折疼了。
在youtube看到能用記憶卡玩,不知道現在有更新嗎
版主回覆:(01/02/2025 11:42:15 AM)
有,可以到這裡查看 https://www.patreon.com/c/sylverb/posts,目前還在開發中。
我個人是不打算跟進了,因為需購買專用的 SD 套件,改機的幅度還不小。
https://forums.atariage.com/topic/282578-two-new-homebrew-lcd-games-game-watch/?fbclid=IwZXh0bgNhZW0CMTEAAR0SqKuKRNepo-p5eyCDVyugjw0uJwSQJED72WcjC8wapmbCqSa4GpM_M78_aem_u9brAWPdRIgIxSU0k8697w
網路看到這2個gw,都沒辦法轉gw是檔案不對嗎?
RWData Table
0x00018390: 0x00000171
0x00002388
0x0000029C
0x2000A800
0x000183AO:
0x00000179
0x0001B3A4:
0xFFFFFCF9
Binary Patching Complete!
Internal Firmware Used: 121320 bytes
SSD
Free: 9752 bytes
Compressed Memory Used: 0 bytes
Free: 0 bytes
SSD
External Firmware Used: 4194304 bytes
SSD
gnwmanager flash ext build/external_flash_patched.bin \
flash bank1 build/internal_flash_patched.bin
start bank1
I
Error communicating with device (Unable to autodetect & connect to debugging probe.). Is it ON and connected?
user@user-System-Product-Name:~/gnw/game-and-watch-patch$
請問有5個燒錄工具都燒錄不進去,上星期還可以燒錄,是哪有問題
版主回覆:(01/06/2025 04:27:16 PM)
字面上看來是刷寫時溝通出了問題,線索不足,如果之前有成功過,那麼可能是接觸不良之類的情況。先前看過有人分享,杜邦線也有可能挖坑。
如果是杜邦線要怎麼用才能燒錄
版主回覆:(01/07/2025 12:01:11 PM)
更換品質好一點的線材,更極端的做法是悍死
5個都不能刷,是不是仿的
版主回覆:(01/09/2025 12:09:56 PM)
市面上買得到的刷寫工具大多是相容的(原廠的很貴),品質就不一定了,如文中所言我就買到不能用的。
不過之前有成功過的話,應該是有能用的,要考慮其他因素。
如果刷寫工具始終不能用的話,可以改考慮樹莓派。樹莓派都是正廠,只需三條杜邦線就能用,不會有工具不相容的問題,不過杜邦線也要注意避坑就是了。
ubuntu所有燒錄設備和杜邦線都試看了還是不行,是環境設備的問題嗎
版主回覆:(01/18/2025 10:53:39 PM)
我使用的作業系統版本是文中提到的那些,遇到不能燒錄的問題就是 ST-LINK 、杜邦線、Flash 晶片損毀這三種,如果三個都換過還不能燒錄,我就真的不知道是怎麼回事了,
如果是晶片損毀怎麼辦
版主回覆:(01/19/2025 05:24:32 PM)
晶片都壞了,只能再買一個好的 Flash 晶片
checking for realpath… yes
checking whether to build a release… no
checking whether to build Doxygen as HTML… yes
checking whether to build Doxygen as PDF… no
checking whether to enable verbose USB I/O messages… no
checking whether to enable verbose USB communication messages… no
checking whether to enable malloc free space logging… no
checking for jimtcl >= 0.79… no
checking for jim.h… no
configure: error: jimtcl is required but not found via pkg-config and system includes
make[1]: *** [Makefile:5:all] 錯誤 1
make[1]: 離開目錄「/home/user/ubuntu-openocd-git-builder/openocd-git」
dh_auto_build: error: make -j2 returned exit code 2
make: *** [debian/rules:4:build] 錯誤 255
dpkg-buildpackage: 錯誤: debian/rules build subprocess returned exit status 2
可以幫忙確認一下為甚麼openocd的安裝到一半都會出錯,現在一直卡在這邊
版主回覆:(02/03/2025 04:11:06 PM)
剛剛踹了一下,真的會出錯,本來是好好的。
看來是不知什麼原因,openocd 改了源碼,現在編譯 openocd 時出錯,說是少了 jimtcl 套件。
有一種比較簡單的做法是先安裝 gnwmanager ,
再透過 gnwmanager 安裝 openocd,就不用編譯 openocd 了。
sudo pip3 install gnwmanager
sudo gnwmanager install openocd
卡在openocd 出錯不能安裝,有什麼辦法解決
版主回覆:(02/03/2025 04:53:02 PM)
的確如此,編譯源碼安裝的方式壞掉了。剛看了一下,該作者已經把專案封存,看來這個問題已經不會修復了。
可以改用 gnwmanager 安裝 openocd。做法是:
sudo pip3 install gnwmanager
sudo gnwmanager install openocd
安裝完之後,openocd 的路徑會變成 /usr/bin/openocd
所以上面提到的 export OPENOCD="/opt/openocd-git/bin/openocd" 拿掉就行了
)
Requirement already satisfied: rich<14.0.0,>=13.8.1 in /usr/local/lib/python3.10/dist-packages (from gnwmana .9.4)
Requirement already satisfied: autoregistry<2.0.0,>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from g г) (1.1.2)
Requirement already satisfied: psutil<6.0.0,>=5.9.6 in /usr/local/lib/python3.10/dist-packages (from gnwmana 9.8)
Requirement already satisfied: rich-rst<2.0.0,>=1.3.1 in /usr/local/lib/python3.10/dist-packages (from cycla 0,>=2.9.9->gnwmanager) (1.3.1)
Requirement already satisfied: docstring-parser>=0.15 in /usr/local/lib/python3.10/dist-packages (from cyclo 0,>=2.9.9->gnwmanager) (0.16) US
Requirement already satisfied: attrs>=23.1.0 in /usr/local/lib/python3.10/dist-packages (from cyclopts<3.0.6 ->gnwmanager) (25.1.0)
Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich<1 13.8.1->gnwmanager) (3.0.0) Led ко-1t-ру-2
/pythonsto
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich >=13.8.1->gnwmanager) (2.19.1)
Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2 ch<14.0.0,>=13.8.1->gnwmanager) (0.1.2)
Requirement already satisfied: docutils in /usr/local/lib/python3.10/dist-packages (from rich-rst<2.0.0,>=1.
lopts<3.0.0,>=2.9.9->gnwmanager) (0.21.2)
WARNING: Running pip as the ‘root’ user can result in broken permissions and conflicting behaviour with the ackage manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
安裝完變這樣
版主回覆:(02/05/2025 10:19:11 AM)
只是警告,建議你不要用管理權限安裝。沒有錯誤的話可以不理。
環境參數寫入 ~/.bashrc是不是要移除openocd 路徑 ?
版主回覆:(02/05/2025 10:15:56 AM)
gnwmanager 會動搜尋系統中的可用 openocd,透過 gnwmanager 安裝 openocd 的話,export OPENOCD="/opt/openocd-git/bin/openocd" 可以移除,沒移除其實也沒差,gnwmanager 會自己去抓正確的路徑。
eback (most recent call last):
_e "/home/user/.local/bin/gnwmanager", line 8, in <module>
sys.exit(run_app())
Le "/home/user/.local/share/pipx/venvs/gnwmanager/lib/python3.10/site-packag wmanager/cli/main.py", line 261, in run_app
app.meta()
Le "/home/user/.local/share/pipx/venvs/gnwmanager/lib/python3.10/site-packag yclopts/core.py", line 903, in _ call_
return command(*bound.args, **bound.kwargs)
Le "/home/user/.local/share/pipx/venvs/gnwmanager/lib/python3.10/site-packag
wmanager/cli/main.py", line 232, in main Command(*bound.args, **bound.kwargs, **additional_kwargs)
Le "/home/user/.local/share/pipx/venvs/gnwmanager/lib/python3.10/site-packag wmanager/cli/_flash.py", line 38, in flash
gnw.start_gnwmanager()
le "/home/user/.local/share/pipx/venvs/gnwmanager/lib/python3.10/site-packag
nwmanager/gnw.py", line 640, in start_gnwmanager
self.wait_for_idle()
le "/home/user/.local/share/pipx/venvs/gnwmanager/lib/python3.10/site-packag nwmanager/gnw.py", line 181, in wait_for_idle raise TimeoutError("wait_for_idle") coutError: wait_for_idle
請問這是什麼原因,謝謝你🙏
版主回覆:(02/06/2025 11:03:10 AM)
看起來是等待裝置閒置時發生逾時錯誤,不過我沒遇過這種問題,所以不知道怎麼會這樣,抱歉