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
只简单地测试了一下,不知道有没有问题.
兰古利萨
痕大您好,请问68k编程可使用什么工具,可以提供工具连结,或使用什么工具进行编辑吗,已知winhex可以编16制,C32Asm可以反汇编,Regen97d可以看68k编码,但编不了68k编程,增加不了脚本,,感谢解惑