|
超任磁碟机博士系列金手指代码完全解析
( I/ U& f# A0 [' y% u% W- T! C. R9 \9 ?
玩家都应该知道甚至熟悉超任游戏机,在那个年代,有经济实力购买正版卡带的人不是很多,大多数人接触超任是从游戏厅里的磁碟机开始的,这其中香港邦谷公司推出博士系列磁碟机市场占有率最高,还可连接光盘驱动器(另选购),也可连接电脑传输ROM、存档等等;此机器还支持金手指修改游戏、即时存档、慢动作等附加功能,在众多磁碟机之中,可谓是极具竞争力。- U2 y; @) u7 C& u% q1 d
转眼十多年过去了,超任早已退出历史舞台,不知道有多少人能真正了解陪伴了自己无数个不眠之夜的游戏机呢?本文就为大家详细解析博士系列的金手指功能。
& Z# j/ W" p& y/ w首先介绍一下金手指码的构成:
2 b3 a( ] O" E: S- N$ ^- Z/ v例如,
4 d, A1 L' C a. `第四次机器人大战4:2 [1 [' h' Z% ~) [
无限金钱:
1 s/ C. L# A( ~& Y/ C7 S* `04620 EAEA8D 67 0
% |1 o$ I, b& O1 d8 X9 F) \' M博士系列的金手指码由5部分构成:# x5 v* G: O! d" e8 @: q) s9 r. `/ ^
前5位 :04620:要修改的ROM数据地址
% g2 A: @6 P& J$ Y; `* x中间6位:EAEA8D:要修改的数据,每2位1字节,一条金手指一次可修改3字节数据
- b& F* `0 O+ _) A1 R8 H) m& |后2位 :67:金手指码的校验和9 N8 i3 P- Z# \; U- W
最后1位:0:功能代码,为0表示修改ROM,为1表示修改SRAM
: E9 c) P! l6 c3 S; @. O3 ^看到这里有同学就会问了:
2 n* x+ P1 ?. P( ], a t* FQ:你不是说由5部分组成么?前4部分已经把14位金手指码全包括了,那么第五部分在哪儿呢?
; q" z$ P# S4 O7 Z% Z. NA:请各位先看张图:' P2 ~: A. I! C. k P3 h$ _
- d- S% G# c. f
图中画红圈的地方就是金手指码的第五部分,很重要,但是似乎所有人都把它忽略了,博士的说明书中也没有提及与金手指相关的内容。这第5部分就是指示内存分区的标识,你可以用手柄的X、Y键改变箭头所指的分区,我把它命名为Slot Code。# Q9 ?! y- L3 T) m) W
下面开始详细分析:
* ^9 U! @9 L: g8 o P2 v; b1 Z1.地址:
4 A! z# ?+ t& V地址码为5位,20BIT宽。说到这里,了解超任硬件的同学会有疑问了:! f8 D: ^( w% R) N
Q:超任主机地址总线宽度为24Bit,最大可寻址16MByte内存空间,而金手指码地址却只有20Bit,只能寻址1MByte,这不是很失败的设计么?如果我要修改超过1M的地址怎么办?
; H* b6 v) e/ ~$ EA:博士的金手指地址码是经过编码的,要与Slot Code一起来实现24Bit寻址。我看了很多磁碟机介绍文章,以及支持金手指码的ZSNESW的源代码,发现人们都是把金手指的地址当作20Bit来处理,这是不完全正确的。- M% k2 J4 _$ J: `0 y
到这里不得不提及游戏ROM的类型:
' e/ k2 ^# V! R- I: y游戏的ROM类型分为HIROM、LOROM、ExHIROM、ExLOROM;
/ _; J ]& g/ a4 XHI、LOROM最大为4mbyte,绝大多数游戏属于这两类;ExHI、ExLoROM可大于4Mb,比如幻想传说(Tales Of Fantasia) 就是ExHiROM,容量为48M(6Mbyte)。
4 x% [* R. E' F! D. q& B1 z1.1地址的解码:
1 G* r; |7 |$ L3 Y2 E前面说过,金手指需要与Slot配合才能访问全部ROM地址,其对应关系是:
7 |3 T: M8 }+ V1 d' j% S$ r5 ]如果一个金手指码未指定修改哪区,那通常就指修改A区' T5 |: r% a U# q5 y; f
情况1:ROM=HIROM,Slot Code=A:
- b/ k2 T- K; i) u5 Z) H) ?地址指向的是ROM的每64K的后32K,0x??8000~0x??FFFF(比如地址码=00000,访问的ROM地址就是0x008000)4 i1 j: h* p! d c$ c
范围0x008000~0x1FFFFF。4 T4 p9 ]4 X& f* _4 Q
情况2:ROM=HIROM,Slot Code=B:7 b% \5 O$ t( v' T# t' E4 s
与情况1类似,但地址加上0x200000(范围0x208000~0x3FFFFF)( L: g6 `2 ?, R7 _! i
情况3:ROM=HIROM,Slot Code=C:
+ g, R; B+ P6 E( i! e. x: Z) w地址指向的是ROM的每64K的前32K,0x??0000~0x??7FFF,范围0x000000~1F7FFF
4 Y5 U: l) `2 a5 X0 P# M情况4:ROM=HIROM,Slot Code=D:
: C6 s0 H+ `: k. _# k与情况3类似,但地址加上0x200000 范围0x207FFF~0x3F7FFF
* \: Q! G" D% c+ u情况5:ROM=LOROM! v$ [7 k. K6 M& X; K$ I$ V
这时地址是线性的20Bit地址,Slot Code=A:范围0x000000~0x0FFFFF,Slot Code=B:范围0x100000~1FFFFF,依次类推% Q& c7 l9 g, _7 C: {; {+ I" C
如果游戏ROM不超过16M(2Mb),那么只有A和B区可用,修改B区的情况跟大于16M时修改C区相同。* \8 ^9 W9 E; q/ ^0 {% u1 q
经过解码过程,我们就得到了金手指码的真实ROM地址,有了这个地址,我们就可以把修改数据直接写入到游戏ROM镜像里,或者转换为PAR码(Pro Action Replay码,另一种金手指,可以用在模拟器中)。 y6 u0 ?) A; j1 J- F+ B4 |. C+ P4 M
注意这样得到的ROM地址是不包括ROM信息头的地址,博士系列的游戏ROM(比如sf24046A)都带有512字节的信息头,在这样的ROM上,计算得出的地址还要加上0x200才是真实ROM地址。# ]. F( x" }/ B: q/ b6 C" J" o
2.数据; O+ j, @& I* k9 n# H2 ~
每条金手指包含修改数据最多为3字节,也可以只包含1字节(不需要修改的位置输入‘X’),甚至可以不包含数据(数据全为‘X’),此时如果输入并确定的话,你会看到这个地址的当前值。5 R0 d* q/ {) }% o* F6 f) }
3.校验和
( {4 G. J8 J$ o+ H. R( ^0 L校验和是用来检验一条金手指码是否合法,算法是:
- o# X* `7 a/ b+ f. a0 g5位地址前面加0补齐为6位,然后按顺序将地址和数据按字节相加,比如上面的金手指码:
3 D, H3 P8 p b00+46+20+ea+ea+8d=2c7$ L$ N, c) ~3 p1 u
得到的和再减去0x160,再和0xFF做按位与运算; ~& Y! [( N3 n7 H
0x2c7-0x160=0x167
~! ?* G) A D" F0x167 AND 0xFF=0x67
' C: p+ ~% \8 k& p6 @+ l5 h这就计算出了校验和,与金手指中的校验和比较,如果相等,则是有效的金手指码。& K9 V- w& Y8 s( P8 w
4.功能代码4 ? t5 n% I, i+ v6 w
如果为0表示修改游戏ROM,为1表示修改游戏存档SRAM。
/ @# p1 J2 p6 J$ |# }3 e因为所有带有SRAM的游戏都会校验数据的校验和,所以不存在通用的修改存档的金手指码,如果你改变了存档中的1个字节,校验和就会发生变化,游戏就会认为存档已经损坏不会读取。所以要想修改SRAM,首先要弄清楚校验和的位置,并在修改数据后对校验和补正,不然就会损坏存档。所以这个功能操作性不强,需要玩家有一定基础。
4 N( ~5 a; G3 `' @* |- G5.Slot Code
& N5 ]' ~5 L% w4 Z这是个隐藏参数,不存在于金手指码中,但是没有它金手指码便无法使用,如果你查到一个金手指码并没有指定修改哪个区,那很可能就是修改A区(Slot Code=A),如果无效,可能这个金手指码不是为博士系列编写的,有些磁碟机也支持金手指码,但实现方式却不相同,比如龙2、金霸王磁碟机,通常只有LOROM游戏的金手指码有效(因为LOROM的地址在磁碟机上为线性),而且只能访问前1M的位置。, D1 K+ Y' k5 I3 D
6.ROM类型
" D4 j& A8 c9 [ |6 I* uQ:现在我知道了ROM类型对于计算地址非常重要,那么如何知道一个ROM是什么类型呢?
" t9 ?% A! e% q8 g$ z! lA:可以利用ROM工具或模拟器查看,用Snes9x载入ROM后会显示是何种类型;用Ucon64、NSRT 也可查看,这两个工具是控制台程序,用ROM文件名作为参数运行,程序就会返回ROM信息。7.总结
5 D/ m* O/ N3 E) p, B1 i一条完整的金手指应该以下列形式表示" Y5 x7 o O& ^& i
AAAAADDDDDDCCF@S
( A1 l' V3 z, r, t; u o5 e$ VA=地址,D=数据,C=校验和,F=功能码,S=Slot Code ^% T: f* q3 g& v% ?
由于超任主机的复杂性,并不是所有游戏ROM映射方式都是标准的HI、LOROM,但数量较少,对于这样的游戏,金手指可能无法正常工作,因为ROM映射方式不同,还有带有特殊芯片的游戏金手指也不会工作。$ ?2 R/ K8 X& T2 O& ?" e
具体的地址转换方法:
" j' R3 i# s8 y* I+ {switch(mapper) {* H' O2 H: o: N% D7 n
case LoROM: {- G3 q1 x# f6 m9 n0 [
addr = ((addr & 0x7f8000) << 1) + 0x8000 + (addr & 0x7fff);& M [9 g) ^" g6 e: a$ i5 f
} break;
+ s/ g1 \6 f1 u5 p# G2 t" [; \1 f U% @- B, D
case HiROM: {! w4 L3 j( b! T& ~- M
addr = 0xc00000 + (addr & 0x3fffff);
( [+ J% @; \" |1 p- W+ y } break;4 p! e* Y$ D& C, h1 B! d
}
& B+ ]! b$ z" J" M6 k& D+ Q" beturn addr;
' b! `; ` @* [) |8 T' l金手指码的功能是软件实现,只能修改ROM,对于运行时数据(WorkRam)的内容是无能为力的,所有7E、7F开头的PAR金手指码从原理上就不可能转换为金手指码。: C& J2 n& E( c, o$ w2 m
8.后记
7 u" g/ K& {7 n4 B" d* s超任磁碟机早已淡出了历史舞台,这篇迟到了近20年的研究成果还有没有人在意呢?
9 O; z% D% G( S" W1 b0 ?7 N" G8 [ U _) T3 G; k
|