Hard reset SPU

From Final Fantasy Hacktics Wiki
(Redirected from 00018858 - 00018ae8)
Jump to navigation Jump to search

p1: manual voice reset flag
     0: manually play out and set all voices to 0
     1: skip that


00018858: 27bdffe0 addiu r29,r29,0xffe0
0001885c: afb00010 sw r16,0x0010(r29)
00018860: 00808021 addu r16,r4,r0
00018864: 3c048003 lui r4,0x8003
00018868: 8c84ad54 lw r4,-0x52ac(r4)            DMA control reg
0001886c: afbf0018 sw r31,0x0018(r29)
00018870: afb10014 sw r17,0x0014(r29)
00018874: 8c820000 lw r2,0x0000(r4)             read
00018878: 3c03000b lui r3,0x000b                0x000b 0000
0001887c: 00431025 or r2,r2,r3                  set SPU channel priority to 3 and turn it on
00018880: ac820000 sw r2,0x0000(r4)
00018884: 3c028003 lui r2,0x8003
00018888: 8c42ad44 lw r2,-0x52bc(r2)            volume left IO port
0001888c: 3c018003 lui r1,0x8003
00018890: ac20ad60 sw r0,-0x52a0(r1)
00018894: 3c018003 lui r1,0x8003
00018898: ac20ad64 sw r0,-0x529c(r1)
0001889c: 3c018003 lui r1,0x8003
000188a0: a420ad5c sh r0,-0x52a4(r1)
000188a4: a4400180 sh r0,0x0180(r2)            
000188a8: a4400182 sh r0,0x0182(r2)             turn main volume left and right to 0
000188ac: a44001aa sh r0,0x01aa(r2)             disable and toggle off all SPU control register flags
000188b0: 0c0064e9 jal 0x000193a4               Hold CPU 240
000188b4: 00000000 nop
000188b8: 3c028003 lui r2,0x8003
000188bc: 8c42ad44 lw r2,-0x52bc(r2)            
000188c0: 00000000 nop
000188c4: a4400180 sh r0,0x0180(r2)
000188c8: a4400182 sh r0,0x0182(r2)             turn main volume left and right to 0, again. just in case they didn't hear you.
000188cc: 944201ae lhu r2,0x01ae(r2)            spu status reg. read
000188d0: 00000000 nop
000188d4: 304207ff andi r2,r2,0x07ff            check if any requests or SPU modes are on
000188d8: 10400015 beq r2,r0,0x00018930         branch if everything is off
000188dc: 00001821 addu r3,r0,r0
000188e0: 24630001 addiu r3,r3,0x0001
000188e4: 2c620f01 sltiu r2,r3,0x0f01           
000188e8: 14400009 bne r2,r0,0x00018910         go to other part of loop 0xf01 times
000188ec: 00000000 nop

SPU timeout

