作者Append (鸦片)
看板C_Chat
标题[心得] RMX1的防盗机制: 人心终究是要回到公路的
时间Mon Aug 12 23:56:44 2024
本文极长,极生硬,强烈推荐读好读版:
https://hackmd.io/@Append/ByM82wnKA
## 开始之前
总之这篇的故事有很大部分跟 RMMH 的近期影片有关。
【电玩说书】你已成为正版的受害者 谈洛克人X1离谱的防盗机制
https://www.youtube.com/watch?v=oL8X4Tb2Mb0
这篇是我在这影片背後的研究过程中的一些心得,
以及对於我们想验证的许多逻辑的补完。
如果还没有看过的话,强烈推荐先至少看过一次。
## 缘起
之前写过一篇「RockmanX 1.0 公路诅咒的机制与回避」,
里面提到了当年 RockmanX 初版卡带的一个奇妙的防盗机制,
让无数的玩家莫名其妙的被送回公路。
我自己从2014年左右开始关注这个现象,
後来经过 ProwainK 和 Ds83171 以及 F6BFB5 的协力研究,
完成了上述这篇文章,
对这个现象的背景、成因以及应对方式有了初步的理解,
至少我们知道了「只要不要冲豆就不会出事了」。
我当时在那篇文章底下写了一段「下集预告」,提到预计会写
The Cutting Room Floor (TCRF) 与 near.sh
对於防盗机制以及跳线修正的相关记载。
然後...就过了三年。
我隔了这麽久都没有把续集写下来。
理由非常简单,就是,
就是我看不懂RRRRRRR ◢▆▅▄▃崩╰(〒皿〒)╯溃▃▄▅▇◣
其他机制那边我真的没什麽好办法,
毕竟我没有想到怎麽触发那些机制的手段,他其实也没有写下来。
我当时能想到的大概是...
去买很多不同的磁碟机说不定有办法撞到几个?
但这有点太过乱枪打鸟了,
实在是没有信心能办到。
至於跳线修正到底做到了什麽...
这我当时就有看到有人在讨论那些电路,
有画出详细的电路图,
但...我看不懂,真没办法,
我一个读化学系的真的没看过这些,臣妾办不到阿。
於是到了前阵子 XGOD 做了一片
【电玩说书】洛克人X2卡匣为什麽当年非常稀有/没有盗版?
其中有拍到 X1 的卡带中的跳线,
那时有讨论了一下有没有办法把这段讲成一个比较容易听懂的故事...
不是,讲故事之前,我得先看懂RRR ◢▆▅▄▃崩╰(〒皿〒)╯溃▃▄▅▇◣
於是就开始了漫长的奋斗。
我有种回到大学期中考前的感觉,
大概就是那种,老师上课的笔记,同学们每个都说没有看懂,
我们开个读书会大家一起努力一下...好像看懂了,
然後跟同学解释,赫然发现这不对,我没有搞懂,
只好继续看一下...
然後花了两小时发现我前面少写一步,
或者发现这边老师笔记写错了一个字,
改掉之後整篇就没有矛盾了。
这些日子大概就这样的感觉,
XGOD 常常很准确的挑出我的逻辑中的矛盾之处,
於是我就摸摸鼻子继续想办法弄清楚...
到了现在,新的这片影片总算是完成了
"【电玩说书】你已成为正版的受害者 谈洛克人X1离谱的防盗机制"
这里面有针对 TCRF 提过的每个防盗机制尽,
每个都尽可能地找出触发的方式,拍下实际的情况;
也有简短的介绍了 near.sh 提到的跳线修正的机制,
并且最後透过理解之後,剪掉跳线上二极体的部分,
成功的在实机上还原了公路的诅咒这个防盗机制。
但...作为一个影片,篇幅有限,
实在无法把所有的过程都写上来,
就算是目前这个篇幅,30分钟的YT影片已经非常漫长了。
实际上内容也确实偏难,
底下的留言几乎也都是「虽然我看不懂,但看起来好厉害」。
不过还是有很多朋友很有勇气,
比较想看到实际上中间我们怎麽验证这些的过程,
所以在这边另外再写一篇,
纪录一下我们说服自己的过程。
这篇文章接下来会讨论以下几件事情:
- 先回顾一下我们在这过程中找到的既有讨论。
实际上我们有非常多的判断都是直接从前人的叙述中得知的,
然後我们设法去重现这些。
- 这之中大部分的机制都牵涉到记忆体映射,
所以我们需要描述超任主机怎麽样透过记忆体位址读取到ROM中的内容。
- 实际上 7400LS 这张晶片到底做了什麽,
以及跳线怎麽修正他。
- 这里面实际上有那些防盗机制,
我能够用模拟器的环境有系统地重现吗?
- 如果我触发了这些的防盗机制,
这游戏有办法有系统的破关吗?
## 文献回顾
在写上一篇的时候,当时我们就已经知道:
- TCRF 除了我们遇到的「爆炸计数器」以外,有提到更多的防盗机制,
例如「落下计数器」和「受伤计数器」。
每个都只各用一句带过,很可惜没有办法看到实际上的效果。
- near.sh 有在文章中写出 Capcom 在制品版中透过跳线修正了卡带,
这很可能是因为开发版的记忆体映射方式和制品版不同,
因此模拟器需要手动修正映射才能避免这些机制的触发。
### TCRF 记载的防盗机制
首先先翻译一下 [TCRF 的叙述]:
https://tcrf.net/Mega_Man_X#Copy_Protection
- 在128次爆炸後,
能反弹子弹的敌人可能会在反弹时杀死你。
强化道具会迅速消失,
并且在冲刺时射击会导致你需要重复初始关卡。
- 这其实就是我们已经知道的公路诅咒。
豆炮反弹会离开关卡,冲刺豆炮会立旗导致离开关卡後回到公路。
- 在掉落128次後,
你接下来的127次跳跃会在正常跳跃和小跳之间交替。
你还会在爬墙时受伤,并且无法使用骑乘装甲。
开火会将你传送回关卡起点。
- 虽然上一篇没有提到,但这个我之前是有注意到的。
当然我并不清楚规则,但我有在Sigma Stage 4的墙上,
用 Joytokey 设定「连发→」来让下滑变得更慢,
赫然发现我的HP会被扣下去。
- 当你第128次受到伤害时,游戏会开始添加随机输入,
并且你的蓄力X炮射击会被锁定。
- 你可能会在开始关卡时失去所有升级(包括E罐)。
- 这个也是很有名的,很老的模拟器 ZSNES 1.2 会友这个现象,
不管什麽装备都留不下来。
- 你在捡起强化道具或穿过Boss门时可能会被传送回关卡起点。
- 当敌人掉落1up时,你可能需要重复初始关卡。
- 虽然这个也满有名的,
但我有点难想像为什麽大家能判定出来是1up造成的...
TCRF记录的这些现象,我们写上一篇的时候就有注意到。
14年之後我很长时间都有在玩1.0J,
应该满早就有看到TCRF写下来的这些,
但当时只知道第一条爆炸计数器,
除此之外我都没有弄懂,
但偶尔还是会听到有人聊天的时候提到,
当年曾经遇到过类似的状况。
很可惜大家都是遥远的模糊记忆,
没有人能记得细节,
所以也不知道如何考据。
不过直到最近我突然注意到,
TCRF 其实是有写下 Citation 的。
- Source: HHS, TASVideos
https://tasvideos.org/Forum/Topics/558?CurrentPage=15&Highlight=384683
- Source: Original TCRF research
https://jul.rustedlogic.net/thread.php?pid=433506
TASVideo 的 HHS 写的超详细,
把所有牵涉到的记忆体位址都有明确的写下来。
我想这多半是有直接看懂程式码,
才能写得这麽准确;
实际上也因为有这些位址,
我们才有手段去直接切入这些问题,
设法重现每一个效果。
另一篇更早一点的 TCRF 的研究中有写下来一些现象,
而且还有发现这些现象的程式码中有额外的自我检查,
如果想把这些程式码移除掉,
仍然会触发同样的防盗机制。
### near.sh 描述的跳线修正
当时我还在研究的时候,
有看到 Near (更多人可能更熟悉 byuu)
有在他的个人网站 near.sh 里面写下来一些模拟器开发的文章,
其中有提到 X1 卡带中的跳线。
在 Near 过世之後,
目前这些文章有被备份到BSNES的网站
https://bsnes.org/articles
其中提到了:
- 洛克人X的卡带中没有存档用的SRAM,
但大部分的盗版装置 or 磁碟机都会有;
程式码中会对SRAM区块进行写入检查,
很可能就能判断出这是不是盗版,
并且施加防盗机制作为惩罚。
- 这段写入检查的程式码有些问题,
在制品版中遇到了不对的「记忆体映射」,
导致正版卡带也会被误判成盗版,
因而触发防盗机制。
- 洛克人X的1.0版踩用 SHVC-2A0N-01 的电路板,
但他透过一条跳线更改了「记忆体映射」,
导致他的记忆体映射和其他同样电路板的行为很不一样。
- 一般模拟器在这种情况难以应对,
但BSNES在资料库中纪录了这件事,
每次遇到这个ROM的时候就针对性的作出正确的映射。
这里提到的「记忆体映射」会需要更多一点点的基本介绍,
我们後面会对此做比较详细的讨论。
### 其他相关文献
接下来附上几张照片。
这来自於 Reddit 上的一个讨论,
https://www.reddit.com/r/snes/comments/b3bsmp/bought_this_import_rockman_what_are_these_wires/eiztnu6/
他拍摄了电路板的照片,
同时标示了电路相连的部分,
以及将他们整理成电路图,
分析上面外加的跳线与二极体的部份的实际效果。
我会在这之後的过程,
照着这个思路走过一次,
描述「74LS00实际上会做出什麽样的记忆体映射」,
以及加上这个跳线修正之後的结果。
https://i.imgur.com/E64ie1g.png
https://i.imgur.com/XMIILq2.png
https://i.imgur.com/KKbwiwJ.png
除此之外,
日文杂志「バックアップ活用テクニック」中有一页提到了这个电路,
同样的提出了解释。
内容的接法稍微有点不同,
後面我们会一并去理解这中间的差异。
https://hackmd.io/_uploads/rkCGHQL5A.png
## 超任的「记忆体位址」与「映射」(Mapping)
超任的CPU要跟其他元件进行互动的时候,
会使用24位元的整数来形成一组「位址」;
前面提到的「记忆体映射」指的就是「把位址对应到特定的元件」的规则。
为了弄清楚这点,先介绍一下超任的位址格式。
超任使用的24位元位址,通常我们会用16进位来表示他。
这样可以把他表示成 000000 ~ FFFFFF 之间的某个整数。
在大家的习惯中,我们把这六位数的最前面两位的
$00 ~ $FF 叫做 Bank (习惯上会标记$表示Bank),
後面的四位 0000 ~ FFFF 叫做 Page (分页)。
理论上,这每个位址都可以对应到一个 Byte 的资料;
所以 000000 ~ FFFFFF 这麽多组位址
实际上可以对应到 16,777,216 个位元组,
也就是 16MB 的资料。
但这里面有很大部分要分给不同元件,
而且超任卡带内容通常不怎麽大,
目前最大的应该是 6MB 的时空幻境 (Tales of Phantasia)
与星海游侠 (Star Ocean)。
洛克人X比起来不大,只有1.5MB,
总位址量远远超过这个大小,
要指向所有的内容其实并不需要完整的24个位元 -
如果是要涵盖这个大小,其实只需要 21 个位元就能达成。
从卡带的角度来考虑,
实际上卡带的针脚的定义我这边引用
The SNES Cartridge, Briefly Explained
一文的图片以及介绍:
https://mousebitelabs.com/2019/05/18/custom-pcb-explanation/
https://hackmd.io/_uploads/BJMVh4TKC.png

