diff options
| author | XTra.KrazzY <XTra.KrazzY@gmail.com> | 2009-07-05 19:14:10 +0000 |
|---|---|---|
| committer | XTra.KrazzY <XTra.KrazzY@gmail.com> | 2009-07-05 19:14:10 +0000 |
| commit | e7ec7d56d59fbc8c8d7779b2324cd8f707561202 (patch) | |
| tree | 31cd48befb9fac170e14563ff275531b5b6b95d7 /docs | |
| parent | 36883d6a48fae0cc31aeb39be1a2b98f7970f7bd (diff) | |
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
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/DSP/DSP_UC_Zelda.txt | 185 |
1 files changed, 134 insertions, 51 deletions
diff --git a/docs/DSP/DSP_UC_Zelda.txt b/docs/DSP/DSP_UC_Zelda.txt index 29771968bb..ba79345db3 100644 --- a/docs/DSP/DSP_UC_Zelda.txt +++ b/docs/DSP/DSP_UC_Zelda.txt @@ -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
|
