MDL2 增加脚本编码

  • 内容
  • 评论
  • 相关

用过剧本编辑器的都知道,游戏里提供的脚本编码只有0x00-0x3C,我们来增加一个0x3D。
我也不是高手,我也不懂68k的汇编,不过没关系,游戏里本身就提供了0x00-0x3C的程序,可以用来参考,再查查指令集就可以了。
比如说,0x25是人物施展火球魔法,弄个0x3D人物施展陨石魔法,这样两个程序比较相近,稍微修改一下就可以了。
用到的工具:调试模拟器(这里是Regen 0.97D),十六进制编辑器(这里是Winhex),计算器(按alt+3切换到程序员版),记事本(记录东西和写程序用),68k cpu的指令集,还有一个有逻辑的头脑
这里有个中文速查:http://zero3c.blog.163.com/blog/static/2782150820073142323549/

看一下编码读取的过程,大概就是:读取编码->读取编码对应的程序->执行程序->返回。
修改成:读取编码->执行我们的程序->读取编码对应的程序->执行程序->返回。
用调试器跟跟编码的读取:

解释一下这几句:
1.读取编码
2.把编码跟0xFF比较
3.如果是0xFF,跳转到0x1596a,如果不是则执行下面的
4和5.实际上这是把编码乘以4
6.跳转到 2 + PC(当前程序执行处) + 编码*4

这里我们把第一句修改成跳转到我们的程序,增加的程序我随便找了个像是空白的地方:0x150000,nop表示空指令,cpu不执行任何操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
15856:0c0000ff cmpi.b #-$1, D0 -> jmp $150000
1585a:6700010e beq $1596a -> nop
1585e:d040 add.w D0,D0
15860:d040 add.w D0,D0
15862:4efb0002 jmp ($2,PC,DO.w)

//这样跳转就完成了,然后去0x150000写我们的程序:
150000:cmpi.b #-$1,D0 //把编码与0xFF比较
150004:bne $15000e //如果不是0xFF,跳转到0x15000e,否则执行下面的程序
150008:jmp $1596a //跳转到0x1596a
15000e:cmpi.b #$3D,D0 //把编码与0x3D比较
150012:bge $15001c //如果大于等于0x3D,跳转到0x15001c.否则执行下面的程序
150016:jmp $1585e //跳转到0x1585e
15001c:addi.b #-$3d,D0 //编码减去0x3D
150020:add.w D0,D0 //
150022:add.w D0,D0 //这两行把减去的结果乘以4
150024:jmp ($2,PC,D0.w) //跳转到 2 + PC(当前程序执行处) + 编码*4
15002a:bra $150100 //0x3D编码执行的程序
15002e:bra $......
......

为了方便起见,把0x15002a开始的地方留了许多空位,以便日后再增加编码,
然后再来写0x3D编码实际执行的程序
模仿0x25的程序,所以先直接把0x25的程序直接复制过来

0x16886-0x16a1c之间的代码就是0x25的程序

打开十六进制编辑器,直接复制

复制过来之后还要作一些修改:
1.修改为jmp操作保留的地址
这里需要修改的地方:

挑第一个说一说:

因为jmp操作不会保留返回的地址,所以要人为的把jmp下一条指令的地址保存,以便程序返回.修改之后:

2.修改一些相对地址的跳转
相对地址的跳转一般有beq,bne,bra,bge等
这里用到的相对地址跳转有:

其中第二个不用管,因为那是跳转到程序里的,我们只要修改跳转到程序外的
因为0x150000到0x1595a太远了,无法用相对地址跳转,只能用长地址跳转jmp,所以我们在0x1500fa增加一句:

然后把上面跳转的0x1595a的改成跳转到0x1500fa就可以了

3.把火球魔法改成陨石魔法
火球魔法的代码是0x03,找到这一行

把0x03改成0x04陨石魔法的代码,修改后

因为本身是0x25的程序,所以就不用我们自己作返回操作了.
到这里,我们的程序就完成了,接下来测试:
第11关,艾格贝尔特放火球的地方:0x1976d0,把0x25改成0x3D.
最后进入游戏里.

姑且算是教程的教程结束,如果有能力的话,可以增加自己编写的程序,跳出游戏本身的限制,像der里编码从0x00-0x56。

修改后的demo:https://pan.baidu.com/s/1jIsS0wI
只简单地测试了一下,不知道有没有问题.

加载中,请稍候...

评论

1条评论
  1. 兰古利萨 回复

    痕大您好,请问68k编程可使用什么工具,可以提供工具连结,或使用什么工具进行编辑吗,已知winhex可以编16制,C32Asm可以反汇编,Regen97d可以看68k编码,但编不了68k编程,增加不了脚本,,感谢解惑

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注