返回列表 发帖

SS—Madou Monogatari魔导物语解压汇编源码

本帖最后由 yzb 于 2021-2-26 20:20 编辑

最近无聊看了一下ss的这个rpg游戏,魔导物语,2D画面比较讨喜,所以稍微研究了一下

这个游戏的资源文件除了音乐以外,其他文件90&是压缩过的,不过万幸只用了一种,类似lzss

解压源码在内存:603617C

简单说一下解压原理:

1个字节标志位每次 & 3 ,然后判断结果

==0,结束本次解压,然后压缩地址读一个字节,压缩地址指针+此字节,标志位清0,然后再次从新压缩地址读一个字节判断是否为0,不是重新循环解压,是的话结束解压

==1  从压缩数据读取一个字节写入到解压地址

==2  读2个字节到r1  解压地址回退( r1>>5)-1,复制长度为r1&1f 低5bit+4

==3  读一个字节到n,从压缩地址读n个字节到解压地址

比较简单的压缩方法,个人感觉还不如lzss

游戏字库在font.cel,解压以后就是明文了,小字为8x8,大字是4个8x8组成的16x16,总容量比较小,如果要汉化可能要扩充

游戏文本在那些MPxxx.SEQ里面,同样需要解压,解压以后久是脚本了,比较复杂,自定义编码,而且脚本的分支比较多,不过看起来编码倒是不用扩充,足够多了