从照片中可以看到,
连接主机的针脚上其实是有编号的;
电路板背面(主机正面)的针脚编号是5~27,
电路板正面(主机背面)的编号是36-58,
两面各有23个针脚,表格中有标示出每个针脚的功能,
中间的编号我就不太清楚会跑去哪,
但似乎还有另外一种电路板会有更多针脚。
考虑到每个针脚都能够对应到 0 与 1 (也就是电位低与高),
他们表示的就是位元,
所以多个针脚就能表示出一个更大的整数。
- VCC, GND: 供电用
- VCC提供高电位,
原则上电路直接连上 VCC 的部份,
电位会是 +5V
- GND提供低电位,
原则上电路直接连上 GND 的部份,
电位会是 0V
- A0-A15, BA0-BA7: 记忆体位址,共24根
- A0-A15 这十六个针脚对应到的就是上面提到的分页,
总共可以对应 0000-FFFF。
- 如果你偷看一下後面 X1 卡带的照片,
他的40什麽都没接上!
- BA0-BA7 这八个针脚对应到的就是上面提到的 Bank,
总共可以对应 00-FF。
- 同样的如果你偷看一下後面 X1 卡带的照片,
他的47/48什麽都没接上!
- X1卡带上总共只有 21 个针脚有接上电路
- 21位元能够表示的位址数量的理论上限是2MB,
比 X1 ROM 的 1.5MB 大一些
- D0-D7: 资料读取/写入用针脚,共八根 (1 byte)
- /CART: Off (也就是电位为Low)时才能够读取卡带内容
- /RD: 读取开关
- /WR: 写入开关
除此之外另外附上两个只有ROM晶片的针脚才会标注的:
- /CE是 Chip Enable,启用这个ROM晶片
- /OE是 Output Enable,接受这个晶片输出的资料
- 实际上接下来我们遇到的都会是 /OE(overbar),
表示**低电位时才启用**
接下来看一下电路板的晶片部分,
可以看到这张 SHVC-2A0N-01 的电路板上有两个 ROM 晶片,
分别是 KM23C4001B (上) 与 KM23C8001B (下) ;
前者可以容纳 512KB,後者可以容纳 1MB。
这两张晶片都是由 Samsung Electronics 制造的,
现在直接搜寻编号仍然能够找到他们的 Datasheet,
上面有列出每个针脚的用途。
先偷偷计算一下,512KB = $2^{19}$ Bytes,
也就是说要描述 512KB 的资料需要 19 个针脚;
相对的,1MB 需要多用到一个位元,
所以可以用 20 个针脚完成。
在针脚的示意图中,
1MB 的 KM23C8001B 的记忆体位址针脚编号从 A0 -> A19,总共20根;
相对的,512KB 的 KM23C4001B 少了 A19 这根针脚,
因此只用到 19 根。
这边需要特别注意的是,
晶片的针脚命名,与电路板的针脚命名并不需要保证相同;
所以之後我们会在需要的时候特别标记,
这个命名是晶片的针脚、还是电路板的针脚。
https://hackmd.io/_uploads/BJ0C6gUcC.png

