|
超任磁碟机博士系列金手指代码完全解析 , T U: z4 [2 X1 `3 W: t1 y
; T; h. [* t+ a$ l' t玩家都应该知道甚至熟悉超任游戏机,在那个年代,有经济实力购买正版卡带的人不是很多,大多数人接触超任是从游戏厅里的磁碟机开始的,这其中香港邦谷公司推出博士系列磁碟机市场占有率最高,还可连接光盘驱动器(另选购),也可连接电脑传输ROM、存档等等;此机器还支持金手指修改游戏、即时存档、慢动作等附加功能,在众多磁碟机之中,可谓是极具竞争力。! v( H2 \% N9 v+ R: a8 A/ ]
转眼十多年过去了,超任早已退出历史舞台,不知道有多少人能真正了解陪伴了自己无数个不眠之夜的游戏机呢?本文就为大家详细解析博士系列的金手指功能。% B! ?: h3 d9 E: ~
首先介绍一下金手指码的构成:2 B* |' ^6 b1 P* P9 T& M/ K
例如,
( V& X! l% }$ m( h6 v) R9 M4 [第四次机器人大战4:# E0 N" C: F- h% {4 K$ i4 ?2 s
无限金钱:9 f9 u& }/ _) ?9 D; J* b" O
04620 EAEA8D 67 0
6 w6 A! Y$ T2 X+ R博士系列的金手指码由5部分构成:
9 T5 E. u5 p1 M前5位 :04620:要修改的ROM数据地址
. j7 U. n2 i! T中间6位:EAEA8D:要修改的数据,每2位1字节,一条金手指一次可修改3字节数据7 Z: C! Y+ x' }% w
后2位 :67:金手指码的校验和6 t' @( k( n2 L8 d
最后1位:0:功能代码,为0表示修改ROM,为1表示修改SRAM, k5 O2 \; t- S7 t) m" q9 y0 c, I
看到这里有同学就会问了:
; Y, Y0 W: k1 ]6 lQ:你不是说由5部分组成么?前4部分已经把14位金手指码全包括了,那么第五部分在哪儿呢?* E. `* D8 l+ e: G; ]6 D0 B: b
A:请各位先看张图:
$ J& L9 h) a" w/ V* B/ [2 ^1 y4 i8 }& G
图中画红圈的地方就是金手指码的第五部分,很重要,但是似乎所有人都把它忽略了,博士的说明书中也没有提及与金手指相关的内容。这第5部分就是指示内存分区的标识,你可以用手柄的X、Y键改变箭头所指的分区,我把它命名为Slot Code。: l7 D5 V5 p6 z3 `6 c y- u" G
下面开始详细分析:9 p+ S" m- N0 g+ Y; o4 R
1.地址:; R6 F. t( ~, J2 f
地址码为5位,20BIT宽。说到这里,了解超任硬件的同学会有疑问了:
0 w# J7 b7 e }: D; p) T7 V. `! E# JQ:超任主机地址总线宽度为24Bit,最大可寻址16MByte内存空间,而金手指码地址却只有20Bit,只能寻址1MByte,这不是很失败的设计么?如果我要修改超过1M的地址怎么办?
5 T# D+ W' Z: X! G6 ?A:博士的金手指地址码是经过编码的,要与Slot Code一起来实现24Bit寻址。我看了很多磁碟机介绍文章,以及支持金手指码的ZSNESW的源代码,发现人们都是把金手指的地址当作20Bit来处理,这是不完全正确的。
7 Z5 E- _+ y7 |7 T; E$ f到这里不得不提及游戏ROM的类型:
4 L% K% Z$ O; O+ w6 p0 r游戏的ROM类型分为HIROM、LOROM、ExHIROM、ExLOROM;- ?8 e7 h' Z. v: C- m$ v, k
HI、LOROM最大为4mbyte,绝大多数游戏属于这两类;ExHI、ExLoROM可大于4Mb,比如幻想传说(Tales Of Fantasia) 就是ExHiROM,容量为48M(6Mbyte)。
7 v" z* M* |# P0 |: Q1.1地址的解码:
3 W: f6 I9 U5 _4 o0 d前面说过,金手指需要与Slot配合才能访问全部ROM地址,其对应关系是:& L; Z: n; X& p
如果一个金手指码未指定修改哪区,那通常就指修改A区1 J+ p' J: B! z" s2 h( q: Y& M0 t
情况1:ROM=HIROM,Slot Code=A:
7 j& U# Q4 L) n" U; B) O地址指向的是ROM的每64K的后32K,0x??8000~0x??FFFF(比如地址码=00000,访问的ROM地址就是0x008000)5 f3 Y! ^& D7 I8 L1 P4 G
范围0x008000~0x1FFFFF。5 I5 e$ k9 c) j6 l; A; M6 N8 Q
情况2:ROM=HIROM,Slot Code=B:# q6 Q3 \) w& A+ D/ x/ v9 D% i
与情况1类似,但地址加上0x200000(范围0x208000~0x3FFFFF)6 k; }' ]) j+ c& C2 ^
情况3:ROM=HIROM,Slot Code=C:
3 e: l* W- j! V! R- |( B5 u% _5 D地址指向的是ROM的每64K的前32K,0x??0000~0x??7FFF,范围0x000000~1F7FFF8 d e* K' F* D+ \+ T1 D
情况4:ROM=HIROM,Slot Code=D:; f. ~ R; I: Q" ]7 y0 F
与情况3类似,但地址加上0x200000 范围0x207FFF~0x3F7FFF0 Q* @, N* D0 o2 P2 ^+ @2 ]
情况5:ROM=LOROM5 |8 ?6 u$ g% s2 a
这时地址是线性的20Bit地址,Slot Code=A:范围0x000000~0x0FFFFF,Slot Code=B:范围0x100000~1FFFFF,依次类推
T. O" N7 p6 t: k6 d, G- c) Z如果游戏ROM不超过16M(2Mb),那么只有A和B区可用,修改B区的情况跟大于16M时修改C区相同。# A- D0 ?% R1 s8 H' h! q
经过解码过程,我们就得到了金手指码的真实ROM地址,有了这个地址,我们就可以把修改数据直接写入到游戏ROM镜像里,或者转换为PAR码(Pro Action Replay码,另一种金手指,可以用在模拟器中)。4 ]7 I" Q/ ]' I. [+ c
注意这样得到的ROM地址是不包括ROM信息头的地址,博士系列的游戏ROM(比如sf24046A)都带有512字节的信息头,在这样的ROM上,计算得出的地址还要加上0x200才是真实ROM地址。
! _, v1 y0 V/ l1 V( W/ V- P8 A2.数据. ]% Y" S) b& Q, B' L( }: x( v
每条金手指包含修改数据最多为3字节,也可以只包含1字节(不需要修改的位置输入‘X’),甚至可以不包含数据(数据全为‘X’),此时如果输入并确定的话,你会看到这个地址的当前值。' i4 j. J4 n, P$ l
3.校验和
; l8 O0 ?6 b1 ~, B. n校验和是用来检验一条金手指码是否合法,算法是:
( C% o& ~' e+ q( {! Q! F5位地址前面加0补齐为6位,然后按顺序将地址和数据按字节相加,比如上面的金手指码:: \1 U5 @; u6 q3 C
00+46+20+ea+ea+8d=2c7
/ S D3 h- i( p* J& u得到的和再减去0x160,再和0xFF做按位与运算
! ?1 E7 b* z- g9 i0x2c7-0x160=0x167; T5 C+ `; z9 C9 B7 x
0x167 AND 0xFF=0x67% J) Z; r0 A; f
这就计算出了校验和,与金手指中的校验和比较,如果相等,则是有效的金手指码。
. P ]: r6 D3 [/ s7 T6 H. H4.功能代码
' U q. p, f, v4 b9 j如果为0表示修改游戏ROM,为1表示修改游戏存档SRAM。
! i" b7 ^4 Q& }. ~) K8 o& R因为所有带有SRAM的游戏都会校验数据的校验和,所以不存在通用的修改存档的金手指码,如果你改变了存档中的1个字节,校验和就会发生变化,游戏就会认为存档已经损坏不会读取。所以要想修改SRAM,首先要弄清楚校验和的位置,并在修改数据后对校验和补正,不然就会损坏存档。所以这个功能操作性不强,需要玩家有一定基础。! L" l5 V) U* Y( }
5.Slot Code1 w; O" V$ `0 b# S8 |9 J. \' m
这是个隐藏参数,不存在于金手指码中,但是没有它金手指码便无法使用,如果你查到一个金手指码并没有指定修改哪个区,那很可能就是修改A区(Slot Code=A),如果无效,可能这个金手指码不是为博士系列编写的,有些磁碟机也支持金手指码,但实现方式却不相同,比如龙2、金霸王磁碟机,通常只有LOROM游戏的金手指码有效(因为LOROM的地址在磁碟机上为线性),而且只能访问前1M的位置。
. l% B8 `" N4 Y! @1 l& I3 q' b6.ROM类型2 M |" y* Y8 X: ?; V
Q:现在我知道了ROM类型对于计算地址非常重要,那么如何知道一个ROM是什么类型呢?
' W1 ?- p6 G5 ~A:可以利用ROM工具或模拟器查看,用Snes9x载入ROM后会显示是何种类型;用Ucon64、NSRT 也可查看,这两个工具是控制台程序,用ROM文件名作为参数运行,程序就会返回ROM信息。7.总结3 G8 p( e% m" j$ c" G$ c* `
一条完整的金手指应该以下列形式表示# w$ [7 z+ i4 `6 }+ l
AAAAADDDDDDCCF@S6 P( ?! S# M% J/ d
A=地址,D=数据,C=校验和,F=功能码,S=Slot Code$ F6 o3 v/ G: u8 K
由于超任主机的复杂性,并不是所有游戏ROM映射方式都是标准的HI、LOROM,但数量较少,对于这样的游戏,金手指可能无法正常工作,因为ROM映射方式不同,还有带有特殊芯片的游戏金手指也不会工作。
# v: J9 @( e: P3 i9 g+ ]" X) k5 `具体的地址转换方法:1 S1 n; A$ _/ }
switch(mapper) {
; x& R8 t! U6 x p case LoROM: {! P4 R. }8 i# \$ W7 v9 z
addr = ((addr & 0x7f8000) << 1) + 0x8000 + (addr & 0x7fff);& r( M8 K$ \3 V$ f% O0 E
} break;
[6 f; V8 W' H2 H# k' ~
* `& p4 ^2 b8 ]" m& \case HiROM: {& J5 `5 [ L" u' L, K7 d
addr = 0xc00000 + (addr & 0x3fffff);6 |0 R/ f5 B# O, k! ?6 O
} break;& K8 _) ?5 X2 _' n: a! x
}3 R: o2 p; d% M8 v' J7 u7 ]
eturn addr;
) x; I3 \8 q" B8 M. ~$ P- W+ s金手指码的功能是软件实现,只能修改ROM,对于运行时数据(WorkRam)的内容是无能为力的,所有7E、7F开头的PAR金手指码从原理上就不可能转换为金手指码。
* H4 k- n) _" S3 |) k' V. `8 E& r8.后记( O* b+ t& g1 o' V; h
超任磁碟机早已淡出了历史舞台,这篇迟到了近20年的研究成果还有没有人在意呢?; [1 s+ n4 Y* X7 a S& r
) J- @* V# j& B4 ^) ?1 r/ U; i5 R& L |