《恶魔城晓月圆舞曲》HACK教程(一)开启SOUND MODE的全声音

      TUTOR 2006-6-20 2:35

恶魔城晓月HACK教程(一)开启SOUND MODE的全声音

作者:0 DAY-S[EGCG]                        转载请注明出处
工具:NO$ GBA,EmuCheat,晓月中文版(基于日版汉化)

  在晓月的SOUND MODE(见图一)中,BGM 一项可播放游戏中的背景音乐,共29首(0-28); VOICE一项可播放游戏中的声音,共87个(0-86).美中不足的是,VOICE中仅仅包含游戏中的人声(和怪物声),其他的诸如打击音效移动音效都无法在此模式下播放,非常不爽.
        如何才能播放全声音呢?Do it yourself.通过EmuCheat搜索得到如下关键内存地址:(须加上2000000h.)

2000604:  00 BGM           01 VOICE              02 EXIT
2000606:  BGM   调用NUMBER  00-28
2000608:  VOICE调用NUMBER  00-86
200060E:  BGM  调用参数

设断   [2000608] !   在SOUND MODE中按下十字键右或左,游戏中断.得到以下程序:
程序比较长,但只需注意有注释的部分.

0800AC24 B5F0     push    r4-r7,lr
0800AC26 4657     mov     r7,r10
0800AC28 464E     mov     r6,r9
0800AC2A 4645     mov     r5,r8
0800AC2C B4E0     push    r5-r7
0800AC2E B084     add     sp,-10h
0800AC30 490A     ldr     r1,=84BCA78h
0800AC32 6808     ldr     r0,[r1]
0800AC34 22CE     mov     r2,0CEh
0800AC36 00D2     lsl     r2,r2,3h
0800AC38 1887     add     r7,r0,r2
0800AC3A 4B09     ldr     r3,=6F4h
0800AC3C 181B     add     r3,r3,r0
0800AC3E 469A     mov     r10,r3
0800AC40 2401     mov     r4,1h
0800AC42 4264     neg     r4,r4
0800AC44 9403     str     r4,[sp,0Ch]
0800AC46 7C40     ldrb    r0,[r0,11h]
0800AC48 1C0E     mov     r6,r1
0800AC4A 2805     cmp     r0,5h
0800AC4C D900     bls     800AC50h
0800AC4E E2AC     b       800B1AAh
0800AC50 0080     lsl     r0,r0,2h
0800AC52 4904     ldr     r1,=800AC68h
0800AC54 1840     add     r0,r0,r1
0800AC56 6800     ldr     r0,[r0]
0800AC58 4687     mov     r15,r0
0800AC5A 0000     lsl     r0,r0,0h
0800AC5C CA78     ldmia   [r2]!,r3-r6
0800AC5E 084B     lsr     r3,r1,1h
0800AC60 06F4     lsl     r4,r6,1Bh
0800AC62 0000     lsl     r0,r0,0h
0800AC64 AC68     add     r4,sp,1A0h
0800AC66 0800     lsr     r0,r0,20h
0800AC68 AC80     add     r4,sp,200h
0800AC6A 0800     lsr     r0,r0,20h
0800AC6C ACE4     add     r4,sp,390h
0800AC6E 0800     lsr     r0,r0,20h
0800AC70 AE14     add     r6,sp,50h
0800AC72 0800     lsr     r0,r0,20h
0800AC74 AE5C     add     r6,sp,170h
0800AC76 0800     lsr     r0,r0,20h
0800AC78 B130     ????
0800AC7A 0800     lsr     r0,r0,20h
0800AC7C B174     ????
0800AC7E 0800     lsr     r0,r0,20h
0800AC80 4913     ldr     r1,=3002C80h
0800AC82 2300     mov     r3,0h
0800AC84 20D8     mov     r0,0D8h
0800AC86 0140     lsl     r0,r0,5h
0800AC88 8008     strh    r0,[r1]
0800AC8A 4912     ldr     r1,=3002C30h
0800AC8C 1C0A     mov     r2,r1
0800AC8E 3248     add     r2,48h
0800AC90 4811     ldr     r0,=3FFFh
0800AC92 8010     strh    r0,[r2]
0800AC94 314C     add     r1,4Ch
0800AC96 2010     mov     r0,10h
0800AC98 8008     strh    r0,[r1]
0800AC9A 6831     ldr     r1,[r6]
0800AC9C 2001     mov     r0,1h
0800AC9E 7448     strb    r0,[r1,11h]
0800ACA0 6830     ldr     r0,[r6]
0800ACA2 7483     strb    r3,[r0,12h]
0800ACA4 2080     mov     r0,80h
0800ACA6 0140     lsl     r0,r0,5h
0800ACA8 F0CBF91E bl      80D5EE8h
0800ACAC 6830     ldr     r0,[r6]
0800ACAE 25CE     mov     r5,0CEh
0800ACB0 00ED     lsl     r5,r5,3h
0800ACB2 1940     add     r0,r0,r5
0800ACB4 F7F6F8AC bl      8000E10h
0800ACB8 6830     ldr     r0,[r6]
0800ACBA 4908     ldr     r1,=5ECh
0800ACBC 1840     add     r0,r0,r1
0800ACBE F7F6F8A7 bl      8000E10h
0800ACC2 6830     ldr     r0,[r6]
0800ACC4 4A06     ldr     r2,=6F4h
0800ACC6 1880     add     r0,r0,r2
0800ACC8 F7F6F8A2 bl      8000E10h
0800ACCC E26D     b       800B1AAh
0800ACCE 0000     lsl     r0,r0,0h
0800ACD0 2C80     cmp     r4,80h
0800ACD2 0300     lsl     r0,r0,0Ch
0800ACD4 2C30     cmp     r4,30h
0800ACD6 0300     lsl     r0,r0,0Ch
0800ACD8 3FFF     sub     r7,0FFh
0800ACDA 0000     lsl     r0,r0,0h
0800ACDC 05EC     lsl     r4,r5,17h
0800ACDE 0000     lsl     r0,r0,0h
0800ACE0 06F4     lsl     r4,r6,1Bh
0800ACE2 0000     lsl     r0,r0,0h
0800ACE4 2300     mov     r3,0h
0800ACE6 9302     str     r3,[sp,8h]
0800ACE8 4833     ldr     r0,=40000D4h
0800ACEA AC02     add     r4,sp,8h
0800ACEC 6004     str     r4,[r0]
0800ACEE 4933     ldr     r1,=600E800h
0800ACF0 6041     str     r1,[r0,4h]
0800ACF2 4A33     ldr     r2,=85000200h
0800ACF4 6082     str     r2,[r0,8h]
0800ACF6 6881     ldr     r1,[r0,8h]
0800ACF8 9302     str     r3,[sp,8h]
0800ACFA 6004     str     r4,[r0]
0800ACFC 4931     ldr     r1,=600F000h
0800ACFE 6041     str     r1,[r0,4h]
0800AD00 6082     str     r2,[r0,8h]
0800AD02 6881     ldr     r1,[r0,8h]
0800AD04 9302     str     r3,[sp,8h]
0800AD06 6004     str     r4,[r0]
0800AD08 492F     ldr     r1,=600F800h
0800AD0A 6041     str     r1,[r0,4h]
0800AD0C 6082     str     r2,[r0,8h]
0800AD0E 6880     ldr     r0,[r0,8h]
0800AD10 4A2E     ldr     r2,=3002C80h
0800AD12 8811     ldrh    r1,[r2]
0800AD14 482E     ldr     r0,=0FBFFh
0800AD16 4008     and     r0,r1
0800AD18 2400     mov     r4,0h
0800AD1A 8010     strh    r0,[r2]
0800AD1C 4A2D     ldr     r2,=3002C30h
0800AD1E 1C11     mov     r1,r2
0800AD20 3148     add     r1,48h
0800AD22 482D     ldr     r0,=853h
0800AD24 8008     strh    r0,[r1]
0800AD26 3102     add     r1,2h
0800AD28 482C     ldr     r0,=0A06h
0800AD2A 8008     strh    r0,[r1]
0800AD2C 1C10     mov     r0,r2
0800AD2E 304C     add     r0,4Ch
0800AD30 8003     strh    r3,[r0]
0800AD32 482B     ldr     r0,=1D01h
0800AD34 8050     strh    r0,[r2,2h]
0800AD36 482B     ldr     r0,=1E02h
0800AD38 8090     strh    r0,[r2,4h]
0800AD3A 482B     ldr     r0,=1F03h
0800AD3C 80D0     strh    r0,[r2,6h]
0800AD3E 482B     ldr     r0,=80E3854h
0800AD40 21C0     mov     r1,0C0h
0800AD42 04C9     lsl     r1,r1,13h
0800AD44 2200     mov     r2,0h
0800AD46 F034F8B3 bl      803EEB0h
0800AD4A 4829     ldr     r0,=80E385Ch
0800AD4C 4929     ldr     r1,=6002000h
0800AD4E 2200     mov     r2,0h
0800AD50 F034F8AE bl      803EEB0h
0800AD54 4828     ldr     r0,=80E3864h
0800AD56 4929     ldr     r1,=6004000h
0800AD58 2200     mov     r2,0h
0800AD5A F034F8A9 bl      803EEB0h
0800AD5E 4828     ldr     r0,=80E3AC8h
0800AD60 F030FE30 bl      803B9C4h
0800AD64 4927     ldr     r1,=80E4D60h
0800AD66 2003     mov     r0,3h
0800AD68 2200     mov     r2,0h
0800AD6A 2300     mov     r3,0h
0800AD6C F033FE26 bl      803E9BCh
0800AD70 4925     ldr     r1,=80E4580h
0800AD72 2002     mov     r0,2h
0800AD74 2200     mov     r2,0h
0800AD76 2300     mov     r3,0h
0800AD78 F033FE20 bl      803E9BCh
0800AD7C 4923     ldr     r1,=80E4610h
0800AD7E 2001     mov     r0,1h
0800AD80 2200     mov     r2,0h
0800AD82 2300     mov     r3,0h
0800AD84 F033FE1A bl      803E9BCh
0800AD88 20EB     mov     r0,0EBh
0800AD8A 0080     lsl     r0,r0,2h
0800AD8C F7FFFE74 bl      800AA78h
0800AD90 4A1F     ldr     r2,=84BCA78h
0800AD92 6811     ldr     r1,[r2]
0800AD94 2010     mov     r0,10h
0800AD96 8088     strh    r0,[r1,4h]
0800AD98 2002     mov     r0,2h
0800AD9A 7448     strb    r0,[r1,11h]
0800AD9C 6810     ldr     r0,[r2]
0800AD9E 7484     strb    r4,[r0,12h]
0800ADA0 1C38     mov     r0,r7
0800ADA2 210E     mov     r1,0Eh
0800ADA4 F03CFBE2 bl      804756Ch
0800ADA8 1C39     mov     r1,r7
0800ADAA 3142     add     r1,42h
0800ADAC 2052     mov     r0,52h
0800ADAE 8008     strh    r0,[r1]
0800ADB0 3104     add     r1,4h
0800ADB2 2034     mov     r0,34h
0800ADB4 8008     strh    r0,[r1]
0800ADB6 E1F8     b       800B1AAh
0800ADB8 00D4     lsl     r4,r2,3h
0800ADBA 0400     lsl     r0,r0,10h
0800ADBC E800     ????
0800ADBE 0600     lsl     r0,r0,18h
0800ADC0 0200     lsl     r0,r0,8h
0800ADC2 8500     strh    r0,[r0,28h]
0800ADC4 F0000600 ????
0800ADC6 0600     lsl     r0,r0,18h
0800ADC8 F8000600 ????
0800ADCA 0600     lsl     r0,r0,18h
0800ADCC 2C80     cmp     r4,80h
0800ADCE 0300     lsl     r0,r0,0Ch
0800ADD0 FBFF0000 ????
0800ADD2 0000     lsl     r0,r0,0h
0800ADD4 2C30     cmp     r4,30h
0800ADD6 0300     lsl     r0,r0,0Ch
0800ADD8 0853     lsr     r3,r2,1h
0800ADDA 0000     lsl     r0,r0,0h
0800ADDC 0A06     lsr     r6,r0,8h
0800ADDE 0000     lsl     r0,r0,0h
0800ADE0 1D01     add     r1,r0,4
0800ADE2 0000     lsl     r0,r0,0h
0800ADE4 1E02     sub     r2,r0,0
0800ADE6 0000     lsl     r0,r0,0h
0800ADE8 1F03     sub     r3,r0,4
0800ADEA 0000     lsl     r0,r0,0h
0800ADEC 3854     sub     r0,54h
0800ADEE 080E     lsr     r6,r1,20h
0800ADF0 385C     sub     r0,5Ch
0800ADF2 080E     lsr     r6,r1,20h
0800ADF4 2000     mov     r0,0h
0800ADF6 0600     lsl     r0,r0,18h
0800ADF8 3864     sub     r0,64h
0800ADFA 080E     lsr     r6,r1,20h
0800ADFC 4000     and     r0,r0
0800ADFE 0600     lsl     r0,r0,18h
0800AE00 3AC8     sub     r2,0C8h
0800AE02 080E     lsr     r6,r1,20h
0800AE04 4D60     ldr     r5,=0E010h
0800AE06 080E     lsr     r6,r1,20h
0800AE08 4580     cmp     r8,r0
0800AE0A 080E     lsr     r6,r1,20h
0800AE0C 4610     ????
0800AE0E 080E     lsr     r6,r1,20h
0800AE10 CA78     ldmia   [r2]!,r3-r6
0800AE12 084B     lsr     r3,r1,1h
0800AE14 6831     ldr     r1,[r6]
0800AE16 8888     ldrh    r0,[r1,4h]
0800AE18 2800     cmp     r0,0h
0800AE1A D001     beq     800AE20h
0800AE1C 3802     sub     r0,2h
0800AE1E E1AE     b       800B17Eh
0800AE20 4A0A     ldr     r2,=3002C80h
0800AE22 8811     ldrh    r1,[r2]
0800AE24 25F0     mov     r5,0F0h
0800AE26 012D     lsl     r5,r5,4h
0800AE28 1C28     mov     r0,r5
0800AE2A 2300     mov     r3,0h
0800AE2C 4308     orr     r0,r1
0800AE2E 8010     strh    r0,[r2]
0800AE30 4907     ldr     r1,=3002C30h
0800AE32 1C0A     mov     r2,r1
0800AE34 3248     add     r2,48h
0800AE36 4807     ldr     r0,=844h
0800AE38 8010     strh    r0,[r2]
0800AE3A 314A     add     r1,4Ah
0800AE3C 4806     ldr     r0,=0A06h
0800AE3E 8008     strh    r0,[r1]
0800AE40 6831     ldr     r1,[r6]
0800AE42 2003     mov     r0,3h
0800AE44 7448     strb    r0,[r1,11h]
0800AE46 6830     ldr     r0,[r6]
0800AE48 7483     strb    r3,[r0,12h]
0800AE4A E1AE     b       800B1AAh
0800AE4C 2C80     cmp     r4,80h
0800AE4E 0300     lsl     r0,r0,0Ch
0800AE50 2C30     cmp     r4,30h
0800AE52 0300     lsl     r0,r0,0Ch
0800AE54 0844     lsr     r4,r0,1h
0800AE56 0000     lsl     r0,r0,0h
0800AE58 0A06     lsr     r6,r0,8h
0800AE5A 0000     lsl     r0,r0,0h
0800AE5C 6833     ldr     r3,[r6]
0800AE5E 8AD9     ldrh    r1,[r3,16h]
0800AE60 2008     mov     r0,8h
0800AE62 4008     and     r0,r1
0800AE64 2800     cmp     r0,0h           ;是否按START
0800AE66 D005     beq     800AE74h        ;没有
0800AE68 2000     mov     r0,0h           ;返回
0800AE6A 2104     mov     r1,4h
0800AE6C 7459     strb    r1,[r3,11h]
0800AE6E 6831     ldr     r1,[r6]
0800AE70 7488     strb    r0,[r1,12h]
0800AE72 E19A     b       800B1AAh
0800AE74 2080     mov     r0,80h
0800AE76 4905     ldr     r1,=604h
0800AE78 185A     add     r2,r3,r1
0800AE7A 2400     mov     r4,0h
0800AE7C 2502     mov     r5,2h
0800AE7E 8B19     ldrh    r1,[r3,18h]
0800AE80 4008     and     r0,r1
0800AE82 2800     cmp     r0,0h          ;是否按下
0800AE84 D004     beq     800AE90h
0800AE86 8810     ldrh    r0,[r2]
0800AE88 3001     add     r0,1h
0800AE8A E007     b       800AE9Ch
0800AE8C 0604     lsl     r4,r0,18h
0800AE8E 0000     lsl     r0,r0,0h
0800AE90 2040     mov     r0,40h
0800AE92 4001     and     r1,r0
0800AE94 2900     cmp     r1,0h         ;是否按上
0800AE96 D002     beq     800AE9Eh
0800AE98 8810     ldrh    r0,[r2]
0800AE9A 3801     sub     r0,1h
0800AE9C 8010     strh    r0,[r2]
0800AE9E 2300     mov     r3,0h
0800AEA0 5ED0     ldsh    r0,[r2,r3]
0800AEA2 42A8     cmp     r0,r5
0800AEA4 DD01     ble     800AEAAh
0800AEA6 8014     strh    r4,[r2]
0800AEA8 E002     b       800AEB0h
0800AEAA 2800     cmp     r0,0h
0800AEAC DA00     bge     800AEB0h
0800AEAE 8015     strh    r5,[r2]
0800AEB0 6834     ldr     r4,[r6]
0800AEB2 4D0C     ldr     r5,=604h
0800AEB4 1961     add     r1,r4,r5
0800AEB6 2200     mov     r2,0h
0800AEB8 5E88     ldsh    r0,[r1,r2]
0800AEBA 2801     cmp     r0,1h
0800AEBC DC3B     bgt     800AF36h
0800AEBE 4A0A     ldr     r2,=80DF334h
0800AEC0 0081     lsl     r1,r0,2h
0800AEC2 1889     add     r1,r1,r2
0800AEC4 2210     mov     r2,10h
0800AEC6 0040     lsl     r0,r0,1h
0800AEC8 1903     add     r3,r0,r4
0800AECA 3502     add     r5,2h
0800AECC 195B     add     r3,r3,r5
0800AECE 2000     mov     r0,0h
0800AED0 4680     mov     r8,r0
0800AED2 2002     mov     r0,2h
0800AED4 5E0D     ldsh    r5,[r1,r0]
0800AED6 8B21     ldrh    r1,[r4,18h]
0800AED8 400A     and     r2,r1             
0800AEDA 2A00     cmp     r2,0h                 ;是否按B取消播放
0800AEDC D006     beq     800AEECh
0800AEDE 8818     ldrh    r0,[r3]
0800AEE0 3001     add     r0,1h
0800AEE2 E009     b       800AEF8h
0800AEE4 0604     lsl     r4,r0,18h
0800AEE6 0000     lsl     r0,r0,0h
0800AEE8 F334080D ????
0800AEEA 080D     lsr     r5,r1,20h
0800AEEC 2020     mov     r0,20h
0800AEEE 4001     and     r1,r0
0800AEF0 2900     cmp     r1,0h                ;是否按左
0800AEF2 D002     beq     800AEFAh           ;没有,继续
0800AEF4 8818     ldrh    r0,[r3]               ;
0800AEF6 3801     sub     r0,1h                ;编号减1
0800AEF8 8018     strh    r0,[r3]               ;保存
0800AEFA>6830     ldr     r0,[r6]
0800AEFC 8B00     ldrh    r0,[r0,18h]
0800AEFE 2180     mov     r1,80h
0800AF00 0049     lsl     r1,r1,1h
0800AF02 4008     and     r0,r1
0800AF04 2800     cmp     r0,0h             ;是否按R
0800AF06 D002     beq     800AF0Eh        ;没有,继续
0800AF08 8818     ldrh    r0,[r3]
0800AF0A 300A     add     r0,0Ah            ;编号加10
0800AF0C 8018     strh    r0,[r3]
0800AF0E 6830     ldr     r0,[r6]
0800AF10 8B00     ldrh    r0,[r0,18h]
0800AF12 2180     mov     r1,80h         
0800AF14 0089     lsl     r1,r1,2h       
0800AF16 4008     and     r0,r1
0800AF18 2800     cmp     r0,0h           ;是否按L
0800AF1A D002     beq     800AF22h        ;没有,继续
0800AF1C 8818     ldrh    r0,[r3]
0800AF1E 380A     sub     r0,0Ah          ;编号减10
0800AF20 8018     strh    r0,[r3]
0800AF22 2100     mov     r1,0h
0800AF24 5E58     ldsh    r0,[r3,r1]     
0800AF26 42A8     cmp     r0,r5
0800AF28 DD02     ble     800AF30h
0800AF2A 4642     mov     r2,r8
0800AF2C 801A     strh    r2,[r3]
0800AF2E E002     b       800AF36h
0800AF30 2800     cmp     r0,0h
0800AF32 DA00     bge     800AF36h
0800AF34 801D     strh    r5,[r3]
0800AF36 6834     ldr     r4,[r6]
0800AF38 4B0B     ldr     r3,=604h
0800AF3A 18E2     add     r2,r4,r3
0800AF3C 2500     mov     r5,0h
0800AF3E 5F50     ldsh    r0,[r2,r5]
0800AF40 0100     lsl     r0,r0,4h
0800AF42 3034     add     r0,34h
0800AF44 1C39     mov     r1,r7
0800AF46 3146     add     r1,46h
0800AF48 8008     strh    r0,[r1]
0800AF4A 8AE1     ldrh    r1,[r4,16h]
0800AF4C 2001     mov     r0,1h
0800AF4E 4008     and     r0,r1
0800AF50 2800     cmp     r0,0h                ;是否按A播放
0800AF52 D065     beq     800B020h             ;没有,继续
0800AF54 2000     mov     r0,0h
0800AF56 5E13     ldsh    r3,[r2,r0]           ;2000604,得到当前选择项
0800AF58 2B00     cmp     r3,0h                ;是BGM
0800AF5A DB61     blt     800B020h           
0800AF5C 2B01     cmp     r3,1h                ;是VOICE
0800AF5E DD05     ble     800AF6Ch             ;
0800AF60 2B02     cmp     r3,2h                ;是EXIT
0800AF62 D053     beq     800B00Ch             ;返回
0800AF64 E05C     b       800B020h
0800AF66 0000     lsl     r0,r0,0h
0800AF68 0604     lsl     r4,r0,18h
0800AF6A 0000     lsl     r0,r0,0h
0800AF6C 2100     mov     r1,0h
0800AF6E 5E50     ldsh    r0,[r2,r1]           ;2000604,得到当前选择项
0800AF70 2800     cmp     r0,0h                ;不是BGM
0800AF72 D10F     bne     800AF94h             ;跳
0800AF74 4A05     ldr     r2,=80DF340h         ;BGM相关指针
0800AF76 0059     lsl     r1,r3,1h
0800AF78 4B05     ldr     r3,=606h        
0800AF7A 18E0     add     r0,r4,r3             ;2000606,BGM编号
0800AF7C 1840     add     r0,r0,r1
0800AF7E 2400     mov     r4,0h
0800AF80 5F00     ldsh    r0,[r0,r4]
0800AF82 0080     lsl     r0,r0,2h
0800AF84 1880     add     r0,r0,r2
0800AF86 8804     ldrh    r4,[r0]
0800AF88 E010     b       800AFACh
0800AF8A 0000     lsl     r0,r0,0h
0800AF8C F340080D ????
0800AF8E 080D     lsr     r5,r1,20h
0800AF90 0606     lsl     r6,r0,18h
0800AF92 0000     lsl     r0,r0,0h
0800AF94 4817     ldr     r0,=80DF334h         ;VOICE相关指针
0800AF96 0099     lsl     r1,r3,2h
0800AF98 1809     add     r1,r1,r0
0800AF9A 005A     lsl     r2,r3,1h
0800AF9C 4D16     ldr     r5,=606h
0800AF9E 1960     add     r0,r4,r5
0800AFA0 1880     add     r0,r0,r2             ;2000608,VOICE编号
0800AFA2 8800     ldrh    r0,[r0]              ;声音参数基址,190H
0800AFA4 8809     ldrh    r1,[r1]
0800AFA6 1840     add     r0,r0,r1
0800AFA8 0400     lsl     r0,r0,10h
0800AFAA 0C04     lsr     r4,r0,10h
0800AFAC 4E13     ldr     r6,=84BCA78h
0800AFAE 6830     ldr     r0,[r6]
0800AFB0 4D13     ldr     r5,=604h
0800AFB2 1941     add     r1,r0,r5
0800AFB4 2200     mov     r2,0h
0800AFB6 5E89     ldsh    r1,[r1,r2]
0800AFB8 0049     lsl     r1,r1,1h
0800AFBA 4B12     ldr     r3,=60Eh
0800AFBC 18C0     add     r0,r0,r3
0800AFBE 1840     add     r0,r0,r1
0800AFC0 8801     ldrh    r1,[r0]
0800AFC2 2200     mov     r2,0h
0800AFC4 5E80     ldsh    r0,[r0,r2]
0800AFC6 2800     cmp     r0,0h
0800AFC8 D006     beq     800AFD8h
0800AFCA 4B0F     ldr     r3,=0FFFF8000h
0800AFCC 1C18     mov     r0,r3
0800AFCE 4308     orr     r0,r1
0800AFD0 0400     lsl     r0,r0,10h
0800AFD2 0C00     lsr     r0,r0,10h
0800AFD4 F0CAFF88 bl      80D5EE8h             ;声音调用
0800AFD8 6830     ldr     r0,[r6]
0800AFDA 1941     add     r1,r0,r5
0800AFDC 2500     mov     r5,0h
0800AFDE 5F49     ldsh    r1,[r1,r5]
0800AFE0 0049     lsl     r1,r1,1h
0800AFE2 4A08     ldr     r2,=60Eh
0800AFE4 1880     add     r0,r0,r2
0800AFE6 1840     add     r0,r0,r1
0800AFE8 8004     strh    r4,[r0]
0800AFEA 1C20     mov     r0,r4
0800AFEC F0CAFF7C bl      80D5EE8h              ;声音调用
0800AFF0 E016     b       800B020h
0800AFF2 0000     lsl     r0,r0,0h
0800AFF4 F334080D ????
0800AFF6 080D     lsr     r5,r1,20h
0800AFF8 0606     lsl     r6,r0,18h
0800AFFA 0000     lsl     r0,r0,0h
0800AFFC CA78     ldmia   [r2]!,r3-r6
0800AFFE 084B     lsr     r3,r1,1h
0800B000 0604     lsl     r4,r0,18h
0800B002 0000     lsl     r0,r0,0h
0800B004 060E     lsl     r6,r1,18h
0800B006 0000     lsl     r0,r0,0h
0800B008 8000     strh    r0,[r0]
0800B00A FFFF2080 ????

