mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-04-16 05:42:55 +00:00
Some more AXWii RE.
Long time I didn't commit to Dolphin, by the way. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4793 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
11091893b2
commit
f9106f4e6f
@ -1,6 +1,22 @@
|
||||
// Memory map:
|
||||
// 0x0C00: current AXList
|
||||
|
||||
|
||||
// Voice PB structure:
|
||||
// the current PB is stored at 0x02D0
|
||||
// offsets and sizes are counted in words
|
||||
//
|
||||
// Offset Size Desription
|
||||
// 0x000 2 Address of the next PB
|
||||
// 0x002 2 Address of this PB
|
||||
// 0x004 1 Sample rate converter (0-2)
|
||||
// 0x005 1 Coef select (0-2: 0x1000, 0x1200, 0x1400)
|
||||
// 0x006 2 Selects entries in 4 tables (19 bits used)
|
||||
// 0x008 1 Play/stop flag (1=play, 0=stop)
|
||||
// 0x022 1 Initial time delay enable
|
||||
// 0x023 2 Initial time delay data
|
||||
|
||||
|
||||
0000 0000 nop
|
||||
0001 0000 nop
|
||||
|
||||
@ -81,7 +97,7 @@ void 0037_Unk_Restart() {
|
||||
0065 16cd 0c00 si @DSPA, #0x0c00
|
||||
0067 8100 clr $ACC0
|
||||
0068 2ec9 srs @DSCR, $AC0.M
|
||||
0069 1ffb mrr $AC1.M, $AX1.H // Transfer the AXList
|
||||
0069 1ffb mrr $AC1.M, $AX1.H // Transfer the AXList (DMA)
|
||||
006a 2fcb srs @DSBL, $AC1.M // DMA transfer from main memory (addr = second mail) to 0x0C00, len = low part of first mail
|
||||
006b 02bf 0084 call 0084_WaitForDMACompletion()
|
||||
006d 0080 0c00 lri $AR0, #0x0c00 // AR0 = 0x0C00
|
||||
@ -101,7 +117,9 @@ void 006f_MailHandler() {
|
||||
007c 1c7e mrr $AR3, $AC0.M
|
||||
007d 0213 ilrr $AC0.M, @$AR3
|
||||
007e 1c7e mrr $AR3, $AC0.M // func at [0x0D04 + cmd_num]
|
||||
007f 176f jmpr $AR3 // Jump to command func; AR0 = 0x0C01
|
||||
007f 176f jmpr $AR3 // Jump to command func: AR0 = 0x0C01. Okay.
|
||||
AC0.M = <nothing interesting>
|
||||
AC1.M = 0x0D04. Not interesting either.
|
||||
}
|
||||
|
||||
void 0080_Die() {
|
||||
@ -516,64 +534,71 @@ void 024f_Cmd_2() {
|
||||
027c 029f 006f jmp 006f_MailHandler()
|
||||
}
|
||||
|
||||
// Command 0x4 - set PBs address
|
||||
// Command 0x4 - Mixer
|
||||
// Parameters: AR0 -> 0x0C01
|
||||
// AXList data: command (2), PBs address (4)
|
||||
// Stores 0x140 bytes of data from the PBs address to 0x02D0. Suspicious.
|
||||
|
||||
void 027e_Cmd_4_SetPBsAddress() {
|
||||
027e 8100 clr $ACC0
|
||||
027f 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
||||
0280 8e60 set16'l : $AC0.L, @$AR0
|
||||
0281 00e0 0cd2 sr @0x0cd2, $AR0
|
||||
027e 8100 clr $ACC0 // ACC0 = 0, ACC1 = 0
|
||||
027f 8970 clr'l $ACC1 : $AC0.M, @$AR0 // ACC0 = mem32[0x0C01] (the new PBs address is there)
|
||||
0280 8e60 set16'l : $AC0.L, @$AR0 //
|
||||
0281 00e0 0cd2 sr @0x0cd2, $AR0 // mem16[0x0CD2] = 0x0C03;
|
||||
|
||||
|
||||
// Mixing loop - stops when the pointer to the next PB in the current PB is NULL
|
||||
0283 2ece srs @DSMAH, $AC0.M
|
||||
0284 2ccf srs @DSMAL, $AC0.L
|
||||
0285 16cd 02d0 si @DSPA, #0x02d0
|
||||
0287 16c9 0000 si @DSCR, #0x0000
|
||||
0289 16cb 0140 si @DSBL, #0x0140 // transfer 0x140 bytes from the PBs address to 0x02D0
|
||||
0289 16cb 0140 si @DSBL, #0x0140 // transfer 0x140 bytes from the current PB address to 0x02D0. aka Transfer the current PB
|
||||
028b 02bf 0084 call 0084_WaitForDMACompletion()
|
||||
|
||||
// Load some values to memory [0x0CDX / 0x0CEX]
|
||||
028d 8100 clr $ACC0
|
||||
028e 8900 clr $ACC1
|
||||
028f 00de 02d4 lr $AC0.M, @0x02d4
|
||||
028f 00de 02d4 lr $AC0.M, @0x02d4 //
|
||||
0291 009f 0db7 lri $AC1.M, #0x0db7
|
||||
0293 4c00 add $ACC0, $ACC1
|
||||
0293 4c00 add $ACC0, $ACC1 // mem16[0x02D4] + 0xDB7;
|
||||
0294 1c7e mrr $AR3, $AC0.M
|
||||
0295 0213 ilrr $AC0.M, @$AR3
|
||||
0296 00fe 0cdf sr @0x0cdf, $AC0.M
|
||||
0295 0213 ilrr $AC0.M, @$AR3 // Sample rate converter
|
||||
0296 00fe 0cdf sr @0x0cdf, $AC0.M // mem16[0x0CDF] = iram16[0x0DB7 + mem16[0x02D4]];
|
||||
0298 00de 02d5 lr $AC0.M, @0x02d5
|
||||
029a 009f 0dba lri $AC1.M, #0x0dba
|
||||
029c 4c00 add $ACC0, $ACC1
|
||||
029d 1c7e mrr $AR3, $AC0.M
|
||||
029e 0213 ilrr $AC0.M, @$AR3
|
||||
029f 00fe 0ce0 sr @0x0ce0, $AC0.M
|
||||
029e 0213 ilrr $AC0.M, @$AR3 // Coef select
|
||||
029f 00fe 0ce0 sr @0x0ce0, $AC0.M // mem16[0x0CE0] = iram16[0x0DBA + mem16[0x02D5]];
|
||||
02a1 009a 001f lri $AX0.H, #0x001f
|
||||
02a3 00de 02d7 lr $AC0.M, @0x02d7
|
||||
02a5 009f 0d13 lri $AC1.M, #0x0d13
|
||||
02a7 3400 andr $AC0.M, $AX0.H
|
||||
02a8 4c00 add $ACC0, $ACC1
|
||||
02a9 1c7e mrr $AR3, $AC0.M
|
||||
02aa 0213 ilrr $AC0.M, @$AR3
|
||||
02ab 00fe 0cd3 sr @0x0cd3, $AC0.M
|
||||
02aa 0213 ilrr $AC0.M, @$AR3 // probably a volume coef table
|
||||
02ab 00fe 0cd3 sr @0x0cd3, $AC0.M // mem16[0x0CD3] = iram16[0x0D13 + (mem16[0x02D7] & 0x001F)]; (5 bits)
|
||||
02ad 00de 02d6 lr $AC0.M, @0x02d6
|
||||
02af 009f 0d33 lri $AC1.M, #0x0d33
|
||||
02b1 3400 andr $AC0.M, $AX0.H
|
||||
02b2 4c00 add $ACC0, $ACC1
|
||||
02b3 1c7e mrr $AR3, $AC0.M
|
||||
02b4 0213 ilrr $AC0.M, @$AR3
|
||||
02b5 00fe 0cd4 sr @0x0cd4, $AC0.M
|
||||
02b4 0213 ilrr $AC0.M, @$AR3 // probably a volume coef table
|
||||
02b5 00fe 0cd4 sr @0x0cd4, $AC0.M // mem16[0x0CD4] = iram16[0x0D33 + (mem16[0x02D6] & 0x001F)]; (5 bits)
|
||||
02b7 00de 02d6 lr $AC0.M, @0x02d6
|
||||
02b9 009f 0d53 lri $AC1.M, #0x0d53
|
||||
02bb 14fb asr $ACC0, #-5
|
||||
02bc 3400 andr $AC0.M, $AX0.H
|
||||
02bd 4c00 add $ACC0, $ACC1
|
||||
02be 1c7e mrr $AR3, $AC0.M
|
||||
02bf 0213 ilrr $AC0.M, @$AR3
|
||||
02c0 00fe 0cd5 sr @0x0cd5, $AC0.M
|
||||
02bf 0213 ilrr $AC0.M, @$AR3 // probably a volume coef table
|
||||
02c0 00fe 0cd5 sr @0x0cd5, $AC0.M // mem16[0x0CD5] = iram16[0x0D53 + ((mem16[0x02D6] >> 5) & 0x001F)]; (5 bits)
|
||||
02c2 00de 02d6 lr $AC0.M, @0x02d6
|
||||
02c4 009f 0d73 lri $AC1.M, #0x0d73
|
||||
02c6 14f6 asr $ACC0, #-10
|
||||
02c7 4c00 add $ACC0, $ACC1
|
||||
02c8 1c7e mrr $AR3, $AC0.M
|
||||
02c9 0213 ilrr $AC0.M, @$AR3
|
||||
02ca 00fe 0cd6 sr @0x0cd6, $AC0.M
|
||||
02c9 0213 ilrr $AC0.M, @$AR3 // probably a volume coef table
|
||||
02ca 00fe 0cd6 sr @0x0cd6, $AC0.M // mem16[0x0CD6] = iram16[0x0D73 + (mem16[0x02D6] >> 10)]; (6 bits)
|
||||
02cc 8100 clr $ACC0
|
||||
02cd 00de 033c lr $AC0.M, @0x033c
|
||||
02cf 009a 0003 lri $AX0.H, #0x0003
|
||||
@ -583,60 +608,67 @@ void 027e_Cmd_4_SetPBsAddress() {
|
||||
02d5 4700 addr $ACC1, $AX1.H
|
||||
02d6 1c7f mrr $AR3, $AC1.M
|
||||
02d7 0313 ilrr $AC1.M, @$AR3
|
||||
02d8 00ff 0cd7 sr @0x0cd7, $AC1.M
|
||||
02d8 00ff 0cd7 sr @0x0cd7, $AC1.M // mem16[0x0CD7] = iram16[0x0DB3 + (mem16[0x033C] & 0x0003)];
|
||||
02da 147e lsr $ACC0, #-2
|
||||
02db 1ffe mrr $AC1.M, $AC0.M
|
||||
02dc 3500 andr $AC1.M, $AX0.H
|
||||
02dd 4700 addr $ACC1, $AX1.H
|
||||
02de 1c7f mrr $AR3, $AC1.M
|
||||
02df 0313 ilrr $AC1.M, @$AR3
|
||||
02e0 00ff 0cd8 sr @0x0cd8, $AC1.M
|
||||
02e0 00ff 0cd8 sr @0x0cd8, $AC1.M // mem16[0x0CD8] = iram16[0x0DB3 + ((mem16[0x033C] >> 2) & 0x0003)];
|
||||
02e2 147e lsr $ACC0, #-2
|
||||
02e3 1ffe mrr $AC1.M, $AC0.M
|
||||
02e4 3500 andr $AC1.M, $AX0.H
|
||||
02e5 4700 addr $ACC1, $AX1.H
|
||||
02e6 1c7f mrr $AR3, $AC1.M
|
||||
02e7 0313 ilrr $AC1.M, @$AR3
|
||||
02e8 00ff 0cd9 sr @0x0cd9, $AC1.M
|
||||
02e8 00ff 0cd9 sr @0x0cd9, $AC1.M // mem16[0x0CD9] = iram16[0x0DB3 + ((mem16[0x033C] >> 4) & 0x0003)];
|
||||
02ea 147e lsr $ACC0, #-2
|
||||
02eb 1ffe mrr $AC1.M, $AC0.M
|
||||
02ec 3500 andr $AC1.M, $AX0.H
|
||||
02ed 4700 addr $ACC1, $AX1.H
|
||||
02ee 1c7f mrr $AR3, $AC1.M
|
||||
02ef 0313 ilrr $AC1.M, @$AR3
|
||||
02f0 00ff 0cda sr @0x0cda, $AC1.M
|
||||
02f0 00ff 0cda sr @0x0cda, $AC1.M // mem16[0x0CDA] = iram16[0x0DB3 + ((mem16[0x033C] >> 6) & 0x0003)];
|
||||
02f2 147e lsr $ACC0, #-2
|
||||
02f3 1ffe mrr $AC1.M, $AC0.M
|
||||
02f4 3500 andr $AC1.M, $AX0.H
|
||||
02f5 4700 addr $ACC1, $AX1.H
|
||||
02f6 1c7f mrr $AR3, $AC1.M
|
||||
02f7 0313 ilrr $AC1.M, @$AR3
|
||||
02f8 00ff 0cdb sr @0x0cdb, $AC1.M
|
||||
02f8 00ff 0cdb sr @0x0cdb, $AC1.M // mem16[0x0CDB] = iram16[0x0DB3 + ((mem16[0x033C] >> 8) & 0x0003)];
|
||||
02fa 147e lsr $ACC0, #-2
|
||||
02fb 1ffe mrr $AC1.M, $AC0.M
|
||||
02fc 3500 andr $AC1.M, $AX0.H
|
||||
02fd 4700 addr $ACC1, $AX1.H
|
||||
02fe 1c7f mrr $AR3, $AC1.M
|
||||
02ff 0313 ilrr $AC1.M, @$AR3
|
||||
0300 00ff 0cdc sr @0x0cdc, $AC1.M
|
||||
0300 00ff 0cdc sr @0x0cdc, $AC1.M // mem16[0x0CDC] = iram16[0x0DB3 + ((mem16[0x033C] >> 10) & 0x0003)];
|
||||
0302 147e lsr $ACC0, #-2
|
||||
0303 1ffe mrr $AC1.M, $AC0.M
|
||||
0304 3500 andr $AC1.M, $AX0.H
|
||||
0305 4700 addr $ACC1, $AX1.H
|
||||
0306 1c7f mrr $AR3, $AC1.M
|
||||
0307 0313 ilrr $AC1.M, @$AR3
|
||||
0308 00ff 0cdd sr @0x0cdd, $AC1.M
|
||||
0308 00ff 0cdd sr @0x0cdd, $AC1.M // mem16[0x0CDD] = iram16[0x0DB3 + ((mem16[0x033C] >> 12) & 0x0003)];
|
||||
030a 147e lsr $ACC0, #-2
|
||||
030b 1ffe mrr $AC1.M, $AC0.M
|
||||
030c 3500 andr $AC1.M, $AX0.H
|
||||
030d 4700 addr $ACC1, $AX1.H
|
||||
030e 1c7f mrr $AR3, $AC1.M
|
||||
030f 0313 ilrr $AC1.M, @$AR3
|
||||
0310 00ff 0cde sr @0x0cde, $AC1.M
|
||||
0310 00ff 0cde sr @0x0cde, $AC1.M // mem16[0x0CDE] = iram16[0x0DB3 + (mem16[0x033C] >> 14)];
|
||||
|
||||
0312 8100 clr $ACC0
|
||||
0313 00de 02f2 lr $AC0.M, @0x02f2
|
||||
0315 b100 tst $ACC0
|
||||
0316 0295 0339 jz 0x0339
|
||||
|
||||
// Initial time delay - aka echo aka reverb
|
||||
// The buffer is 64 bytes
|
||||
// That thing may be hard to implement in HLE because the HLE sound buffer size is variable
|
||||
if (mem16[0x02F2] != 0)
|
||||
{
|
||||
0318 8900 clr $ACC1
|
||||
0319 00df 02f5 lr $AC1.M, @0x02f5
|
||||
031b 0300 0c40 addi $AC1.M, #0x0c40
|
||||
@ -653,25 +685,33 @@ void 027e_Cmd_4_SetPBsAddress() {
|
||||
032f 16cd 0c40 si @DSPA, #0x0c40
|
||||
0331 16c9 0000 si @DSCR, #0x0000
|
||||
0333 16cb 0040 si @DSBL, #0x0040
|
||||
0335 02bf 0084 call 0084_WaitForDMACompletion()
|
||||
0335 02bf 0084 call 0084_WaitForDMACompletion() // so yet another DMA... from mem32[0x02F3] to 0x0C40, 64 bytes
|
||||
0337 029f 0341 jmp 0x0341
|
||||
}
|
||||
else
|
||||
{
|
||||
0339 009f 0c60 lri $AC1.M, #0x0c60
|
||||
033b 00ff 0ce2 sr @0x0ce2, $AC1.M
|
||||
033d 00ff 0ce3 sr @0x0ce3, $AC1.M
|
||||
033f 00ff 0ce1 sr @0x0ce1, $AC1.M
|
||||
}
|
||||
|
||||
0341 8c00 clr15
|
||||
0342 8b00 m0
|
||||
0343 8100 clr $ACC0
|
||||
0344 00de 02d8 lr $AC0.M, @0x02d8
|
||||
0346 0601 cmpis $ACC0, #0x01
|
||||
0347 0294 046a jnz 0x046a
|
||||
|
||||
if (mem16[0x02D8] == 1) // if the voice is playing
|
||||
{
|
||||
0349 00c3 0cdf lr $AR3, @0x0cdf
|
||||
034b 177f callr $AR3
|
||||
034c 8a00 m2
|
||||
034b 177f callr $AR3 // call the sample rate converter
|
||||
034c 8a00 m2 // MULTIPLICATION x2 MODE ENABLED!
|
||||
034d 8100 clr $ACC0
|
||||
034e 8900 clr $ACC1
|
||||
034f 00de 0306 lr $AC0.M, @0x0306
|
||||
0351 00df 0305 lr $AC1.M, @0x0305
|
||||
034f 00de 0306 lr $AC0.M, @0x0306 // pb[0x36]
|
||||
0351 00df 0305 lr $AC1.M, @0x0305 // pb[0x35]
|
||||
0353 1f1f mrr $AX0.L, $AC1.M
|
||||
0354 4d00 add $ACC1, $ACC0
|
||||
0355 1481 asl $ACC0, #1
|
||||
@ -716,24 +756,29 @@ void 027e_Cmd_4_SetPBsAddress() {
|
||||
038d 0080 02f9 lri $AR0, #0x02f9
|
||||
038f 8100 clr $ACC0
|
||||
0390 100c loopi #0x0c
|
||||
0391 1b1e srri @$AR0, $AC0.M
|
||||
0391 1b1e srri @$AR0, $AC0.M // zero out the updates field
|
||||
0392 0080 034d lri $AR0, #0x034d
|
||||
0394 1008 loopi #0x08
|
||||
0395 1b1e srri @$AR0, $AC0.M
|
||||
0396 00c3 0cd3 lr $AR3, @0x0cd3
|
||||
0398 177f callr $AR3
|
||||
0396 00c3 0cd3 lr $AR3, @0x0cd3 // perform volume stuff
|
||||
0398 177f callr $AR3 // what a complicated volume control!
|
||||
0399 00c3 0cd4 lr $AR3, @0x0cd4
|
||||
039b 177f callr $AR3
|
||||
039c 00c3 0cd5 lr $AR3, @0x0cd5
|
||||
039e 177f callr $AR3
|
||||
039f 00c3 0cd6 lr $AR3, @0x0cd6
|
||||
03a1 177f callr $AR3
|
||||
|
||||
03a2 00de 033b lr $AC0.M, @0x033b
|
||||
03a4 b100 tst $ACC0
|
||||
03a5 0295 0447 jz 0x0447
|
||||
if (mem16[0x033B] != 0)
|
||||
{
|
||||
03a7 00de 035a lr $AC0.M, @0x035a
|
||||
03a9 b100 tst $ACC0
|
||||
03aa 0295 03c4 jz 0x03c4
|
||||
if (mem16[0x035A] != 0)
|
||||
{
|
||||
03ac 0a02 lris $AX0.H, #0x02
|
||||
03ad c100 cmpar $ACC0, $AX0.H
|
||||
03ae 0294 03ba jnz 0x03ba
|
||||
@ -747,11 +792,15 @@ void 027e_Cmd_4_SetPBsAddress() {
|
||||
03be 0083 035b lri $AR3, #0x035b
|
||||
03c0 02bf 06ab call 0x06ab
|
||||
03c2 029f 03cc jmp 0x03cc
|
||||
}
|
||||
else
|
||||
{
|
||||
03c4 0080 0d0c lri $AR0, #0x0d0c
|
||||
03c6 00c1 0ce1 lr $AR1, @0x0ce1
|
||||
03c8 1160 03cb bloopi #0x60, 0x03cb
|
||||
03ca 193f lrri $AC1.M, @$AR1
|
||||
03cb 1b1f srri @$AR0, $AC1.M
|
||||
}
|
||||
03cc 0082 0355 lri $AR2, #0x0355
|
||||
03ce 8c00 clr15
|
||||
03cf 8100 clr $ACC0
|
||||
@ -834,6 +883,7 @@ void 027e_Cmd_4_SetPBsAddress() {
|
||||
0442 00c3 0cde lr $AR3, @0x0cde
|
||||
0444 177f callr $AR3
|
||||
0445 00f8 0354 sr @0x0354, $AX0.L
|
||||
}
|
||||
0447 00de 02f2 lr $AC0.M, @0x02f2
|
||||
0449 b100 tst $ACC0
|
||||
044a 0295 046a jz 0x046a
|
||||
@ -854,8 +904,11 @@ void 027e_Cmd_4_SetPBsAddress() {
|
||||
0463 029f 0468 jmp 0x0468
|
||||
0465 0295 0468 jz 0x0468
|
||||
0467 7400 incm $AC0.M
|
||||
|
||||
0468 00fe 02f6 sr @0x02f6, $AC0.M
|
||||
046a 8e00 set16
|
||||
}
|
||||
|
||||
046b 8100 clr $ACC0
|
||||
046c 00de 02f2 lr $AC0.M, @0x02f2
|
||||
046e b100 tst $ACC0
|
||||
@ -867,7 +920,8 @@ void 027e_Cmd_4_SetPBsAddress() {
|
||||
0477 16cd 0ca0 si @DSPA, #0x0ca0
|
||||
0479 16c9 0001 si @DSCR, #0x0001
|
||||
047b 16cb 0040 si @DSBL, #0x0040
|
||||
047d 02bf 0084 call 0084_WaitForDMACompletion()
|
||||
047d 02bf 0084 call 0084_WaitForDMACompletion() // from 0x0CA0 to mem32[0x02F3], 64 bytes
|
||||
|
||||
047f 8100 clr $ACC0
|
||||
0480 8900 clr $ACC1
|
||||
0481 00de 02d2 lr $AC0.M, @0x02d2
|
||||
@ -877,16 +931,18 @@ void 027e_Cmd_4_SetPBsAddress() {
|
||||
0487 16cd 02d0 si @DSPA, #0x02d0
|
||||
0489 16c9 0001 si @DSCR, #0x0001
|
||||
048b 16cb 0140 si @DSBL, #0x0140
|
||||
048d 02bf 0084 call 0084_WaitForDMACompletion()
|
||||
048d 02bf 0084 call 0084_WaitForDMACompletion() // from 0x02D0 to mem32[0x02D2], 0x140 bytes
|
||||
048f 8100 clr $ACC0
|
||||
0490 00de 02d0 lr $AC0.M, @0x02d0
|
||||
0492 00dc 02d1 lr $AC0.L, @0x02d1
|
||||
0494 b100 tst $ACC0
|
||||
0495 0294 0283 jnz 0x0283
|
||||
0497 00c0 0cd2 lr $AR0, @0x0cd2
|
||||
0495 0294 0283 jnz 0x0283 // if (mem32[0x02D0] != 0) do the whole thing again;
|
||||
|
||||
0497 00c0 0cd2 lr $AR0, @0x0cd2 // restore AR0;
|
||||
0499 029f 006f jmp 006f_MailHandler()
|
||||
}
|
||||
|
||||
|
||||
void 049b_Cmd_5() {
|
||||
049b 8e00 set16
|
||||
049c 00c4 0ce6 lr $IX0, @0x0ce6
|
||||
@ -927,12 +983,18 @@ void 04b4_Cmd_6() {
|
||||
04cb 029f 006f jmp 006f_MailHandler()
|
||||
}
|
||||
|
||||
// set out buffer
|
||||
// Command #7 - Set output buffer address
|
||||
// AXList data:
|
||||
// - command (2)
|
||||
// - something (2)
|
||||
// - Left/Right(?) output buffer address (4)
|
||||
// - Right/Left(?) output buffer address (4)
|
||||
//
|
||||
void 04cd_Cmd_7() {
|
||||
04cd 8e00 set16
|
||||
04ce 00c4 0ce8 lr $IX0, @0x0ce8
|
||||
04d0 1905 lrri $IX1, @$AR0
|
||||
04d1 00e5 0ce8 sr @0x0ce8, $IX1
|
||||
04d1 00e5 0ce8 sr @0x0ce8, $IX1 // mem16[0x0CE8] = mem16[0x0C01];
|
||||
04d3 0086 0880 lri $IX2, #0x0880
|
||||
04d5 8100 clr $ACC0
|
||||
04d6 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
||||
@ -942,7 +1004,7 @@ void 04cd_Cmd_7() {
|
||||
04da 1fc6 mrr $AC0.M, $IX2
|
||||
04db 2ecd srs @DSPA, $AC0.M
|
||||
04dc 16c9 0001 si @DSCR, #0x0001
|
||||
04de 16cb 0480 si @DSBL, #0x0480
|
||||
04de 16cb 0480 si @DSBL, #0x0480 // dma from 0x0880 to mem32[0x0C02], 1152 bytes.
|
||||
04e0 02bf 0084 call 0084_WaitForDMACompletion()
|
||||
04e2 02bf 04e6 call 0x04e6
|
||||
04e4 029f 006f jmp 006f_MailHandler()
|
||||
@ -1425,16 +1487,21 @@ void 06c3_Unknown() {
|
||||
0719 02df ret
|
||||
}
|
||||
|
||||
071a 02bf 07e6 call 0x07e6
|
||||
// Sample rate converter #0 - None
|
||||
//
|
||||
071a 02bf 07e6 call 0x07e6_SetupAccelerator()
|
||||
071c 8c00 clr15
|
||||
071d 8a00 m2
|
||||
071e 8f00 set40
|
||||
// Read ratio
|
||||
071f 195b lrri $AX1.H, @$AR2
|
||||
0720 1959 lrri $AX1.L, @$AR2
|
||||
0721 8100 clr $ACC0
|
||||
// Read cur_addr fractional part
|
||||
0722 195c lrri $AC0.L, @$AR2
|
||||
0723 0080 0d08 lri $AR0, #0x0d08
|
||||
0725 0088 0003 lri $WR0, #0x0003
|
||||
// Read the last samples, copy them to 0x0D08
|
||||
0727 195f lrri $AC1.M, @$AR2
|
||||
0728 1b1f srri @$AR0, $AC1.M
|
||||
0729 195f lrri $AC1.M, @$AR2
|
||||
@ -1443,6 +1510,7 @@ void 06c3_Unknown() {
|
||||
072c 1b1f srri @$AR0, $AC1.M
|
||||
072d 195f lrri $AC1.M, @$AR2
|
||||
072e 1b1f srri @$AR0, $AC1.M
|
||||
|
||||
072f 0081 0c60 lri $AR1, #0x0c60
|
||||
0731 0082 ffdd lri $AR2, #0xffdd
|
||||
0733 00c7 0ce0 lr $IX3, @0x0ce0
|
||||
@ -1495,7 +1563,9 @@ void 06c3_Unknown() {
|
||||
0769 8b00 m0
|
||||
076a 02df ret
|
||||
|
||||
076b 02bf 07e6 call 0x07e6
|
||||
// Sample rate converter #1 - ?
|
||||
//
|
||||
076b 02bf 07e6 call 0x07e6_SetupAccelerator()
|
||||
076d 8d00 set15
|
||||
076e 8b00 m0
|
||||
076f 8f00 set40
|
||||
@ -1567,15 +1637,19 @@ void 06c3_Unknown() {
|
||||
07be 8c00 clr15
|
||||
07bf 02df ret
|
||||
|
||||
07c0 02bf 07e6 call 0x07e6
|
||||
// Sample rate converter #2 - No sample rate conversion
|
||||
// Just copies 96 bytes of data to the output buffer
|
||||
//
|
||||
07c0 02bf 07e6 call 0x07e6_SetupAccelerator()
|
||||
07c2 0080 0c60 lri $AR0, #0x0c60
|
||||
07c4 0082 ffdd lri $AR2, #0xffdd
|
||||
07c4 0082 ffdd lri $AR2, #0xffdd // 0xFFDD: ACDAT
|
||||
07c6 1160 07cb bloopi #0x60, 0x07cb
|
||||
07c8 1844 lrr $IX0, @$AR2
|
||||
07c9 1b04 srri @$AR0, $IX0
|
||||
07c8 1844 lrr $IX0, @$AR2 // Load a sample from accelerator
|
||||
07c9 1b04 srri @$AR0, $IX0 // and store it to 0x0C60+
|
||||
07ca 0000 nop
|
||||
07cb 0000 nop
|
||||
07cc 0004 dar $AR0
|
||||
// Save the 4 last samples in the PB
|
||||
07cd 0082 0329 lri $AR2, #0x0329
|
||||
07cf 189f lrrd $AC1.M, @$AR0
|
||||
07d0 1adf srrd @$AR2, $AC1.M
|
||||
@ -1585,36 +1659,56 @@ void 06c3_Unknown() {
|
||||
07d4 1adf srrd @$AR2, $AC1.M
|
||||
07d5 189f lrrd $AC1.M, @$AR0
|
||||
07d6 1adf srrd @$AR2, $AC1.M
|
||||
// Save the accelerator regs in the PB
|
||||
07d7 0082 0322 lri $AR2, #0x0322
|
||||
// YN1 and YN2
|
||||
07d9 27dc lrs $AC1.M, @yn2
|
||||
07da 1adf srrd @$AR2, $AC1.M
|
||||
07db 27db lrs $AC1.M, @yn1
|
||||
07dc 1adf srrd @$AR2, $AC1.M
|
||||
// Pred scale
|
||||
07dd 27da lrs $AC1.M, @pred_scale
|
||||
07de 1adf srrd @$AR2, $AC1.M
|
||||
07df 0082 030e lri $AR2, #0x030e
|
||||
// Current address
|
||||
07e1 27d9 lrs $AC1.M, @ACCAL
|
||||
07e2 1adf srrd @$AR2, $AC1.M
|
||||
07e3 27d8 lrs $AC1.M, @ACCAH
|
||||
07e4 1adf srrd @$AR2, $AC1.M
|
||||
07e5 02df ret
|
||||
|
||||
07e6_Sample() {
|
||||
// Called by the three sample rate converters above.
|
||||
// Sets up the accelerator so that it can be used to
|
||||
// read the audio data.
|
||||
// The accelerator area is set to be the same length
|
||||
// as the sound data being played, so that looping
|
||||
// will be handled by exception vector #5 (ACCOV).
|
||||
// Parameters: None
|
||||
// Return: AR0 = 0x0328
|
||||
//
|
||||
07e6_SetupAccelerator()
|
||||
{
|
||||
// Set the accelerator regs from the PB
|
||||
07e6 0082 0308 lri $AR2, #0x0308
|
||||
// Sample format
|
||||
07e8 195e lrri $AC0.M, @$AR2
|
||||
07e9 2ed1 srs @SampleFormat, $AC0.M
|
||||
// Start address
|
||||
07ea 195e lrri $AC0.M, @$AR2
|
||||
07eb 2ed4 srs @ACSAH, $AC0.M
|
||||
07ec 195e lrri $AC0.M, @$AR2
|
||||
07ed 2ed5 srs @ACSAL, $AC0.M
|
||||
// End address
|
||||
07ee 195e lrri $AC0.M, @$AR2
|
||||
07ef 2ed6 srs @ACEAH, $AC0.M
|
||||
07f0 195e lrri $AC0.M, @$AR2
|
||||
07f1 2ed7 srs @ACEAL, $AC0.M
|
||||
// Current address
|
||||
07f2 195e lrri $AC0.M, @$AR2
|
||||
07f3 2ed8 srs @ACCAH, $AC0.M
|
||||
07f4 195e lrri $AC0.M, @$AR2
|
||||
07f5 2ed9 srs @ACCAL, $AC0.M
|
||||
// 16 coefs
|
||||
07f6 195e lrri $AC0.M, @$AR2
|
||||
07f7 2ea0 srs @COEF_A1_0, $AC0.M
|
||||
07f8 195e lrri $AC0.M, @$AR2
|
||||
@ -1647,23 +1741,30 @@ void 06c3_Unknown() {
|
||||
0813 2eae srs @COEF_A1_7, $AC0.M
|
||||
0814 195e lrri $AC0.M, @$AR2
|
||||
0815 2eaf srs @COEF_A2_7, $AC0.M
|
||||
// Gain
|
||||
0816 195e lrri $AC0.M, @$AR2
|
||||
0817 2ede srs @GAIN, $AC0.M
|
||||
// Pred scale
|
||||
0818 195e lrri $AC0.M, @$AR2
|
||||
0819 2eda srs @pred_scale, $AC0.M
|
||||
// YN1 and YN2
|
||||
081a 195e lrri $AC0.M, @$AR2
|
||||
081b 2edb srs @yn1, $AC0.M
|
||||
081c 195e lrri $AC0.M, @$AR2
|
||||
081d 2edc srs @yn2, $AC0.M
|
||||
081e 02df ret
|
||||
}
|
||||
|
||||
// Volume_0_0
|
||||
081f 02df ret
|
||||
|
||||
// Volume_0_1
|
||||
0820 00c0 0ce2 lr $AR0, @0x0ce2
|
||||
0822 0081 02da lri $AR1, #0x02da
|
||||
0824 0082 0000 lri $AR2, #0x0000
|
||||
0826 1c62 mrr $AR3, $AR2
|
||||
0827 02bf 0bd1 call 0bd1_Unknown()
|
||||
0829 00f8 02f9 sr @0x02f9, $AX0.L
|
||||
0827 02bf 0bd1 call 0bd1_ApplyVolume1(mem16[0x0ce2], 0x02da, 0x0000, 0x0000)
|
||||
0829 00f8 02f9 sr @0x02f9, $AX0.L // uh? the last <PROD> is saved in updates field?
|
||||
082b 02df ret
|
||||
|
||||
082c 00c0 0ce3 lr $AR0, @0x0ce3
|
||||
@ -2193,32 +2294,46 @@ void 0b52_Maybe_Mixer() {
|
||||
0bcf 029f 0b52 jmp 0x0b52
|
||||
}
|
||||
|
||||
// Mixer loop??
|
||||
void 0bd1_Unknown() {
|
||||
0bd1 191a lrri $AX0.H, @$AR0
|
||||
0bd2 1939 lrri $AX1.L, @$AR1
|
||||
0bd3 b072 mulx'l $AX0.H, $AX1.L : $AC0.M, @$AR2
|
||||
0bd4 195c lrri $AC0.L, @$AR2
|
||||
0bd5 f07a lsl16'l $ACC0 : $AC1.M, @$AR2
|
||||
0bd6 191a lrri $AX0.H, @$AR0
|
||||
0bd7 b46a mulxac'l $AX0.H, $AX1.L, $ACC0 : $AC1.L, @$AR2
|
||||
0bd8 9100 asr16 $ACC0
|
||||
0bd9 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M
|
||||
0bda 112f 0be3 bloopi #0x2f, 0x0be3
|
||||
0bdc b523 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR3, $AC0.L
|
||||
0bdd 9972 asr16'l $ACC1 : $AC0.M, @$AR2
|
||||
0bde 195c lrri $AC0.L, @$AR2
|
||||
0bdf f0a1 lsl16'ls $ACC0 : $AX0.H, $AC1.M
|
||||
0be0 b42b mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR3, $AC1.L
|
||||
0be1 917a asr16'l $ACC0 : $AC1.M, @$AR2
|
||||
0be2 195d lrri $AC1.L, @$AR2
|
||||
0be3 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M
|
||||
0be4 1b7c srri @$AR3, $AC0.L
|
||||
0be5 6e00 movp $ACC0
|
||||
0be6 4f12 addp'mv $ACC1 : $AX0.L, $AC0.M
|
||||
0be7 9900 asr16 $ACC1
|
||||
0be8 1b7f srri @$AR3, $AC1.M
|
||||
0be9 812b clr's $ACC0 : @$AR3, $AC1.L
|
||||
// Volume
|
||||
// AR0: factor table?
|
||||
// AR1: factor
|
||||
// AR2: input
|
||||
// AR3: output
|
||||
// returns: last <PROD> in AX0.L (16 highest bits)
|
||||
//
|
||||
// basically:
|
||||
// for (i = 0; i < 96; i++)
|
||||
// out[i] = ((in[i*2+1] << 16) + (ar0[i] * factor)) >> 16;
|
||||
//
|
||||
// so that you don't bang your head against your keyboard trying to figure
|
||||
// out those awful pipelined loops (I had to get myself a new head to finish
|
||||
// this one). :P
|
||||
//
|
||||
void 0bd1_ApplyVolume1() {
|
||||
0bd1 191a lrri $AX0.H, @$AR0 // ax0.h = mem[ar0++]
|
||||
0bd2 1939 lrri $AX1.L, @$AR1 // ax1.l = mem[ar1++]
|
||||
0bd3 b072 mulx'l $AX0.H, $AX1.L : $AC0.M, @$AR2 // <PROD> = ax0.h * ax1.l; ac0.m = mem[ar2++]
|
||||
0bd4 195c lrri $AC0.L, @$AR2 // ac0.l = mem[ar2++]
|
||||
0bd5 f07a lsl16'l $ACC0 : $AC1.M, @$AR2 // acc0 <<= 16; ac1.m = mem[ar2++]
|
||||
0bd6 191a lrri $AX0.H, @$AR0 // ax0.h = mem[ar0++]
|
||||
0bd7 b46a mulxac'l $AX0.H, $AX1.L, $ACC0 : $AC1.L, @$AR2 // acc0 += <PROD>; <PROD> = ax0.h * ax1.l; ac1.l = mem[ar2++]
|
||||
0bd8 9100 asr16 $ACC0 // acc0 >>= 16
|
||||
0bd9 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M // acc1 <<= 16; ax0.h = mem[ar0++]; mem[ar3++] = ac0.m
|
||||
0bda 112f 0be3 bloopi #0x2f, 0x0be3 // for (i = 0; i < 0x2f; i++)
|
||||
0bdc b523 mulxac's $AX0.H, $AX1.L, $ACC1 : @$AR3, $AC0.L // acc1 += <PROD>; <PROD> = ax0.h * ax1.l; mem[ar3++] = ac0.l;
|
||||
0bdd 9972 asr16'l $ACC1 : $AC0.M, @$AR2 // acc1 >>= 16; ac0.m = mem[ar2++]
|
||||
0bde 195c lrri $AC0.L, @$AR2 // ac0.l = mem[ar2++];
|
||||
0bdf f0a1 lsl16'ls $ACC0 : $AX0.H, $AC1.M // acc0 <<= 16; ax0.h = mem[ar0++]; mem[ar3++] = ac1.m
|
||||
0be0 b42b mulxac's $AX0.H, $AX1.L, $ACC0 : @$AR3, $AC1.L // acc0 += <PROD>; <PROD> = ax0.h * ax1.l; mem[ar3++] = ac1.l;
|
||||
0be1 917a asr16'l $ACC0 : $AC1.M, @$AR2 // acc0 >>= 16; ac1.m = mem[ar2++]
|
||||
0be2 195d lrri $AC1.L, @$AR2 // ac1.l = mem[ar2++];
|
||||
0be3 f1a0 lsl16'ls $ACC1 : $AX0.H, $AC0.M // acc1 <<= 16; ax0.h = mem[ar0++]; mem[ar3++] = ac0.m
|
||||
0be4 1b7c srri @$AR3, $AC0.L // mem[ar3++] = ac0.l;
|
||||
0be5 6e00 movp $ACC0 // acc0 = <PROD>;
|
||||
0be6 4f12 addp'mv $ACC1 : $AX0.L, $AC0.M // acc1 += <PROD>; ax0.l = ac0.m;
|
||||
0be7 9900 asr16 $ACC1 // acc1 >>= 16;
|
||||
0be8 1b7f srri @$AR3, $AC1.M // mem[ar3++] = ac1.m;
|
||||
0be9 812b clr's $ACC0 : @$AR3, $AC1.L // acc0 = 0; mem[ar3++] = ac1.l;
|
||||
0bea 02df ret
|
||||
}
|
||||
|
||||
@ -2510,8 +2625,8 @@ void 0c21_Unknown() {
|
||||
0d11 067c // 0xD - ???
|
||||
0d12 0672 // 0xE - The End
|
||||
|
||||
// coef table?
|
||||
0d13 081f lris $AX0.L, #0x1f
|
||||
// Table #1 - entry selected by PB[0x007] bits 0-4
|
||||
0d13 081f lris $AX0.L, #0x1f // 0: Do nothing
|
||||
0d14 0820 lris $AX0.L, #0x20
|
||||
0d15 082c lris $AX0.L, #0x2c
|
||||
0d16 0838 lris $AX0.L, #0x38
|
||||
@ -2543,7 +2658,9 @@ void 0c21_Unknown() {
|
||||
0d30 08d4 lris $AX0.L, #0xd4
|
||||
0d31 08d4 lris $AX0.L, #0xd4
|
||||
0d32 08d4 lris $AX0.L, #0xd4
|
||||
0d33 081f lris $AX0.L, #0x1f
|
||||
|
||||
// Table #2 - entry selected by PB[0x006] bits 0-4
|
||||
0d33 081f lris $AX0.L, #0x1f // 0: Do nothing
|
||||
0d34 08e2 lris $AX0.L, #0xe2
|
||||
0d35 08ee lris $AX0.L, #0xee
|
||||
0d36 08fa lris $AX0.L, #0xfa
|
||||
@ -2575,7 +2692,9 @@ void 0c21_Unknown() {
|
||||
0d50 0996 lris $AX1.L, #0x96
|
||||
0d51 0996 lris $AX1.L, #0x96
|
||||
0d52 0996 lris $AX1.L, #0x96
|
||||
0d53 081f lris $AX0.L, #0x1f
|
||||
|
||||
// Table #3 - entry selected by PB[0x006] bits 5-9
|
||||
0d53 081f lris $AX0.L, #0x1f // 0: Do nothing
|
||||
0d54 09a4 lris $AX1.L, #0xa4
|
||||
0d55 09b0 lris $AX1.L, #0xb0
|
||||
0d56 09bc lris $AX1.L, #0xbc
|
||||
@ -2607,7 +2726,10 @@ void 0c21_Unknown() {
|
||||
0d70 0a58 lris $AX0.H, #0x58
|
||||
0d71 0a58 lris $AX0.H, #0x58
|
||||
0d72 0a58 lris $AX0.H, #0x58
|
||||
0d73 081f lris $AX0.L, #0x1f
|
||||
|
||||
// Table #4 - entry selected by PB[0x006] bits 10-15
|
||||
// (twice longer than the three previous ones!)
|
||||
0d73 081f lris $AX0.L, #0x1f // 0: Do nothing
|
||||
0d74 0a66 lris $AX0.H, #0x66
|
||||
0d75 0a72 lris $AX0.H, #0x72
|
||||
0d76 0a7e lris $AX0.H, #0x7e
|
||||
@ -2671,13 +2793,20 @@ void 0c21_Unknown() {
|
||||
0db0 0bc3 lris $AX1.H, #0xc3
|
||||
0db1 0bc3 lris $AX1.H, #0xc3
|
||||
0db2 0bc3 lris $AX1.H, #0xc3
|
||||
|
||||
|
||||
0db3 0cb0 lris $AC0.L, #0xb0
|
||||
0db4 0cb3 lris $AC0.L, #0xb3
|
||||
0db5 0cd0 lris $AC0.L, #0xd0
|
||||
0db6 0cd0 lris $AC0.L, #0xd0
|
||||
0db7 071a cmpis $ACC1, #0x1a
|
||||
0db8 076b cmpis $ACC1, #0x6b
|
||||
0db9 07c0 cmpis $ACC1, #0xc0
|
||||
|
||||
// Jump table for sample rate converters
|
||||
0db7 071a cmpis $ACC1, #0x1a // none
|
||||
0db8 076b cmpis $ACC1, #0x6b // ?
|
||||
0db9 07c0 cmpis $ACC1, #0xc0 // linear
|
||||
|
||||
// Table for coef_select
|
||||
// addresses into COEF ROM
|
||||
0dba 1000 loopi #0x00
|
||||
0dbb 1200 sbclr #0x00
|
||||
0dbc 1400 lsl $ACC0, #0
|
||||
@ -3028,26 +3157,32 @@ void 0f5c_Int4_Handler() {
|
||||
0f60 02ff rti
|
||||
}
|
||||
|
||||
void 0f61_Int5_Handler() {
|
||||
// Handles ACCOV exception
|
||||
// ACCOV exception will be triggered when a sound being played
|
||||
// reaches end and needs to be reloaded or stopped.
|
||||
//
|
||||
void 0f61_Int5_Handler()
|
||||
{
|
||||
0f61 8e00 set16
|
||||
0f62 1dbc mrr $ST1, $AC0.L
|
||||
0f63 1dbe mrr $ST1, $AC0.M
|
||||
0f64 8100 clr $ACC0
|
||||
0f65 00de 0307 lr $AC0.M, @0x0307
|
||||
0f67 0601 cmpis $ACC0, #0x01
|
||||
0f68 0295 0f72 jz 0x0f72
|
||||
0f68 0295 0f72 jz 0x0f72 // if (mem16[0x0307] == 1) handle looping;
|
||||
0f6a 0e00 lris $AC0.M, #0x00
|
||||
0f6b 00fe 02d8 sr @0x02d8, $AC0.M
|
||||
0f6b 00fe 02d8 sr @0x02d8, $AC0.M // else stop the sound;
|
||||
0f6d 0082 0ce9 lri $AR2, #0x0ce9
|
||||
0f6f 1fcd mrr $AC0.M, $ST1
|
||||
0f70 1f8d mrr $AC0.L, $ST1
|
||||
0f71 02ff rti
|
||||
}
|
||||
|
||||
void 0f72_Int5_Handler() {
|
||||
// Looping handling
|
||||
0f72 00de 02d9 lr $AC0.M, @0x02d9
|
||||
0f74 0601 cmpis $ACC0, #0x01
|
||||
0f75 0295 0f83 jz 0x0f83
|
||||
0f75 0295 0f83 jz 0x0f83 // if (mem16[0x02D9] == 1) handle stream;
|
||||
// reload pred scale, yn1 and yn2 from the PB
|
||||
// the address will be automatically reloaded by the accelerator
|
||||
0f77 00de 032a lr $AC0.M, @0x032a
|
||||
0f79 2eda srs @pred_scale, $AC0.M
|
||||
0f7a 00de 032b lr $AC0.M, @0x032b
|
||||
@ -3057,8 +3192,12 @@ void 0f72_Int5_Handler() {
|
||||
0f80 1fcd mrr $AC0.M, $ST1
|
||||
0f81 1f8d mrr $AC0.L, $ST1
|
||||
0f82 02ff rti
|
||||
|
||||
// Stream handling
|
||||
// reload pred_scale from the PB
|
||||
0f83 00de 032a lr $AC0.M, @0x032a
|
||||
0f85 2eda srs @pred_scale, $AC0.M
|
||||
// ??? - reload the yn1 and yn2 from... themselves
|
||||
0f86 26db lrs $AC0.M, @yn1
|
||||
0f87 2edb srs @yn1, $AC0.M
|
||||
0f88 26dc lrs $AC0.M, @yn2
|
||||
|
Loading…
x
Reference in New Issue
Block a user