mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-22 22:00:39 -06:00
DSPHLE: Decoded most of 0x21. Added real conclusions to the switch case to signal the CPU that the voice has been played. More work on 0x20/0x21/Raw (and probably the end of it) this weekend.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3683 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -3441,10 +3441,17 @@ void 0a91_Unk() {
|
||||
|
||||
//////////////////////////////////////////// 0x20 DECODER
|
||||
{
|
||||
0a9a 8900 clr $ACC1
|
||||
0a9b 0f50 lris $AC1.M, #0x50
|
||||
0a9c 0083 0520 lri $AR3, #0x0520
|
||||
0a9e 02bf 0ab3 call 0x0ab3
|
||||
// 0a9a 8900 clr $ACC1
|
||||
// 0a9b 0f50 lris $AC1.M, #0x50
|
||||
// 0a9c 0083 0520 lri $AR3, #0x0520
|
||||
// 0a9e 02bf 0ab3 call 0x0ab3
|
||||
|
||||
ACC1 = 0;
|
||||
AC1.M = 0x50;
|
||||
AR3 = 0x520;
|
||||
|
||||
0ab3_Decoder0x21Core(AC1.M=0x50, AR3=#0x0580);
|
||||
|
||||
// 0aa0 029f 02d8 jmp 0x02d8
|
||||
GOTO ContinueWithBlock: // in SyncFrame
|
||||
}
|
||||
@ -3485,64 +3492,133 @@ void 0ab3_Decoder0x21Core(AC1.M, AR3) {
|
||||
// 0ab8 1f1f mrr $AX0.L, $AC1.M
|
||||
// 0ab9 0a00 lris $AX0.H, #0x00
|
||||
// 0aba 5800 subax $ACC0, $AX0.L
|
||||
ACC0 = [3a,3b] - AC1.M;
|
||||
ACC0 = [0x043a,0x043b] - AC1.M;
|
||||
|
||||
|
||||
0abb 0292 0ad1 jg 0x0ad1
|
||||
if ((prev val of)ACC0 > AX0.L) {
|
||||
0abd 8900 clr $ACC1
|
||||
0abe 00c0 043b lr $AR0, @0x043b
|
||||
0ac0 02bf 0af6 call 0x0af6 // 0af6_Decoder0x21_MoreStuff()
|
||||
// 0abb 0292 0ad1 jg 0x0ad1
|
||||
if ([0x043a,0x043b] > *0x043a) {
|
||||
// Happens when sound has finished playing?
|
||||
|
||||
// 0abd 8900 clr $ACC1
|
||||
// 0abe 00c0 043b lr $AR0, @0x043b
|
||||
ACC1 = 0;
|
||||
AR0 = 0x043b;
|
||||
|
||||
// 0ac0 02bf 0af6 call 0x0af6 // 0af6_Decoder0x21_MoreStuff()
|
||||
0af6_Decoder0x21_MoreStuff(AR0=0x043b);
|
||||
|
||||
// 0ac2 8100 clr $ACC0
|
||||
// 0ac3 1fd8 mrr $AC0.M, $AX0.L
|
||||
// 0ac4 223b lrs $AX0.H, @0x003b
|
||||
// 0ac5 5400 subr $ACC0, $AX0.H
|
||||
// 0ac6 0007 dar $AR3
|
||||
// 0ac7 1979 lrri $AX1.L, @$AR3
|
||||
|
||||
ACC0 = 0;
|
||||
AX0.H = *0x043b;
|
||||
AC0.M = AX0.L - *0x043b;
|
||||
|
||||
AX1.L = *$AR3;
|
||||
|
||||
// Looks like duplication of the first memory address AC0.M times
|
||||
|
||||
// 0ac8 005e loop $AC0.M
|
||||
for(int i = 0; i < AC0.M; i++) {
|
||||
// 0ac9 1b79 srri @$AR3, $AX1.L
|
||||
*$AR3++ = AX1.L;
|
||||
}
|
||||
|
||||
// 0aca 0f01 lris $AC1.M, #0x01
|
||||
// 0acb 2f01 srs @0x0001, $AC1.M
|
||||
// 0acc 8900 clr $ACC1
|
||||
// 0acd 2f3b srs @0x003b, $AC1.M
|
||||
|
||||
ACC1 = 0;
|
||||
|
||||
// Looks like some finalization of the PB
|
||||
*0x0401 = 1; // KeyOff
|
||||
*0x043b = 0; // RemLength
|
||||
|
||||
|
||||
0ac2 8100 clr $ACC0
|
||||
0ac3 1fd8 mrr $AC0.M, $AX0.L
|
||||
0ac4 223b lrs $AX0.H, @0x003b
|
||||
0ac5 5400 subr $ACC0, $AX0.H
|
||||
0ac6 0007 dar $AR3
|
||||
0ac7 1979 lrri $AX1.L, @$AR3
|
||||
0ac8 005e loop $AC0.M
|
||||
0ac9 1b79 srri @$AR3, $AX1.L
|
||||
0aca 0f01 lris $AC1.M, #0x01
|
||||
0acb 2f01 srs @0x0001, $AC1.M
|
||||
0acc 8900 clr $ACC1
|
||||
0acd 2f3b srs @0x003b, $AC1.M
|
||||
0ace 0092 00ff lri $CR, #0x00ff
|
||||
0ad0 02df ret
|
||||
//0ad0 02df ret
|
||||
return;
|
||||
}
|
||||
0ad1 2e3a srs @0x003a, $AC0.M
|
||||
0ad2 2c3b srs @0x003b, $AC0.L
|
||||
0ad3 8100 clr $ACC0
|
||||
0ad4 8900 clr $ACC1
|
||||
0ad5 268a lrs $AC0.M, @0xff8a
|
||||
0ad6 2734 lrs $AC1.M, @0x0034
|
||||
0ad7 5c00 sub $ACC0, $AC1.L
|
||||
0ad8 2e36 srs @0x0036, $AC0.M
|
||||
0ad9 5000 subr $ACC0, $AX0.L
|
||||
|
||||
// 0ad1 2e3a srs @0x003a, $AC0.M
|
||||
// 0ad2 2c3b srs @0x003b, $AC0.L
|
||||
|
||||
*0x043a = AC0.M;
|
||||
*0x043b = AC0.L;
|
||||
|
||||
// 0ad3 8100 clr $ACC0
|
||||
// 0ad4 8900 clr $ACC1
|
||||
// 0ad5 268a lrs $AC0.M, @0xff8a
|
||||
// 0ad6 2734 lrs $AC1.M, @0x0034
|
||||
|
||||
ACC0 = 0;
|
||||
ACC1 = 0;
|
||||
AC0.M = *0x048a;
|
||||
AC1.M = *0x0434;
|
||||
|
||||
// 0ad7 5c00 sub $ACC0, $AC1.L
|
||||
// 0ad8 2e36 srs @0x0036, $AC0.M
|
||||
|
||||
ACC0 -= AC1.L;
|
||||
*0x0436 = (ACC0 & 0xFFFF0000) >> 16;
|
||||
|
||||
// 0ad9 5000 subr $ACC0, $AX0.L
|
||||
ACC0 -= AX0.L;
|
||||
|
||||
0ada 0290 0af0 jns 0x0af0
|
||||
if () {
|
||||
if (ACC0 < 0) {
|
||||
// 0adc 00c0 0436 lr $AR0, @0x0436
|
||||
// 0ade 02bf 0af6 call 0x0af6
|
||||
0af6_Decoder0x21_MoreStuff($AR0 = *0x0436);
|
||||
0af6_Decoder0x21_MoreStuff(AR0=*0x0436);
|
||||
|
||||
// 0ae0 8100 clr $ACC0
|
||||
0ae1 1fd8 mrr $AC0.M, $AX0.L
|
||||
0ae2 2236 lrs $AX0.H, @0x0036 // 0x0436
|
||||
0ae3 5400 subr $ACC0, $AX0.H
|
||||
0ae4 1c1e mrr $AR0, $AC0.M
|
||||
0ae5 8100 clr $ACC0
|
||||
0ae6 2e34 srs @0x0034, $AC0.M
|
||||
0ae7 2688 lrs $AC0.M, @0xff88 // 0x0488
|
||||
0ae8 2489 lrs $AC0.L, @0xff89 // 0x0489
|
||||
0ae9 2e8c srs @0xff8c, $AC0.M
|
||||
0aea 2c8d srs @0xff8d, $AC0.L
|
||||
// 0ae1 1fd8 mrr $AC0.M, $AX0.L
|
||||
|
||||
ACC0 = 0;
|
||||
AC0.M = AX0.L;
|
||||
|
||||
// 0ae2 2236 lrs $AX0.H, @0x0036 // 0x0436
|
||||
AX0.H = *0x0436;
|
||||
|
||||
// 0ae3 5400 subr $ACC0, $AX0.H
|
||||
// 0ae4 1c1e mrr $AR0, $AC0.M
|
||||
// 0ae5 8100 clr $ACC0
|
||||
// 0ae6 2e34 srs @0x0034, $AC0.M
|
||||
|
||||
ACC0 -= AX0.H;
|
||||
AR0 = (ACC0 & 0xFFFF0000) >> 16;
|
||||
ACC0 = 0;
|
||||
*0x0434 = 0;
|
||||
|
||||
|
||||
// 0ae7 2688 lrs $AC0.M, @0xff88 // 0x0488
|
||||
// 0ae8 2489 lrs $AC0.L, @0xff89 // 0x0489
|
||||
// 0ae9 2e8c srs @0xff8c, $AC0.M
|
||||
// 0aea 2c8d srs @0xff8d, $AC0.L
|
||||
|
||||
*0x048c = *0x0488;
|
||||
*0x048d = *0x0489;
|
||||
|
||||
// 0aeb 02bf 0af6 call 0x0af6
|
||||
0af6_Decoder0x21_MoreStuff($AR0 = *0x0436);
|
||||
0af6_Decoder0x21_MoreStuff(AR0=*0x0436);
|
||||
|
||||
0aed 0092 00ff lri $CR, #0x00ff
|
||||
// 0aef 02df ret
|
||||
return;
|
||||
}
|
||||
0af0 1c18 mrr $AR0, $AX0.L
|
||||
0af1 02bf 0af6 call 0x0af6
|
||||
|
||||
// 0af0 1c18 mrr $AR0, $AX0.L
|
||||
// 0af1 02bf 0af6 call 0x0af6
|
||||
|
||||
AR0 = AX0.L;
|
||||
0af6_Decoder0x21_MoreStuff(AR0=AX0.L);
|
||||
|
||||
|
||||
0af3 0092 00ff lri $CR, #0x00ff
|
||||
// 0af5 02df ret
|
||||
}
|
||||
@ -3552,19 +3628,24 @@ void 0ab3_Decoder0x21Core(AC1.M, AR3) {
|
||||
// Does strange stuff with PB[0x34] and the address PB[0x8c,d]
|
||||
// Does not touch AX0.L
|
||||
void 0af6_Decoder0x21_MoreStuff($AR0) {
|
||||
0af6 8100 clr $ACC0
|
||||
0af7 1fc0 mrr $AC0.M, $AR0
|
||||
// 0af6 8100 clr $ACC0
|
||||
// 0af7 1fc0 mrr $AC0.M, $AR0
|
||||
// 0af8 b100 tst $ACC0
|
||||
// 0af9 02d5 retz
|
||||
if (!AR0)
|
||||
return;
|
||||
|
||||
ACC0 = 0;
|
||||
AC0.M = AR0;
|
||||
|
||||
// 0afa 8900 clr $ACC1
|
||||
// 0afb 2734 lrs $AC1.M, @0x0034
|
||||
// 0afc 0340 0001 andi $AC1.M, #0x0001
|
||||
// 0afe 0b00 lris $AX1.H, #0x00
|
||||
// 0aff 1f3f mrr $AX1.L, $AC1.M
|
||||
// AX1.L = *0x0434 & 1;
|
||||
|
||||
AX1.L = *0x0434 & 1;
|
||||
|
||||
// 0b00 268c lrs $AC0.M, @0xff8c
|
||||
// 0b01 248d lrs $AC0.L, @0xff8d
|
||||
// 0b02 8900 clr $ACC1
|
||||
@ -3577,7 +3658,9 @@ void 0af6_Decoder0x21_MoreStuff($AR0) {
|
||||
|
||||
ACC0 = {8c,8d} + *0x0434 * 2 - (*0x0434 & 1) * 2
|
||||
|
||||
0b08 1c20 mrr $AR1, $AR0
|
||||
// 0b08 1c20 mrr $AR1, $AR0
|
||||
|
||||
AR1 = AR0;
|
||||
|
||||
// 0b09 1fe0 mrr $AC1.M, $AR0
|
||||
// 0b0a 0502 addis $ACC1, #0x02
|
||||
|
Reference in New Issue
Block a user