000188f0: 3c048001 lui r4,0x8001
000188f4: 24840044 addiu r4,r4,0x0044           "SPU:T/O [%s]\n"
000188f8: 3c058001 lui r5,0x8001
000188fc: 24a50054 addiu r5,r5,0x0054           "wait (reset)"
00018900: 0c0088cb jal 0x0002232c               printf SPU time out [wait (reset)]
00018904: 00000000 nop 
00018908: 0800624d j 0x00018934
0001890c: 00002021 addu r4,r0,r0
00018910: 3c028003 lui r2,0x8003
00018914: 8c42ad44 lw r2,-0x52bc(r2)            spu status reg
00018918: 00000000 nop
0001891c: 944201ae lhu r2,0x01ae(r2)
00018920: 00000000 nop
00018924: 304207ff andi r2,r2,0x07ff
00018928: 1440ffee bne r2,r0,0x000188e4         loop if anything is still on.
0001892c: 24630001 addiu r3,r3,0x0001
00018930: 00002021 addu r4,r0,r0
00018934: 3c058003 lui r5,0x8003
00018938: 24a57080 addiu r5,r5,0x7080
0001893c: 34020002 ori r2,r0,0x0002
00018940: 3c018003 lui r1,0x8003
00018944: ac22ad68 sw r2,-0x5298(r1)            this is only ever 2.
00018948: 34020003 ori r2,r0,0x0003
0001894c: 3c018003 lui r1,0x8003
00018950: ac22ad6c sw r2,-0x5294(r1)            this is only ever 3.
00018954: 34020008 ori r2,r0,0x0008
00018958: 3c018003 lui r1,0x8003
0001895c: ac22ad70 sw r2,-0x5290(r1)            this is only ever 8.
00018960: 34020007 ori r2,r0,0x0007
00018964: 3c018003 lui r1,0x8003
00018968: ac22ad74 sw r2,-0x528c(r1)            this is only ever 7
0001896c: 3c028003 lui r2,0x8003
00018970: 8c42ad44 lw r2,-0x52bc(r2)            left IO Port
00018974: 34030004 ori r3,r0,0x0004
00018978: a44301ac sh r3,0x01ac(r2)             correctly sets this to the intended value of 4. apparently other modes exist, they're just broken.
0001897c: 3403ffff ori r3,r0,0xffff
00018980: a4400184 sh r0,0x0184(r2)             main volume left = 0
00018984: a4400186 sh r0,0x0186(r2)             main volume right = 0
00018988: a443018c sh r3,0x018c(r2)             voice 0 -> 11 key off = 0 (stops all release?)
0001898c: a443018e sh r3,0x018e(r2)             voice 12 -> 23 key off = 0 (stops all release?)
00018990: a4400198 sh r0,0x0198(r2)             voice 0 -> 11 channel reverb mode = 0
00018994: a440019a sh r0,0x019a(r2)             voice 12 -> 23 channel reverb mode = 0
00018998: a4a00000 sh r0,0x0000(r5)
0001899c: 24840001 addiu r4,r4,0x0001
000189a0: 2882000a slti r2,r4,0x000a
000189a4: 1440fffc bne r2,r0,0x00018998         loop and clear 0xa halfwords from r5
000189a8: 24a50002 addiu r5,r5,0x0002
000189ac: 1600003e bne r16,r0,0x00018aa8
000189b0: 00001021 addu r2,r0,r0
000189b4: 3c048003 lui r4,0x8003
000189b8: 2484ad84 addiu r4,r4,0xad84
000189bc: 3c028003 lui r2,0x8003
000189c0: 8c42ad44 lw r2,-0x52bc(r2)            left IO port
000189c4: 34030200 ori r3,r0,0x0200
000189c8: 3c018003 lui r1,0x8003
000189cc: a423ad5c sh r3,-0x52a4(r1)            ?
000189d0: a4400190 sh r0,0x0190(r2)
000189d4: a4400192 sh r0,0x0192(r2)             voices 0 -> 23 channel pitch = 0
000189d8: a4400194 sh r0,0x0194(r2)
000189dc: a4400196 sh r0,0x0196(r2)             voices 0 -> 23 channel noise mode = 0
000189e0: a44001b0 sh r0,0x01b0(r2)
000189e4: a44001b2 sh r0,0x01b2(r2)             CD volume left/right = 0
000189e8: a44001b4 sh r0,0x01b4(r2)
000189ec: a44001b6 sh r0,0x01b6(r2)             external devices volume left/right = 0
000189f0: 0c0062bb jal 0x00018aec               00018aec - 00018cb4
000189f4: 34050010 ori r5,r0,0x0010
000189f8: 00002021 addu r4,r0,r0
000189fc: 34063fff ori r6,r0,0x3fff
00018a00: 34050200 ori r5,r0,0x0200
00018a04: 3c038003 lui r3,0x8003
00018a08: 8c63ad44 lw r3,-0x52bc(r3)            left IO port
00018a0c: 00000000 nop
00018a10: a4600000 sh r0,0x0000(r3)
00018a14: a4600002 sh r0,0x0002(r3)             set voice 0 to volume 0 (also voice 3, 6, 9, etc.)
00018a18: a4660004 sh r6,0x0004(r3)             set voice 1 left volume to 0x3fff (also voice 4, 7, 10, etc.)
00018a1c: a4650006 sh r5,0x0006(r3)             set voice 1 right volume to 0x200 (4, 7, 10, etc.)
00018a20: a4600008 sh r0,0x0008(r3)
00018a24: a460000a sh r0,0x000a(r3)             set voice 2 to volume 0 (also voice 5, 8, 11, etc.)
00018a28: 24840001 addiu r4,r4,0x0001
00018a2c: 28820018 slti r2,r4,0x0018
00018a30: 1440fff6 bne r2,r0,0x00018a0c         loop and set volume for all voices
00018a34: 24630010 addiu r3,r3,0x0010
00018a38: 3411ffff ori r17,r0,0xffff            voices 0 -> 16
00018a3c: 3c028003 lui r2,0x8003
00018a40: 8c42ad44 lw r2,-0x52bc(r2)            left IO port
00018a44: 341000ff ori r16,r0,0x00ff            voices 17 -> 23
00018a48: a4510188 sh r17,0x0188(r2)            
00018a4c: a450018a sh r16,0x018a(r2)            turn every voice ON     
00018a50: 0c0064e9 jal 0x000193a4               Hold CPU 240
00018a54: 00000000 nop
00018a58: 0c0064e9 jal 0x000193a4               Hold CPU 240
00018a5c: 00000000 nop
00018a60: 0c0064e9 jal 0x000193a4               Hold CPU 240
00018a64: 00000000 nop
00018a68: 0c0064e9 jal 0x000193a4               Hold CPU 240
00018a6c: 00000000 nop
00018a70: 3c028003 lui r2,0x8003
00018a74: 8c42ad44 lw r2,-0x52bc(r2)            left IO port
00018a78: 00000000 nop
00018a7c: a451018c sh r17,0x018c(r2)            
00018a80: a450018e sh r16,0x018e(r2)            set every voice to release
00018a84: 0c0064e9 jal 0x000193a4               Hold CPU 240
00018a88: 00000000 nop
00018a8c: 0c0064e9 jal 0x000193a4               Hold CPU 240
00018a90: 00000000 nop
00018a94: 0c0064e9 jal 0x000193a4               Hold CPU 240
00018a98: 00000000 nop
00018a9c: 0c0064e9 jal 0x000193a4               Hold CPU 240
00018aa0: 00000000 nop
00018aa4: 00001021 addu r2,r0,r0
00018aa8: 3c048003 lui r4,0x8003
00018aac: 8c84ad44 lw r4,-0x52bc(r4)            IO port left
00018ab0: 34030001 ori r3,r0,0x0001
00018ab4: 3c018003 lui r1,0x8003
00018ab8: ac23ad78 sw r3,-0x5288(r1)
00018abc: 3403c000 ori r3,r0,0xc000             0xc000 (enable SPU and unmute)
00018ac0: a48301aa sh r3,0x01aa(r4)             give instruction to SPU
00018ac4: 3c018003 lui r1,0x8003
00018ac8: ac20ad7c sw r0,-0x5284(r1)
00018acc: 3c018003 lui r1,0x8003
00018ad0: ac20ad80 sw r0,-0x5280(r1)
00018ad4: 8fbf0018 lw r31,0x0018(r29)
00018ad8: 8fb10014 lw r17,0x0014(r29)
00018adc: 8fb00010 lw r16,0x0010(r29)
00018ae0: 27bd0020 addiu r29,r29,0x0020
00018ae4: 03e00008 jr r31
00018ae8: 00000000 nop