〖2006-6-5〗〖原创〗梦幻模拟战2 AT32 Hack的初步程序分析
对应RO为:Langrisser II (J) (REV01) [T+ChiV06]。目前分析的结果:
在原ROM中有如下两段数据,如下所示:
ROM:0000D798 ; ???????????????????????????????????????????????????????????????????????????
ROM:0000D798
ROM:0000D798 loc_0_D798: ; CODE XREF: ROM:0000D784j
ROM:0000D798 lea (unk_0_D7C6).l,a0
ROM:0000D79E jsr sub_0_8A20
ROM:0000D7A4 bne.w loc_0_D7E6
ROM:0000D7A8 eori.b #1,($FFFFA6C7).l
ROM:0000D7B0 move.b #$46,($FFFFA6DA).l
ROM:0000D7B8 clr.b ($FFFFA6DB).l
ROM:0000D7BE bsr.w sub_0_FD7A //调用音乐程序;
ROM:0000D7C2 bra.w loc_0_D7E6
ROM:0000D7C2 ; ???????????????????????????????????????????????????????????????????????????
//变更BGM和部分音效:
ROM:0000FD7A ; ??????????????? S U B R O U T I N E ???????????????????????????????????????
ROM:0000FD7A
ROM:0000FD7A
ROM:0000FD7A sub_0_FD7A: ; CODE XREF: ROM:0000D7BEp
ROM:0000FD7A ; sub_0_FCCE+Ep
ROM:0000FD7A move.w #$100,($A11100).l
ROM:0000FD82
ROM:0000FD82 loc_0_FD82: ; CODE XREF: sub_0_FD7A+10j
ROM:0000FD82 btst #0,($A11100).l
ROM:0000FD8A bne.s loc_0_FD82
ROM:0000FD8C move.b ($FFFFA6DB).l,($A01FFE).l
ROM:0000FD96 move.b ($FFFFA6DA).l,($A01FFF).l
ROM:0000FDA0 move.w #0,($A11100).l
ROM:0000FDA8 rts
ROM:0000FDA8 ; End of function sub_0_FD7A
ROM:0000FDA8
ROM:0000FDA8 ; ???????????????????????????????????????????????????????????????????????????
其中,第一段数据中:
ROM:0000D7BE bsr.w sub_0_FD7A
一句负责对BGM更换程序进行调用。我们可以在这里变更音乐代码地址,比如跳转到自定义的代码,或者进行判段跳转。
第二段数据中:
ROM:0000FD8C move.b ($FFFFA6DB).l,($A01FFE).l
ROM:0000FD96 move.b ($FFFFA6DA).l,($A01FFF).l
负责变更当前BGM(含部分音效)。若我们将此两句去掉,则在游戏画面中(标题及战前准备除外)将无法更换背景音乐。
基于以上情况,目前HACK的方案大致如下几种:
第一种:利用动态内存修改来锁定A6DB和A6DA两地址的数据。但以目前HACK软件及模拟器内部补丁的精密度来讲,尚不能够实现。
第二种:直接将从FD8C开始的20个字节清0,也就是删除FD8C~FD96两行,并由此得到禁用BGM的ROM。之后动态检测A6DB或A6DA的数据并播放。此种做法虽然简单,但是由于删除FD8C和FD96代码的同时也禁止了部分BGM,因此不是很适合只变更OST的场合。
第三种:就是修改D7BE处的数据,使其跳转到自定义的代码段并执行。此种做法应该可以生成完美版的ROM。