|
超任磁碟机博士系列金手指代码完全解析
$ Y+ L! k+ I& `0 n
5 t3 x+ G! H( i' W玩家都应该知道甚至熟悉超任游戏机,在那个年代,有经济实力购买正版卡带的人不是很多,大多数人接触超任是从游戏厅里的磁碟机开始的,这其中香港邦谷公司推出博士系列磁碟机市场占有率最高,还可连接光盘驱动器(另选购),也可连接电脑传输ROM、存档等等;此机器还支持金手指修改游戏、即时存档、慢动作等附加功能,在众多磁碟机之中,可谓是极具竞争力。
. U. ?- j8 L/ p w% U! k转眼十多年过去了,超任早已退出历史舞台,不知道有多少人能真正了解陪伴了自己无数个不眠之夜的游戏机呢?本文就为大家详细解析博士系列的金手指功能。3 \' o2 W1 a/ k7 }
首先介绍一下金手指码的构成:
& {+ m+ C/ x; ]3 j' S" _例如,; r, i; J- q' f: k- F
第四次机器人大战4:
; X$ x( t! W O; Z/ s$ [无限金钱:0 ]$ V3 @4 E$ u2 q }, o
04620 EAEA8D 67 0
7 X# Z; X4 J, z; S7 t博士系列的金手指码由5部分构成:
$ [- f I" D. S$ D前5位 :04620:要修改的ROM数据地址4 W. y& i4 s; Z
中间6位:EAEA8D:要修改的数据,每2位1字节,一条金手指一次可修改3字节数据
1 T! S9 X3 a6 r# m后2位 :67:金手指码的校验和- G8 d5 V$ Q% l, y, j4 @6 s
最后1位:0:功能代码,为0表示修改ROM,为1表示修改SRAM
1 `; ]8 v) j4 C, N5 f) k看到这里有同学就会问了:
2 h4 ]7 E: o- E! w! RQ:你不是说由5部分组成么?前4部分已经把14位金手指码全包括了,那么第五部分在哪儿呢?% }! ]# ]3 e" b( M+ r' w
A:请各位先看张图:& _, I7 z+ R) j# N
$ r2 r. K" f5 ^$ A
图中画红圈的地方就是金手指码的第五部分,很重要,但是似乎所有人都把它忽略了,博士的说明书中也没有提及与金手指相关的内容。这第5部分就是指示内存分区的标识,你可以用手柄的X、Y键改变箭头所指的分区,我把它命名为Slot Code。
- R7 m2 M0 [# f6 |5 E6 s- a0 j- x下面开始详细分析:
+ y: L% C5 q+ s" f( @1.地址:
: {1 ~1 B! I( f6 h4 K. A! V地址码为5位,20BIT宽。说到这里,了解超任硬件的同学会有疑问了:/ U1 n' T) L' a2 p2 C
Q:超任主机地址总线宽度为24Bit,最大可寻址16MByte内存空间,而金手指码地址却只有20Bit,只能寻址1MByte,这不是很失败的设计么?如果我要修改超过1M的地址怎么办?
8 E( S% ~# c! q3 ]" `A:博士的金手指地址码是经过编码的,要与Slot Code一起来实现24Bit寻址。我看了很多磁碟机介绍文章,以及支持金手指码的ZSNESW的源代码,发现人们都是把金手指的地址当作20Bit来处理,这是不完全正确的。
# G3 C F1 |+ S u' O: ^* n到这里不得不提及游戏ROM的类型:* Q' Y: t+ o0 v
游戏的ROM类型分为HIROM、LOROM、ExHIROM、ExLOROM;
( R, `! R7 `5 bHI、LOROM最大为4mbyte,绝大多数游戏属于这两类;ExHI、ExLoROM可大于4Mb,比如幻想传说(Tales Of Fantasia) 就是ExHiROM,容量为48M(6Mbyte)。8 w) a8 o% D; b, u
1.1地址的解码:
) j8 z2 W# {% y# ~$ H& p前面说过,金手指需要与Slot配合才能访问全部ROM地址,其对应关系是:
2 d+ R# t2 C: E如果一个金手指码未指定修改哪区,那通常就指修改A区% X+ ^& q9 v% R, d" @
情况1:ROM=HIROM,Slot Code=A:" V% ~: k# ^; `" a
地址指向的是ROM的每64K的后32K,0x??8000~0x??FFFF(比如地址码=00000,访问的ROM地址就是0x008000)2 x1 e5 {* @; N8 U& m
范围0x008000~0x1FFFFF。
" D4 P3 {& r2 m9 v* C! t情况2:ROM=HIROM,Slot Code=B:
0 l1 b3 c7 W4 ], Z6 _% C3 x与情况1类似,但地址加上0x200000(范围0x208000~0x3FFFFF) b& e3 V0 x8 [( `, c! R
情况3:ROM=HIROM,Slot Code=C:
Z# ^6 g# c3 r& s G# `地址指向的是ROM的每64K的前32K,0x??0000~0x??7FFF,范围0x000000~1F7FFF+ v, O* V9 e2 O/ P
情况4:ROM=HIROM,Slot Code=D:# j, a7 ?0 n* F; L
与情况3类似,但地址加上0x200000 范围0x207FFF~0x3F7FFF: p- ]( M. u( Z R; @ i
情况5:ROM=LOROM) Q' K$ _% T. t( O3 |+ l4 T
这时地址是线性的20Bit地址,Slot Code=A:范围0x000000~0x0FFFFF,Slot Code=B:范围0x100000~1FFFFF,依次类推
_/ d1 m3 ], P! ~! p4 k3 {如果游戏ROM不超过16M(2Mb),那么只有A和B区可用,修改B区的情况跟大于16M时修改C区相同。8 e4 q6 w g% J Z4 b3 r6 b/ T: i
经过解码过程,我们就得到了金手指码的真实ROM地址,有了这个地址,我们就可以把修改数据直接写入到游戏ROM镜像里,或者转换为PAR码(Pro Action Replay码,另一种金手指,可以用在模拟器中)。
( h& A+ S8 x6 K% }* }7 ]3 N8 P注意这样得到的ROM地址是不包括ROM信息头的地址,博士系列的游戏ROM(比如sf24046A)都带有512字节的信息头,在这样的ROM上,计算得出的地址还要加上0x200才是真实ROM地址。
, ?$ M4 d k$ F9 [) R Z @2.数据9 k8 Q* z. s# R1 d& c
每条金手指包含修改数据最多为3字节,也可以只包含1字节(不需要修改的位置输入‘X’),甚至可以不包含数据(数据全为‘X’),此时如果输入并确定的话,你会看到这个地址的当前值。( ] a7 M( M- D: h b0 G8 j
3.校验和
: H& E, A1 b2 D9 N; }+ g* w: W: j/ G校验和是用来检验一条金手指码是否合法,算法是:
% J% C7 `! k @1 ~5 N5位地址前面加0补齐为6位,然后按顺序将地址和数据按字节相加,比如上面的金手指码:3 [* H S# @& R, Y
00+46+20+ea+ea+8d=2c7
* l) B6 X8 g0 ^得到的和再减去0x160,再和0xFF做按位与运算
8 z! [4 n/ s# q; k( N( Y0x2c7-0x160=0x167
$ }$ [* T% [! ?) T1 _% h0x167 AND 0xFF=0x67
" d7 I- [) h) _, ~3 z这就计算出了校验和,与金手指中的校验和比较,如果相等,则是有效的金手指码。. w) `( M% x, S9 r/ [# ]/ Q$ v3 X
4.功能代码7 k# G# |, a$ o' y! Z( f( G
如果为0表示修改游戏ROM,为1表示修改游戏存档SRAM。
8 L- |8 A$ S" T8 {! g: A- Q, L因为所有带有SRAM的游戏都会校验数据的校验和,所以不存在通用的修改存档的金手指码,如果你改变了存档中的1个字节,校验和就会发生变化,游戏就会认为存档已经损坏不会读取。所以要想修改SRAM,首先要弄清楚校验和的位置,并在修改数据后对校验和补正,不然就会损坏存档。所以这个功能操作性不强,需要玩家有一定基础。! m/ x3 x; u* ^+ _
5.Slot Code
( k' A* X8 p7 Y! L4 O6 w) g/ x5 D) d这是个隐藏参数,不存在于金手指码中,但是没有它金手指码便无法使用,如果你查到一个金手指码并没有指定修改哪个区,那很可能就是修改A区(Slot Code=A),如果无效,可能这个金手指码不是为博士系列编写的,有些磁碟机也支持金手指码,但实现方式却不相同,比如龙2、金霸王磁碟机,通常只有LOROM游戏的金手指码有效(因为LOROM的地址在磁碟机上为线性),而且只能访问前1M的位置。( X3 e" e# j) z8 ?( q
6.ROM类型
) j" D, k4 ]( K2 X% n) c) q k+ `; JQ:现在我知道了ROM类型对于计算地址非常重要,那么如何知道一个ROM是什么类型呢?1 g% p1 g5 @) z! R; k9 i
A:可以利用ROM工具或模拟器查看,用Snes9x载入ROM后会显示是何种类型;用Ucon64、NSRT 也可查看,这两个工具是控制台程序,用ROM文件名作为参数运行,程序就会返回ROM信息。7.总结
7 a3 ~7 q9 f: X' [一条完整的金手指应该以下列形式表示$ F+ g& S' _1 H* M. s; k9 D" D; N: i
AAAAADDDDDDCCF@S
# u W2 T4 F3 n/ l* \A=地址,D=数据,C=校验和,F=功能码,S=Slot Code
# T% a4 E: n) x$ S# i由于超任主机的复杂性,并不是所有游戏ROM映射方式都是标准的HI、LOROM,但数量较少,对于这样的游戏,金手指可能无法正常工作,因为ROM映射方式不同,还有带有特殊芯片的游戏金手指也不会工作。6 k' I6 u# w! B7 K: A% U& n1 }
具体的地址转换方法:
- Y, m3 q) }# A& r, l7 pswitch(mapper) {
* t/ f1 s9 w9 Q: T8 h: ]# ~ case LoROM: {6 D& h0 ]+ y4 P o( [
addr = ((addr & 0x7f8000) << 1) + 0x8000 + (addr & 0x7fff);
0 _- ]. c, p" a- J$ q } break;
5 G! W) m* X5 d9 ^4 L7 Y* y% X8 E7 ^/ z4 }
case HiROM: {
8 L7 F& D2 K$ B& @% X9 Q; n* X addr = 0xc00000 + (addr & 0x3fffff); D/ T6 X6 K, y$ ]5 [4 V
} break;
8 m& h* G7 r; M2 ]* J }
9 @- k, x i @ ^ W/ Qeturn addr;
, K7 E3 {6 h/ U: h' x& w" d金手指码的功能是软件实现,只能修改ROM,对于运行时数据(WorkRam)的内容是无能为力的,所有7E、7F开头的PAR金手指码从原理上就不可能转换为金手指码。
O5 W# q( ~7 v( ^, M8.后记
$ [; i; O) a& ]/ g# }超任磁碟机早已淡出了历史舞台,这篇迟到了近20年的研究成果还有没有人在意呢?* x. b( W9 b$ d
3 F$ O4 A8 O0 R) r, ]
|