但从卡带电路板的针脚来看,
电路板针脚 40 (A15) 其实什麽都没有接上;
1MB 的 KM23C8001B 需要的 20 个针脚,
对应到电路板上应该会是 A0-A14 (15根) + BA0-BA4 (5根)。
很可惜我没有办法看到晶片底下的电路怎麽经过,
这部分他们怎麽连接我没有证据,
但根据超任的 Memory Map 规则,
A0-A14这15个针脚对应到的应该会是位址的後面四位,
也就是「分页」;
分页能够对应到的位址是 0x0000 - 0xFFFF,
这需要16个位元才能表示;
如果只有15个针脚,
实际上是不能对应到全部的。
实际上超任的 LoROM 模式也因此不会用到这之中全部的位址,
每个分页都只对应到 0x8000 - 0xFFFF;
这相当於在这16个位元中的第一个位元固定都是1,
後面15个位元由针脚决定。
相对的,
Bank 的部份对应到的位址应该是 $00 - $FF,需要八个位元来表示;
晶片上的与此有关的针脚是 A15-A19,
这五根对应到电路板中的 BA0-BA4 这 5 根针脚。
但很明显的,5 根针脚只能对应到 $00 - $1F 这 32 种可能,
考虑前面分页是32768个位址,这样刚好能够表示1MB;
剩余还没有用到的三个针脚中,
电路板上我们能够看到 47(BA6) / 48(BA7)这两个针脚并没有接上晶片,
最後剩下的 BA5 在这里决定要控制这两张晶片的哪一张,
因此这样就能对应到 $00 - $3F 这些可能。
但实际上 KM23C4001B 在 Bank 的部份只有用到 BA0-BA3 个针脚,
BA4 原本就没有接上他。
也因此总对应其实应该是 $00 - $3F;
其中 $00 - $1F 对应到 1MB 的 KM23C8001B,
$20 - $2F 对应到 512KB 的 KM23C4001B。
好,那麽现在就有个奇妙的问题 -
BA6 与 BA7 没有接上,如果我们给他不同的位元,
会影响其他位元的运作吗?
如果他真的没有接上其他元件,
那不管他是哪个位元应该都不会影响。
也因此,
$00 (00000000)、$40 (01000000)、
$80 (10000000) 与 $C0 (11000000)
应该都对应到一样的 Bank。
这件事情就是「记忆体镜像」(Memory Mirroring),
因为 BA6 与 BA7 在这边没有接上元件,
自然的让这四组位址对应到了同样的区块。
以下附上超任的 LoROM 模式的记忆体映射示意图。
https://hackmd.io/_uploads/B12-7GL90.png
> 这里其实有个还没看懂的问题:
> - 根据上面这个逻辑,
> 电路板上同样没接上的 A15 应该会有同样的效果,
> 让所有分页的部分 0x8000-0xFFFF 也镜射到 0x0000-0x7FFF?
> - 前面引用的文章中有提到 A15 会接上一个 decoder,
> 最後应该要对应到 我无法在电路板上看出这件事情
> - 实际上 bsnes 最後给我 SHVC-2A0N-01 的记忆体映射里面,
> $40-$7F 的部份对应到的分页 0x8000-0xFFFF
> 也是有镜射到 0x0000-0x7FFF
> - 也就是说,这个问题很可能应该要改问
> 「SFC如何决定一些位址不要映射到 ROM 的资料,
> 而是对应到其他元件」?
> - 这会同时回答为何超任能够将 Bank $7E-$7F 对应到 RAM,
> 而不是 ROM 的镜像。
## 记忆体控制晶片: 74LS00
SHVC-2A0N-01 上面使用的记忆体控制晶片是 74LS00。
这也能够直接 Google 查到 Datasheet,
实际上他很单纯,就是四个 NAND 闸。
他有十四个针脚,其中 VCC 和 GND 分别对应到 +5V 与 0V,
其他12根分别对应到这四个 NAND 闸,
每个闸各两有两个输入与一个输出。
https://hackmd.io/_uploads/BJY7GmUqC.png
在 SHVC-2A0N-01 这张电路板上,
我无法判断出这些针脚之间在晶片底下有什麽样的连接,
但根据 Reddit 上面的讨论中,
有在上面这些照片上加上线路的连接方式。
看着下面这张照片,
可以注意到醒目的黑色的导线,
他一端接上了 KM23C4001B 的 31 号针脚(/OE),
另一端通过一个电阻之後接上了74LS00 的 3 号针脚。
但如果仔细看这个 3 号针脚,
在电路板上其实本来就有一条电路
直接走向 KM23C4001B 的 31 号针脚 -
但是在中间有个被切断的痕迹。
为了避免看不清楚,
这边附上另一张不同出处的照片,
并且用黄圈表示被切断的位置。
假设跳线、电阻与二极体都是後来追加的部分,
那麽推测原本应该没有这些,
也没有那个切断的痕迹 - 也就是说那边应该要能形成通路。
https://i.imgur.com/XMIILq2.png
https://i.imgur.com/glUbH1M.png
在这个情况下,
我们能够透过线上模拟工具重建这个情况。
前面有提到 /CART 为 Low 的时候才能读取卡带内容,
在这个情况下,
BA5 为 Low 的时候,
会让 ROM0 的 /OE 为 Low (注意 /OE 是在 Low 启用),
ROM1 的 /OE 为 High;
这个时候超任会读取到的就是 ROM0 的内容。
相对的,如果 BA5 是 High,
ROM0 的/OE 为 High,ROM1 的/OE 为 Low,
读取到的就是 ROM1 的内容。
但在这个时候,
由於 ROM1 只有 512KB,
BA4 实际上并没有接上他,
所以不管 BA4 实质上是 Low 还是 High,
他都只会认得 BA0-BA3 指向的 Bank;
从记忆体映射的角度来看,
他做到的就是把 $20 - $2F 镜射到 $30 - $3F
(以及考虑其他mapping後,
$60 - $6F 镜射到 $70 - $7F,
$A0 - $AF 镜射到 $B0 - $BF,
$E0 - $EF 镜射到 $F0 - $FF)。
这样看的话,
74LS00 预设的这个接法,
就会让512KB 的 ROM1 重复表现两次,
实质上表现得像是 1MB;
原本超过 1.5MB 到 2MB 之间的 512KB 位址,
实际上却对应到了後面 512KB 的资料。
对於一个1.5MB的游戏来说,
如果两张 ROM 分别是 1MB 和 512KB,
那「镜射後面的512KB」
就是 SHVC-2A0N-01 这张电路板上的 74LS00 预设的行为。
https://hackmd.io/_uploads/rkWDVSI5R.png
## 跳线修正:为什麽要外接一条丑丑的电线?
前面提到这张卡带背面的跳线修正。
以前面这张照片为例,这有一个黑色导线,
一端接上了 KM23C4001B 的 31 号针脚(/OE),
另一端通过一个电阻之後接上了 74LS00 的 3 号针脚;
另外有一个二极体,
阴极的一端(有个黄色环标记)接上了 31 号针脚,
而阳极接上 30 号针脚
(BA4,但对 ROM1 来说原本应该是 NC,也就是"没有作用")。
除此之外,有一个原本线路切断的痕迹。
https://i.imgur.com/XMIILq2.png
考虑有可能的各种情况,
我们能够重新制作出电路的模拟。
以下直接列出 BA5 与 BA4 分别为 Low 或是 High 的所有可能,
列出实际上他各自会读取哪个 ROM;
| ---- | ---- | ---- | ---- | ---- |
| BA5 | BA4 | ROM0 | ROM1 | 选择 |
| ---- | ---- | ---- | ---- | ---- |
| Low | Low | Low | High | ROM0 |
| Low | High | Low | High | ROM0 |
| High | Low | High | Low | ROM1 |
| High | High | High | High | NONE |
| ---- | ---- | ---- | ---- | ---- |
https://hackmd.io/_uploads/rkZfXF8qR.png
特别需要注意的是,
如果是 $30 - $3F 这个记忆体位址区间,
BA5 和 BA4 会同时为 High,
那麽 ROM0-/OE 与 ROM1-/OE 就会同时为 High,
没有任何一个被启用;
这样会发生什麽事呢?
以超任的设计来说,这个情况被称为「OpenBus」:
如果没有任何 ROM 被启用,读取的行为会失败;
但由於读取的过程中有个暂存器,
如果这次读取没有成功,
暂存器的数值就不会被改变,
因此他应该要拿到「前一次读取」的资料。
回到记忆体映射的角度来看,
这个时候 $00 - $1F 会对应到 ROM0,
$20 - $2F 会对应到 ROM1,
$30 - $3F 什麽都没有对应到,
就形成了 OpenBus 的情况。
near.sh 的讨论中有提到,
开发版本的电路板为了开发方便,
会选择使用可以重复烧录的 EPROM;
他认为这应该会是个有四个插槽的电路板,
但对於 1.5 MB 的游戏,
他需要插上三个 512KB 的 EPROM,
留下一个空的插槽。
但不管有没有接上 EPROM,
位址就会对应到这个插槽,
因此不会发生 74LS00 把後 512KB 的内容重复一次的情况。
很可惜这边我没有证据他拍的电路板就是 X1 开发时使用的型号,
无法保证这点是否合理;
但 near 把「镜射到 $30 - $3F」这个部分在模拟器中取消掉,
同时确保正确的 OpenBus 行为之後,
就能正确的模拟以跳线修正後的游戏内容。
因此我认为这个说法是完全自洽的。
## 日文杂志的接法不太一样?
1994年4月出版的「バックアップ活用テクニック」 Part 36, page 107
有一篇丹治佐一写的
「プロテクトバージョン!? ロックマンXの秘密」,
其中有提到这个电路,
但...他描述的连接方式和上面讨论的有点相似,
却有些微妙的不同。
特别是仔细看一下白色跳线的接法,
这根本不是第三根针脚。
https://hackmd.io/_uploads/rkCGHQL5A.png
仔细看一眼他的插图,会发现...
这张电路板最左边的 CIC 晶片的位置和前面我们看过的不同。
这张电路板其实不是 SHVC-2A0N-01,而是 SHVC-2A0N-11。
这边有一张拍得更清楚的 SHVC-2A0N-11 照片,
可以看到他上面的线路确实很不一样。
为了方便与正面对照,我有故意把背面照片左右相反,
但杂志中是没有这样做的。
从正面可以看到黄圈圈起来的地方有个人工切断的痕迹,
这件事情和 SHVC-2A0N-01 在背面的切断如出一辙;
相同的,白色跳线其实是在让那个切断的地方重新接上。
白色跳线与电阻接上 74LS00 的部分,
数针脚可以看出这是 74LS00 的第六根针脚,
所以左边电路图接上 1K欧姆电阻的地方就是 6 号针脚;
回去对照杂志上的电路图,
确实他会是这样连接的。
如果认真的去看每个针脚的定义,
确实都有符合杂志下方的电路图的接法。
也就是说,两个讨论的电路接法应该都是正确的;
他们的差异其实就是电路板的走线原本就有所差异,
而它们同样的透过跳线/电阻/二极体的组合,
使 BA5 和 BA4 会同时为 High 的时候,
两个 ROM 都不会启用。
https://hackmd.io/_uploads/ByInnT8c0.png

