sm64/rsp/audio.s

1903 lines
48 KiB
ArmAsm
Raw Normal View History

2020-06-02 12:44:34 -04:00
.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
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH
.definelabel VERSION_SH_CN, 1
.elseifdef VERSION_CN
.definelabel VERSION_SH_CN, 1
.endif
2020-06-02 12:44:34 -04:00
.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
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
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
2021-07-12 23:17:54 -04:00
jumpTableEntry cmd_DMEMMOVE2
jumpTableEntry cmd_DOWNSAMPLE_HALF
2020-12-03 14:26:38 -05:00
jumpTableEntry cmd_ENVSETUP1
jumpTableEntry cmd_ENVMIXER
jumpTableEntry cmd_LOADBUFF
jumpTableEntry cmd_SAVEBUFF
jumpTableEntry cmd_ENVSETUP2
2021-07-12 23:17:54 -04:00
jumpTableEntry cmd_S8DEC
2020-12-03 14:26:38 -05:00
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
2020-06-02 12:44:34 -04:00
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
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
.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
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
.dh 0x0000, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
.dh 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
.endif
2020-06-02 12:44:34 -04:00
.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
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
.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
2020-06-02 12:44:34 -04:00
.definelabel segmentTable, 0x320
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
.definelabel audioStruct, 0x320
.else
2020-06-02 12:44:34 -04:00
.definelabel audioStruct, 0x360
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
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
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
.definelabel audio_rate_lo_right, 0x04 // 0x37a
.else
.definelabel audio_rate_lo_right, 0x1a // 0x37a
.endif
2020-06-02 12:44:34 -04:00
audio_dry_gain equ 0x1c // 0x37c
audio_wet_gain equ 0x1e // 0x37e
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
.definelabel nextTaskEntry, 0x340
.definelabel adpcmTable, 0x3c0
.else
2020-06-02 12:44:34 -04:00
.definelabel nextTaskEntry, 0x380 // next task entries (0x140 bytes)
.definelabel adpcmTable, 0x4c0 // (16*8 16-bit entries)
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
.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
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
addi $2, $zero, 0x000f
addi $1, $zero, segmentTable
@@audio_040010c8:
sw $zero, 0x00($1)
bgtz $2, @@audio_040010c8
addi $2, $2, -1
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
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
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
addi $4, $3, -0x80
.else
2020-06-02 12:44:34 -04:00
addi $4, $3, -0x0140
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
blez $4, @@audio_0400116c
addi $1, $zero, nextTaskEntry
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
addi $3, $zero, 0x80
.else
2020-06-02 12:44:34 -04:00
addi $3, $zero, 0x0140
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
@@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
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
addi $4, $zero, dmemBase
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
andi $2, $26, 0xffff
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
add $2, $2, $4
2020-12-03 14:26:38 -05:00
.endif
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
vxor $v0, $v0, $v0
.else
2020-06-02 12:44:34 -04:00
vxor $v1, $v1, $v1
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
addi $3, $3, -0x10
@@audio_040011f8:
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
sdv $v0[0], 0x0($2)
sdv $v0[0], 0x8($2)
.else
2020-06-02 12:44:34 -04:00
sdv $v1[0], 0x0($2)
sdv $v1[0], 0x8($2)
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
addi $2, $2, 0x10
bgtz $3, @@audio_040011f8
addi $3, $3, -0x10
j cmd_SPNOOP
nop
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
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
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
cmd_SEGMENT:
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
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)
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
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)
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
cmd_SETBUFF:
srl $2, $25, 16
sh $26, 0($24)
sh $2, 2($24)
.else
2020-06-02 12:44:34 -04:00
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)
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
j cmd_SPNOOP
sh $25, (audio_rate_lo_right)($24)
cmd_INTERLEAVE:
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
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
2020-06-02 12:44:34 -04:00
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
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
bgtz $1, @@audio_040013a8
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
ssv $v2[6], 0xFE($a0)
.else
2020-06-02 12:44:34 -04:00
addi $4, $4, 0x20
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
j cmd_SPNOOP
nop
cmd_DMEMMOVE:
andi $1, $25, 0xffff
beqz $1, cmd_SPNOOP
andi $2, $26, 0xffff
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
addi $2, $2, dmemBase
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
srl $3, $25, 16
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
addi $3, $3, dmemBase
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
@@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
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
srl $3, $25, 24
sll $3, $3, 2
lw $2, (segmentTable)($3)
add $1, $1, $2
sw $1, (audio_loop_value)($24)
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
j cmd_SPNOOP
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
sw $at, 0x10($t8)
.else
2020-06-02 12:44:34 -04:00
nop
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
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
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
lui $1, 0x00ff
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
vxor $v16, $v16, $v16
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
sll $s1, $t9, 8
.else
2020-06-02 12:44:34 -04:00
ori $1, $1, 0xffff
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
vxor $v17, $v17, $v17
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
and $17, $25, $1
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
vxor $v18, $v18, $v18
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
srl $s1, $s1, 8
.else
2020-06-02 12:44:34 -04:00
srl $2, $25, 24
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
vxor $v19, $v19, $v19
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
sll $2, $2, 2
lw $3, (segmentTable)($2)
add $17, $17, $3 // last frame addr
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
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:
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
addi $16, $zero, 0x0050
.else
2020-06-02 12:44:34 -04:00
addi $16, $zero, 0x0030
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
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
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
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
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
@@dma_read_busy:
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
mfc0 $5, SP_DMA_BUSY
bnez $5, @@dma_read_busy
nop
mtc0 $zero, SP_SEMAPHORE
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
@@audio_040017a0:
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
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)
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
@@audio_04001800:
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
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
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
@@dma_write_busy:
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
mfc0 $5, SP_DMA_BUSY
bnez $5, @@dma_write_busy
nop
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
@@audio_04001874:
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
j cmd_SPNOOP
mtc0 $zero, SP_SEMAPHORE
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
cmd_RESAMPLE:
lh $8, (audio_in_buf)($24)
lh $19, (audio_out_buf)($24)
lh $18, (audio_count)($24)
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
sll $v0, $t9, 8
srl $v0, $v0, 8
.else
2020-06-02 12:44:34 -04:00
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
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
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
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
ldv $v16[0], 0x00($23)
addi $t0, $t0, -4
ssv $v16[0], 0x00($t0)
ssv $v16[4], 0x02($t0)
j @@audio_c410c
nop
.else
2020-06-02 12:44:34 -04:00
nop
lh $11, 0x0a($23)
lqv $v3[0], 0x10($23)
sdv $v3[0], -0x10($8)
sdv $v3[8], -0x08($8)
sub $8, $8, $11
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
@@audio_04001908:
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
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
2020-06-02 12:44:34 -04:00
addi $8, $8, -8
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2021-07-12 23:17:54 -04:00
sdv $v16[0], 0x00($8)
2020-12-03 14:26:38 -05:00
.endif
@@audio_c410c:
2020-06-02 12:44:34 -04:00
lsv $v23[14], 0x08($23) // saved pitch_accumulator
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2021-07-12 23:17:54 -04:00
ldv $v16[0], 0x00($8)
2020-12-03 14:26:38 -05:00
.else
2020-06-02 12:44:34 -04:00
ldv $v16[0], 0x00($23) // saved next 4 unprocessed samples
sdv $v16[0], 0x00($8) // store them before the input samples
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
mtc2 $8, $v18[4]
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
addi $10, $zero, 0x100
.else
2020-06-02 12:44:34 -04:00
addi $10, $zero, 0xc0
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
mtc2 $10, $v18[6]
mtc2 $26, $v18[8] // pitch
addi $10, $zero, 0x40
mtc2 $10, $v18[10]
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
addi $9, $zero, 0x60
.else
2020-06-02 12:44:34 -04:00
addi $9, $zero, data0040
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
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)
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
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
2020-12-03 14:26:38 -05:00
addi $7, $zero, 0x10
2020-06-02 12:44:34 -04:00
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)
2020-12-03 14:26:38 -05:00
.endif
2020-06-02 12:44:34 -04:00
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
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2021-07-12 23:17:54 -04:00
cmd_DMEMMOVE2:
srl $t7, $k0, 16
2020-12-03 14:26:38 -05:00
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
2021-07-12 23:17:54 -04:00
cmd_DOWNSAMPLE_HALF:
2020-12-03 14:26:38 -05:00
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
2023-08-17 08:56:02 -04:00
.ifndef VERSION_SH_CN
2020-06-02 12:44:34 -04:00
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
2020-12-03 14:26:38 -05:00
.endif
2023-08-17 08:56:02 -04:00
.ifdef VERSION_SH_CN
2020-12-03 14:26:38 -05:00
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
2021-07-12 23:17:54 -04:00
cmd_S8DEC:
lhu $13, (audio_in_buf)(r24)
2020-12-03 14:26:38 -05:00
vxor $v2, $v2, $v2
2021-07-12 23:17:54 -04:00
lhu $14, (audio_out_buf)(r24)
2020-12-03 14:26:38 -05:00
vxor $v3, $v3, $v3
2021-07-12 23:17:54 -04:00
lhu $12, (audio_count)(r24)
2020-12-03 14:26:38 -05:00
sll $17, $25, 8
2021-07-12 23:17:54 -04:00
srl $17, $17, 8 // state addr
sqv $v2[0], 0x0(r14) // store 0 to first 16 samples if A_INIT
2020-12-03 14:26:38 -05:00
sqv $v3[0], 0x10(r14)
srl $1, $26, 16
andi $1, $1, 0x1
2021-07-12 23:17:54 -04:00
bgtz $1, @audio_4001bd8 // A_INIT
2020-12-03 14:26:38 -05:00
srl $1, $26, 16
andi $1, $1, 0x2
2021-07-12 23:17:54 -04:00
beq $0, $1, @audio_4001bbc // A_LOOP
2020-12-03 14:26:38 -05:00
addi $2, $17, 0x0
2021-07-12 23:17:54 -04:00
lw $2, (audio_loop_value)(r24)
2020-12-03 14:26:38 -05:00
@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
2021-07-12 23:17:54 -04:00
beq $12, $0, @audio_4001c04 // this of very few ops allows count=0
2020-12-03 14:26:38 -05:00
nop
@audio_4001be4:
2021-07-12 23:17:54 -04:00
lpv $v2[0], 0x0(r13) // load each byte to upper 8 bits per elem
2020-12-03 14:26:38 -05:00
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:
2021-07-12 23:17:54 -04:00
addi $1, $14, 0xffe0 // write last 16 samples to the state
2020-12-03 14:26:38 -05:00
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
2020-06-02 12:44:34 -04:00
.close // CODE_FILE