sm64/rsp/audio.s
2021-07-12 23:17:54 -04:00

1897 lines
48 KiB
ArmAsm

.rsp
.include "rsp/rsp_defs.inc"
// This file assumes DATA_FILE and CODE_FILE are set on the command line
.if version() < 110
.error "armips 0.11 or newer is required"
.endif
.macro jumpTableEntry, addr
.dh addr & 0xFFFF
.endmacro
// Audio flags
A_INIT equ 0x01
A_CONTINUE equ 0x00
A_LOOP equ 0x02
A_OUT equ 0x02
A_LEFT equ 0x02
A_RIGHT equ 0x00
A_VOL equ 0x04
A_RATE equ 0x00
A_AUX equ 0x08
A_NOAUX equ 0x00
A_MAIN equ 0x00
A_MIX equ 0x10
.create DATA_FILE, 0x0000
.dh 0x0000, 0x0001, 0x0002, 0xffff, 0x0020, 0x0800, 0x7fff, 0x4000 // 0x00000000
// 0x10 - 0x1F: command dispatch table
dispatchTable:
jumpTableEntry cmd_SPNOOP
jumpTableEntry cmd_ADPCM
jumpTableEntry cmd_CLEARBUFF
.ifdef VERSION_SH
jumpTableEntry cmd_SPNOOP
jumpTableEntry cmd_ADDMIXER
jumpTableEntry cmd_RESAMPLE
jumpTableEntry cmd_RESAMPLE_ZOH
jumpTableEntry cmd_SPNOOP
jumpTableEntry cmd_SETBUFF
jumpTableEntry cmd_SPNOOP
jumpTableEntry cmd_DMEMMOVE
jumpTableEntry cmd_LOADADPCM
jumpTableEntry cmd_MIXER
jumpTableEntry cmd_INTERLEAVE
jumpTableEntry cmd_SPNOOP
jumpTableEntry cmd_SETLOOP
jumpTableEntry cmd_DMEMMOVE2
jumpTableEntry cmd_DOWNSAMPLE_HALF
jumpTableEntry cmd_ENVSETUP1
jumpTableEntry cmd_ENVMIXER
jumpTableEntry cmd_LOADBUFF
jumpTableEntry cmd_SAVEBUFF
jumpTableEntry cmd_ENVSETUP2
jumpTableEntry cmd_S8DEC
jumpTableEntry cmd_HILOGAIN
jumpTableEntry cmd_1c7c
jumpTableEntry cmd_DUPLICATE
jumpTableEntry cmd_FILTER
jumpTableEntry cmd_SPNOOP
jumpTableEntry cmd_SPNOOP
jumpTableEntry cmd_SPNOOP
jumpTableEntry cmd_SPNOOP
.else
jumpTableEntry cmd_ENVMIXER
jumpTableEntry cmd_LOADBUFF
jumpTableEntry cmd_RESAMPLE
jumpTableEntry cmd_SAVEBUFF
jumpTableEntry cmd_SEGMENT
jumpTableEntry cmd_SETBUFF
jumpTableEntry cmd_SETVOL
jumpTableEntry cmd_DMEMMOVE
jumpTableEntry cmd_LOADADPCM
jumpTableEntry cmd_MIXER
jumpTableEntry cmd_INTERLEAVE
jumpTableEntry cmd_POLEF
jumpTableEntry cmd_SETLOOP
.endif
.dh 0xf000, 0x0f00, 0x00f0, 0x000f, 0x0001, 0x0010, 0x0100, 0x1000 // 0x00000030
data0040:
.dh 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e, 0x0010 // 0x00000040
.dh 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001 // 0x00000050
.dh 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0100, 0x0200 // 0x00000060
.dh 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000 // 0x00000070
.dh 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000 // 0x00000080
.dh 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000 // 0x00000090
.dh 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001 // 0x000000a0
.dh 0x2000, 0x4000, 0x6000, 0x8000, 0xa000, 0xc000, 0xe000, 0xffff // 0x000000b0
.ifdef VERSION_SH
.dh 0x0000, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
.dh 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
.endif
.dh 0x0c39, 0x66ad, 0x0d46, 0xffdf, 0x0b39, 0x6696, 0x0e5f, 0xffd8 // 0x000000c0
.dh 0x0a44, 0x6669, 0x0f83, 0xffd0, 0x095a, 0x6626, 0x10b4, 0xffc8 // 0x000000d0
.dh 0x087d, 0x65cd, 0x11f0, 0xffbf, 0x07ab, 0x655e, 0x1338, 0xffb6 // 0x000000e0
.dh 0x06e4, 0x64d9, 0x148c, 0xffac, 0x0628, 0x643f, 0x15eb, 0xffa1 // 0x000000f0
.dh 0x0577, 0x638f, 0x1756, 0xff96, 0x04d1, 0x62cb, 0x18cb, 0xff8a // 0x00000100
.dh 0x0435, 0x61f3, 0x1a4c, 0xff7e, 0x03a4, 0x6106, 0x1bd7, 0xff71 // 0x00000110
.dh 0x031c, 0x6007, 0x1d6c, 0xff64, 0x029f, 0x5ef5, 0x1f0b, 0xff56 // 0x00000120
.dh 0x022a, 0x5dd0, 0x20b3, 0xff48, 0x01be, 0x5c9a, 0x2264, 0xff3a // 0x00000130
.dh 0x015b, 0x5b53, 0x241e, 0xff2c, 0x0101, 0x59fc, 0x25e0, 0xff1e // 0x00000140
.dh 0x00ae, 0x5896, 0x27a9, 0xff10, 0x0063, 0x5720, 0x297a, 0xff02 // 0x00000150
.dh 0x001f, 0x559d, 0x2b50, 0xfef4, 0xffe2, 0x540d, 0x2d2c, 0xfee8 // 0x00000160
.dh 0xffac, 0x5270, 0x2f0d, 0xfedb, 0xff7c, 0x50c7, 0x30f3, 0xfed0 // 0x00000170
.dh 0xff53, 0x4f14, 0x32dc, 0xfec6, 0xff2e, 0x4d57, 0x34c8, 0xfebd // 0x00000180
.dh 0xff0f, 0x4b91, 0x36b6, 0xfeb6, 0xfef5, 0x49c2, 0x38a5, 0xfeb0 // 0x00000190
.dh 0xfedf, 0x47ed, 0x3a95, 0xfeac, 0xfece, 0x4611, 0x3c85, 0xfeab // 0x000001a0
.dh 0xfec0, 0x4430, 0x3e74, 0xfeac, 0xfeb6, 0x424a, 0x4060, 0xfeaf // 0x000001b0
.dh 0xfeaf, 0x4060, 0x424a, 0xfeb6, 0xfeac, 0x3e74, 0x4430, 0xfec0 // 0x000001c0
.dh 0xfeab, 0x3c85, 0x4611, 0xfece, 0xfeac, 0x3a95, 0x47ed, 0xfedf // 0x000001d0
.dh 0xfeb0, 0x38a5, 0x49c2, 0xfef5, 0xfeb6, 0x36b6, 0x4b91, 0xff0f // 0x000001e0
.dh 0xfebd, 0x34c8, 0x4d57, 0xff2e, 0xfec6, 0x32dc, 0x4f14, 0xff53 // 0x000001f0
.dh 0xfed0, 0x30f3, 0x50c7, 0xff7c, 0xfedb, 0x2f0d, 0x5270, 0xffac // 0x00000200
.dh 0xfee8, 0x2d2c, 0x540d, 0xffe2, 0xfef4, 0x2b50, 0x559d, 0x001f // 0x00000210
.dh 0xff02, 0x297a, 0x5720, 0x0063, 0xff10, 0x27a9, 0x5896, 0x00ae // 0x00000220
.dh 0xff1e, 0x25e0, 0x59fc, 0x0101, 0xff2c, 0x241e, 0x5b53, 0x015b // 0x00000230
.dh 0xff3a, 0x2264, 0x5c9a, 0x01be, 0xff48, 0x20b3, 0x5dd0, 0x022a // 0x00000240
.dh 0xff56, 0x1f0b, 0x5ef5, 0x029f, 0xff64, 0x1d6c, 0x6007, 0x031c // 0x00000250
.dh 0xff71, 0x1bd7, 0x6106, 0x03a4, 0xff7e, 0x1a4c, 0x61f3, 0x0435 // 0x00000260
.dh 0xff8a, 0x18cb, 0x62cb, 0x04d1, 0xff96, 0x1756, 0x638f, 0x0577 // 0x00000270
.dh 0xffa1, 0x15eb, 0x643f, 0x0628, 0xffac, 0x148c, 0x64d9, 0x06e4 // 0x00000280
.dh 0xffb6, 0x1338, 0x655e, 0x07ab, 0xffbf, 0x11f0, 0x65cd, 0x087d // 0x00000290
.dh 0xffc8, 0x10b4, 0x6626, 0x095a, 0xffd0, 0x0f83, 0x6669, 0x0a44 // 0x000002a0
.dh 0xffd8, 0x0e5f, 0x6696, 0x0b39, 0xffdf, 0x0d46, 0x66ad, 0x0c39 // 0x000002b0
.ifdef VERSION_SH
.dh 0xFFFF, 0xDFFF, 0xBFFF, 0x9FFF, 0x7FFF, 0x5FFF, 0x3FFF, 0x1FFF
.dh 0x0000, 0x2000, 0x4000, 0x6000, 0x8000, 0xA000, 0xC000, 0xE000
.dh 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000A, 0x000C, 0x000E
.endif
.definelabel segmentTable, 0x320
.ifdef VERSION_SH
.definelabel audioStruct, 0x320
.else
.definelabel audioStruct, 0x360
.endif
audio_in_buf equ 0x00 // 0x360
audio_out_buf equ 0x02 // 0x362
audio_count equ 0x04 // 0x364
audio_vol_left equ 0x06 // 0x366
audio_vol_right equ 0x08 // 0x366
audio_aux_buf0 equ 0x0a // 0x36a
audio_aux_buf1 equ 0x0c // 0x36c
audio_aux_buf2 equ 0x0e // 0x36e
audio_loop_value equ 0x10 // 0x370 (shared)
audio_target_left equ 0x10 // 0x370 (shared)
audio_rate_hi_left equ 0x12 // 0x372 (shared)
audio_rate_lo_left equ 0x14 // 0x374
audio_target_right equ 0x16 // 0x376
audio_rate_hi_right equ 0x18 // 0x378
.ifdef VERSION_SH
.definelabel audio_rate_lo_right, 0x04 // 0x37a
.else
.definelabel audio_rate_lo_right, 0x1a // 0x37a
.endif
audio_dry_gain equ 0x1c // 0x37c
audio_wet_gain equ 0x1e // 0x37e
.ifdef VERSION_SH
.definelabel nextTaskEntry, 0x340
.definelabel adpcmTable, 0x3c0
.else
.definelabel nextTaskEntry, 0x380 // next task entries (0x140 bytes)
.definelabel adpcmTable, 0x4c0 // (16*8 16-bit entries)
.endif
.definelabel dmemBase, 0x5c0 // all samples stored that is transferred to DMEM
.definelabel tmpData, 0xF90 // temporary area
.close // DATA_FILE
.create CODE_FILE, 0x04001080
addi $24, $zero, audioStruct
addi $23, $zero, tmpData
lw $28, 0x30($1) // task_data
lw $27, 0x34($1) // task_data_size
mfc0 $5, DPC_STATUS
andi $4, $5, DPC_STATUS_XBUS_DMA
beqz $4, @@audio_040010b4
andi $4, $5, DPC_STATUS_DMA_BUSY
beqz $4, @@audio_040010b4
nop
@@dpc_dma_busy:
mfc0 $4, DPC_STATUS
andi $4, $4, DPC_STATUS_DMA_BUSY
bgtz $4, @@dpc_dma_busy
@@audio_040010b4:
nop
jal audio_04001150
nop
.ifndef VERSION_SH
addi $2, $zero, 0x000f
addi $1, $zero, segmentTable
@@audio_040010c8:
sw $zero, 0x00($1)
bgtz $2, @@audio_040010c8
addi $2, $2, -1
.endif
dma_busy:
mfc0 $2, SP_DMA_BUSY
bnez $2, dma_busy
addi $29, $zero, nextTaskEntry
mtc0 $zero, SP_SEMAPHORE // release semaphore
audio_040010e4:
lw $26, 0x00($29) // first word of command
lw $25, 0x04($29) // second word of command
srl $1, $26, 23 // cmd byte << 1
andi $1, $1, 0x00fe
addi $28, $28, 8
addi $27, $27, -8
addi $29, $29, 8
addi $30, $30, -8
add $2, $zero, $1
lh $2, (dispatchTable)($2)
jr $2
nop
break
cmd_SPNOOP:
bgtz $30, audio_040010e4
nop
blez $27, @@audio_04001138
nop
jal audio_04001150
nop
j dma_busy
nop
@@audio_04001138:
ori $1, $zero, 0x4000
mtc0 $1, SP_STATUS
break
nop
@@forever:
b @@forever
nop
audio_04001150:
addi $5, $ra, 0x0000
add $2, $zero, $28
addi $3, $27, 0x0000
.ifdef VERSION_SH
addi $4, $3, -0x80
.else
addi $4, $3, -0x0140
.endif
blez $4, @@audio_0400116c
addi $1, $zero, nextTaskEntry
.ifdef VERSION_SH
addi $3, $zero, 0x80
.else
addi $3, $zero, 0x0140
.endif
@@audio_0400116c:
addi $30, $3, 0x0000
jal dma_read_start
addi $3, $3, -1
addi $29, $zero, nextTaskEntry
jr $5
nop
dma_read_start:
mfc0 $4, SP_SEMAPHORE
bnez $4, dma_read_start
nop
@@dma_not_full:
mfc0 $4, SP_DMA_FULL
bnez $4, @@dma_not_full
nop
mtc0 $1, SP_MEM_ADDR
mtc0 $2, SP_DRAM_ADDR
mtc0 $3, SP_RD_LEN
jr $ra
nop
dma_write_start:
mfc0 $4, SP_SEMAPHORE
bnez $4, dma_write_start
nop
@@dma_not_full:
mfc0 $4, SP_DMA_FULL
bnez $4, @@dma_not_full
nop
mtc0 $1, SP_MEM_ADDR
mtc0 $2, SP_DRAM_ADDR
mtc0 $3, SP_WR_LEN
jr $ra
nop
cmd_CLEARBUFF:
andi $3, $25, 0xffff
beqz $3, cmd_SPNOOP
.ifndef VERSION_SH
addi $4, $zero, dmemBase
.endif
andi $2, $26, 0xffff
.ifndef VERSION_SH
add $2, $2, $4
.endif
.ifdef VERSION_SH
vxor $v0, $v0, $v0
.else
vxor $v1, $v1, $v1
.endif
addi $3, $3, -0x10
@@audio_040011f8:
.ifdef VERSION_SH
sdv $v0[0], 0x0($2)
sdv $v0[0], 0x8($2)
.else
sdv $v1[0], 0x0($2)
sdv $v1[0], 0x8($2)
.endif
addi $2, $2, 0x10
bgtz $3, @@audio_040011f8
addi $3, $3, -0x10
j cmd_SPNOOP
nop
.ifndef VERSION_SH
cmd_LOADBUFF:
lhu $3, (audio_count)($24)
beqz $3, cmd_SPNOOP
sll $2, $25, 8
srl $2, $2, 8
srl $4, $25, 24
sll $4, $4, 2
lw $5, (segmentTable)($4)
add $2, $2, $5
lhu $1, (audio_in_buf)($24)
jal dma_read_start
addi $3, $3, -1
@@dma_read_busy:
mfc0 $1, SP_DMA_BUSY
bnez $1, @@dma_read_busy
nop
j cmd_SPNOOP
mtc0 $zero, SP_SEMAPHORE
cmd_SAVEBUFF:
lhu $3, (audio_count)($24)
beqz $3, cmd_SPNOOP
sll $2, $25, 8
srl $2, $2, 8
srl $4, $25, 24
sll $4, $4, 2
lw $5, (segmentTable)($4)
add $2, $2, $5
lhu $1, (audio_out_buf)($24)
jal dma_write_start
addi $3, $3, -1
@@dma_write_busy:
mfc0 $1, SP_DMA_BUSY
bnez $1, @@dma_write_busy
nop
j cmd_SPNOOP
mtc0 $zero, SP_SEMAPHORE
cmd_LOADADPCM:
sll $2, $25, 8
srl $2, $2, 8
srl $4, $25, 24
sll $4, $4, 2
lw $5, (segmentTable)($4)
add $2, $2, $5
addi $1, $zero, adpcmTable
andi $3, $26, 0xffff
jal dma_read_start
addi $3, $3, -1
@@dma_read_busy:
mfc0 $1, SP_DMA_BUSY
bnez $1, @@dma_read_busy
nop
j cmd_SPNOOP
mtc0 $zero, SP_SEMAPHORE
.endif
cmd_SEGMENT:
.ifndef VERSION_SH
sll $3, $25, 8 // Least significant 24-bits offset
srl $3, $3, 8
srl $2, $25, 24 // Most significant 8-bits segment number
sll $2, $2, 2
add $4, $zero, $2
j cmd_SPNOOP
sw $3, (segmentTable)($4)
.endif
.ifndef VERSION_SH
cmd_SETBUFF:
addi $1, $26, dmemBase
srl $2, $25, 16
addi $2, $2, dmemBase
srl $4, $26, 16
andi $4, $4, A_AUX
bgtz $4, @@audio_04001318
addi $3, $25, dmemBase
sh $1, (audio_in_buf)($24)
sh $2, (audio_out_buf)($24)
j cmd_SPNOOP
sh $25, (audio_count)($24)
@@audio_04001318:
sh $3, (audio_aux_buf2)($24)
sh $1, (audio_aux_buf0)($24)
j cmd_SPNOOP
sh $2, (audio_aux_buf1)($24)
.endif
.ifdef VERSION_SH
cmd_SETBUFF:
srl $2, $25, 16
sh $26, 0($24)
sh $2, 2($24)
.else
cmd_SETVOL:
srl $2, $26, 16
andi $1, $2, A_AUX
beqz $1, @@audio_04001344
andi $1, $2, A_VOL
sh $26, (audio_dry_gain)($24)
j cmd_SPNOOP
sh $25, (audio_wet_gain)($24)
@@audio_04001344:
beqz $1, @@audio_04001364
andi $1, $2, A_LEFT
beqz $1, @@audio_0400135c
nop
j cmd_SPNOOP
sh $26, (audio_vol_left)($24)
@@audio_0400135c:
j cmd_SPNOOP
sh $26, (audio_vol_right)($24)
@@audio_04001364:
beqz $1, @@audio_0400137c
srl $1, $25, 16
sh $26, (audio_target_left)($24)
sh $1, (audio_rate_hi_left)($24)
j cmd_SPNOOP
sh $25, (audio_rate_lo_left)($24)
@@audio_0400137c:
sh $26, (audio_target_right)($24)
sh $1, (audio_rate_hi_right)($24)
.endif
j cmd_SPNOOP
sh $25, (audio_rate_lo_right)($24)
cmd_INTERLEAVE:
.ifdef VERSION_SH
andi $a0, $k0, 0xffff
srl $at, $k0, 12
andi $at, $at, 0xff0
andi $v1, $t9, 0xffff
srl $v0, $t9, 16
@@audio_040013a8:
ldv $v1[0], 0x0($2)
ldv $v2[0], 0x0($3)
addi $at, $at, -8
addi $a0, $a0, 16
ssv $v1[0], 0xF0($4)
ssv $v1[2], 0xF4($4)
addi $v0, $v0, 8
ssv $v1[4], 0xF8($4)
ssv $v1[6], 0xFC($4)
ssv $v2[0], 0xF2($4)
addi $v1, $v1, 8
ssv $v2[2], 0xF6($4)
ssv $v2[4], 0xFA($4)
.else
lhu $1, (audio_count)($24)
lhu $4, (audio_out_buf)($24)
beqz $1, cmd_SPNOOP
andi $3, $25, 0xffff
addi $3, $3, dmemBase
srl $2, $25, 16
addi $2, $2, dmemBase
@@audio_040013a8:
lqv $v1[0], 0x00($2)
lqv $v2[0], 0x00($3)
ssv $v1[0], 0x00($4)
ssv $v2[0], 0x02($4)
ssv $v1[2], 0x04($4)
ssv $v2[2], 0x06($4)
ssv $v1[4], 0x08($4)
ssv $v2[4], 0x0a($4)
ssv $v1[6], 0x0c($4)
ssv $v2[6], 0x0e($4)
ssv $v1[8], 0x10($4)
ssv $v2[8], 0x12($4)
ssv $v1[10], 0x14($4)
ssv $v2[10], 0x16($4)
ssv $v1[12], 0x18($4)
ssv $v2[12], 0x1a($4)
ssv $v1[14], 0x1c($4)
ssv $v2[14], 0x1e($4)
addi $1, $1, -0x10
addi $2, $2, 0x10
addi $3, $3, 0x10
.endif
bgtz $1, @@audio_040013a8
.ifdef VERSION_SH
ssv $v2[6], 0xFE($a0)
.else
addi $4, $4, 0x20
.endif
j cmd_SPNOOP
nop
cmd_DMEMMOVE:
andi $1, $25, 0xffff
beqz $1, cmd_SPNOOP
andi $2, $26, 0xffff
.ifndef VERSION_SH
addi $2, $2, dmemBase
.endif
srl $3, $25, 16
.ifndef VERSION_SH
addi $3, $3, dmemBase
.endif
@@audio_04001424:
ldv $v1[0], 0x0($2)
ldv $v2[0], 0x8($2)
addi $1, $1, -0x10
addi $2, $2, 0x10
sdv $v1[0], 0x0($3)
sdv $v2[0], 0x8($3)
bgtz $1, @@audio_04001424
addi $3, $3, 0x10
j cmd_SPNOOP
nop
cmd_SETLOOP:
sll $1, $25, 8
srl $1, $1, 8
.ifndef VERSION_SH
srl $3, $25, 24
sll $3, $3, 2
lw $2, (segmentTable)($3)
add $1, $1, $2
sw $1, (audio_loop_value)($24)
.endif
j cmd_SPNOOP
.ifdef VERSION_SH
sw $at, 0x10($t8)
.else
nop
.endif
cmd_ADPCM:
lqv $v31[0], 0x00($zero)
vxor $v27, $v27, $v27
lhu $21, (audio_in_buf)($24)
vxor $v25, $v25, $v25
vxor $v24, $v24, $v24
addi $20, $21, 1
lhu $19, (audio_out_buf)($24)
vxor $v13, $v13, $v13
vxor $v14, $v14, $v14
lhu $18, (audio_count)($24)
vxor $v15, $v15, $v15
.ifndef VERSION_SH
lui $1, 0x00ff
.endif
vxor $v16, $v16, $v16
.ifdef VERSION_SH
sll $s1, $t9, 8
.else
ori $1, $1, 0xffff
.endif
vxor $v17, $v17, $v17
.ifndef VERSION_SH
and $17, $25, $1
.endif
vxor $v18, $v18, $v18
.ifdef VERSION_SH
srl $s1, $s1, 8
.else
srl $2, $25, 24
.endif
vxor $v19, $v19, $v19
.ifndef VERSION_SH
sll $2, $2, 2
lw $3, (segmentTable)($2)
add $17, $17, $3 // last frame addr
.endif
sqv $v27[0], 0x00($19)
sqv $v27[0], 0x10($19)
srl $1, $26, 16
andi $1, $1, A_INIT
bgtz $1, @@audio_0400150c
srl $1, $26, 16
andi $1, $1, A_LOOP
beq $zero, $1, @@audio_040014f0
addi $2, $17, 0x00
lw $2, (audio_loop_value)($24)
@@audio_040014f0:
addi $1, $19, 0x0000
jal dma_read_start
addi $3, $zero, 0x1f
@@dma_read_busy:
mfc0 $5, SP_DMA_BUSY
bnez $5, @@dma_read_busy
nop
mtc0 $zero, SP_SEMAPHORE
@@audio_0400150c:
.ifdef VERSION_SH
addi $16, $zero, 0x0050
.else
addi $16, $zero, 0x0030
.endif
addi $15, $zero, adpcmTable
ldv $v25[0], 0x00($16)
ldv $v24[8], 0x00($16)
ldv $v23[0], 0x08($16)
ldv $v23[8], 0x08($16)
lqv $v27[0], 0x10($19) // last 8 frames
addi $19, $19, 0x20
beqz $18, @@audio_040016e8
ldv $v1[0], 0x00($20)
lbu $1, 0x00($21)
andi $11, $1, 0x000f
sll $11, $11, 5
vand $v3, $v25, $v1[0]
add $13, $11, $15
vand $v4, $v24, $v1[1]
srl $14, $1, 4
vand $v5, $v25, $v1[2]
addi $2, $zero, 12
vand $v6, $v24, $v1[3]
sub $14, $2, $14
addi $2, $14, -1
addi $3, $zero, 1
sll $3, $3, 15
srlv $4, $3, $2
mtc2 $4, $v22[0]
lqv $v21[0], 0x00($13)
lqv $v20[0], 0x10($13)
addi $13, $13, -2
lrv $v19[0], 0x20($13)
addi $13, $13, -2
lrv $v18[0], 0x20($13)
addi $13, $13, -2
lrv $v17[0], 0x20($13)
addi $13, $13, -2
lrv $v16[0], 0x20($13)
addi $13, $13, -2
lrv $v15[0], 0x20($13)
addi $13, $13, -2
lrv $v14[0], 0x20($13)
addi $13, $13, -2
lrv $v13[0], 0x20($13)
@@audio_040015b4:
addi $20, $20, 9
vmudn $v30, $v3, $v23
addi $21, $21, 9
vmadn $v30, $v4, $v23
ldv $v1[0], 0x00($20)
vmudn $v29, $v5, $v23
lbu $1, 0x00($21)
vmadn $v29, $v6, $v23
blez $14, @@audio_040015e4
andi $11, $1, 0x000f
vmudm $v30, $v30, $v22[0]
vmudm $v29, $v29, $v22[0]
@@audio_040015e4:
sll $11, $11, 5
vand $v3, $v25, $v1[0]
add $13, $11, $15
vand $v4, $v24, $v1[1]
vand $v5, $v25, $v1[2]
vand $v6, $v24, $v1[3]
srl $14, $1, 4
vmudh $v2, $v21, $v27[6]
addi $2, $zero, 12
vmadh $v2, $v20, $v27[7]
sub $14, $2, $14
vmadh $v2, $v19, $v30[0]
addi $2, $14, -1
vmadh $v2, $v18, $v30[1]
addi $3, $zero, 1
vmadh $v2, $v17, $v30[2]
sll $3, $3, 15
vmadh $v2, $v16, $v30[3]
srlv $4, $3, $2
vmadh $v28, $v15, $v30[4]
mtc2 $4, $v22[0]
vmadh $v2, $v14, $v30[5]
vmadh $v2, $v13, $v30[6]
vmadh $v2, $v30, $v31[5]
vsar $v26, $v7, $v28[1]
vsar $v28, $v7, $v28[0]
vmudn $v2, $v26, $v31[4]
vmadh $v28, $v28, $v31[4]
vmudh $v2, $v19, $v29[0]
addi $12, $13, -2
vmadh $v2, $v18, $v29[1]
lrv $v19[0], 0x20($12)
vmadh $v2, $v17, $v29[2]
addi $12, $12, -2
vmadh $v2, $v16, $v29[3]
lrv $v18[0], 0x20($12)
vmadh $v2, $v15, $v29[4]
addi $12, $12, -2
vmadh $v2, $v14, $v29[5]
lrv $v17[0], 0x20($12)
vmadh $v2, $v13, $v29[6]
addi $12, $12, -2
vmadh $v2, $v29, $v31[5]
lrv $v16[0], 0x20($12)
vmadh $v2, $v21, $v28[6]
addi $12, $12, -2
vmadh $v2, $v20, $v28[7]
lrv $v15[0], 0x20($12)
vsar $v26, $v7, $v27[1]
addi $12, $12, -2
vsar $v27, $v7, $v27[0]
lrv $v14[0], 0x20($12)
addi $12, $12, -2
lrv $v13[0], 0x20($12)
lqv $v21[0], 0x00($13)
vmudn $v2, $v26, $v31[4]
lqv $v20[0], 0x10($13)
vmadh $v27, $v27, $v31[4]
addi $18, $18, -0x20
sdv $v28[0], 0x00($19)
sdv $v28[8], 0x08($19)
sdv $v27[0], 0x10($19)
sdv $v27[8], 0x18($19)
bgtz $18, @@audio_040015b4
addi $19, $19, 0x20
@@audio_040016e8:
addi $1, $19, -0x20
addi $2, $17, 0x00
jal dma_write_start
addi $3, $zero, 0x1f
@@dma_write_busy:
mfc0 $5, SP_DMA_BUSY
bnez $5, @@dma_write_busy
nop
j cmd_SPNOOP
mtc0 $zero, SP_SEMAPHORE
cmd_POLEF: // unused by SM64
.ifndef VERSION_SH
lqv $v31[0], 0x0000($zero)
vxor $v28, $v28, $v28
lhu $21, (audio_in_buf)($24)
vxor $v17, $v17, $v17
lhu $20, (audio_out_buf)($24)
vxor $v18, $v18, $v18
lhu $19, (audio_count)($24)
vxor $v19, $v19, $v19
beqz $19, @@audio_04001874
andi $14, $26, 0xffff
mtc2 $14, $v31[10]
sll $14, $14, 2
mtc2 $14, $v16[0]
lui $1, 0x00ff
vxor $v20, $v20, $v20
ori $1, $1, 0xffff
vxor $v21, $v21, $v21
and $18, $25, $1
vxor $v22, $v22, $v22
srl $2, $25, 24
vxor $v23, $v23, $v23
sll $2, $2, 2
lw $3, (segmentTable)($2)
add $18, $18, $3
slv $v28[0], 0x00($23)
srl $1, $26, 16
andi $1, $1, 0x0001
bgtz $1, @@audio_040017a0
nop
addi $1, $23, 0x0000
addi $2, $18, 0x0000
jal dma_read_start
addi $3, $zero, 7
.endif
@@dma_read_busy:
.ifndef VERSION_SH
mfc0 $5, SP_DMA_BUSY
bnez $5, @@dma_read_busy
nop
mtc0 $zero, SP_SEMAPHORE
.endif
@@audio_040017a0:
.ifndef VERSION_SH
addi $13, $zero, adpcmTable
addi $1, $zero, 0x0004
mtc2 $1, $v14[0]
lqv $v24[0], 0x0010($13)
vmudm $v16, $v24, $v16[0]
ldv $v28[8], 0x00($23)
sqv $v16[0], 0x10($13)
lqv $v25[0], 0x00($13)
addi $13, $13, -2
lrv $v23[0], 0x20($13)
addi $13, $13, -2
lrv $v22[0], 0x20($13)
addi $13, $13, -2
lrv $v21[0], 0x20($13)
addi $13, $13, -2
lrv $v20[0], 0x20($13)
addi $13, $13, -2
lrv $v19[0], 0x20($13)
addi $13, $13, -2
lrv $v18[0], 0x20($13)
addi $13, $13, -2
lrv $v17[0], 0x20($13)
ldv $v30[0], 0x00($21)
ldv $v30[8], 0x08($21)
.endif
@@audio_04001800:
.ifndef VERSION_SH
vmudh $v16, $v25, $v28[6]
addi $21, $21, 0x10
vmadh $v16, $v24, $v28[7]
addi $19, $19, -0x10
vmadh $v16, $v23, $v30[0]
vmadh $v16, $v22, $v30[1]
vmadh $v16, $v21, $v30[2]
vmadh $v16, $v20, $v30[3]
vmadh $v28, $v19, $v30[4]
vmadh $v16, $v18, $v30[5]
vmadh $v16, $v17, $v30[6]
vmadh $v16, $v30, $v31[5]
ldv $v30[0], 0x00($21)
vsar $v26, $v15, $v28[1]
ldv $v30[8], 0x08($21)
vsar $v28, $v15, $v28[0]
vmudn $v16, $v26, $v14[0]
vmadh $v28, $v28, $v14[0]
sdv $v28[0], 0x00($20)
sdv $v28[8], 0x08($20)
bgtz $19, @@audio_04001800
addi $20, $20, 0x10
addi $1, $20, -8
addi $2, $18, 0x00
jal dma_write_start
addi $3, $zero, 7
.endif
@@dma_write_busy:
.ifndef VERSION_SH
mfc0 $5, SP_DMA_BUSY
bnez $5, @@dma_write_busy
nop
.endif
@@audio_04001874:
.ifndef VERSION_SH
j cmd_SPNOOP
mtc0 $zero, SP_SEMAPHORE
.endif
cmd_RESAMPLE:
lh $8, (audio_in_buf)($24)
lh $19, (audio_out_buf)($24)
lh $18, (audio_count)($24)
.ifdef VERSION_SH
sll $v0, $t9, 8
srl $v0, $v0, 8
.else
lui $4, 0x00ff
ori $4, $4, 0xffff
and $2, $25, $4
srl $5, $25, 24
sll $5, $5, 2
lw $6, (segmentTable)($5)
add $2, $2, $6 // physical address of state_addr
.endif
addi $1, $23, 0x0000
sw $2, 0x40($23) // overwrite TASK_UCODE ptr
addi $3, $zero, 0x1f
srl $7, $26, 16
andi $10, $7, A_INIT
bgtz $10, @@audio_040018dc
nop
jal dma_read_start
nop
@@dma_read_busy:
mfc0 $1, SP_DMA_BUSY
bnez $1, @@dma_read_busy
nop
j @@audio_040018e8
mtc0 $zero, SP_SEMAPHORE
@@audio_040018dc:
sh $zero, 0x08($23)
vxor $v16, $v16, $v16
sdv $v16[0], 0x00($23)
@@audio_040018e8:
andi $10, $7, 0x02 // A_LOOP? A_OUT?
beqz $10, @@audio_04001908
.ifdef VERSION_SH
ldv $v16[0], 0x00($23)
addi $t0, $t0, -4
ssv $v16[0], 0x00($t0)
ssv $v16[4], 0x02($t0)
j @@audio_c410c
nop
.else
nop
lh $11, 0x0a($23)
lqv $v3[0], 0x10($23)
sdv $v3[0], -0x10($8)
sdv $v3[8], -0x08($8)
sub $8, $8, $11
.endif
@@audio_04001908:
.ifdef VERSION_SH
andi $t2, $a3, 4
beqz $t2, @@audio_c4104
nop
addi $t0, $t0, -16
ssv $v16[0], 0x00($t0)
ssv $v16[0], 0x02($t0)
ssv $v16[2], 0x04($t0)
ssv $v16[2], 0x06($t0)
ssv $v16[4], 0x08($t0)
ssv $v16[4], 0x0a($t0)
ssv $v16[6], 0x0c($t0)
ssv $v16[6], 0x0e($t0)
j @@audio_c410c
nop
@@audio_c4104:
.endif
addi $8, $8, -8
.ifdef VERSION_SH
sdv $v16[0], 0x00($8)
.endif
@@audio_c410c:
lsv $v23[14], 0x08($23) // saved pitch_accumulator
.ifdef VERSION_SH
ldv $v16[0], 0x00($8)
.else
ldv $v16[0], 0x00($23) // saved next 4 unprocessed samples
sdv $v16[0], 0x00($8) // store them before the input samples
.endif
mtc2 $8, $v18[4]
.ifdef VERSION_SH
addi $10, $zero, 0x100
.else
addi $10, $zero, 0xc0
.endif
mtc2 $10, $v18[6]
mtc2 $26, $v18[8] // pitch
addi $10, $zero, 0x40
mtc2 $10, $v18[10]
.ifdef VERSION_SH
addi $9, $zero, 0x60
.else
addi $9, $zero, data0040
.endif
lqv $v31[0], 0x10($9) // 0x50
lqv $v25[0], 0x00($9) // 0x40
vsub $v25, $v25, $v31
lqv $v30[0], 0x20($9) // 0x60
lqv $v29[0], 0x30($9) // 0x70
lqv $v28[0], 0x40($9) // 0x80
lqv $v27[0], 0x50($9) // 0x90
lqv $v26[0], 0x60($9) // 0xA0
vsub $v25, $v25, $v31
lqv $v24[0], 0x70($9) // 0xB0
addi $21, $23, 0x20
addi $20, $23, 0x30
vxor $v22, $v22, $v22
vmudm $v23, $v31, $v23[7] // load pitch_accumulator into every vector element
vmadm $v22, $v25, $v18[4] // (accumulate with pitch times index) >> 16
vmadn $v23, $v31, $v30[0] // result & 0xffff
vmudn $v21, $v31, $v18[2] // load the in address into every vector element
vmadn $v21, $v22, $v30[2] // accumulate with 2 * $v22
vmudl $v17, $v23, $v18[5] // 64 * $v23 >> 16
vmudn $v17, $v17, $v30[4] // * 8
vmadn $v17, $v31, $v18[3] // += 0x00c0 (resample lookup table address)
lqv $v25[0], 0x00($9)
sqv $v21[0], 0x00($21)
sqv $v17[0], 0x00($20)
ssv $v23[7], 0x08($23)
lh $17, 0x00($21)
lh $9, 0x00($20)
lh $13, 0x08($21)
lh $5, 0x08($20)
lh $16, 0x02($21)
lh $8, 0x02($20)
lh $12, 0x0a($21)
lh $4, 0x0a($20)
lh $15, 0x04($21)
lh $7, 0x04($20)
lh $11, 0x0c($21)
lh $3, 0x0c($20)
lh $14, 0x06($21)
lh $6, 0x06($20)
lh $10, 0x0e($21)
lh $2, 0x0e($20)
@@audio_040019d8:
ldv $v16[0], 0x00($17)
vmudm $v23, $v31, $v23[7]
ldv $v15[0], 0x00($9)
vmadh $v23, $v31, $v22[7]
ldv $v16[8], 0x00($13)
vmadm $v22, $v25, $v18[4]
ldv $v15[8], 0x00($5)
vmadn $v23, $v31, $v30[0]
ldv $v14[0], 0x00($16)
vmudn $v21, $v31, $v18[2]
ldv $v13[0], 0x00($8)
vmadn $v21, $v22, $v30[2]
ldv $v14[8], 0x00($12)
vmudl $v17, $v23, $v18[5]
ldv $v13[8], 0x00($4)
ldv $v12[0], 0x00($15)
ldv $v11[0], 0x00($7)
ldv $v12[8], 0x00($11)
vmudn $v17, $v17, $v30[4]
ldv $v11[8], 0x00($3)
ldv $v10[0], 0x00($14)
ldv $v9[0], 0x00($6)
vmadn $v17, $v31, $v18[3]
ldv $v10[8], 0x00($10)
vmulf $v8, $v16, $v15
ldv $v9[8], 0x00($2)
vmulf $v7, $v14, $v13
sqv $v21[0], 0x00($21)
vmulf $v6, $v12, $v11
sqv $v17[0], 0x00($20)
lh $17, 0x00($21)
vmulf $v5, $v10, $v9
lh $9, 0x00($20)
vadd $v8, $v8, $v8[1q]
lh $13, 0x08($21)
vadd $v7, $v7, $v7[1q]
lh $5, 0x08($20)
vadd $v6, $v6, $v6[1q]
lh $16, 0x02($21)
vadd $v5, $v5, $v5[1q]
lh $8, 0x02($20)
vadd $v8, $v8, $v8[2h]
lh $12, 0x0a($21)
vadd $v7, $v7, $v7[2h]
lh $4, 0x0a($20)
vadd $v6, $v6, $v6[2h]
lh $15, 0x04($21)
vadd $v5, $v5, $v5[2h]
lh $7, 0x04($20)
vmudn $v4, $v29, $v8[0h]
lh $11, 0x0c($21)
vmadn $v4, $v28, $v7[0h]
lh $3, 0x0c($20)
vmadn $v4, $v27, $v6[0h]
lh $14, 0x06($21)
vmadn $v4, $v26, $v5[0h]
lh $6, 0x06($20)
lh $10, 0x0e($21)
addi $18, $18, -0x10
sqv $v4[0], 0x00($19)
blez $18, @@audio_04001ad8
lh $2, 0x0e($20)
j @@audio_040019d8
addi $19, $19, 0x0010
@@audio_04001ad8:
ssv $v23[0], 0x08($23)
ldv $v16[0], 0x00($17)
sdv $v16[0], 0x00($23)
.ifndef VERSION_SH
lh $6, (audio_in_buf)($24)
addi $17, $17, 8
sub $5, $17, $6
andi $4, $5, 0x000f
sub $17, $17, $4
beqz $4, @@audio_04001b04
addi $7, $zero, 0x10
sub $4, $7, $4
@@audio_04001b04:
sh $4, 0x0a($23)
ldv $v3[0], 0x00($17)
ldv $v3[8], 0x08($17)
sqv $v3[0], 0x10($23)
.endif
lw $2, 0x40($23)
addi $1, $23, 0x00
jal dma_write_start
addi $3, $zero, 0x1f
@@dma_write_busy:
mfc0 $5, SP_DMA_BUSY
bnez $5, @@dma_write_busy
nop
j cmd_SPNOOP
mtc0 $zero, SP_SEMAPHORE
.ifdef VERSION_SH
cmd_DMEMMOVE2:
srl $t7, $k0, 16
andi $t7, $t7, 0xff
andi $t5, $k0, 0xffff
srl $t6, $t9, 0x10
@@audio_30C314:
addi $t7, $t7, -1
andi $t4, $t9, 0xffff
@@audio_30C31C:
lqv $v1[0], 0x00($t5)
lqv $v2[0], 0x10($t5)
addi $t4, $t4, -0x20
addi $t5, $t5, 0x20
sqv $v1[0], 0x00($t6)
sqv $v2[0], 0x10($t6)
bgtz $t4, @@audio_30C31C
addi $t6, $t6, 0x20
bgtz $t7, @@audio_30C314
nop
j cmd_SPNOOP
nop
cmd_DUPLICATE:
srl $t7, $k0, 0x10
andi $t7, $t7, 0xff
andi $t5, $k0, 0xffff
srl $t6, $t9, 0x10
lqv $v1[0], 0x00($t5)
lqv $v2[0], 0x10($t5)
lqv $v3[0], 0x20($t5)
lqv $v4[0], 0x30($t5)
lqv $v5[0], 0x40($t5)
lqv $v6[0], 0x50($t5)
lqv $v7[0], 0x60($t5)
lqv $v8[0], 0x70($t5)
@@audio_30C37C:
addi $t7, $t7, -1
sqv $v1[0], 0x00($t6)
sqv $v2[0], 0x10($t6)
sqv $v3[0], 0x20($t6)
sqv $v4[0], 0x30($t6)
sqv $v5[0], 0x40($t6)
sqv $v6[0], 0x50($t6)
sqv $v7[0], 0x60($t6)
sqv $v8[0], 0x70($t6)
bgtz $t7, @@audio_30C37C
addi $t6, $t6, 0x80
j cmd_SPNOOP
nop
cmd_DOWNSAMPLE_HALF:
andi $t4, $k0, 0xffff
andi $t6, $t9, 0xffff
srl $t5, $t9, 0x10
@@audio_30C3BC:
lsv $v1[0], 0x00($t5)
lsv $v2[0], 0x08($t5)
lsv $v3[0], 0x10($t5)
lsv $v4[0], 0x18($t5)
lsv $v1[2], 0x04($t5)
lsv $v2[2], 0x0c($t5)
lsv $v3[2], 0x14($t5)
lsv $v4[2], 0x1c($t5)
addi $t5, $t5, 0x20
slv $v1[0], 0x00($t6)
slv $v2[0], 0x04($t6)
slv $v3[0], 0x08($t6)
addi $t4, $t4, -8
slv $v4[0], 0x0c($t6)
bgtz $t4, @@audio_30C3BC
addi $t6, $t6, 0x10
j cmd_SPNOOP
nop
.endif
.ifndef VERSION_SH
cmd_ENVMIXER:
lui $4, 0x00ff
ori $4, $4, 0xffff
and $2, $25, $4
srl $5, $25, 24
sll $5, $5, 2
lw $6, (segmentTable)($5)
add $2, $2, $6
addi $1, $23, 0x00
addi $3, $zero, 0x4f
vxor $v0, $v0, $v0
addi $11, $zero, 0x40
lqv $v31[0], 0x10($11) // all 0001
lqv $v10[0], 0x00($zero) // element 6 is 0x7fff
srl $12, $26, 16
andi $10, $12, A_INIT
beqz $10, @@audio_04001b84
lqv $v24[0], 0x10($24)
j @@audio_04001bb0
nop
@@audio_04001b84:
jal dma_read_start
nop
@@dma_read_busy:
mfc0 $5, SP_DMA_BUSY
bnez $5, @@dma_read_busy
nop
mtc0 $zero, SP_SEMAPHORE
lqv $v20[0], 0x00($23)
lqv $v21[0], 0x10($23)
lqv $v18[0], 0x20($23)
lqv $v19[0], 0x30($23)
lqv $v24[0], 0x40($23)
@@audio_04001bb0:
lh $13, (audio_in_buf)($24)
lh $19, (audio_out_buf)($24)
lh $18, (audio_aux_buf0)($24)
lh $17, (audio_aux_buf1)($24)
lh $16, (audio_aux_buf2)($24)
lh $14, (audio_count)($24)
addi $15, $zero, 0x10
mfc2 $21, $v24[2]
mfc2 $20, $v24[8]
andi $9, $12, 0x0008
bgtz $9, @@audio_04001bec
nop
addi $17, $23, 0x50
add $16, $zero, $17
addi $15, $zero, 0
@@audio_04001bec:
beqz $10, @@audio_04001cf0
lqv $v30[0], 0x70($11)
lqv $v17[0], 0x00($13)
lqv $v29[0], 0x00($19)
lqv $v27[0], 0x00($17)
vxor $v21, $v21, $v21
lsv $v20[14], 0x06($24)
vmudm $v23, $v20, $v24[2]
vmadh $v22, $v20, $v24[1]
vmadn $v23, $v31, $v0[0]
vsubc $v23, $v23, $v21
vsub $v22, $v22, $v20
vmudl $v23, $v30, $v23[7]
vmadn $v23, $v30, $v22[7]
vmadm $v22, $v31, $v0[0]
vmadm $v21, $v31, $v21[7]
vmadh $v20, $v31, $v20[7]
bgtz $21, @@audio_04001c44
vmadn $v21, $v31, $v0[0]
vge $v20, $v20, $v24[0]
j @@audio_04001c48
nop
@@audio_04001c44:
vcl $v20, $v20, $v24[0]
@@audio_04001c48:
vmulf $v16, $v20, $v24[6]
vmulf $v15, $v20, $v24[7]
vmulf $v29, $v29, $v10[6]
vmacf $v29, $v17, $v16
vmulf $v27, $v27, $v10[6]
vmacf $v27, $v17, $v15
sqv $v29[0], 0x00($19)
sqv $v27[0], 0x00($17)
lqv $v28[0], 0x00($18)
lqv $v26[0], 0x00($16)
vxor $v19, $v19, $v19
lsv $v18[14], 0x08($24)
vmudm $v23, $v18, $v24[5]
vmadh $v22, $v18, $v24[4]
vmadn $v23, $v31, $v0[0]
vsubc $v23, $v23, $v19
vsub $v22, $v22, $v18
vmudl $v23, $v30, $v23[7]
vmadn $v23, $v30, $v22[7]
vmadm $v22, $v31, $v0[0]
vmadm $v19, $v31, $v19[7]
vmadh $v18, $v31, $v18[7]
bgtz $20, @@audio_04001cb4
vmadn $v19, $v31, $v0[0]
vge $v18, $v18, $v24[3]
j @@audio_04001cb8
nop
@@audio_04001cb4:
vcl $v18, $v18, $v24[3]
@@audio_04001cb8:
vmulf $v16, $v18, $v24[6]
vmulf $v15, $v18, $v24[7]
vmulf $v28, $v28, $v10[6]
vmacf $v28, $v17, $v16
vmulf $v26, $v26, $v10[6]
vmacf $v26, $v17, $v15
sqv $v28[0], 0x00($18)
sqv $v26[0], 0x00($16)
addi $14, $14, -0x10
addi $13, $13, 0x10
addi $19, $19, 0x10
addi $18, $18, 0x10
add $17, $17, $15
add $16, $16, $15
@@audio_04001cf0:
vmudl $v23, $v21, $v24[2]
vmadm $v23, $v20, $v24[2]
vmadn $v23, $v21, $v24[1]
vmadh $v20, $v20, $v24[1]
vmadn $v21, $v31, $v0[0]
@@audio_04001d04:
bgtz $21, @@audio_04001d30
lqv $v17[0], 0x00($13)
vge $v20, $v20, $v24[0]
vmudl $v23, $v19, $v24[5]
vmadm $v23, $v18, $v24[5]
vmadn $v23, $v19, $v24[4]
lqv $v29[0], 0x00($19)
vmadh $v18, $v18, $v24[4]
lqv $v27[0], 0x00($17)
j @@audio_04001d50
vmadn $v19, $v31, $v0[0]
@@audio_04001d30:
vcl $v20, $v20, $v24[0]
vmudl $v23, $v19, $v24[5]
vmadm $v23, $v18, $v24[5]
vmadn $v23, $v19, $v24[4]
lqv $v29[0], 0x00($19)
vmadh $v18, $v18, $v24[4]
lqv $v27[0], 0x00($17)
vmadn $v19, $v31, $v0[0]
@@audio_04001d50:
vmulf $v16, $v20, $v24[6]
sqv $v20[0], 0x00($23)
vmulf $v15, $v20, $v24[7]
sqv $v21[0], 0x10($23)
vmulf $v29, $v29, $v10[6]
vmacf $v29, $v17, $v16
lqv $v28[0], 0x00($18)
vmulf $v27, $v27, $v10[6]
lqv $v26[0], 0x00($16)
vmacf $v27, $v17, $v15
bgtz $20, @@audio_04001da0
sqv $v29[0], 0x00($19)
vge $v18, $v18, $v24[3]
vmudl $v23, $v21, $v24[2]
sqv $v27[0], 0x00($17)
vmadm $v23, $v20, $v24[2]
vmadn $v23, $v21, $v24[1]
vmadh $v20, $v20, $v24[1]
j @@audio_04001dbc
vmadn $v21, $v31, $v0[0]
@@audio_04001da0:
vcl $v18, $v18, $v24[3]
vmudl $v23, $v21, $v24[2]
sqv $v27[0], 0x00($17)
vmadm $v23, $v20, $v24[2]
vmadn $v23, $v21, $v24[1]
vmadh $v20, $v20, $v24[1]
vmadn $v21, $v31, $v0[0]
@@audio_04001dbc:
vmulf $v16, $v18, $v24[6]
addi $14, $14, -0x10
vmulf $v15, $v18, $v24[7]
addi $19, $19, 0x10
vmulf $v28, $v28, $v10[6]
add $17, $17, $15
vmacf $v28, $v17, $v16
addi $13, $13, 0x10
vmulf $v26, $v26, $v10[6]
vmacf $v26, $v17, $v15
sqv $v28[0], 0x00($18)
addi $18, $18, 0x10
blez $14, @@audio_04001dfc
sqv $v26[0], 0x00($16)
j @@audio_04001d04
add $16, $16, $15
@@audio_04001dfc:
sqv $v18[0], 0x20($23)
sqv $v19[0], 0x30($23)
sqv $v24[0], 0x40($23)
jal dma_write_start
addi $3, $zero, 0x004f
@@dma_write_busy:
mfc0 $5, SP_DMA_BUSY
bnez $5, @@dma_write_busy
nop
j cmd_SPNOOP
mtc0 $zero, SP_SEMAPHORE
cmd_MIXER:
lqv $v31[0], 0x00($zero) // element 6 is 0x7fff
lhu $18, (audio_count)($24)
beqz $18, @@cmd_mixer_done // skip operation when count is 0
nop
andi $19, $25, 0xffff
addi $19, $19, dmemBase // dmemout + DMEM_BASE
srl $20, $25, 16
addi $20, $20, dmemBase // dmemin + DMEM_BASE
andi $17, $26, 0xffff
mtc2 $17, $v30[0]
lqv $v27[0], 0x00($19)
lqv $v29[0], 0x00($20)
lqv $v26[0], 0x10($19)
lqv $v28[0], 0x10($20)
@@audio_04001e5c:
vmulf $v27, $v27, $v31[6]
addi $18, $18, -0x20
vmacf $v27, $v29, $v30[0]
addi $20, $20, 0x20
sqv $v27[0], 0x00($19)
vmulf $v26, $v26, $v31[6]
lqv $v29[0], 0x00($20)
vmacf $v26, $v28, $v30[0]
lqv $v28[0], 0x10($20)
sqv $v26[0], 0x10($19)
addi $19, $19, 0x20
lqv $v27[0], 0x00($19)
bgtz $18, @@audio_04001e5c
lqv $v26[0], 0x10($19)
@@cmd_mixer_done:
j cmd_SPNOOP
nop
nop
.endif
.ifdef VERSION_SH
cmd_ENVMIXER:
vxor $v4, $v4, $v4
vxor $v0, $v0, $v0
lqv $v3[0], 0x0(r0)
add $21, $21, $21
mtc2 $21, $v4[0]
mtc2 $21, $v4[2]
srl $12, $26, 12
andi $19, $12, 0xff0
add $22, $22, $22
mtc2 $22, $v4[4]
mtc2 $22, $v4[6]
srl $12, $25, 20
andi $14, $12, 0xff0
add $11, $11, $11
mtc2 $11, $v4[8]
mtc2 $11, $v4[10]
srl $12, $25, 12
andi $15, $12, 0xff0
srl $12, $25, 4
andi $16, $12, 0xff0
sll $12, $25, 4
andi $17, $12, 0xff0
andi $12, $26, 0x2
lhu $12, 0xe0(r12)
mtc2 $12, $v2[0]
andi $12, $26, 0x1
sll $12, $12, 1
lhu $12, 0xe0(r12)
mtc2 $12, $v2[2]
srl $12, $26, 8
andi $20, $12, 0xff
vadd $v0, $v0, $v0
andi $10, $26, 0x4
lqv $v8[0], 0x0(r19)
@audio_400196c:
lqv $v15[0], 0x10(r19)
addi $19, $19, 0x20
vmudm $v9, $v8, $v1[0]
vmudm $v10, $v8, $v1[2]
addi $20, $20, 0xfff0
lqv $v11[0], 0x0(r14)
lqv $v12[0], 0x0(r15)
vmudm $v16, $v15, $v1[1]
vmudm $v17, $v15, $v1[3]
lqv $v18[0], 0x10(r14)
lqv $v19[0], 0x10(r15)
vxor $v9, $v9, $v2[0]
vxor $v10, $v10, $v2[1]
lqv $v13[0], 0x0(r16)
lqv $v14[0], 0x0(r17)
vadd $v11, $v11, $v9
vadd $v12, $v12, $v10
vmudm $v9, $v9, $v1[4]
vmudm $v10, $v10, $v1[4]
vxor $v16, $v16, $v2[0]
vxor $v17, $v17, $v2[1]
lqv $v20[0], 0x10(r16)
lqv $v21[0], 0x10(r17)
vadd $v18, $v18, $v16
vadd $v19, $v19, $v17
vmudm $v16, $v16, $v1[5]
vmudm $v17, $v17, $v1[5]
sqv $v11[0], 0x0(r14)
bne $10, $0, @audio_4001a34
sqv $v12[0], 0x0(r15)
vadd $v13, $v13, $v9
vadd $v14, $v14, $v10
sqv $v18[0], 0x10(r14)
sqv $v19[0], 0x10(r15)
vadd $v20, $v20, $v16
vadd $v21, $v21, $v17
@audio_40019fc:
addi $14, $14, 0x20
sqv $v13[0], 0x0(r16)
sqv $v14[0], 0x0(r17)
addi $15, $15, 0x20
lqv $v8[0], 0x0(r19)
sqv $v20[0], 0x10(r16)
sqv $v21[0], 0x10(r17)
addi $16, $16, 0x20
vaddc $v1, $v1, $v4
addi $17, $17, 0x20
bgtz $20, @audio_400196c
vadd $v0, $v0, $v0
j cmd_SPNOOP
vxor $v0, $v0, $v0
@audio_4001a34:
vadd $v13, $v13, $v10
vadd $v14, $v14, $v9
sqv $v18[0], 0x10(r14)
sqv $v19[0], 0x10(r15)
vadd $v20, $v20, $v17
j @audio_40019fc
vadd $v21, $v21, $v16
cmd_ENVSETUP1:
vxor $v1, $v1, $v1
andi $11, $26, 0xffff
srl $12, $26, 8
andi $12, $12, 0xff00
mtc2 $12, $v1[8]
add $12, $12, $11
mtc2 $12, $v1[10]
srl $21, $25, 16
j cmd_SPNOOP
andi $22, $25, 0xffff
cmd_ENVSETUP2:
srl $12, $25, 16
mtc2 $12, $v1[0]
add $12, $12, $21
mtc2 $12, $v1[2]
andi $12, $25, 0xffff
mtc2 $12, $v1[4]
add $12, $12, $22
j cmd_SPNOOP
mtc2 $12, $v1[6]
@audio_4001a9c:
srl $3, $26, 12
andi $3, $3, 0xff0
andi $1, $26, 0xffff
@audio_4001aa8:
sll $2, $25, 8
jr $31
srl $2, $2, 8
cmd_LOADBUFF:
jal @audio_4001a9c
nop
jal dma_read_start
addi $3, $3, 0xffff
@audio_4001ac4:
mfc0 $1, sp_dma_busy
bne $1, $0, @audio_4001ac4
nop
j cmd_SPNOOP
mtc0 $0, sp_semaphore
cmd_SAVEBUFF:
jal @audio_4001a9c
nop
jal dma_write_start
addi $3, $3, 0xffff
j @audio_4001ac4
nop
cmd_LOADADPCM:
jal @audio_4001aa8
addi $1, $0, adpcmTable
andi $3, $26, 0xffff
jal dma_read_start
addi $3, $3, 0xffff
j @audio_4001ac4
nop
cmd_MIXER:
lqv $v31[0], 0x0(r0)
srl $18, $26, 12
andi $18, $18, 0xff0
andi $19, $25, 0xffff
srl $20, $25, 16
andi $17, $26, 0xffff
mtc2 $17, $v30[0]
lqv $v27[0], 0x0(r19)
lqv $v29[0], 0x0(r20)
lqv $v26[0], 0x10(r19)
lqv $v28[0], 0x10(r20)
@audio_4001b38:
vmulf $v27, $v27, $v31[6]
addi $18, $18, 0xffe0
vmacf $v27, $v29, $v30[0]
addi $20, $20, 0x20
vmulf $v26, $v26, $v31[6]
vmacf $v26, $v28, $v30[0]
lqv $v29[0], 0x0(r20)
sqv $v27[0], 0x0(r19)
lqv $v27[0], 0x20(r19)
lqv $v28[0], 0x10(r20)
sqv $v26[0], 0x10(r19)
addi $19, $19, 0x20
bgtz $18, @audio_4001b38
lqv $v26[0], 0x10(r19)
j cmd_SPNOOP
nop
cmd_S8DEC:
lhu $13, (audio_in_buf)(r24)
vxor $v2, $v2, $v2
lhu $14, (audio_out_buf)(r24)
vxor $v3, $v3, $v3
lhu $12, (audio_count)(r24)
sll $17, $25, 8
srl $17, $17, 8 // state addr
sqv $v2[0], 0x0(r14) // store 0 to first 16 samples if A_INIT
sqv $v3[0], 0x10(r14)
srl $1, $26, 16
andi $1, $1, 0x1
bgtz $1, @audio_4001bd8 // A_INIT
srl $1, $26, 16
andi $1, $1, 0x2
beq $0, $1, @audio_4001bbc // A_LOOP
addi $2, $17, 0x0
lw $2, (audio_loop_value)(r24)
@audio_4001bbc:
addi $1, $14, 0x0
jal dma_read_start
addi $3, $0, 0x1f
@audio_4001bc8:
mfc0 $5, sp_dma_busy
bne $5, $0, @audio_4001bc8
nop
mtc0 $0, sp_semaphore
@audio_4001bd8:
addi $14, $14, 0x20
beq $12, $0, @audio_4001c04 // this of very few ops allows count=0
nop
@audio_4001be4:
lpv $v2[0], 0x0(r13) // load each byte to upper 8 bits per elem
lpv $v3[0], 0x8(r13)
addi $13, $13, 0x10
addi $12, $12, 0xffe0
sqv $v2[0], 0x0(r14)
sqv $v3[0], 0x10(r14)
bgtz $12, @audio_4001be4
addi $14, $14, 0x20
@audio_4001c04:
addi $1, $14, 0xffe0 // write last 16 samples to the state
addi $2, $17, 0x0
jal dma_write_start
addi $3, $0, 0x1f
@audio_4001c14:
mfc0 $5, sp_dma_busy
bne $5, $0, @audio_4001c14
nop
j cmd_SPNOOP
mtc0 $0, sp_semaphore
cmd_HILOGAIN:
andi $12, $26, 0xffff
srl $13, $25, 16
srl $15, $26, 4
andi $15, $15, 0xf000
mtc2 $15, $v3[2]
srl $15, $26, 20
andi $15, $15, 0xf
mtc2 $15, $v3[0]
@audio_4001c48:
lqv $v1[0], 0x0(r13)
lqv $v2[0], 0x10(r13)
vmudm $v4, $v1, $v3[1]
vmadh $v4, $v1, $v3[0]
vmudm $v5, $v2, $v3[1]
vmadh $v5, $v2, $v3[0]
sqv $v4[0], 0x0(r13)
sqv $v5[0], 0x10(r13)
addi $12, $12, 0xffe0
bgtz $12, @audio_4001c48
addi $13, $13, 0x20
j cmd_SPNOOP
vxor $v0, $v0, $v0
cmd_1c7c:
andi $12, $26, 0xffff
srl $13, $25, 16
addi $14, $13, 0x0
andi $15, $25, 0xffff
srl $11, $26, 16
andi $11, $11, 0xff
add $15, $15, $11
ldv $v11[0], 0x0(r15)
ldv $v12[0], 0x10(r15)
ldv $v13[0], 0x20(r15)
ldv $v14[0], 0x30(r15)
ldv $v11[8], 0x8(r15)
ldv $v12[8], 0x18(r15)
ldv $v13[8], 0x28(r15)
ldv $v14[8], 0x38(r15)
@audio_4001cb8:
lqv $v3[0], 0x0(r13)
lqv $v4[0], 0x10(r13)
lqv $v5[0], 0x20(r13)
lqv $v6[0], 0x30(r13)
vmudh $v3, $v3, $v11
vmudh $v4, $v4, $v12
vmudh $v5, $v5, $v13
vmudh $v6, $v6, $v14
sqv $v3[0], 0x0(r13)
sqv $v4[0], 0x10(r13)
sqv $v5[0], 0x20(r13)
sqv $v6[0], 0x30(r13)
addi $12, $12, 0xffc0
bgtz $12, @audio_4001cb8
addi $13, $13, 0x40
j cmd_SPNOOP
nop
cmd_FILTER:
addi $13, $23, 0x0
vxor $v0, $v0, $v0
addi $14, $23, 0x10
sqv $v0[0], 0x0(r13)
sll $2, $25, 8
srl $2, $2, 8
srl $12, $26, 16
andi $12, $12, 0xff
beq $12, $0, @audio_4001d68
nop
addi $12, $12, 0xffff
beq $12, $0, @audio_4001d88
nop
andi $15, $26, 0xffff
vxor $v0, $v0, $v0
sqv $v0[0], 0x0(r14)
sqv $v0[0], 0x20(r14)
addi $1, $14, 0x10
addi $3, $0, 0xf
jal dma_read_start
nop
mfc0 $5, sp_dma_busy
bne $5, $0, 0x4001d50
nop
mtc0 $0, sp_semaphore
j cmd_SPNOOP
nop
@audio_4001d68:
add $1, $13, $0
addi $3, $0, 0xf
jal dma_read_start
nop
@audio_4001d78:
mfc0 $5, sp_dma_busy
bne $5, $0, 0x4001d78
nop
mtc0 $0, sp_semaphore
@audio_4001d88:
add $1, $13, $0
andi $11, $26, 0xffff
lqv $v24[0], 0x10(r14)
ldv $v28[0], 0x8(r14)
ldv $v28[8], 0x10(r14)
ldv $v20[0], 0x18(r14)
ldv $v20[8], 0x20(r14)
addi $14, $14, 0x2
ldv $v31[0], 0x0(r14)
ldv $v31[8], 0x8(r14)
ldv $v17[0], 0x10(r14)
ldv $v17[8], 0x18(r14)
ldv $v27[0], 0x8(r14)
ldv $v27[8], 0x10(r14)
ldv $v21[0], 0x18(r14)
ldv $v21[8], 0x20(r14)
addi $14, $14, 0x2
ldv $v30[0], 0x0(r14)
ldv $v30[8], 0x8(r14)
ldv $v26[0], 0x8(r14)
ldv $v26[8], 0x10(r14)
ldv $v18[0], 0x10(r14)
ldv $v18[8], 0x18(r14)
ldv $v22[0], 0x18(r14)
ldv $v22[8], 0x20(r14)
addi $14, $14, 0x2
ldv $v29[0], 0x0(r14)
ldv $v29[8], 0x8(r14)
ldv $v25[0], 0x8(r14)
ldv $v25[8], 0x10(r14)
ldv $v19[0], 0x10(r14)
ldv $v19[8], 0x18(r14)
ldv $v23[0], 0x18(r14)
ldv $v23[8], 0x20(r14)
lqv $v15[0], 0x0(r13)
@audio_4001e14:
lqv $v16[0], 0x0(r11)
vxor $v14, $v14, $v14
vmulf $v0, $v0, $v0
vmacf $v14, $v23, $v15[1]
vmacf $v14, $v22, $v15[2]
vmacf $v14, $v21, $v15[3]
vmacf $v14, $v20, $v15[4]
vmacf $v14, $v19, $v15[5]
vmacf $v14, $v18, $v15[6]
vmacf $v14, $v17, $v15[7]
vmacf $v14, $v24, $v16[0]
vmacf $v14, $v25, $v16[1]
vmacf $v14, $v26, $v16[2]
vmacf $v14, $v27, $v16[3]
vmacf $v14, $v28, $v16[4]
vmacf $v14, $v29, $v16[5]
vmacf $v14, $v30, $v16[6]
vmacf $v14, $v31, $v16[7]
addi $15, $15, 0xfff0
sqv $v14[0], 0x0(r11)
addi $11, $11, 0x10
bgtz $15, @audio_4001e14
vaddc $v15, $v0, $v16
sqv $v16[0], 0x0(r13)
addi $3, $0, 0xf
jal dma_write_start
nop
@audio_4001e80:
mfc0 $5, sp_dma_busy
bne $5, $0, @audio_4001e80
nop
mtc0 $0, sp_semaphore
j cmd_SPNOOP
nop
cmd_ADDMIXER:
vaddc $v31, $v31, $v31
srl $18, $26, 12
andi $18, $18, 0xff0
andi $19, $25, 0xffff
srl $20, $25, 16
lqv $v27[0], 0x0(r19)
@audio_4001eb0:
lqv $v29[0], 0x0(r20)
lqv $v26[0], 0x10(r19)
lqv $v28[0], 0x10(r20)
lqv $v25[0], 0x20(r19)
lqv $v23[0], 0x20(r20)
lqv $v24[0], 0x30(r19)
lqv $v22[0], 0x30(r20)
addi $20, $20, 0x40
vadd $v27, $v27, $v29
vadd $v26, $v26, $v28
vadd $v25, $v25, $v23
vadd $v24, $v24, $v22
addi $18, $18, 0xffc0
sqv $v27[0], 0x0(r19)
sqv $v26[0], 0x10(r19)
sqv $v25[0], 0x20(r19)
sqv $v24[0], 0x30(r19)
addi $19, $19, 0x40
bgtz $18, @audio_4001eb0
lqv $v27[0], 0x0(r19)
j cmd_SPNOOP
nop
cmd_RESAMPLE_ZOH:
lh $14, 0x0(r24)
lh $15, 0x2(r24)
lh $13, 0x4(r24)
andi $12, $26, 0xffff
sll $12, $12, 2
andi $10, $25, 0xffff
sll $14, $14, 16
or $10, $10, $14
@audio_4001f28:
srl $11, $10, 16
andi $11, $11, 0xfffe
lsv $v1[0], 0x0(r11)
add $10, $10, $12
srl $11, $10, 16
andi $11, $11, 0xfffe
lsv $v1[2], 0x0(r11)
add $10, $10, $12
srl $11, $10, 16
andi $11, $11, 0xfffe
lsv $v1[4], 0x0(r11)
add $10, $10, $12
srl $11, $10, 16
andi $11, $11, 0xfffe
lsv $v1[6], 0x0(r11)
add $10, $10, $12
addi $13, $13, 0xfff8
sdv $v1[0], 0x0(r15)
addi $15, $15, 0x8
bgtz $13, @audio_4001f28
nop
jal cmd_SPNOOP
nop
.endif
.close // CODE_FILE