至此我们找到声音调用的一般格式:

 mov     r0,??h                 ;声音参数,??h可能为数字,也可能为寄存器
 bl      80D5EE8h            ;声音调用程序

那么我们在程序中查找 bl      80D5EE8h就可以找到大部分的声音调用了。

图一    (修改前)                     

  

图二    (修改后)


回到正题.我们注意到这里:

0800AF94 4817     ldr     r0,=80DF334h         ;VOICE相关指针
0800AF96 0099     lsl     r1,r3,2h
0800AF98 1809     add     r1,r1,r0
0800AF9A 005A     lsl     r2,r3,1h
0800AF9C 4D16     ldr     r5,=606h
0800AF9E 1960     add     r0,r4,r5
0800AFA0 1880     add     r0,r0,r2             ;2000608,VOICE编号
0800AFA2 8800     ldrh    r0,[r0]              ;声音参数基址,190H
0800AFA4 8809     ldrh    r1,[r1]
0800AFA6 1840     add     r0,r0,r1
0800AFA8 0400     lsl     r0,r0,10h
0800AFAA 0C04     lsr     r4,r0,10h

  在数据窗口查看80DF334h后的内容,发现:

80DF338h :190h   ;人声参数基址
80DF33Ah: 56h              ;MAX声音编号

  根据声音调用的一般格式,我们猜测声音参数是从00h开始的,将80DF338h:190h改为00h,通过范围测试将max声音编号修改为1F4h(500),回到游戏,果然能播放其他的声音了,但声音编号的切换显示却不正常.因为原显示程序只支持两位十进制数的刷新,而修改后的声音编号则达到三位了.
       对VRAM的相应地址设断,中断后来到如下程序:
