你能想到嗎,一臺23年前的遊戲機居然又又又被破解了,還有這種事情?而且成本不要1000,僅僅只要20塊錢左右?你要是有這東西再穿越回去,絕對要上CCTV的
本次要說的這個方案,它推出已經兩年了,但是我在看了之後我感覺就是大為震驚,什麼,居然這麼簡單?什麼,居然這麼便宜?甚至它的源代碼梳理一下之後,都簡約到讓我覺得驚呆的程度,最關鍵還是實現結果,比如,SD卡的理論支持容量居然達到了2TB!
並且,它還直接替代了昂貴的早期破解方案,從最終的效果看幾乎就是完美,遊戲流暢,加載迅速,實話說就是要啥有啥。
所以,這到底是怎麼辦到的?
1.NGC是個啥
我們先來簡單介紹一下NGC, NGC是任天堂(Nintendo)所開發的家用遊戲機,發售時間在2001年,中文區和日本通常縮寫為“NGC”,而歐美地區則常常稱呼為為“GCN”或者GameCube,是任天堂首次正式使用光盤作為載體的遊戲機 ,NGC的軟件載體為特製8cm DVD,單碟最高容量可達1.8GB
NGC在機能上強於當時的索尼PS2,並且價格也與PS2相當,但是,因為遊戲陣容相對薄弱,這導致NGC的市場表現沒有任天堂預期那麼好,但這個也只是任爹覺得它不行,實際上截至停產時,NGC共在全球售出2174萬臺,所以也是覆蓋面很廣,很有名的產品了。
接著我們來回顧一下之前的一些方法,How to Mod a GameCube
2.以前怎麼HACK
在本次要說的方法出現之前,我們先來回顧一下早些時候的方案。
第1種方法是最為經典的,這個方法就是使用光驅直讀芯片。
光驅直讀芯片是一個焊接在主板上的模塊,這個模塊有著原理簡單,成本低廉並且使用方便的特點,比如NGC用的直讀芯片XENO GC,也就15塊錢,本體是一塊8位的MCU ,ATMEGA8A
直讀破解在PS1,SS,PS2等經典機型上面都有大面積列裝過。只要把它裝上之後,不管你是什麼機型,都可以直接讀取遊戲光盤,甚至跨區也不是問題。
直讀芯片方案的常見原理是,遊戲光盤數據在最開頭的位置會有一段校驗數據,這個校驗如果沒有成功的話,就會使得遊戲不能運行。那麼方法很簡單,我們只要在任何光盤加載之前,讓系統先校驗一遍這個數據就行了,而控制加載校驗數據,以及校驗數據的來源就是直讀芯片。
第2種方法是光驅模擬器,直接把遊戲數據轉成光盤數據流,這樣就不需要NGC有個能用的光頭和光驅來加載引導盤。這個就是GCLoader的基本原理,但是這個方案比較複雜,而且成本也比較難進行一個控制,主控使用的是xilinx的FPGA
這裡使用的spartan6芯片停產+本體昂貴,所以GCLoader原裝的價格基本都炒到來上千
第3種方法建立在前兩者上面,需要先用引導盤——通常是swiss這個工具,來實現引導啟動,然後再通過SD卡轉記憶卡,或者SD卡轉SP插槽,來實現讀取SD卡上面的遊戲鏡像。
3.現在的方法
在述說原理之前,我們先來實踐一下現在的方法,看看到底能不能成功。因為這機器就算是放在懷舊裡面也是屬於小眾機型,沒啥原因就是PS和PS2實在太成功,很多人家裡都沒買過這個,因此中文相關的內容說實話並不多。
主要準備的材料:
SD卡和SD轉存儲卡
樹莓派Pico(國產翻版也可)
一些引線
任天堂梅花螺絲的專用螺絲刀
文件包(我大概會放在文章末尾)
3.1燒寫Pico
首先我們先來做燒寫操作,這裡你需要上github(https://github.com/webhdx/PicoBoot/releases)下載由Maciej Kobus發明的picoboot的最新版本,或者直接使用我的文件包內文件。
這裡我從箱子裡翻出來一個做過簡單改裝的樹莓派Pico,不影響最終效果
你需要在插線之前,按住上面BOOTSEL按鈕,之後再插線
當連接到電腦上後,會出現一個盤符
把文件包內的picoboot.uf2拖進盤符,隨後盤消失
等到後面亮起綠燈就是成功了。
3.2 SD卡的準備
你可以使用SD2SP2也可以和我一樣使用SD卡轉記憶卡,不管是怎麼樣都可以使用,最大支持2TB的SD卡,但是你需要先格式化為FAT32格式,這裡我們使用diskgenius來進行
選擇格式化分區,文件系統FAT32
Sd卡核心還是ipl.dol文件,其他都不重要,這個文件本體是swiss引導程序的dol格式,下圖是沒有改名前
如果你有遊戲鏡像,最好是使用Nkit裡面的NKit Processing App轉換為ISO格式來提供最大兼容性,當然GCM格式也同樣可以
3.3機器的拆解
接著就是拆機器,沒有非常需要詳解的地方,拆掉你看到的所有螺絲就可以
這裡要感慨下當年NGC做工之強大,螺絲數量堪比一些醫用和軍工電子設備
在看到散熱片後,卸掉散熱片上面的螺絲,拆散熱片可能會面對黏的太緊的問題,我建議是左右扭動再卸載
接著我們開始飛線,連線圖以PicoBoot官方為準,這裡分了兩個機型DOL-001和DOL-101。
這裡有兩個方案,一個是使用這種24AWG尺寸的跳線,比較方便進行連接
從背面跳到正面電路,是通過犧牲一個散熱器孔洞來完成
第二個方案是使用比較細的飛線,這可以有效的減少你理線的麻煩。
樹莓派Pico我們放置在底座插槽部分,先臨時使用泡沫膠固定方便測試,因為底部有IO口絲印,所以朝上。
紅圈部分要注意,是使用一坨焊錫連接兩個引腳
不管用的是哪個方法,在完成連線之後都需要先測試兩端有沒有真的導通再合蓋
搞的差不多後我們可以先插一些必要的部分上去,光驅必須要裝不然開機會出錯。
在沒插SD卡之前先開機看看能不能正常跑,正常來說,和先前是沒有任何差別的
插上SD卡後,開機就會自動進入到swiss引導,如果沒有,檢查線路連接和SD卡的格式
沒啥問題就可以裝回了
這邊我順帶拆換了自帶的紐扣電池
樹莓派使用一個3D打印底座來安裝
最後測試,能正常的運行ROM,這個方案確實有效並且它的成功率也是非常之高。熟練一下幾乎就是一次成功。
4.這個方法的原理
和之前crack任天堂的那個方案比較,雖然都是使用樹莓派Pico都是用RP2040,但是這個方案會更好理解。
我會盡量多用點比喻和比方,方便大夥能儘可能看懂這是怎麼實現的。
最先看一下源代碼部分,可以說是非常簡單,picoboot組成主要是兩個文件,一個picoboot.c是主程序的代碼,一個是picoboot.pio用於描述子函數的功能的基礎實現,咱們主要說這個.c文件,這個文件描述了整個picoboot的工作流程
在.c文件內定義了使用的引腳
P25:用於控制狀態指示LED燈
P6:數據輸出引腳
P4:U10 芯片選擇引腳
P5:外部總線時鐘引腳
由程序可知,picoboot整個工作流程是這樣的:
1. 初始化系統,讓LED燈發光,並且設置系統時鐘為 250MHz,這是能讓代碼正常工作的最高頻率,用於在NGC那邊過來的時鐘脈衝之間獲得更多時鐘週期。這樣說有點難度,舉個例子,你是前臺負責收款,客人來你這邊結賬你就要忙,但沒人時候你可以玩手機,為了能多玩手機,咱們就需要更高的頻率。
其他初始化部分還有設置DMA,設置P6引腳為快速轉換以及驅動電流到最大4ma等等
2.設置狀態機,顧名思義就是記錄當前狀態,比如開始或者停止,還沒啟動或者已經啟動過了這種,這邊有兩個狀態機,一個是“Transfer Start”狀態機,這個狀態機功能是,對所有連續的傳輸進行計數,並且當第一次 1 K字節的傳輸開始時,設置一箇中斷請求(IRQ)。
什麼是中斷?比如你在辦公室打遊戲,老闆突然進來,你馬上按下Win+D切到桌面,不管你在玩啥遊戲這個都會立刻觸發,這就是中斷。
觸發中斷,可以讓程序在這個關鍵節點做出相應的響應或處理
除了還有Transfer Start還有另一個名為“Clocked Output”的狀態機,同樣進行相關設置和操作。它等待來自剛才用於設置傳輸開始的狀態機的中斷請求信號,並採樣時鐘信號,以輸出 IPL 數據。
到這裡大夥就要傻眼了,時鐘是啥,IPL數據又是啥?
打個比方來說,時鐘就像是我們的心跳一樣,讓整個電子系統的各個部分都能按照這個節奏有秩序地工作和協同,不管是遊戲機也好,電子錶也好,手機也好,都是根據時鐘的節奏來進行數據處理、傳輸等操作。
也因此,提高時鐘頻率就可以讓系統運行的更快,這就是超頻!
而 IPL 數據則是一本 “啟動說明書”。當電腦要開始工作時,它需要知道首先要做什麼、按照什麼步驟來,這些信息就包含在 IPL 數據裡。它就像是一個指引,告訴電腦系統如何開始最初的步驟,把需要的關鍵程序和數據加載進來,讓電腦能正常啟動並進入可以工作的狀態。
當Clocked Output狀態機在中斷觸發後,便會開始執行,他會同步NGC那邊的時鐘信號,並且輸出IPL數據,這是破解NGC很重要的一部分,通過這個方式就可以跳過開機啟動的正版驗證,當然這裡還沒真正跳過驗證,主要是修改IPL數據。
然後,最重要的一步來了,設置 DMA 以將 IPL 讀取到 PIO FIFO
什麼是DMA?DMA全稱是Direct Memory Access直接內存訪問,打個比方,正常情況下你要寄快遞,要經過快遞公司的運輸,就算同城運來運去也要一天時間,但是,你可以把包裹通過達達或者順豐同城直接給對方,這樣對方一小時不到就能收到。
DMA就是這樣的功能,本來數據要經過CPU才能和內存交換
現在通過DMA控制器,少了CPU這個中介,速度就會快非常多,CPU還不用分出性能來處理這個數據。
通過DMA方式來讀取IPL數據,重新編碼再通過FIFO回傳給NGC,就實現了IPL數據的讀取,修改,回傳,這樣的步驟,最終破解NGC,實現直接引導運行TF卡上的文件
在完成解析後我發現,居然如此的簡約,直白!那麼為什麼以前做不到?其實也很簡單,性能不足,早期因為沒有pico這種便宜且高性能低功耗的單片機,所以做不成,甚至只能依靠昂貴的FPGA來實現。
早期破解方案比如說GC Loader,在算力不夠,集成度不夠面前,就走了一個彎路,通過同期更好破的光驅部分來實現ROM的加載,也算是一種彎道過人吧。
最後
通過一系列的實操,以及分析,我們瞭解到了picoboot是如何讓20塊錢的小小樹莓派Pico有了遠超上千元GCLoader的易用性,對於復古遊戲愛好者來說,使用實機來玩永遠是最好的選擇,或許這也是驅動許多人無償投入到對早期電子產品的繼續研究和創作中吧。
20多年前的遊戲機,在這幾年,居然用20塊錢的小東西就可以繞過防破解方案,只能說,當年也沒能想到吧?
很高興你能來看我的文章,我們下次再見!
還想看什麼?試試花幾秒在評論區留言
參考資料:
https://github.com/webhdx/PicoBoot
https://github.com/emukidid/swiss-gc/
https://blog.csdn.net/fanjufei123456/article/details/132753095