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 除了Ken和机关这里还有谁会M68k汇编:cat6: 另外的一段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 ; --------------------------------------------------------------------------- 天文数值,艾
页:
[1]