|
超任磁碟机博士系列金手指代码完全解析
/ L0 A. O) ]4 T4 @8 T: O4 r9 z
G! ?, J `! M6 ?4 o+ P玩家都应该知道甚至熟悉超任游戏机,在那个年代,有经济实力购买正版卡带的人不是很多,大多数人接触超任是从游戏厅里的磁碟机开始的,这其中香港邦谷公司推出博士系列磁碟机市场占有率最高,还可连接光盘驱动器(另选购),也可连接电脑传输ROM、存档等等;此机器还支持金手指修改游戏、即时存档、慢动作等附加功能,在众多磁碟机之中,可谓是极具竞争力。
( \! B c5 A I' {8 \2 @转眼十多年过去了,超任早已退出历史舞台,不知道有多少人能真正了解陪伴了自己无数个不眠之夜的游戏机呢?本文就为大家详细解析博士系列的金手指功能。# T7 x, f0 l' d8 d9 [5 e: A* Y# W
首先介绍一下金手指码的构成:: W0 v) J5 N# O9 h# f) H) l
例如,
4 X6 f3 h6 j+ B& Q5 D第四次机器人大战4:$ e; A1 ?+ m. k9 ?
无限金钱:; |2 @' S4 {* v
04620 EAEA8D 67 0
6 C P1 v5 l7 \- N+ Q8 Q博士系列的金手指码由5部分构成:& ~6 c. q" A1 ^2 I/ l/ {
前5位 :04620:要修改的ROM数据地址
8 U0 K# Y+ e% N. }1 i! f中间6位:EAEA8D:要修改的数据,每2位1字节,一条金手指一次可修改3字节数据; y+ E) ^% ^8 r$ D& \/ N
后2位 :67:金手指码的校验和
2 s' ^( Z. y C最后1位:0:功能代码,为0表示修改ROM,为1表示修改SRAM# `0 o, @( r$ T6 J- ]- {2 d' b
看到这里有同学就会问了:; u2 x$ ]2 g8 l1 C, R
Q:你不是说由5部分组成么?前4部分已经把14位金手指码全包括了,那么第五部分在哪儿呢?+ J0 d6 B3 l% ^; b8 j
A:请各位先看张图:, h7 p: G2 @0 g8 @& e4 u9 O
, u" w! Z9 j# e. v7 t% M9 K& N图中画红圈的地方就是金手指码的第五部分,很重要,但是似乎所有人都把它忽略了,博士的说明书中也没有提及与金手指相关的内容。这第5部分就是指示内存分区的标识,你可以用手柄的X、Y键改变箭头所指的分区,我把它命名为Slot Code。+ |; ]/ ?5 o* m e
下面开始详细分析:0 k4 B8 U0 q% {0 _- ?- n. i# Z
1.地址:
2 h, k7 F- Z4 q- ? A6 P) X地址码为5位,20BIT宽。说到这里,了解超任硬件的同学会有疑问了:
! b% Z: y) T" K" X1 J+ kQ:超任主机地址总线宽度为24Bit,最大可寻址16MByte内存空间,而金手指码地址却只有20Bit,只能寻址1MByte,这不是很失败的设计么?如果我要修改超过1M的地址怎么办?
/ \7 O: j8 j4 J4 cA:博士的金手指地址码是经过编码的,要与Slot Code一起来实现24Bit寻址。我看了很多磁碟机介绍文章,以及支持金手指码的ZSNESW的源代码,发现人们都是把金手指的地址当作20Bit来处理,这是不完全正确的。: N" W1 v9 p' d
到这里不得不提及游戏ROM的类型:
/ j0 n/ Q% F5 _$ i1 M' r9 c游戏的ROM类型分为HIROM、LOROM、ExHIROM、ExLOROM;
* _1 n2 Z3 m4 G# n8 k, h% ?) \( DHI、LOROM最大为4mbyte,绝大多数游戏属于这两类;ExHI、ExLoROM可大于4Mb,比如幻想传说(Tales Of Fantasia) 就是ExHiROM,容量为48M(6Mbyte)。
# X" l, \" P- ~; Z9 G2 Y1.1地址的解码:
3 c# K+ \- U! i6 |) Z1 l/ o前面说过,金手指需要与Slot配合才能访问全部ROM地址,其对应关系是:9 c' S5 Z j1 @
如果一个金手指码未指定修改哪区,那通常就指修改A区1 z7 V/ n7 t, m5 ` h
情况1:ROM=HIROM,Slot Code=A:
. R2 V# U& ?8 B( w3 ^- q地址指向的是ROM的每64K的后32K,0x??8000~0x??FFFF(比如地址码=00000,访问的ROM地址就是0x008000)! r" c h1 _6 S c
范围0x008000~0x1FFFFF。
( b4 s# f7 T6 j' J情况2:ROM=HIROM,Slot Code=B:
) O8 E7 E/ f4 } V& p与情况1类似,但地址加上0x200000(范围0x208000~0x3FFFFF)- F$ A6 T$ |/ D( w1 E
情况3:ROM=HIROM,Slot Code=C:" n5 ?0 W) C& n: w7 z; o9 \! ?
地址指向的是ROM的每64K的前32K,0x??0000~0x??7FFF,范围0x000000~1F7FFF
: b& H1 k( e$ [/ R$ g情况4:ROM=HIROM,Slot Code=D:' \: J& k9 A/ }( P
与情况3类似,但地址加上0x200000 范围0x207FFF~0x3F7FFF
- I9 z. f6 U8 _6 w$ M情况5:ROM=LOROM
4 w4 Z0 C7 [9 y9 i这时地址是线性的20Bit地址,Slot Code=A:范围0x000000~0x0FFFFF,Slot Code=B:范围0x100000~1FFFFF,依次类推
]+ e" O8 g; A9 `* t) k如果游戏ROM不超过16M(2Mb),那么只有A和B区可用,修改B区的情况跟大于16M时修改C区相同。5 l7 Q. I7 F" B9 n0 h0 H
经过解码过程,我们就得到了金手指码的真实ROM地址,有了这个地址,我们就可以把修改数据直接写入到游戏ROM镜像里,或者转换为PAR码(Pro Action Replay码,另一种金手指,可以用在模拟器中)。+ m( i6 o6 Y9 g; y0 a& K
注意这样得到的ROM地址是不包括ROM信息头的地址,博士系列的游戏ROM(比如sf24046A)都带有512字节的信息头,在这样的ROM上,计算得出的地址还要加上0x200才是真实ROM地址。
. I) o. G! o: a2 i- {6 \2.数据
2 k/ A8 ?6 U) ]# [每条金手指包含修改数据最多为3字节,也可以只包含1字节(不需要修改的位置输入‘X’),甚至可以不包含数据(数据全为‘X’),此时如果输入并确定的话,你会看到这个地址的当前值。" I2 I2 `+ c; U! {- N
3.校验和. k" W. U) j. R) H9 y
校验和是用来检验一条金手指码是否合法,算法是:
7 k; |# D6 j( [3 N* q5位地址前面加0补齐为6位,然后按顺序将地址和数据按字节相加,比如上面的金手指码:
; w3 Q8 k, d2 u! t( M00+46+20+ea+ea+8d=2c7
% [ W6 E7 Y; w( W得到的和再减去0x160,再和0xFF做按位与运算
, {# X# g" s6 r7 N: }9 p7 ~3 _0x2c7-0x160=0x167' b. A% G) i" k/ j
0x167 AND 0xFF=0x67- o, w6 L- ~7 H' d
这就计算出了校验和,与金手指中的校验和比较,如果相等,则是有效的金手指码。
* Z" _+ V4 q, K9 j( R) E: C4.功能代码: ]9 H" V% A1 Q, a- S' I
如果为0表示修改游戏ROM,为1表示修改游戏存档SRAM。$ t: O; p L& _5 X6 F/ y* c; k
因为所有带有SRAM的游戏都会校验数据的校验和,所以不存在通用的修改存档的金手指码,如果你改变了存档中的1个字节,校验和就会发生变化,游戏就会认为存档已经损坏不会读取。所以要想修改SRAM,首先要弄清楚校验和的位置,并在修改数据后对校验和补正,不然就会损坏存档。所以这个功能操作性不强,需要玩家有一定基础。
3 S+ [# e+ c5 A) C( k, I5.Slot Code7 D2 R7 O. r- x! w
这是个隐藏参数,不存在于金手指码中,但是没有它金手指码便无法使用,如果你查到一个金手指码并没有指定修改哪个区,那很可能就是修改A区(Slot Code=A),如果无效,可能这个金手指码不是为博士系列编写的,有些磁碟机也支持金手指码,但实现方式却不相同,比如龙2、金霸王磁碟机,通常只有LOROM游戏的金手指码有效(因为LOROM的地址在磁碟机上为线性),而且只能访问前1M的位置。) o+ ?* |! Y5 Z: `
6.ROM类型( A3 M1 x( y. n
Q:现在我知道了ROM类型对于计算地址非常重要,那么如何知道一个ROM是什么类型呢?
% T1 s: R' x' l B R! O( b0 pA:可以利用ROM工具或模拟器查看,用Snes9x载入ROM后会显示是何种类型;用Ucon64、NSRT 也可查看,这两个工具是控制台程序,用ROM文件名作为参数运行,程序就会返回ROM信息。7.总结) q: V* E$ f) u7 P/ I1 M5 a* @. t
一条完整的金手指应该以下列形式表示6 d- a! h* w6 s2 C H0 ?* R# ]2 D
AAAAADDDDDDCCF@S
. L# q, C: L1 E+ MA=地址,D=数据,C=校验和,F=功能码,S=Slot Code
5 ~) h% T' P# ?; ^1 L由于超任主机的复杂性,并不是所有游戏ROM映射方式都是标准的HI、LOROM,但数量较少,对于这样的游戏,金手指可能无法正常工作,因为ROM映射方式不同,还有带有特殊芯片的游戏金手指也不会工作。8 m0 }- @$ A* `- x% E7 g) H6 T R
具体的地址转换方法:
4 Z+ b; b9 \) h2 {) W5 p% }+ Eswitch(mapper) {
0 r: f v5 P4 F3 j* \* o: f case LoROM: {; ~. D, @! R9 H( E+ O
addr = ((addr & 0x7f8000) << 1) + 0x8000 + (addr & 0x7fff);0 _+ P" b" N6 j [3 P
} break;
, G3 h. o) V, r0 {- |0 t5 [2 t3 Y) C5 j k S! g0 D# V7 X+ W
case HiROM: {" f/ w( F/ {4 p {3 ~
addr = 0xc00000 + (addr & 0x3fffff);7 }1 g, Z$ k3 p# B5 O& N' D/ y
} break;# \$ S: |/ I4 m/ S
}4 W- I. V% ~7 d7 R
eturn addr;+ a/ Z, ?3 t+ m- t
金手指码的功能是软件实现,只能修改ROM,对于运行时数据(WorkRam)的内容是无能为力的,所有7E、7F开头的PAR金手指码从原理上就不可能转换为金手指码。
7 ~4 F! u, y7 Q7 i! E2 S1 [* M8.后记
7 }# O D$ p! E7 e超任磁碟机早已淡出了历史舞台,这篇迟到了近20年的研究成果还有没有人在意呢?! I9 _* N/ d: d7 I/ B
) b4 A( q2 n6 W |