|
超任磁碟机博士系列金手指代码完全解析
2 ]+ Z( [) p" d1 R4 g# v7 L, q2 L3 t# _2 J) x0 L! x/ N9 _
玩家都应该知道甚至熟悉超任游戏机,在那个年代,有经济实力购买正版卡带的人不是很多,大多数人接触超任是从游戏厅里的磁碟机开始的,这其中香港邦谷公司推出博士系列磁碟机市场占有率最高,还可连接光盘驱动器(另选购),也可连接电脑传输ROM、存档等等;此机器还支持金手指修改游戏、即时存档、慢动作等附加功能,在众多磁碟机之中,可谓是极具竞争力。& A$ S: A! }9 q$ f) e
转眼十多年过去了,超任早已退出历史舞台,不知道有多少人能真正了解陪伴了自己无数个不眠之夜的游戏机呢?本文就为大家详细解析博士系列的金手指功能。
% S1 G3 g/ q% n d4 v首先介绍一下金手指码的构成:
6 B, j8 j% y' t# |+ f例如,) o' r* c* q; b1 P6 a
第四次机器人大战4:# t9 Y$ u1 d6 a
无限金钱:( d2 L g: l$ k: d; D
04620 EAEA8D 67 0- K8 |% u) N& b8 J9 e8 }# `% @
博士系列的金手指码由5部分构成:, h; Q4 f; `2 Z4 t7 k/ I' \, C5 [
前5位 :04620:要修改的ROM数据地址3 u4 ?; Q7 l) q2 @/ W
中间6位:EAEA8D:要修改的数据,每2位1字节,一条金手指一次可修改3字节数据/ m; H' @" S$ |% N* }4 I
后2位 :67:金手指码的校验和; s) Y7 I3 m) U, R/ [; i3 @5 n
最后1位:0:功能代码,为0表示修改ROM,为1表示修改SRAM
# {6 S" K( |. y! ]/ V; A8 P: U5 T& r看到这里有同学就会问了:
( R5 h( ~' S$ KQ:你不是说由5部分组成么?前4部分已经把14位金手指码全包括了,那么第五部分在哪儿呢?; T& e* a6 D# i3 e% Z: w
A:请各位先看张图:' P: j, i& X- f7 ]
' m3 [1 b/ n" S/ c图中画红圈的地方就是金手指码的第五部分,很重要,但是似乎所有人都把它忽略了,博士的说明书中也没有提及与金手指相关的内容。这第5部分就是指示内存分区的标识,你可以用手柄的X、Y键改变箭头所指的分区,我把它命名为Slot Code。, {+ D6 O h# g* h
下面开始详细分析:
, ]; u/ C7 P( w$ Y; Q; y8 M+ B0 W1.地址:
2 K: U# m( T! W/ X' n- f地址码为5位,20BIT宽。说到这里,了解超任硬件的同学会有疑问了:, ?2 @' |$ o( a0 z, d
Q:超任主机地址总线宽度为24Bit,最大可寻址16MByte内存空间,而金手指码地址却只有20Bit,只能寻址1MByte,这不是很失败的设计么?如果我要修改超过1M的地址怎么办?( I J4 q; i7 E
A:博士的金手指地址码是经过编码的,要与Slot Code一起来实现24Bit寻址。我看了很多磁碟机介绍文章,以及支持金手指码的ZSNESW的源代码,发现人们都是把金手指的地址当作20Bit来处理,这是不完全正确的。
1 d2 J x% _: H到这里不得不提及游戏ROM的类型:5 ?4 }3 b, l& P3 u% d9 A
游戏的ROM类型分为HIROM、LOROM、ExHIROM、ExLOROM;
( l# g s* _' Y' L% S3 MHI、LOROM最大为4mbyte,绝大多数游戏属于这两类;ExHI、ExLoROM可大于4Mb,比如幻想传说(Tales Of Fantasia) 就是ExHiROM,容量为48M(6Mbyte)。: h U, o% f1 S" S) A$ L3 c6 v$ v
1.1地址的解码:
' m S* _' e( Z前面说过,金手指需要与Slot配合才能访问全部ROM地址,其对应关系是:
7 q0 u6 Q8 a$ A8 z3 F1 h4 B& ]2 C) \如果一个金手指码未指定修改哪区,那通常就指修改A区
/ r4 x+ f1 m5 L% F- ^! i: Z情况1:ROM=HIROM,Slot Code=A:& i0 Y. O: b: F: M P o
地址指向的是ROM的每64K的后32K,0x??8000~0x??FFFF(比如地址码=00000,访问的ROM地址就是0x008000)
7 j/ J4 q7 c; S1 @. ]范围0x008000~0x1FFFFF。2 B2 ]: Y4 v/ W7 V4 {! f8 Q0 C
情况2:ROM=HIROM,Slot Code=B:2 {) z1 {; A" t+ k4 B3 Q" J
与情况1类似,但地址加上0x200000(范围0x208000~0x3FFFFF)& c0 K7 n: j4 k$ X3 X! x( j! ]
情况3:ROM=HIROM,Slot Code=C:
- _: k1 J% M# f; y& i5 s地址指向的是ROM的每64K的前32K,0x??0000~0x??7FFF,范围0x000000~1F7FFF
1 U2 i$ K. K) h# Q9 ^( }& n情况4:ROM=HIROM,Slot Code=D:
& H# [1 h! N0 k0 y与情况3类似,但地址加上0x200000 范围0x207FFF~0x3F7FFF
3 P( f4 x- \; e# z情况5:ROM=LOROM
4 Z8 `" }- J; F2 j* C6 t这时地址是线性的20Bit地址,Slot Code=A:范围0x000000~0x0FFFFF,Slot Code=B:范围0x100000~1FFFFF,依次类推+ ?$ Z" ^% @, i) m" W
如果游戏ROM不超过16M(2Mb),那么只有A和B区可用,修改B区的情况跟大于16M时修改C区相同。2 R! U* q0 |, B0 ]* y! ~
经过解码过程,我们就得到了金手指码的真实ROM地址,有了这个地址,我们就可以把修改数据直接写入到游戏ROM镜像里,或者转换为PAR码(Pro Action Replay码,另一种金手指,可以用在模拟器中)。9 x6 V. y! I) l$ A/ u! o- z, F6 R
注意这样得到的ROM地址是不包括ROM信息头的地址,博士系列的游戏ROM(比如sf24046A)都带有512字节的信息头,在这样的ROM上,计算得出的地址还要加上0x200才是真实ROM地址。; N7 o3 ]: w, s( e9 v+ V$ u
2.数据* t- e4 ]$ l6 D* c* H% z
每条金手指包含修改数据最多为3字节,也可以只包含1字节(不需要修改的位置输入‘X’),甚至可以不包含数据(数据全为‘X’),此时如果输入并确定的话,你会看到这个地址的当前值。
t1 \# v# ^( [3.校验和8 c" v9 ?9 r+ m2 @8 ?/ l, E
校验和是用来检验一条金手指码是否合法,算法是:' d! Z5 T& D: T' j7 x
5位地址前面加0补齐为6位,然后按顺序将地址和数据按字节相加,比如上面的金手指码:
) g& F3 z) X- \2 o2 e2 l) [00+46+20+ea+ea+8d=2c7
' h7 [: R: ? F% ]5 s" G得到的和再减去0x160,再和0xFF做按位与运算
5 w U' o1 \8 b6 |( [ W2 D3 n+ j. @0x2c7-0x160=0x167
- J+ _$ y& ?3 P0x167 AND 0xFF=0x67
) a/ P% x/ V; r. T# j: c( a这就计算出了校验和,与金手指中的校验和比较,如果相等,则是有效的金手指码。
9 [' w# B1 O+ Z2 ~% L4.功能代码
. L( `& m D" k如果为0表示修改游戏ROM,为1表示修改游戏存档SRAM。/ p+ B: I, R2 R t
因为所有带有SRAM的游戏都会校验数据的校验和,所以不存在通用的修改存档的金手指码,如果你改变了存档中的1个字节,校验和就会发生变化,游戏就会认为存档已经损坏不会读取。所以要想修改SRAM,首先要弄清楚校验和的位置,并在修改数据后对校验和补正,不然就会损坏存档。所以这个功能操作性不强,需要玩家有一定基础。$ U$ X" b2 E. S' Y3 g1 y
5.Slot Code
8 _8 p! E/ u7 T i5 f7 X这是个隐藏参数,不存在于金手指码中,但是没有它金手指码便无法使用,如果你查到一个金手指码并没有指定修改哪个区,那很可能就是修改A区(Slot Code=A),如果无效,可能这个金手指码不是为博士系列编写的,有些磁碟机也支持金手指码,但实现方式却不相同,比如龙2、金霸王磁碟机,通常只有LOROM游戏的金手指码有效(因为LOROM的地址在磁碟机上为线性),而且只能访问前1M的位置。
) x3 A, p( Q& i& j6 r' K2 M6.ROM类型6 k9 Y1 W m! |6 w, k) h
Q:现在我知道了ROM类型对于计算地址非常重要,那么如何知道一个ROM是什么类型呢?
6 b6 D6 {* E6 `' n4 l5 U% R5 HA:可以利用ROM工具或模拟器查看,用Snes9x载入ROM后会显示是何种类型;用Ucon64、NSRT 也可查看,这两个工具是控制台程序,用ROM文件名作为参数运行,程序就会返回ROM信息。7.总结7 i$ J3 m6 t( j) B, M5 L$ U
一条完整的金手指应该以下列形式表示
* b4 C% ]6 h; C! PAAAAADDDDDDCCF@S' H" G) s4 q& H1 Q1 k
A=地址,D=数据,C=校验和,F=功能码,S=Slot Code
+ n, t0 ~8 A2 t# k由于超任主机的复杂性,并不是所有游戏ROM映射方式都是标准的HI、LOROM,但数量较少,对于这样的游戏,金手指可能无法正常工作,因为ROM映射方式不同,还有带有特殊芯片的游戏金手指也不会工作。' E# Q% I( W/ w9 j; r
具体的地址转换方法:3 c* _) g/ A4 o! C- L9 t5 Y; E; r
switch(mapper) {
& J) g+ J0 ~( x case LoROM: {
4 G: D5 ^: {0 s; v0 B addr = ((addr & 0x7f8000) << 1) + 0x8000 + (addr & 0x7fff);
/ s% _& O6 m* O4 J: w: Z } break;3 Y% X% B: P* A
, F, Q6 s* ]$ A4 vcase HiROM: {
. Z/ y' H. A- V5 `7 b e addr = 0xc00000 + (addr & 0x3fffff);3 G& c/ D/ t: j% w1 |( S; ~) t( o" k
} break;
, O' O# n' V2 ~3 U1 D }! Q) t% c3 Z2 ]/ q, k0 I
eturn addr;# b, u) ^' e+ x- S8 r* }' Y
金手指码的功能是软件实现,只能修改ROM,对于运行时数据(WorkRam)的内容是无能为力的,所有7E、7F开头的PAR金手指码从原理上就不可能转换为金手指码。3 @- G1 o& f9 p( z' K
8.后记) l U j! L$ C) c2 W) T
超任磁碟机早已淡出了历史舞台,这篇迟到了近20年的研究成果还有没有人在意呢?: v1 l/ K$ {& C b
0 m- ?1 k4 ^+ I P' N: P
|