首先特别感谢绝爱仙剑宝宝,反汇编源码及说明都非常详尽。
最近闲来想把黄金的全部地图给导出来,于是参照绝爱仙剑宝宝的反汇编源码及说明去挊,可搞出来的地图仅有几张正确,其余虽然有很多都能对上,但总有部分位置不同。。
于是读代码发现,仙剑宝宝的提取地图方法适用于最原始的GMUD之英雄坛说(标牌仍会有错误),而黄金增加了地图及大量NPC,而地图数据中不仅包含地图图片信息,还含有部分事件信息,因此要进行修正
在Part1部分
539C : CPY #$00 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
539E : BEQ $53A6 ;Z=1则转移,否则继续
53A0 : CPY #$09 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
53A2 : BEQ $53BF ;Z=1则转移,否则继续
53A4 : BNE $53C1 ;Z=0则转移,否则继续
53A6 : CMP #$08 ;与A比较,(A>=MEM,c=1)(A<MEM,C=0,N=1)(A==MEM,Z=1)
53A8 : BNE $53B3 ;Z=0则转移,否则继续
53AA : LDA $3185 ;->A
53AD : ASL ;算术左移
53AE : ASL ;算术左移
53AF : ASL ;算术左移
53B0 : JMP $53C1 ;
53B3 : LDA $2E9B ;->A ImageID
53B6 : ASL ;算术左移
53B7 : ASL ;算术左移
53B8 : ASL ;算术左移 *8
53B9 : CLC ;清进位标志
53BA : ADC $75 ;与(A+标志C)相加,结果送A
53BC : JMP $53C1 ;
53BF : LDA #$00 ;->A
53C1 : INT $3118 ;page2 AAF2
53C4 : STA $80 ;A->MEM
53C6 : LDA #$00 ;->A
53C8 : STA $81 ;A->MEM
539C中比较的Y为地图元素的类型,类型00与主角行走图相关;类型09(地名标牌),会把A(图片ID)改为0。
在经过初步的处理再去INT $3118(Part2 AAF2行开始)
AAF2 : BIT $3445 ;A∧($n2n1)
AAF5 : BPL $AAFB ;N=0则转移,否则继续
AAF7 : INT $3110 ;
AAFA : RTS ;子程序返回
AAFB : STA $83 ;A->MEM
AAFD : TYA ;Y->A
AAFE : PHA ;累加器进栈
AAFF : CPY #$0B ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB01 : BEQ $AB20 ;Z=1则转移,否则继续
AB03 : CPY #$0A ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB05 : BEQ $AB20 ;Z=1则转移,否则继续
AB07 : CPY #$06 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB09 : BEQ $AB35 ;Z=1则转移,否则继续
AB0B : CPY #$02 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB0D : BEQ $AB4A ;Z=1则转移,否则继续
AB0F : CPY #$03 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB11 : BEQ $AB5F ;Z=1则转移,否则继续
AB13 : CPY #$04 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB15 : BEQ $AB82 ;Z=1则转移,否则继续
AB17 : CPY #$05 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB19 : BEQ $AB97 ;Z=1则转移,否则继续
AB1B : PLA ;A出栈
AB1C : TAY ;A->Y
AB1D : LDA $83 ;->A
AB1F : RTS ;子程序返回
AB20 : LDA $83 ;->A
AB22 : CMP #$07 ;与A比较,(A>=MEM,c=1)(A<MEM,C=0,N=1)(A==MEM,Z=1)
AB24 : BCC $AB1B ;进位标志C=0则转移,否则继续
AB26 : LDA #$73 ;->A
AB28 : STA $80 ;A->MEM
AB2A : LDA #$B1 ;->A
AB2C : STA $81 ;A->MEM B173 07010801
AB2E : LDA #$04 ;->A
AB30 : STA $82 ;A->MEM
AB32 : JMP $ABAF ;
这边开始会替换部分02,03,04,05,06,0A,0B中的图片,JMP $ABAF查表替换,$80$81为查表的起始地址,$82为查表的长度,$83是暂存的图片ID,用来比对,这其中主要替换了箭头房屋及黄金新增的NPC(黄金NPC图片ID已经超过了人物图片ID最大值)的图片。经过替换后最终再得到真正的地图。
最近闲来想把黄金的全部地图给导出来,于是参照绝爱仙剑宝宝的反汇编源码及说明去挊,可搞出来的地图仅有几张正确,其余虽然有很多都能对上,但总有部分位置不同。。
于是读代码发现,仙剑宝宝的提取地图方法适用于最原始的GMUD之英雄坛说(标牌仍会有错误),而黄金增加了地图及大量NPC,而地图数据中不仅包含地图图片信息,还含有部分事件信息,因此要进行修正
在Part1部分
539C : CPY #$00 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
539E : BEQ $53A6 ;Z=1则转移,否则继续
53A0 : CPY #$09 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
53A2 : BEQ $53BF ;Z=1则转移,否则继续
53A4 : BNE $53C1 ;Z=0则转移,否则继续
53A6 : CMP #$08 ;与A比较,(A>=MEM,c=1)(A<MEM,C=0,N=1)(A==MEM,Z=1)
53A8 : BNE $53B3 ;Z=0则转移,否则继续
53AA : LDA $3185 ;->A
53AD : ASL ;算术左移
53AE : ASL ;算术左移
53AF : ASL ;算术左移
53B0 : JMP $53C1 ;
53B3 : LDA $2E9B ;->A ImageID
53B6 : ASL ;算术左移
53B7 : ASL ;算术左移
53B8 : ASL ;算术左移 *8
53B9 : CLC ;清进位标志
53BA : ADC $75 ;与(A+标志C)相加,结果送A
53BC : JMP $53C1 ;
53BF : LDA #$00 ;->A
53C1 : INT $3118 ;page2 AAF2
53C4 : STA $80 ;A->MEM
53C6 : LDA #$00 ;->A
53C8 : STA $81 ;A->MEM
539C中比较的Y为地图元素的类型,类型00与主角行走图相关;类型09(地名标牌),会把A(图片ID)改为0。
在经过初步的处理再去INT $3118(Part2 AAF2行开始)
AAF2 : BIT $3445 ;A∧($n2n1)
AAF5 : BPL $AAFB ;N=0则转移,否则继续
AAF7 : INT $3110 ;
AAFA : RTS ;子程序返回
AAFB : STA $83 ;A->MEM
AAFD : TYA ;Y->A
AAFE : PHA ;累加器进栈
AAFF : CPY #$0B ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB01 : BEQ $AB20 ;Z=1则转移,否则继续
AB03 : CPY #$0A ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB05 : BEQ $AB20 ;Z=1则转移,否则继续
AB07 : CPY #$06 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB09 : BEQ $AB35 ;Z=1则转移,否则继续
AB0B : CPY #$02 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB0D : BEQ $AB4A ;Z=1则转移,否则继续
AB0F : CPY #$03 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB11 : BEQ $AB5F ;Z=1则转移,否则继续
AB13 : CPY #$04 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB15 : BEQ $AB82 ;Z=1则转移,否则继续
AB17 : CPY #$05 ;与Y比较,(Y>=MEM,c=1)(Y<MEM,C=0,N=1)(Y==MEM,Z=0)
AB19 : BEQ $AB97 ;Z=1则转移,否则继续
AB1B : PLA ;A出栈
AB1C : TAY ;A->Y
AB1D : LDA $83 ;->A
AB1F : RTS ;子程序返回
AB20 : LDA $83 ;->A
AB22 : CMP #$07 ;与A比较,(A>=MEM,c=1)(A<MEM,C=0,N=1)(A==MEM,Z=1)
AB24 : BCC $AB1B ;进位标志C=0则转移,否则继续
AB26 : LDA #$73 ;->A
AB28 : STA $80 ;A->MEM
AB2A : LDA #$B1 ;->A
AB2C : STA $81 ;A->MEM B173 07010801
AB2E : LDA #$04 ;->A
AB30 : STA $82 ;A->MEM
AB32 : JMP $ABAF ;
这边开始会替换部分02,03,04,05,06,0A,0B中的图片,JMP $ABAF查表替换,$80$81为查表的起始地址,$82为查表的长度,$83是暂存的图片ID,用来比对,这其中主要替换了箭头房屋及黄金新增的NPC(黄金NPC图片ID已经超过了人物图片ID最大值)的图片。经过替换后最终再得到真正的地图。