Schelfaniel 发表于 2010-8-2 20:53

MD版 梦幻模拟战2 解压入口程序解析

原文:http://www.snowemu.cn/bbs/viewthread.php?tid=3169


目前L2的压缩方法有几种,各种源程序如下:

ROM:000099B2               movem.l d0-d2/a0-a1,-(sp)
ROM:000099B6               move.wd0,d2      ;比如说,艾尔文头像,压缩指针编码80E7
ROM:000099B8               bpl.s   loc_99C2
ROM:000099BA               move.la1,d1         ; 解压地址,比如头像DMA显存地址是VDP D300
ROM:000099BC               lea   ($FF1000).l,a1
ROM:000099C2
ROM:000099C2 loc_99C2:                               ; CODE XREF: sub_99B2+6j
ROM:000099C2               andi.w#$7FFF,d0
ROM:000099C6               bsr.s   sub_9A0E      ; 根据编码换算出压缩数据地址
ROM:000099C8               bsr.s   sub_99FA      ; 解压程序入口
ROM:000099CA               tst.w   d2
ROM:000099CC               bpl.s   loc_99EA
ROM:000099CE               movea.l ($FFFF81C4).w,a1
ROM:000099D2               move.w#$FFF9,(a1)+
ROM:000099D6               move.wd1,(a1)+
ROM:000099D8               move.l#$FF1000,(a1)+
ROM:000099DE               lsr.w   #1,d0
ROM:000099E0               move.wd0,(a1)+
ROM:000099E2               move.la1,($FFFF81C4).w
ROM:000099E6               bsr.w   sub_8A6C
ROM:000099EA loc_99EA:
ROM:000099EA               movem.l (sp)+,d0-d2/a0-a1
ROM:000099EE               rts


ROM:00009A0E               move.wd0,-(sp)   ;比如说,艾尔文头像,压缩指针编码E7,凯恩F7
ROM:00009A10               movea.l #off_B0000,a0   压缩数据地址指针表
ROM:00009A16               lsl.w   #2,d0
ROM:00009A18               movea.l (a0,d0.w),a0
ROM:00009A1C               move.w(sp)+,d0
ROM:00009A1E               rts

解压总程序入口:
ROM:000099FA               move.la0,-(sp)      ;a0为压缩数据地址
ROM:000099FC               moveq   #0,d0
ROM:000099FE               move.b(a0)+,d0      ; 读第一个数据,判断解压类型,3为战斗动画解压类型
ROM:000099FE                                       ; 2为头像等其他
ROM:00009A00               add.w   d0,d0
ROM:00009A02               move.wword_99F0(pc,d0.w),d0
ROM:00009A06               jsr   word_99F0(pc,d0.w)
ROM:00009A0A               movea.l (sp)+,a0
ROM:00009A0C               rts

头像解压入口地址类型是2,也就是9C10

希望对那些想制作L2加强/修改版的朋友有帮助


BY ken_tse

Doi_Doi 发表于 2010-8-2 23:49

除了Ken和机关这里还有谁会M68k汇编:cat6:

フラナガン機關 发表于 2010-8-3 08:20

另外的一段3屬程序是:

ROM:00009DFE ; ---------------------------------------------------------------------------
ROM:00009DFE               movem.l d1-a2,-(sp)
ROM:00009E02               movea.l a1,a2
ROM:00009E04               move.b(a0)+,d7
ROM:00009E06               lsl.w   #8,d7
ROM:00009E08               move.b(a0)+,d7
ROM:00009E0A               move.wd7,-(sp)
ROM:00009E0C               lea   ($FF0000).l,a2
ROM:00009E12               move.w#$FF,d6 ; <suspicious>
ROM:00009E16               move.l#$20202020,d3
ROM:00009E16
ROM:00009E1C
ROM:00009E1C loc_9E1C:                               ; CODE XREF: ROM:00009E24↓j
ROM:00009E1C               move.ld3,(a2)+
ROM:00009E1E               move.ld3,(a2)+
ROM:00009E20               move.ld3,(a2)+
ROM:00009E22               move.ld3,(a2)+
ROM:00009E24               dbf   d6,loc_9E1C
ROM:00009E24
ROM:00009E28               movea.l a1,a2
ROM:00009E2A               lea   ($FF0000).l,a1
ROM:00009E30               move.w#$FEE,d6 ; <suspicious>
ROM:00009E34               moveq   #0,d3
ROM:00009E34
ROM:00009E36
ROM:00009E36 loc_9E36:                               ; CODE XREF: ROM:00009E68↓j
ROM:00009E36                                       ; ROM:00009EB8↓j
ROM:00009E36               move.b(a0)+,d5
ROM:00009E38               moveq   #7,d4
ROM:00009E38
ROM:00009E3A
ROM:00009E3A loc_9E3A:                               ; CODE XREF: ROM:00009E64↓j
ROM:00009E3A                                       ; ROM:00009EB4↓j
ROM:00009E3A               lsr.b   #1,d5
ROM:00009E3C               bcc.s   loc_9E6A
ROM:00009E3C
ROM:00009E3E               moveq   #0,d0
ROM:00009E40               move.b(a0)+,d0
ROM:00009E42               move.bd0,(a1,d6.w)
ROM:00009E46               addq.w#1,d3
ROM:00009E48               swap    d3
ROM:00009E4A               btst    #$10,d3
ROM:00009E4E               bne.s   loc_9E56
ROM:00009E4E
ROM:00009E50               lsl.w   #8,d3
ROM:00009E52               or.w    d3,d0
ROM:00009E54               move.wd0,(a2)+
ROM:00009E54
ROM:00009E56
ROM:00009E56 loc_9E56:                               ; CODE XREF: ROM:00009E4E↑j
ROM:00009E56               move.bd0,d3
ROM:00009E58               swap    d3
ROM:00009E5A               addq.w#1,d6
ROM:00009E5C               andi.w#$FFF,d6 ; <suspicious>
ROM:00009E60               subq.w#1,d7
ROM:00009E62               beq.s   loc_9EBC
ROM:00009E62
ROM:00009E64               dbf   d4,loc_9E3A
ROM:00009E64
ROM:00009E68               bra.s   loc_9E36
ROM:00009E68
ROM:00009E6A ; ---------------------------------------------------------------------------

orphee22 发表于 2010-8-3 08:29

天文数值,艾
页: [1]
查看完整版本: MD版 梦幻模拟战2 解压入口程序解析