20年后的20块钱,居然掀翻了任天堂 | Pcioboot和NGC


3楼猫 发布时间:2024-06-18 21:33:48 作者:新昼 Language

你能想到吗,一台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

© 2022 3楼猫 下载APP 站点地图 广告合作:asmrly666@gmail.com