超任磁碟机博士系列金手指代码完全解析
?5 B. ?+ z1 _
. d; ~, h7 g( s7 O) [玩家都应该知道甚至熟悉超任游戏机,在那个年代,有经济实力购买正版卡带的人不是很多,大多数人接触超任是从游戏厅里的磁碟机开始的,这其中香港邦谷公司推出博士系列磁碟机市场占有率最高,还可连接光盘驱动器(另选购),也可连接电脑传输ROM、存档等等;此机器还支持金手指修改游戏、即时存档、慢动作等附加功能,在众多磁碟机之中,可谓是极具竞争力。. |$ E9 ?. Q( u" X
转眼十多年过去了,超任早已退出历史舞台,不知道有多少人能真正了解陪伴了自己无数个不眠之夜的游戏机呢?本文就为大家详细解析博士系列的金手指功能。
0 D4 v5 T+ N8 {6 \6 N首先介绍一下金手指码的构成:
! a5 s+ ?0 g) {; W3 W, h% R例如,
0 U$ h% f3 l# i1 H第四次机器人大战4:3 O; q9 f8 @" v) A. `" {
无限金钱:
2 S( x( R) ]% @: t! U: s7 t2 j6 b04620 EAEA8D 67 0
9 E6 ^# D5 S/ t+ |博士系列的金手指码由5部分构成:9 _0 v7 s5 l t: o8 A' Q4 z
前5位 :04620:要修改的ROM数据地址! i; S) m o" K) t2 V
中间6位:EAEA8D:要修改的数据,每2位1字节,一条金手指一次可修改3字节数据
: u, |1 M% J( ^, F后2位 :67:金手指码的校验和
: ]) o' q1 ] O$ _9 I! |1 C* k9 q最后1位:0:功能代码,为0表示修改ROM,为1表示修改SRAM+ n0 F4 r( b# u ?5 I" E7 ]) `
看到这里有同学就会问了:
; n% x1 r8 \9 R+ N& c _Q:你不是说由5部分组成么?前4部分已经把14位金手指码全包括了,那么第五部分在哪儿呢?
9 F. d( D9 `+ R' O& O9 f/ _& a3 d2 {A:请各位先看张图:5 u) P1 g7 S. h. X2 B) [7 m
9 f* O, i0 M3 E- o# M- J. x+ i& m
图中画红圈的地方就是金手指码的第五部分,很重要,但是似乎所有人都把它忽略了,博士的说明书中也没有提及与金手指相关的内容。这第5部分就是指示内存分区的标识,你可以用手柄的X、Y键改变箭头所指的分区,我把它命名为Slot Code。% M6 q, x/ Y3 s/ j
下面开始详细分析:
4 \7 {" c! m& [# n: `. @9 N1 b1.地址:
) t: Q' b7 M7 ?' I: t) {地址码为5位,20BIT宽。说到这里,了解超任硬件的同学会有疑问了:% o a! J( p: |7 k+ `
Q:超任主机地址总线宽度为24Bit,最大可寻址16MByte内存空间,而金手指码地址却只有20Bit,只能寻址1MByte,这不是很失败的设计么?如果我要修改超过1M的地址怎么办?
1 M, b# v0 M! N6 Y# X+ @+ N6 kA:博士的金手指地址码是经过编码的,要与Slot Code一起来实现24Bit寻址。我看了很多磁碟机介绍文章,以及支持金手指码的ZSNESW的源代码,发现人们都是把金手指的地址当作20Bit来处理,这是不完全正确的。* p. f' b7 \9 r* |: o
到这里不得不提及游戏ROM的类型:
) U- n2 `! X" U8 T5 u: H游戏的ROM类型分为HIROM、LOROM、ExHIROM、ExLOROM;+ M& `$ x: ^; p2 _$ f; l% u
HI、LOROM最大为4mbyte,绝大多数游戏属于这两类;ExHI、ExLoROM可大于4Mb,比如幻想传说(Tales Of Fantasia) 就是ExHiROM,容量为48M(6Mbyte)。. \, r+ @# E: ^- m
1.1地址的解码:
: K7 P. e+ W3 w+ z9 o前面说过,金手指需要与Slot配合才能访问全部ROM地址,其对应关系是:
% X1 u5 I7 G, g4 W) h如果一个金手指码未指定修改哪区,那通常就指修改A区
$ k3 I9 @0 k4 I, H情况1:ROM=HIROM,Slot Code=A:: q" d4 J; f6 I4 Z0 v9 k
地址指向的是ROM的每64K的后32K,0x??8000~0x??FFFF(比如地址码=00000,访问的ROM地址就是0x008000)
1 G/ J1 ?# @& K! z4 S1 x% T范围0x008000~0x1FFFFF。
4 u0 @$ t' a6 q( m# A2 h, l情况2:ROM=HIROM,Slot Code=B:/ b6 B9 L; {2 h9 H: [
与情况1类似,但地址加上0x200000(范围0x208000~0x3FFFFF)
2 K& z" I4 a. J情况3:ROM=HIROM,Slot Code=C:1 n- \' u0 v5 N& r/ F6 s
地址指向的是ROM的每64K的前32K,0x??0000~0x??7FFF,范围0x000000~1F7FFF7 s. W! W8 ?2 g! J2 `0 L
情况4:ROM=HIROM,Slot Code=D:4 x: ]5 g/ o. ]: k& r) m
与情况3类似,但地址加上0x200000 范围0x207FFF~0x3F7FFF
0 Q1 q) t7 L6 h' E情况5:ROM=LOROM
# t3 d. n" j0 g这时地址是线性的20Bit地址,Slot Code=A:范围0x000000~0x0FFFFF,Slot Code=B:范围0x100000~1FFFFF,依次类推
4 Z% ~" j: e) L0 v! N9 Y+ b如果游戏ROM不超过16M(2Mb),那么只有A和B区可用,修改B区的情况跟大于16M时修改C区相同。
6 t2 A5 v$ P) `) z$ }经过解码过程,我们就得到了金手指码的真实ROM地址,有了这个地址,我们就可以把修改数据直接写入到游戏ROM镜像里,或者转换为PAR码(Pro Action Replay码,另一种金手指,可以用在模拟器中)。
5 d# x# F2 f; C s注意这样得到的ROM地址是不包括ROM信息头的地址,博士系列的游戏ROM(比如sf24046A)都带有512字节的信息头,在这样的ROM上,计算得出的地址还要加上0x200才是真实ROM地址。
9 R+ s4 i& d" W+ S' P; D2.数据
& K/ W& V( Q3 e5 n每条金手指包含修改数据最多为3字节,也可以只包含1字节(不需要修改的位置输入‘X’),甚至可以不包含数据(数据全为‘X’),此时如果输入并确定的话,你会看到这个地址的当前值。2 A5 `4 J% ]; u. {2 a4 t/ X' _5 B: }* _
3.校验和" i* E/ M- e, L& m) L
校验和是用来检验一条金手指码是否合法,算法是:
4 m4 T3 S7 l: p' h( F5位地址前面加0补齐为6位,然后按顺序将地址和数据按字节相加,比如上面的金手指码:
( X( Q8 G$ g S4 d0 ~+ V8 S00+46+20+ea+ea+8d=2c7
( N; W* r: J8 n5 `& e+ s得到的和再减去0x160,再和0xFF做按位与运算
: T# E1 y% I4 |/ ] ^9 v0x2c7-0x160=0x167# @# v" A6 a1 ~& ?( Y, B- [
0x167 AND 0xFF=0x673 U; M" Y) I2 \. \
这就计算出了校验和,与金手指中的校验和比较,如果相等,则是有效的金手指码。
; Z6 s2 b. b7 t+ I4.功能代码
# N5 n8 |. E$ A* G; i如果为0表示修改游戏ROM,为1表示修改游戏存档SRAM。
( f, A4 O7 I6 A" O5 J* q因为所有带有SRAM的游戏都会校验数据的校验和,所以不存在通用的修改存档的金手指码,如果你改变了存档中的1个字节,校验和就会发生变化,游戏就会认为存档已经损坏不会读取。所以要想修改SRAM,首先要弄清楚校验和的位置,并在修改数据后对校验和补正,不然就会损坏存档。所以这个功能操作性不强,需要玩家有一定基础。6 K9 a: D: s' ~8 Q
5.Slot Code
" G- a% D( p5 \* Q0 Q) b这是个隐藏参数,不存在于金手指码中,但是没有它金手指码便无法使用,如果你查到一个金手指码并没有指定修改哪个区,那很可能就是修改A区(Slot Code=A),如果无效,可能这个金手指码不是为博士系列编写的,有些磁碟机也支持金手指码,但实现方式却不相同,比如龙2、金霸王磁碟机,通常只有LOROM游戏的金手指码有效(因为LOROM的地址在磁碟机上为线性),而且只能访问前1M的位置。 ~: b3 n! y# [ o
6.ROM类型! x' `+ Q& k# r. w) B
Q:现在我知道了ROM类型对于计算地址非常重要,那么如何知道一个ROM是什么类型呢?
4 X; R% t2 X/ CA:可以利用ROM工具或模拟器查看,用Snes9x载入ROM后会显示是何种类型;用Ucon64、NSRT 也可查看,这两个工具是控制台程序,用ROM文件名作为参数运行,程序就会返回ROM信息。7.总结
! J& T' a# o6 h# ]; y* A9 Z一条完整的金手指应该以下列形式表示
; ^9 t. ?) ?7 F! ^) L. W$ v; t1 WAAAAADDDDDDCCF@S. k4 b, u8 d( T! i. n& a( ]
A=地址,D=数据,C=校验和,F=功能码,S=Slot Code
+ J: S( ^( \$ ]# R- b* a由于超任主机的复杂性,并不是所有游戏ROM映射方式都是标准的HI、LOROM,但数量较少,对于这样的游戏,金手指可能无法正常工作,因为ROM映射方式不同,还有带有特殊芯片的游戏金手指也不会工作。# Y# d7 x% S, N) V4 e7 E
具体的地址转换方法:; O: G3 C1 u8 @
switch(mapper) {
# ~' u5 F2 P$ \+ {$ b" p case LoROM: {
' w( n7 G: ^- c addr = ((addr & 0x7f8000) << 1) + 0x8000 + (addr & 0x7fff);; _3 P! g" B% h# ~4 e
} break;
9 v0 Y# q" L1 _* o; [+ a/ E" F; l6 V/ c% w/ W& d: b' G* J
case HiROM: {
$ t$ s, \ u# W" z addr = 0xc00000 + (addr & 0x3fffff);, C: ~- K/ n( V" k
} break;
6 M2 D% u2 I8 R. a# _ }
& h$ {% F: {4 O8 c5 M5 [, A4 c8 v* _eturn addr;
# {8 h; M" z4 o9 L: P" o: M金手指码的功能是软件实现,只能修改ROM,对于运行时数据(WorkRam)的内容是无能为力的,所有7E、7F开头的PAR金手指码从原理上就不可能转换为金手指码。6 v z2 I% G5 [
8.后记) @' b3 m0 U+ i" X, P
超任磁碟机早已淡出了历史舞台,这篇迟到了近20年的研究成果还有没有人在意呢?
0 U( L' K( x) f* P- V4 Q5 q% ?. T3 X: \" j
|