## 透过 bsnes 手动调整记忆体映射
大部分模拟器的模拟目标是 ROM,
许多 ROM 确实也会在标头区块记录一些卡带的相关资讯,
例如超任的 ROM 有记录这个档案的大小、
这需要超任用什麽模式执行 (例如 LoROM 或 HiROM)、
这张卡带有没有 SRAM 提供存档空间、
以及这张卡带上有没有副处理器 (例如洛克人玩家们熟悉的 Cx4)。
由 near 主导开发的模拟器 bsnes,
目标是尽可能提高超任模拟的准确性,
但很快的就发现 -
超任卡带常常有些奇妙的设计,
像是特殊规格的电路板,
像是这次提到的奇妙的跳线。
非常明显的,这些当然不会被记录在 ROM 之中,
所以模拟器不太可能只从 ROM 提供的资讯就做到正确的模拟;
near 对此选择的应对方式是,
他建立了超过一千两百张卡带的资料库,
遇到每个 ROM 的时候:
(1) 先搜寻资料库内有没有记录他的卡带的相关资讯
(2) 如果没有的话,看看 ROM 附近有没有记录资讯的相关档案
(3) 上述都没有的话,从 ROM 的标头区块去猜出来
这边要特别提到的是 (2)。
bsnes 使用自行开发的 .bml 格式进行这些记录,
是个轻量的标记式语言。
虽然如(1)所述,他资料库内对於我们现在讨论的初版洛克人X的 ROM 是有记录的,
但我们还是姑且用 (2) 的格式来说明
SHVC-2A0N-01 与 初版洛克人X的 ROM 的差别,
应该会比较容易看懂。
一般的 SHVC-2A0N-01 的电路板,
上面不会有SRAM (那个2A0N的0表示没有SRAM),
他的内容应该会是:
board: SHVC-2A0N-01
memory
type:ROM
content:Program
map
address:00-3f,80-bf:8000-ffff
mask:0x8000
map
address:40-7d,c0-ff:0000-ffff
mask:0x8000
这里面记录了电路板的名称,
以及 ROM 对应到的记忆体映射。
但是对於初版洛克人X,
他有另外处理了跳线修正过後的电路版:(他在资料库内的写法不太一样,
但这应该是等效的)
board: SHVC-2A0N-01#A
memory
type:ROM
content:Program
map
address:00-2f,80-af:8000-ffff
mask:0x8000
map
address:40-6f,c0-ef:0000-ffff
mask:0x8000
电路板名称中的#A用来区分这是个有跳线修正後的版本,
而其中的记忆体映射也很明显的删去了
Bank $30 - $3F 与相关镜像的映射,
用来表示跳线修正过後的结果。
但如果我们想要自行调整映射的部分,
或者甚至想要帮他加上原本不存在的SRAM,
这能够做到吗?
答案是...可以!
这边选择内嵌 bsnes v115 核心的 Bizhawk 2.9.1 进行实验。
他没有 bsnes 的资料库,
不会受到 (1) 的影响;
同时他内建的 bsnes v115 核心能够在读取 ROM 的时候,
尝试读取同位置同档名的 .bml 档案,
试图从里面取得卡带相关的资讯。
因此我们可以在这个 .bml 中遵照格式自己添加自己想要的映射、或是SRAM区块。
举例来说,
目前我们讨论的初版洛克人X的ROM Rockman X 1.0(J).sfc 他没有 SRAM,
但我们可以手动帮他加上去。
这需要在他旁边摆上治作一个记录卡带资讯用的 Rockman X 1.0(J).bml:
game
sha256: 76f80cdf704a0e1daf1af5bbf564e427b425a5ee42329417de6f29219fe63e5f
label: ロックマンエックス
name: Rockman X
region: SHVC-RX
revision: SHVC-RX-1
board: SHVC-2A0N-01#B
memory
type: ROM
size: 0x180000
content: Program
memory
type: RAM
size: 0x2000
content: Save
name: save.ram
board: SHVC-2A0N-01#B
memory
type:ROM
content:Program
map
address:00-2f,80-af:8000-ffff
mask:0x8000
map
address:40-6f,c0-ef:0000-ffff
mask:0x8000
memory
type:RAM
content:Save
name: save.ram
map
address:70-7d,f0-ff:0000-ffff
我在 board 标上了 SHVC-2A0N-01#B 这样的名字,
用来跟原本的做出区隔。
这样写下来的 .bml 就能够让 bsnes v115 核心
认定这里应该要有一块 SRAM,
而且也一并指定好他需要的记忆体映射。
拿这组配置下去游玩,
就会触发 TCRF 提到的三个计数器相关的机制。
## 防盗机制 - 不应存在的SRAM
理解了跳线修正如何改变了记忆体映射之後,
我们终於可以回来看看最前面提到过的TCRF 的叙述
https://tcrf.net/Mega_Man_X#Copy_Protection
其中有三个与计数器相关的部分:(1) 128次爆炸 (2) 128次掉落 (3) 128次受伤。
TASVideo 网站上 HHS写的讨论中,
https://tasvideos.org/Forum/Topics/558?CurrentPage=15&Highlight=384683#384683
他有把牵涉到的记忆体位址都有明确的写下来,
其中这三条分别指向一个 SRAM 位址的检查;
如果尝试写入那个地方後,
读取同一个位置得到了刚才写入的资料,
就相信这个位置能够写入,
是正版卡带不应该存在的 SRAM,
因此触发防盗机制。
这个作法很巧妙,
事实上後两条计数器也确实的让许多磁碟机玩家体验到了异常困难的游戏过程,
让大家在讨论 X1 的时候,
每个人各自提到的奇怪体验常常不太一样。
但很不巧的,
爆炸计数器相关的位址检查有所瑕疵,
没有注意到记忆体映射造成的问题,
因此让制品版也会在预设的记忆体映射下触发这个问题,
因此必须用跳线/电阻/二极体的组合去阻止错误的 $30-$3f 映射。
好,上面是我们已经知道的部分。
但我们有办法验证这个部分吗?上一节我们提到,
bsnes 核心能够透过 .bml 自订电路板配置,
我们也同时描述了一组「加上 SRAM 的初版 X1 卡带」的纪录方式。
因此如果用 Bizhawk 2.9.1 + bsnes v115 核心启动他,
就会发现游戏的过程中有上述 TCRF 提到的现象。
但这个写法不够具体,
所以这边利用 Bizhawk 监控记忆体的功能,
直接把对应的记忆体内容显示出来。
观察每个计数器的行为,
我们能够得到以下观察:
1. 爆炸计数器 (0x001F9D) -128 ~ 127 (2021年的文章提过)
- 每次发生一次爆炸就会+1,
Boss等大型敌人可能会爆炸很多次。
- 在爆炸计数器为负值时,会触发以下效果
- 大补落地後 6 桢就会消失
- 冲刺豆炮会立起「序关旗标」(0x001F9B),
纪录「序关尚未完成」,
以任何方式离开关卡之後就会回到公路
- 由於序关是否完成这点有纪录在密码表中,
所以这个状态下产生的密码会产生矛盾,
会被判定错误密码。
- 所以只要全程使用特武就都不会触发,
不要拿脚也不会触发
- 拿了脚部又没有特武的话,只好默念三遍,
「冲刺不攻击,攻击不冲刺」
- 「非冲刺状态下的豆炮打中坚硬物件而反弹」会立刻离开关卡
- 如果这是个八大关卡,
同时 Boss 尚未打倒,
那麽会进入武器展示画面
- 如果在武器展示画面中,
看到 X 传送下来的光束,就会判定 X 永久获得这个武器。
八大头目的生存状态其实是看「持有武器」决定的,
所以拿到武器就算是打赢了 Boss。
- 只要全程使用特武就都不会触发
- 在矿车上会无法起跳,所以拿波动拳的时候会相当麻烦
2. 落下计数器 (0x001F9E) -128 ~ 127
- 每次自由落体掉落时都会+1,
- 没有 SRAM 的情况下起跳的时候会扣回来,所以很难看到。
- 到达 -1 之後不会变成 0,所以这个问题不会解除。
- 在落下计数器为负值时,会触发以下效果:
- 接下来每次跳跃,
计数器偶数时跳跃高度会只剩一半,奇数时正常。
- 因此会一次高一次低,相当困扰。
- 好消息是因为他不会变回 0,
所以到那之後就都是正常跳跃高度。
- 接下来每次爬墙的时候都会扣一点血
- 老西城四一开始的高墙真的很高,爬上去会直接底血
- 闪电金刚关卡的中头目 HP 大幅提升
- 无法搭乘机甲
- 我没有检查记忆体,不确定是不是跟开火有关,
但在这之後我每次接关都会回到关卡开头。
- TCRF 的说法是「开火後会传送回起点」,
我想这应该是指中继点被取消。
https://hackmd.io/_uploads/S1zINjPcA.png
3. 受伤计数器 (0x001F9F) -128 ~ 127
- 每次受到伤害会 +1
- 似乎不只受伤会加,像是进入胶囊也会
- 铁鹰的横向龙卷会大量增加这个计数器
- 如果受伤计数器达到 -128 的瞬间,游戏会开始自动随机输入
- 因为随机输入的部分包含暂停,所以会几乎无法进行游玩
- 所以能够大幅累积这个数值的铁鹰堪称门神
## 防盗机制 - Bank $40 映射失败
最前面提过的 TCRF 的叙述除了三组计数器相关的机制以外,
还有以下三条看起来与计数器无关的部分:
- 你可能会在开始关卡时失去所有升级(包括E罐)。
- 你在捡起强化道具或穿过Boss门时可能会被传送回关卡起点。
- 当敌人掉落1up时,你可能需要重复初始关卡。
与之前相同的,
TASVideo 网站上 HHS 写的讨论中,
也有把这些部分牵涉到的记忆体位址都有明确的写下来。
我没有仔细检查这些区块的记忆体,
但我透过与前面描述很接近的方式,
手动在 .bml 中移除了 $40-$6F 的记忆体映射:
board: SHVC-2A0N-01#C
memory
type:ROM
content:Program
map
address:00-2f,80-af:8000-ffff
mask:0x8000
map
address:c0-ef:0000-ffff
mask:0x8000
透过这个方式,我取消了 $40-$6F 的记忆体映射。
打开游戏之後输入全装甲+波动拳的密码,
进入任意关卡,出现的确实是完全没有装甲的素身X。
这是最明显的迹象;
除此之外,死亡後也会被送回关卡起点,没有中继点可以用。
後来也有被传送回序关公路,
即使没有脚部装甲,根本没有冲刺豆炮的可能,仍然是被送回去了。
虽然没有逐项检查,但我相信这个部分的几条机制应该都有重现成功 -
除了E罐以外。是的,我手上有E罐,进入关卡并没有让他消失。
除此之外 - 波动拳密码在这个场合,仍然打得出波动拳。
https://hackmd.io/_uploads/BJYrZovcC.png)
https://hackmd.io/_uploads/rydEZsP5R.png)
https://hackmd.io/_uploads/rkK3bsP9R.png)
## X1 的版本差异:防盗机制
洛克人X以 ROM 的标头部分纪录的版本资讯来分辨的话,
实际上总共有五个版本:1.0(J), 1.1(J), 1.0(U), 1.1(U), 1.0(E)。
虽然是回到公路这个明显的现象最为有名,
但因为有跳线修正的 1.0(J) 通常也不会出现这个迹象,
因此目前比较实际的分辨版本的方式,
仍然是「集气冰车打倒BOSS」─只有 1.0(J) 的冰车是不会碎裂的,
因此在逆袭的时候在空中用冰车打倒铁鹰,
就有可能让自己被移动的冰车给推下无底洞中。
其他的版本冰车都会碎裂,
因此不可能发生这样的情况。
这时就有个有趣的问题─
如果我们直接给这些卡带一块 SRAM,
这些卡带会触发上述SRAM相关的的防盗机制、也就是三个计数器吗?
如果我们拿掉这些卡带 $40-$6F 的映射,
这些卡带会让我们在进入关卡的瞬间,就把装备剥光吗?
答案是...会!
实作的方式非常容易,
就是把上面的那个 .bml 的部分,
前面的 sha256 换成对应的 ROM 的 sha256 值即可。
底下的电路板相关资讯,
完全可以直接沿用。
因此可以推断,
CAPCOM 在制作 1.1 以後的版本的时候,
确实有把前面的映射考虑进去,
因此不必再用跳线修正记忆体映射,
也能够有正确的执行结果;
当然我无法藉此判断他有没有又在里面装上一条跳线,
但至少不会是用来改变映射。
## 其他模拟器的实行方式 - 直接修改ROM
看了上面这些透过 bsnes 核心去强迫他表现的防盗机制,
对於这麽惨绝人寰的设计,
对於这些呕心沥血试图干扰盗版玩家的措施,
我相信在座的各位一定感到...
非常兴奋,我在哪里可以玩到这些有防盗机制的版本?
俗话说的好,洛克人玩家都是 M,或至少有一大堆都很 M,
看到这麽困难的机制,马上就会有个问题─
「上面的有点复杂我看不懂,但这看起来很难,很有挑战性,这我有办法玩到吗?」
可以。
只要你手上有一个洛克人X的ROM,不论版本,
但要确定他是 .sfc 格式
(而不是.smc,如果只有这个请自行寻找将 smc 转换成 sfc 的方式),
直接找个 16 进位的编辑器(我个人推荐 HxD 或 Notepad++自带的Hex Editor)
去更改一个 Byte,把 0x007FD8 的位置从 00 改成 08,
然後另存一个新的 ROM -
这个 ROM 就会有办法在大部分 bsnes 以外的模拟器中表现出这个效果了。
(bsnes反而不能,得要真材实料的去写 .bml。)
原理上这是更改 ROM 标头纪录的 SRAM 大小,
因此能够简单的触发三条 SRAM 相关的计数器规则。
## 正面挑战三个计数器!
自己打过个两轮左右,
总之首先先下结论──
这游戏确实能够有系统的通关。
我目前有开计数器作为辅助,
但我觉得这熟悉之後可以不用开。
几个比较需要注意的点大概是:
- 不能让受伤计数器累积到128,相当於直接卡死
- 但只要没有用到冲刺豆炮,序关旗标没有立起,
那麽直接 Reset 超任会记得当前的密码,几乎不必担心。
- 波动拳也能够透过密码继承,
但是在输入後确认的同时要按住 L+R+X+↓+START 这个按键组合。
- 附上八组可能的波动拳密码,应该不管怎麽样都是这八组。
如果不小心没按好按键组合,没继承到波动拳,
那可以用这些对照调整一下密码:
- 2653 3848 7587
- 2656 6418 3242
- 3673 2177 2487
- 3676 4627 5142
- 7431 3842 8523
- 7437 6412 1255
- 8441 2176 4423
- 8447 4626 6155
- 这游戏最可怕的敌人应该是暴风铁鹰,
他把人推飞的龙卷会大量增加受伤计数器,
我觉得这是不能回避的。
- 目前觉得有机会解掉的方式只剩下,
贴上去波动拳一发带走,
除此之外风险都太高了。
- 密码不能继承城内的进度,
所以城二中间开始就会面临爬墙都会扣血的情况,需要小心控制。
打老西的时候特别明显,不太有办法正面打老西一阶,
所以还是只好老样子波动拳处理。
- 攻略的基本想法大概如下:
- 先参照2021年的上篇,利用爆炸计数器的效果,
直接透过豆炮反弹咒杀掉八大头目
- 带着特武去收集强化零件,
有需要就 Reset
- Reset 一次之後去收集波动拳
- 这中间很可能会遇到中继点失效,
但问题不大,仍然能够拿到波动拳
- Reset 一次之後进城,小心不要受伤超过 128 次
## 结语 - 人心终究是要回到公路的
2014年的12月,
我在 PTT Rockman 版发表了一篇
#1Ke19UXX (Rockman) [ptt.cc] [[心得] RockmanX初版回溯Bug研究+咒杀八大
https://webptt.com/cn.aspx?n=bbs/Rockman/M.1419776606.A.861.html)
那时我只是一时兴起,想说这个回溯公路的现象时有耳闻,
想说「如果我们揪一群人找个愚人节一起来开个电视墙,
墙上每个人动不动就会被扔回公路去」,
感觉会是个不错的节目。
当时我天真的以为这只是纯运气,
所以我应该要先实测一下节目有可能的长度──
也就是这大约需要多久才能够打赢老西。
但为了保险起见,我好像应该也尝试看看,
缺乏装备的情况下能不能直接硬推进度的打下去,
如果可以的话 - 我猜我只要有身体装备,
就能够当个坦克人来应对大部分的情况。
然後我就赫然发现,我再也没有被送回公路过了。
我当天第一次注意到,只要不拿脚就不会被送回公路 -
於是这个电视墙的意义就彻底的被我自己破坏掉了。
既然不拿脚就不会回到公路,
那麽墙上的玩家当然就会避免拿脚。
从那之後我就对初版洛克人X能够引起的现象充满兴趣。
当时有看到的观众,有些人讲出来他当初遇到这个现象,
有被送回公路去的,也有一些超过这个范围的,像是什麽1up杀人事件之类的;
当时我实在是没办法重现出这些现象,
所以我非常怀疑实机到底会遇到什麽样的情况,
卡带会遇到什麽?磁碟机又会遇到什麽?
後来持续的有在注意这些相关的讨论,
我慢慢地注意到有人宣称这其实是一种防盗机制,
到後来看到了 near (当时还是 byuu) 的文章
讨论了 bsnes 如何处理了这个部分 -
我真的看不懂,一点都没办法,我真没想过要去看记忆体映射。
知道有这样的事情,设法一点一点的多弄懂了一些,
非常缓慢,完全不知道何时有机会把这些串起来。
另一方面,我也持续的在推坑身边的朋友来玩 1.0(J)。
在游戏的选择上,我自己特别喜欢
「操作上没有这麽困难、但是有些出乎意料」的东西;
1.0(J)非常符合这个原则,我觉得这真的是满有趣的。
非常感谢这些日子陪我一起玩 or 被我推坑跳进来玩的朋友们,
特别是告诉我「避免使用冲刺豆炮就比较不会被送回公路」的波纹 (ProwainK),
以及实际上在我面前打完一整轮,一次都没有被送回公路的阿痕 (ds83171)。
我能够确信这是冲刺豆炮造成的,并且独立找出了爆炸计数器+序关旗标的位址,
完全倚赖上述这两个结果。
再来,感谢 F6BFB5 这一路上的讨论。
我看不懂日文,对於研究日版来说非常缺乏相关的情报:
有非常多日文相关的讨论 / 上面的日文杂志截图 / 以及当年回收X1的全版广告,
族繁不及备载的日文资料,全都是他告诉我的;
除此之外最重要的是上面模拟电路用的软体,
也是他实际上拉好了一组电路出来,
我才知道有这样的工具,爱不释手,马上解决了我困惑已久的许多问题。
另外特别感谢 XGOD 最近这两个月,
XGOD 与我讨论了非常多的 1.0(J) 相关研究内容,
让我重新梳理了我所知道的所有的事情。
他的思维相当严格,时常准确地指出问题点,让我发现我其实没有完全弄懂,
所以摸摸鼻子回去多想一个晚上,找出能符合更多已知事实的解释。
然後有时过个两三天他又发现了一个矛盾之处,
所以我才会注意到前面想的这些不太正确...
但终究,在制作一开始提到影片之前,
我想我们确实的弄懂了很大部分的机制,
也尽可能消除了矛盾之处,达成一个自洽的说法。
这中间或许还有错漏,毕竟我没有非常细心,
我们两个也都还是外行人,真没办法说很有把握这些都是对的。
如果有发现哪边有明显的问题,或是有看出来我们哪边不懂,
而且知道这实际上应该怎麽运作的,还请不吝指教 -
如果真的能够教会我那些我不懂的地方,
那真的是太好了,先行谢过。
行文至此,我们终於可以来问,
「如果我手上有一张跳线修正过的 1.0 卡带,
我有办法取消这个修正,让他表现出未修正之前的效果吗?」
这相当於我2014年想知道的问题。
从电路模拟的角度来看,我们模拟了跳线修正前/修正後的结果;
也因此,我马上想到的就是 -
如果我把跳线 or 二极体拆掉,这应该要回到修正前的结果吗?
是的。照这个模拟,直接剪掉二极体就会回到修正之前。
所以 XGOD 去剪了卡带,确实的让爆炸计数器生效,亲手回到了公路。
在此重新感谢 XGOD,这个瞬间你确实的解答了我十年来的困惑。
最後感谢十年前的自己。
一直以来你都没有放弃,持续的想着这个问题,
努力地学会了这些第一次看到的时候完全不懂的知识,直到问题被解决的这天。
辛苦你了,生日快乐。
是的,我选在今天把这整段故事总结下来,作为我自己38岁的生日礼物。
同时也感谢看到这里的你。
这篇文章真的很长,非常艰涩,
不管中间跳过多少部分,几乎所有的段落都仍然困难,
愿意看到这真是辛苦你了。
## 给按 End 的人
(0) X1的防盗机制很精彩,
如果没有耐心看这麽多字,可以直接看RMMH的这个影片
【电玩说书】你已成为正版的受害者 谈洛克人X1离谱的防盗机制
https://www.youtube.com/watch?v=oL8X4Tb2Mb0
(1) X1日版初版的防盗机制有些问题,
会让正版玩家莫名其妙被送回公路。
这有跳线修正,修正之後原则上不会发生 -
除非这个修正用的线路有另外出问题。
(2) 防盗机制有很多条,
「不应该存在的SRAM存在」与「不正确的记忆体映射」
分别会触发更多不同的防盗机制,大幅妨碍玩家的游玩过程。
(3) SRAM相关的惩罚机制意外的有趣,在这个条件下仍然可以有系统的破关。
(4) 「剪卡带会变回有问题的初版卡带」这个说法是正确的,
RMMH 有实际剪了录下来。
但前提是这确实是 1.0 (J),
以及要剪断的不是导线,而是旁边的二极体。
以上,硬生生地赶上了...吧?
鸦片(Append), 2024.08.12
--
███◣ ◢██◣ ◢██◣ █ ◢█ ◣ ◢ ◢██◣ ◣ █
█ ██ █ ██ █ ██ █◢█◤ █◣◢█ █ ██ █◣ █
█ ██ █ ██ █ ██◤ ████ █ ██ ██◣█ @ ptt.cc
███◤ █ ██ █ ██◣ █◥◤█ ████ ████
█◥█◣ █ ██ █ ██ █◥█◣ █ █ █ ██ █◥██ 鸦片(Append)
█ ◥█ ◥██◤ ◥██◤ █ ◥█ █ █ █ ██ █ ◥█twitch.tv/append
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.127.47.181 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Chat/M.1723478218.A.684.html
※ Append:转录至看板 Rockman 08/12 23:57
1F:推 tv1239: 推详细记录 08/13 00:02
2F:推 aegius1r: 推 08/13 00:03
3F:推 TohmaMiyuki: push 08/13 00:04
4F:→ hirokifuyu: 推 鸦片辛苦了 08/13 00:05
5F:推 ninnyshadow: 推一下 根本是论文等级了 08/13 00:06
6F:推 pbkfss: 推,光看这篇文就辛苦了 08/13 00:11
7F:推 dogluckyno1: 推论文 08/13 00:12
8F:推 fuhu66: 推 08/13 00:13
9F:推 cactus44: 化学系弄这个太痛苦了的吧w 08/13 00:15
10F:推 OSDim: interesting... 08/13 00:17
11F:推 f78507851: 上ptt 看这让我头好疼 08/13 00:19
12F:推 inte629l: 推 08/13 00:19
13F:推 XFarter: 大推 整个Teardown 还把所有过程留下来真的是勇者 08/13 00:22
14F:推 gully: 好耶 08/13 00:22
15F:推 Darkmatt: 推 08/13 00:26
16F:推 LADKUO56: 前一阵子就有看到RMMH的文了 这边再推一下 08/13 00:26
17F:推 forsakesheep: 推,馆长的影片我还看得懂,这篇真的不行 08/13 00:26
18F:→ LADKUO56: 不过看到这防盗机制 这样才知道为什麽小时候电脑课 08/13 00:26
19F:→ LADKUO56: 玩的磁片X1会一直卡在序关XD 08/13 00:27
20F:推 KRSmp: 这个真的是论文等级的,只能跪了,感谢诸位辛苦研究的大大 08/13 00:29
21F:推 vsmk3: 研究到这麽透彻真的是让人佩服 只能推 08/13 00:31
22F:推 Fino5566: 长期受您照顾了,以前玩洛克人最爱看馆里的研究文 08/13 00:34
23F:→ Fino5566: 轶事传闻小故事也很有趣 比从游戏本身得到的乐趣还多 08/13 00:35
欸,你可能误会了,我并不是RMMH馆主,馆主叫做艾克轧德(XGOD),
在这篇文章我有多次提到他。我提到的影片确实是他的频道的影片。
24F:推 RoaringWolf: 这是在写论文吧 08/13 00:38
※ 编辑: Append (59.127.47.181 台湾), 08/13/2024 00:40:47
25F:推 cleverjung: 先推 08/13 00:52
26F:→ eva05s: 哇这验证太猛了 08/13 00:55
27F:推 chshsnail: 我只知道以前电脑大补帖里面的X1打到公路关被霸法就会 08/13 00:57
28F:→ chshsnail: 直接卡住 08/13 00:57
29F:推 eva05s: 补推 08/13 00:58
30F:推 jeff666: 太神啦 08/13 01:04
31F:推 RandyAAA: 不知道老卡当年的STAFF看到两位的研究会有什麽感想 08/13 01:14
32F:推 aaaaagw: 超强!推一下玩弄机制! 08/13 01:17
33F:推 avans: 看不完,不过先推了 08/13 01:30
34F:推 sakabato: 推,21年看过一次,想不到你後面做的更精采,连mapping 08/13 01:31
35F:→ sakabato: 都翻出来了 08/13 01:31
36F:推 llabc1000: 哇喔 08/13 01:36
37F:推 sword10723: 论文级的研究,真的很有爱,大推 08/13 01:37
38F:推 JMLee: 专业推 08/13 01:57
39F:推 silveryiris: 先推再说 08/13 02:59
40F:推 lunaX19: 推 但看不懂 08/13 03:00
41F:推 jasonchangki: 预防性朝圣,原来小时候遇到的情况是防盗 08/13 03:03
42F:推 danny10173: 太长了,我没看完。用心推 08/13 03:36
43F:推 devilhades: 推 08/13 04:37
44F:推 kyle6506: 没看完但给认真推 08/13 05:15
45F:推 moma8: 很酷的设计 08/13 06:19
46F:推 kuff220: 强… 08/13 06:30
47F:推 WindSucker: top player 08/13 06:38
48F:推 wahaha2005: 未看先推 08/13 06:55
49F:推 lee27827272: 推鸦片大 08/13 07:02
50F:推 your025: 推 08/13 07:10
51F:推 v86861062: 酷酷的知识增加了 08/13 07:11
52F:推 emulators: 我是不是该说一声生日快乐? 08/13 07:17
53F:→ emulators: 啊今天13了不是12,所以是迟到的生日快乐 08/13 07:17
谢。这真没办法,我这篇真的是压线赶在最後一刻才写完的...
54F:推 howtotell: 完全看不懂但真心佩服你的研究精神 08/13 07:42
55F:推 janfat: 完全看不懂但还是要推… 08/13 07:53
56F:推 Issarc0721: 感觉内容很硬,先推,有空再来啃 08/13 08:32
57F:推 henry46277: 推 08/13 08:52
58F:推 Catwaterfall: 推 08/13 08:54
59F:推 SangoGO: 推 08/13 09:07
60F:推 Deparic: 我还以为我错板 08/13 09:15
61F:推 g020488854: 论文推 08/13 09:16
62F:推 hayate1143: 推,完全看完了 08/13 09:17
63F:推 dzes916603: 推 08/13 09:48
64F:推 jaspergod: 好猛 推 08/13 10:03
65F:→ nisioisin: 太长 纯推不看 08/13 10:19
※ 编辑: Append (59.127.47.181 台湾), 08/13/2024 10:44:26
66F:推 FeiYue: 推论文 没想到过了那麽多年1.0J还能玩出新东西 08/13 10:49
67F:推 r60214: 谢谢分享 虽然看不懂.. 08/13 12:38
68F:推 NicoNeco: 强 08/13 12:48
69F:推 UshioKai: 当年卡社工程师到底吃了什麽搞出这麽多花样 怕 08/13 15:14
70F:推 mizukami: O-o 08/14 17:10
71F:推 user1120: 推 08/15 23:56