超任磁碟机博士系列金手指代码完全解析 , [9 z" E8 l: J0 c$ ~* X: ^
/ S, C3 |1 y; J8 D9 o' \
玩家都应该知道甚至熟悉超任游戏机,在那个年代,有经济实力购买正版卡带的人不是很多,大多数人接触超任是从游戏厅里的磁碟机开始的,这其中香港邦谷公司推出博士系列磁碟机市场占有率最高,还可连接光盘驱动器(另选购),也可连接电脑传输ROM、存档等等;此机器还支持金手指修改游戏、即时存档、慢动作等附加功能,在众多磁碟机之中,可谓是极具竞争力。- Y4 j$ @& y% o
转眼十多年过去了,超任早已退出历史舞台,不知道有多少人能真正了解陪伴了自己无数个不眠之夜的游戏机呢?本文就为大家详细解析博士系列的金手指功能。: Z- M9 h! ^$ q! w
首先介绍一下金手指码的构成:8 V4 U5 I8 o+ N( T6 ^. Y9 R
例如,9 T5 G6 b( V9 |) ~
第四次机器人大战4:
, ^* L- \( s- I% ^无限金钱:
3 u$ p% y& B H) B- s, P+ X/ j04620 EAEA8D 67 0$ k V/ f# e7 L* A8 ~
博士系列的金手指码由5部分构成:
4 P4 q* ?' Q3 U G* r前5位 :04620:要修改的ROM数据地址
/ K- E/ K$ Q" v) ]1 y! T中间6位:EAEA8D:要修改的数据,每2位1字节,一条金手指一次可修改3字节数据
3 E: O, h. I- N0 d* c: F2 A0 Q1 r后2位 :67:金手指码的校验和) E1 @ M8 {6 ?, e
最后1位:0:功能代码,为0表示修改ROM,为1表示修改SRAM1 P( J& t; \2 S; G
看到这里有同学就会问了:
2 u9 U& Q. {' l, M5 y5 {Q:你不是说由5部分组成么?前4部分已经把14位金手指码全包括了,那么第五部分在哪儿呢?
, \; c2 A) e* L1 iA:请各位先看张图:
) W/ ~/ k, p `* R9 L; R( A B" V- n$ g Z' @
图中画红圈的地方就是金手指码的第五部分,很重要,但是似乎所有人都把它忽略了,博士的说明书中也没有提及与金手指相关的内容。这第5部分就是指示内存分区的标识,你可以用手柄的X、Y键改变箭头所指的分区,我把它命名为Slot Code。
3 L8 k! r/ f* v" l5 G; a下面开始详细分析:) t4 ~# ]" D) Q2 L
1.地址:
6 h8 t( N7 r; R3 p9 O6 Y: w$ J地址码为5位,20BIT宽。说到这里,了解超任硬件的同学会有疑问了:
+ F p, M( ~2 q) x6 V% MQ:超任主机地址总线宽度为24Bit,最大可寻址16MByte内存空间,而金手指码地址却只有20Bit,只能寻址1MByte,这不是很失败的设计么?如果我要修改超过1M的地址怎么办?, N% I1 m* l; u: e a! _
A:博士的金手指地址码是经过编码的,要与Slot Code一起来实现24Bit寻址。我看了很多磁碟机介绍文章,以及支持金手指码的ZSNESW的源代码,发现人们都是把金手指的地址当作20Bit来处理,这是不完全正确的。
5 a$ i( x3 k4 Y到这里不得不提及游戏ROM的类型:% L& _ Q& J: b5 ^! T
游戏的ROM类型分为HIROM、LOROM、ExHIROM、ExLOROM;
Y7 L, Q5 L, ^" A7 k1 }5 UHI、LOROM最大为4mbyte,绝大多数游戏属于这两类;ExHI、ExLoROM可大于4Mb,比如幻想传说(Tales Of Fantasia) 就是ExHiROM,容量为48M(6Mbyte)。
. l' l% ?! y) F$ d1.1地址的解码:
& l6 }6 A: B# S: s9 W前面说过,金手指需要与Slot配合才能访问全部ROM地址,其对应关系是:
' K5 r b C: P: D( l# G% S x& v/ y如果一个金手指码未指定修改哪区,那通常就指修改A区
m/ h4 E- s0 L! Z情况1:ROM=HIROM,Slot Code=A:
% F3 r8 M; c' @# S: a4 r4 |地址指向的是ROM的每64K的后32K,0x??8000~0x??FFFF(比如地址码=00000,访问的ROM地址就是0x008000)
/ |$ W1 z5 G, ]2 s( |$ _7 `/ O范围0x008000~0x1FFFFF。
+ r8 a' s6 }& `0 J4 T0 o' @0 }' Y情况2:ROM=HIROM,Slot Code=B:& h& |: y8 ^ [2 L8 `
与情况1类似,但地址加上0x200000(范围0x208000~0x3FFFFF)
' B7 x: R7 ~ M0 k/ F) W情况3:ROM=HIROM,Slot Code=C:; b+ G" |( x3 c% t2 f
地址指向的是ROM的每64K的前32K,0x??0000~0x??7FFF,范围0x000000~1F7FFF) O; L1 _, ^& c% B
情况4:ROM=HIROM,Slot Code=D:
7 E* B. l$ U) F1 _与情况3类似,但地址加上0x200000 范围0x207FFF~0x3F7FFF
" G/ O3 _) c6 ]' `$ x# w情况5:ROM=LOROM
4 F/ N0 X- f k1 A( \" o这时地址是线性的20Bit地址,Slot Code=A:范围0x000000~0x0FFFFF,Slot Code=B:范围0x100000~1FFFFF,依次类推
' x( w8 O+ q! u5 K如果游戏ROM不超过16M(2Mb),那么只有A和B区可用,修改B区的情况跟大于16M时修改C区相同。2 H5 V% N8 E4 ~, X- K6 E# ]' j
经过解码过程,我们就得到了金手指码的真实ROM地址,有了这个地址,我们就可以把修改数据直接写入到游戏ROM镜像里,或者转换为PAR码(Pro Action Replay码,另一种金手指,可以用在模拟器中)。
- N1 F% Z9 D% {5 u! `" o注意这样得到的ROM地址是不包括ROM信息头的地址,博士系列的游戏ROM(比如sf24046A)都带有512字节的信息头,在这样的ROM上,计算得出的地址还要加上0x200才是真实ROM地址。 H f G2 Y. A" E9 f+ o* b& A& V
2.数据
: t1 z+ H$ a, p1 ^) M- w每条金手指包含修改数据最多为3字节,也可以只包含1字节(不需要修改的位置输入‘X’),甚至可以不包含数据(数据全为‘X’),此时如果输入并确定的话,你会看到这个地址的当前值。% n- N/ x" s8 r6 r
3.校验和4 G+ @0 A6 y3 l3 O
校验和是用来检验一条金手指码是否合法,算法是:
( i4 _$ A+ r& [: f$ B: }* K; E+ }5位地址前面加0补齐为6位,然后按顺序将地址和数据按字节相加,比如上面的金手指码:2 u. }! f% [% o9 Q6 h
00+46+20+ea+ea+8d=2c7
/ R( h$ e- N1 ^* ?/ Z得到的和再减去0x160,再和0xFF做按位与运算
& @* V2 B+ b1 z3 o+ X4 }! b& v0x2c7-0x160=0x167
( ~7 P$ d5 n _! r6 Y, b9 \6 P. w0x167 AND 0xFF=0x67$ d g! }( ?( \0 l# G- I
这就计算出了校验和,与金手指中的校验和比较,如果相等,则是有效的金手指码。% W2 ~8 [7 l) { ^1 p1 Y3 l
4.功能代码
2 m; N1 S% Y7 h如果为0表示修改游戏ROM,为1表示修改游戏存档SRAM。5 m2 q' q' e2 {$ e" d
因为所有带有SRAM的游戏都会校验数据的校验和,所以不存在通用的修改存档的金手指码,如果你改变了存档中的1个字节,校验和就会发生变化,游戏就会认为存档已经损坏不会读取。所以要想修改SRAM,首先要弄清楚校验和的位置,并在修改数据后对校验和补正,不然就会损坏存档。所以这个功能操作性不强,需要玩家有一定基础。; q& V0 r/ \1 M. o3 O
5.Slot Code
% F) n6 ?' E5 i- s! Q8 {8 e2 D这是个隐藏参数,不存在于金手指码中,但是没有它金手指码便无法使用,如果你查到一个金手指码并没有指定修改哪个区,那很可能就是修改A区(Slot Code=A),如果无效,可能这个金手指码不是为博士系列编写的,有些磁碟机也支持金手指码,但实现方式却不相同,比如龙2、金霸王磁碟机,通常只有LOROM游戏的金手指码有效(因为LOROM的地址在磁碟机上为线性),而且只能访问前1M的位置。$ Q8 N6 N. b6 [$ {/ U
6.ROM类型2 g1 @1 X* X- z4 s
Q:现在我知道了ROM类型对于计算地址非常重要,那么如何知道一个ROM是什么类型呢?- } g6 |: I+ c3 [8 x! z
A:可以利用ROM工具或模拟器查看,用Snes9x载入ROM后会显示是何种类型;用Ucon64、NSRT 也可查看,这两个工具是控制台程序,用ROM文件名作为参数运行,程序就会返回ROM信息。7.总结
% N7 e7 t6 Z3 L q$ z一条完整的金手指应该以下列形式表示
4 c1 {8 P5 i6 x& A9 dAAAAADDDDDDCCF@S
, C( P& M, v0 t( ?+ CA=地址,D=数据,C=校验和,F=功能码,S=Slot Code
# B( H9 _# W- t. x1 @9 z由于超任主机的复杂性,并不是所有游戏ROM映射方式都是标准的HI、LOROM,但数量较少,对于这样的游戏,金手指可能无法正常工作,因为ROM映射方式不同,还有带有特殊芯片的游戏金手指也不会工作。
: h: h6 P7 \2 ~2 ~: s" P$ b具体的地址转换方法:
: |5 u; m5 c# n" |% }; n8 H( Fswitch(mapper) {
% e V( v$ G+ h/ D& C" v& K# f+ E9 ] case LoROM: {
* g2 Y: N! J# I+ W2 C: z2 j addr = ((addr & 0x7f8000) << 1) + 0x8000 + (addr & 0x7fff);
1 u" H7 R. ` k } break;
7 b' d1 {3 H! @' E. C9 Y% D4 C
7 Z' E/ q S% k. ccase HiROM: {# G( O) w5 h( R
addr = 0xc00000 + (addr & 0x3fffff);$ e$ _$ T1 s! E- H) i' @# @8 [
} break;
/ ?, q9 v5 c6 K6 N/ K0 w# N }
- J0 S5 r1 o# V- W4 Xeturn addr;
" N2 O1 h6 c7 q m; ^4 S/ K金手指码的功能是软件实现,只能修改ROM,对于运行时数据(WorkRam)的内容是无能为力的,所有7E、7F开头的PAR金手指码从原理上就不可能转换为金手指码。
& q# ^2 ? p; f0 v7 g8.后记
( F' y; {2 ?. s超任磁碟机早已淡出了历史舞台,这篇迟到了近20年的研究成果还有没有人在意呢?
4 F- v) a9 @, u: Y, @' M1 c- t; K6 l% s& y6 y6 V6 @; D
|