Relax,下面又到了我们的猜参数时间.(我为什么要说"又"?)

0800B102 2012     mov     r0,12h       ;刷新显示的位数,两位
0800B104 1C29     mov     r1,r5            
0800B106 2302     mov     r3,2h      ;刷新控制的位数,两位
0800B108 F03AFB68 bl      80457DCh   ;SOUND MODE编号显示程序
0800B10C 3502     add     r5,2h
0800B10E 3401     add     r4,1h
0800B110 2C01     cmp     r4,1h
0800B112 DDE9     ble     800B0E8h
0800B114 E049     b       800B1AAh

修改程序为:

0800B102 2013     mov     r0,13h       ;刷新显示的位数,三位
0800B104 1C29     mov     r1,r5            
0800B106 2302     mov     r3,3h      ;刷新控制的位数,三位
0800B108 F03AFB68 bl      80457DCh   ;SOUND MODE编号显示程序

回到游戏,BINGO,显示刷新正确.(见图二)收工.有兴趣的朋友可以尝试加上按SELECT编号加100的程序^^^
这个修改的主要作用并不仅限于此.修改后VOICE编号正好等于游戏中声音调用的参数,为查找程序提供了便利.

附表一 修改地址及数据:

80DF338h :9001 ->    0000  
80DF33Ah: 5600    ->    F401
800B102h: 12         ->    13 
800B106h: 02         ->    03 

附表二 BGM编号参数对照表:

编号          曲名             声音参数        备注

00        漆黑的太阳            1B           标题画面
01        输入名字              0E      
02        开场--弥娜主题曲      15(1D)
03        荒城回廊              02
04        礼拜堂                08
05        恶魔城藏书库          07
06        舞踏馆                05
07        幻梦宫                06
08        忘却之庭园            09
09        时计塔                01
10        地下水域              03
11        炼狱斗技场            0A
12        恶魔城最上阶          04
13        不可侵洞穴            0B(1C)
14        原初之混沌            0C
15        哈马商会              0D(1E)
16        游戏结束              0F
17        对决                  10
18        强敌登场              11
19        王座之战              13
20        混沌之战              1F
21        最终决战              12
22        等不到晚上            14             JULIUS专用
23        预感                  16(17,19)
24        魔王之宿命            21(22)
25        你并不孤独            23(24)
26        净化                  20
27        结局                  18
28        制作人员表            1A

其中 参数 17,19,1C,1D,1E,22,24是重复调用,25h是游戏开始时的风声。

                                                    0DAY-S 原写于2006-06-17 00:32

标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}
}