暂时就到这了吧,热度已退
  1. sub_603617C:                                ; CODE XREF: sub_6036038+44p

  2.                 mov.l        r8, @-r15
  3.                 mov.l        r9, @-r15
  4.                 mov.l        r10, @-r15
  5.                 mov.l        r11, @-r15
  6.                 mov.l        r12, @-r15
  7.                 mov.l        r13, @-r15
  8.                 mov.l        r14, @-r15
  9.                 sts.l        pr, @-r15
  10.                 add        #-h'18, r15
  11.                 mov        r15, r14
  12.                 mov        r4, r10
  13.                 mov        r5, r8
  14.                 mov.l        r6, @r14
  15.                 mov.l        r10, @(4,r14)
  16.                 mov.l        r8, @(8,r14)
  17.                 mov        #0, r3
  18.                 mov.l        r3, @(h'14,r14)
  19.                 mov.b        @r8+, r1
  20.                 mov        #0, r11
  21.                 mov.l        @(h'100,pc), r7 ; [060362A4] = h'60A743C
  22.                 extu.b        r1, r12

  23. loc_60361A6:                                ; CODE XREF: sub_603617C+DEj
  24.                                         ; sub_603617C+E8j
  25.                 mov        #3, r2
  26.                 and        r12, r2
  27.                 mov        #3, r1
  28.                 cmp/hi        r1, r2                ; &3
  29.                 bt/s        loc_6036250
  30.                 mov        r2, r1
  31.                 add        r1, r1
  32.                 mova        @(8,pc), r0 ;
  33.                 mov.w        @(r0,r1), r1
  34.                 add        r1, r0
  35.                 jmp        @r0
  36.                 nop
  37. ; ---------------------------------------------------------------------------
  38.                 nop
  39. ; ---------------------------------------------------------------------------
  40. word_60361C0:        .data.w        h'56            ; DATA XREF: sub_603617C+38o
  41.                 .data.w        h'4E
  42.                 .data.w        8
  43.                 .data.w        h'36
  44. ; ---------------------------------------------------------------------------
  45.                 mov        #h'1F, r9      
  46.                 mov        r10, r5
  47.                 mov.b        @r8+, r2
  48.                 mov        r10, r4
  49.                 extu.b        r2, r2
  50.                 mov.b        @r8+, r1
  51.                 shll8        r2
  52.                 extu.b        r1, r1
  53.                 or        r1, r2                ;
  54.                 and        r2, r9
  55.                 add        #4, r9                ;
  56.                 shlr2        r2
  57.                 shlr        r2
  58.                 shlr2        r2
  59.                 add        #1, r2               
  60.                 sub        r2, r5
  61.                 mov.l        @(h'BC,pc), r1 ; [060362A8] = sub_60362B8
  62.                 mov        r9, r6
  63.                 jsr        @r1 ; sub_60362B8
  64.                 mov.l        r7, @(h'10,r14)
  65.                 mov.l        @(h'10,r14), r7
  66.                 bra        loc_6036250
  67.                 add        r9, r10
  68. ; ---------------------------------------------------------------------------
  69.                 mov.b        @r8+, r1       
  70.                 extu.b        r1, r9       
  71.                 cmp/pl        r9
  72.                 bf        loc_6036250

  73. loc_60361FE:                               
  74.                 mov.b        @r8+, r1
  75.                 add        #-1, r9
  76.                 cmp/pl        r9
  77.                 mov.b        r1, @r10
  78.                 bt/s        loc_60361FE
  79.                 add        #1, r10
  80.                 bra        loc_6036252
  81.                 add        #1, r11
  82. ; ---------------------------------------------------------------------------
  83.                 mov.b        @r8+, r1       
  84.                 mov.b        r1, @r10       
  85.                 bra        loc_6036250
  86.                 add        #1, r10
  87. ; ---------------------------------------------------------------------------
  88.                 mov.b        @r8, r1               
  89.                 mov.l        @(h'14,r14), r13
  90.                 mov        #4, r11
  91.                 mov.l        @r14, r3       
  92.                 extu.b        r1, r1
  93.                 add        r1, r8
  94.                 add        #1, r8
  95.                 add        #1, r13
  96.                 tst        r3, r3
  97.                 bt/s        loc_6036250
  98.                 mov.l        r13, @(h'14,r14)
  99.                 cmp/gt        r13, r3
  100.                 bt/s        loc_6036252
  101.                 add        #1, r11
  102.                 mov        r8, r1
  103.                 mov.l        @(8,r14), r13
  104.                 sub        r13, r1
  105.                 mov.l        @(h'70,pc), r13 ; [060362AC] = h'60A7434
  106.                 mov.l        @r7, r2
  107.                 mov        #1, r0
  108.                 add        r1, r2
  109.                 mov.l        r2, @r7
  110.                 mov.l        @(4,r14), r3
  111.                 mov        r10, r1
  112.                 mov.l        @r13, r2
  113.                 sub        r3, r1
  114.                 add        r1, r2
  115.                 bra        loc_6036284
  116.                 mov.l        r2, @r13
  117. ; ---------------------------------------------------------------------------

  118. loc_6036250:                                ; CODE XREF: sub_603617C+32j
  119.                                         ; sub_603617C+76j ...
  120.                 add        #1, r11

  121. loc_6036252:                                ; CODE XREF: sub_603617C+8Ej
  122.                                         ; sub_603617C+B2j
  123.                 mov        #3, r1                ;
  124.                 cmp/gt        r1, r11
  125.                 bt/s        loc_603625E
  126.                 shar        r12
  127.                 bra        loc_60361A6
  128.                 shar        r12
  129. ; ---------------------------------------------------------------------------

  130. loc_603625E:                                ; CODE XREF: sub_603617C+DAj
  131.                 mov.b        @r8+, r1
  132.                 extu.b        r1, r12
  133.                 tst        r12, r12        ;
  134.                 bf/s        loc_60361A6
  135.                 mov        #0, r11
  136.                 mov        r10, r1                ;
  137.                 mov.l        @(4,r14), r3
  138.                 sub        r3, r1
  139.                 mov.l        @(h'3C,pc), r13 ; [060362AC] = h'60A7434
  140.                 mov.l        @r13, r2        ;
  141.                 mov        #2, r0
  142.                 add        r1, r2
  143.                 mov.l        r2, @r13
  144.                 mov.l        @(8,r14), r3
  145.                 mov        r8, r1                ;
  146.                 mov.l        @r7, r2
  147.                 sub        r3, r1       
  148.                 add        r1, r2
  149.                 mov.l        r2, @r7       

  150. loc_6036284:                                ; CODE XREF: sub_603617C+D0j
  151.                 mov.l        @(h'28,pc), r1 ; [060362B0] = h'60A7440
  152.                 mov.l        r8, @r1
  153.                 mov.l        @(h'28,pc), r1 ; [060362B4] = h'60A7438
  154.                 mov.l        r10, @r1
  155.                 add        #h'18, r14
  156.                 mov        r14, r15
  157.                 lds.l        @r15+, pr
  158.                 mov.l        @r15+, r14
  159.                 mov.l        @r15+, r13
  160.                 mov.l        @r15+, r12
  161.                 mov.l        @r15+, r11
  162.                 mov.l        @r15+, r10
  163.                 mov.l        @r15+, r9
  164.                 rts
  165.                 mov.l        @r15+, r8
复制代码

返回列表