|
超任磁碟机博士系列金手指代码完全解析
. x6 W; I, y7 A, W, C* w; h; i) A L3 j4 W
玩家都应该知道甚至熟悉超任游戏机,在那个年代,有经济实力购买正版卡带的人不是很多,大多数人接触超任是从游戏厅里的磁碟机开始的,这其中香港邦谷公司推出博士系列磁碟机市场占有率最高,还可连接光盘驱动器(另选购),也可连接电脑传输ROM、存档等等;此机器还支持金手指修改游戏、即时存档、慢动作等附加功能,在众多磁碟机之中,可谓是极具竞争力。) R, H% N$ u/ _, m4 h
转眼十多年过去了,超任早已退出历史舞台,不知道有多少人能真正了解陪伴了自己无数个不眠之夜的游戏机呢?本文就为大家详细解析博士系列的金手指功能。8 d- i0 \/ k$ `! V
首先介绍一下金手指码的构成:: D1 b# e P: X/ D
例如,8 n2 \- ]" N4 t0 ^
第四次机器人大战4:
: G+ h0 U1 v8 X无限金钱:
: K! b/ A- J! ]- Z) S/ L04620 EAEA8D 67 0* E; _6 W) \7 m% C# e1 Q7 W7 E2 \
博士系列的金手指码由5部分构成:
1 T9 {: K7 ^5 |2 h前5位 :04620:要修改的ROM数据地址7 ^( M- Y' I& q8 \0 R: M
中间6位:EAEA8D:要修改的数据,每2位1字节,一条金手指一次可修改3字节数据
$ e+ U: K; q4 X S; S5 w9 V后2位 :67:金手指码的校验和
# a9 {3 H7 H1 |最后1位:0:功能代码,为0表示修改ROM,为1表示修改SRAM' v3 f0 G9 a$ q: K! R0 E1 t
看到这里有同学就会问了:
( \8 f) O0 `! l3 m4 F& [Q:你不是说由5部分组成么?前4部分已经把14位金手指码全包括了,那么第五部分在哪儿呢?
8 ?* }* M" f- V4 {* ]. JA:请各位先看张图:( t5 R2 J, D8 B" \7 }
3 ?% C6 |; X) V5 w" }
图中画红圈的地方就是金手指码的第五部分,很重要,但是似乎所有人都把它忽略了,博士的说明书中也没有提及与金手指相关的内容。这第5部分就是指示内存分区的标识,你可以用手柄的X、Y键改变箭头所指的分区,我把它命名为Slot Code。
\! h0 D$ @& B9 y* [6 U下面开始详细分析:
$ {( } g/ P4 U' q' ~1.地址:
. E4 j V# m- V, P6 G3 @7 W地址码为5位,20BIT宽。说到这里,了解超任硬件的同学会有疑问了:
: e; `3 e2 d! }+ p6 A! PQ:超任主机地址总线宽度为24Bit,最大可寻址16MByte内存空间,而金手指码地址却只有20Bit,只能寻址1MByte,这不是很失败的设计么?如果我要修改超过1M的地址怎么办? p F9 L" I! F: T% x
A:博士的金手指地址码是经过编码的,要与Slot Code一起来实现24Bit寻址。我看了很多磁碟机介绍文章,以及支持金手指码的ZSNESW的源代码,发现人们都是把金手指的地址当作20Bit来处理,这是不完全正确的。9 V0 u/ a5 N. S
到这里不得不提及游戏ROM的类型:
5 Y9 n/ x( r* B游戏的ROM类型分为HIROM、LOROM、ExHIROM、ExLOROM;
4 {: s$ m: y6 q* I. P) K/ F* O+ IHI、LOROM最大为4mbyte,绝大多数游戏属于这两类;ExHI、ExLoROM可大于4Mb,比如幻想传说(Tales Of Fantasia) 就是ExHiROM,容量为48M(6Mbyte)。
1 r- H2 h: _* I1.1地址的解码:4 o1 a1 I) F* m3 W& k$ Q; C# ~& z P
前面说过,金手指需要与Slot配合才能访问全部ROM地址,其对应关系是:4 v0 K$ f( F* H0 V! c, a. G3 m
如果一个金手指码未指定修改哪区,那通常就指修改A区
0 q4 Q, J# o) ^+ T3 W- a& v: l# y情况1:ROM=HIROM,Slot Code=A:
- \- P4 S0 w" y- A( B" E地址指向的是ROM的每64K的后32K,0x??8000~0x??FFFF(比如地址码=00000,访问的ROM地址就是0x008000)* m0 o3 O5 k' F
范围0x008000~0x1FFFFF。
6 i2 f% K Q' d! l情况2:ROM=HIROM,Slot Code=B:+ K$ q8 `8 K7 |( L) W
与情况1类似,但地址加上0x200000(范围0x208000~0x3FFFFF)
1 {+ N# m/ I. @+ y情况3:ROM=HIROM,Slot Code=C:# E( A" R8 m& V$ Y1 s5 {
地址指向的是ROM的每64K的前32K,0x??0000~0x??7FFF,范围0x000000~1F7FFF E5 d6 A2 z) [5 H- @2 R: S
情况4:ROM=HIROM,Slot Code=D:4 e9 _( C& p5 q! b" T2 i( t8 _
与情况3类似,但地址加上0x200000 范围0x207FFF~0x3F7FFF
" R# | J) f6 d- D% ]8 q" z/ s! ^情况5:ROM=LOROM
5 |0 Z' e1 M1 ^/ i" Y: o% c这时地址是线性的20Bit地址,Slot Code=A:范围0x000000~0x0FFFFF,Slot Code=B:范围0x100000~1FFFFF,依次类推# p# |- j1 D6 K& A% M: X9 I" w
如果游戏ROM不超过16M(2Mb),那么只有A和B区可用,修改B区的情况跟大于16M时修改C区相同。
u5 j) o. {3 ^( Q6 r" h E经过解码过程,我们就得到了金手指码的真实ROM地址,有了这个地址,我们就可以把修改数据直接写入到游戏ROM镜像里,或者转换为PAR码(Pro Action Replay码,另一种金手指,可以用在模拟器中)。
/ T! g6 @3 G3 ]! v: b+ l' B0 Z注意这样得到的ROM地址是不包括ROM信息头的地址,博士系列的游戏ROM(比如sf24046A)都带有512字节的信息头,在这样的ROM上,计算得出的地址还要加上0x200才是真实ROM地址。
: O4 [8 Q, r! P( W+ J1 _2.数据
$ ^' z$ X/ v; D) e- D( S5 P, I每条金手指包含修改数据最多为3字节,也可以只包含1字节(不需要修改的位置输入‘X’),甚至可以不包含数据(数据全为‘X’),此时如果输入并确定的话,你会看到这个地址的当前值。7 E) E3 k7 W' K6 L3 B
3.校验和" r0 ~1 I) U- s$ G! Q3 e
校验和是用来检验一条金手指码是否合法,算法是:3 [/ o3 V4 j! c5 o9 z
5位地址前面加0补齐为6位,然后按顺序将地址和数据按字节相加,比如上面的金手指码:) J! K, z5 Y( I. S% @
00+46+20+ea+ea+8d=2c7; C/ \. e" v* V" @2 w0 W
得到的和再减去0x160,再和0xFF做按位与运算
, N) S9 Q+ t8 w# @2 ^3 e0x2c7-0x160=0x167
i: x7 f4 h) z+ {7 x0 k1 p1 h5 a- f D0x167 AND 0xFF=0x67
; t( Q1 O$ u# c这就计算出了校验和,与金手指中的校验和比较,如果相等,则是有效的金手指码。0 y; q- I/ {& ^0 `- p F: F
4.功能代码
8 x2 a2 s+ x" T7 u* G r5 o如果为0表示修改游戏ROM,为1表示修改游戏存档SRAM。& c3 F7 J1 p( Y! s. N. R% {
因为所有带有SRAM的游戏都会校验数据的校验和,所以不存在通用的修改存档的金手指码,如果你改变了存档中的1个字节,校验和就会发生变化,游戏就会认为存档已经损坏不会读取。所以要想修改SRAM,首先要弄清楚校验和的位置,并在修改数据后对校验和补正,不然就会损坏存档。所以这个功能操作性不强,需要玩家有一定基础。: D2 x% z9 n' Z3 R# g" u
5.Slot Code* i% h0 I2 E4 t. a4 k; v, J2 x& D
这是个隐藏参数,不存在于金手指码中,但是没有它金手指码便无法使用,如果你查到一个金手指码并没有指定修改哪个区,那很可能就是修改A区(Slot Code=A),如果无效,可能这个金手指码不是为博士系列编写的,有些磁碟机也支持金手指码,但实现方式却不相同,比如龙2、金霸王磁碟机,通常只有LOROM游戏的金手指码有效(因为LOROM的地址在磁碟机上为线性),而且只能访问前1M的位置。; e6 V: n* ]& e' T
6.ROM类型
( x' B0 p5 ]. v+ e1 A P) o3 ?Q:现在我知道了ROM类型对于计算地址非常重要,那么如何知道一个ROM是什么类型呢?
6 ^; _5 r+ ^, x4 |. OA:可以利用ROM工具或模拟器查看,用Snes9x载入ROM后会显示是何种类型;用Ucon64、NSRT 也可查看,这两个工具是控制台程序,用ROM文件名作为参数运行,程序就会返回ROM信息。7.总结
/ v8 `8 C$ s+ m% l7 }2 H8 ?一条完整的金手指应该以下列形式表示8 W$ c9 i4 @+ [8 j5 _5 f
AAAAADDDDDDCCF@S
# f& ?4 T+ \$ q( |1 c9 R: C; ~A=地址,D=数据,C=校验和,F=功能码,S=Slot Code
+ g- o, n5 Y$ y: I' q由于超任主机的复杂性,并不是所有游戏ROM映射方式都是标准的HI、LOROM,但数量较少,对于这样的游戏,金手指可能无法正常工作,因为ROM映射方式不同,还有带有特殊芯片的游戏金手指也不会工作。
/ m* F* u7 ?6 e! J' Z: I9 d2 @% O具体的地址转换方法:
! C8 l& O( h& @switch(mapper) {
4 O2 [3 D5 ?) F case LoROM: {
/ o5 a. [( e; X* d3 j1 D8 u addr = ((addr & 0x7f8000) << 1) + 0x8000 + (addr & 0x7fff);% a# F1 F. m. z
} break;
4 s. I5 i' ^3 M
4 T1 f9 T% u `2 Y( a1 N( icase HiROM: {
# _7 m' W- L! }: v- f. a2 K1 B( ^ addr = 0xc00000 + (addr & 0x3fffff);0 l# h% o& A) }0 F
} break;& A/ {6 o1 z* N; `
}( o& t2 P) q4 ]2 Q
eturn addr;
. z% E% U7 E2 g' F( N. e* V- ?金手指码的功能是软件实现,只能修改ROM,对于运行时数据(WorkRam)的内容是无能为力的,所有7E、7F开头的PAR金手指码从原理上就不可能转换为金手指码。1 J4 W* c3 c) W/ O3 G
8.后记
$ ^" Q8 q) Q8 q# Y超任磁碟机早已淡出了历史舞台,这篇迟到了近20年的研究成果还有没有人在意呢?9 Q" g( I8 f3 T0 r4 |% \, j
/ v6 w( N0 L1 H' j% k8 B. x
|