/*
#     ___  _ _      ___
#    |    | | |    |
# ___|    |   | ___|    PS2DEV Open Source Project.
#----------------------------------------------------------
# (c) 2006 Eugene Plotnikov <e-plotnikov@operamail.com>
# Licenced under Academic Free License version 2.0
# Review ps2sdk README & LICENSE files for further details.
#
*/
.set noreorder
.set nomacro
.set noat

.globl MP123_CoreInit
.globl MP123_IMDCT36
.globl MP123_IMDCT12
.globl MP123_Synth

.sdata
.align 4
s_Cos64:    .word   0x3F002785, 0x3F01668B, 0x3F03F45B, 0x3F07F268
            .word   0x3F0D9838, 0x3F153B3A, 0x3F1F5C6E, 0x3F2CC03D
            .word   0x3F3E99EE, 0x3F56DF9E, 0x3F78FA3B, 0x3F95B035
            .word   0x3FBDF91B, 0x4003B2AF, 0x405A1642, 0x41230A46
            .word   0x3F009E8D, 0x3F05C278, 0x3F11233F, 0x3F25961D
            .word   0x3F49C480, 0x3F87C449, 0x3FDC7926, 0x40A33C9C
            .word   0x3F0281F7, 0x3F19F1BD, 0x3F6664D7, 0x402406CF
            .word   0x3F0A8BD4, 0x3FA73D75, 0x3F3504F3, 0x00000000
s_Cos36:    .float  0.866025,  0.939693, -0.173648,  -0.766044
            .float  0.500000,  0.984808, -0.342020,  -0.642788
            .float  0.501910,  0.517638,  0.551689,   0.610387
            .float  0.707107,  0.871723,  1.183100,   1.931850
            .float  5.736860,  0.000000,  0.000000,   0.000000
s_Cos12:    .float  0.866025,  0.866025,  0.866025,   0.000000
            .float  0.707107,  0.707107,  0.707107,   0.000000
            .float  0.500000,  0.500000,  0.500000,   0.000000
            .float  0.517638,  0.517638,  0.517638,   0.000000
            .float  1.931850,  1.931850,  1.931850,   0.000000
s_DecWin:   .word   0x80000000, 0x41680000, 0xC2D50000, 0x43658000
            .word   0xC47EA000, 0x45210800, 0xC54D7000, 0x46927100
            .word   0xC7128F00, 0xC6927100, 0xC54D7000, 0xC5210800
            .word   0xC47EA000, 0xC3658000, 0xC2D50000, 0xC1680000
            .word   0x80000000, 0x41680000, 0xC2D50000, 0x43658000
            .word   0xC47EA000, 0x45210800, 0xC54D7000, 0x46927100
            .word   0xC7128F00, 0xC6927100, 0xC54D7000, 0xC5210800
            .word   0xC47EA000, 0xC3658000, 0xC2D50000, 0xC1680000
            .word   0x3F000000, 0x41780000, 0xC2DA0000, 0x4381C000
            .word   0xC47A0000, 0x452C6800, 0xC53A3800, 0x4699A800
            .word   0xC7127800, 0xC68B3800, 0xC55EF000, 0xC515A000
            .word   0xC480F000, 0xC3488000, 0xC2D00000, 0xC1500000
            .word   0x3F000000, 0x41780000, 0xC2DA0000, 0x4381C000
            .word   0xC47A0000, 0x452C6800, 0xC53A3800, 0x4699A800
            .word   0xC7127800, 0xC68B3800, 0xC55EF000, 0xC515A000
            .word   0xC480F000, 0xC3488000, 0xC2D00000, 0xC1500000
            .word   0x3F000000, 0x418C0000, 0xC2DE0000, 0x43914000
            .word   0xC4740000, 0x4537B800, 0xC5254000, 0x46A0D800
            .word   0xC7123400, 0xC683FF00, 0xC56EC000, 0xC50A4800
            .word   0xC4820000, 0xC32D8000, 0xC2CA0000, 0xC1400000
            .word   0x3F000000, 0x418C0000, 0xC2DE0000, 0x43914000
            .word   0xC4740000, 0x4537B800, 0xC5254000, 0x46A0D800
            .word   0xC7123400, 0xC683FF00, 0xC56EC000, 0xC50A4800
            .word   0xC4820000, 0xC32D8000, 0xC2CA0000, 0xC1400000
            .word   0x3F000000, 0x41980000, 0xC2E10000, 0x43A14000
            .word   0xC46CA000, 0x4542E800, 0xC50E8800, 0x46A7FE00
            .word   0xC711C300, 0xC6799600, 0xC57CE000, 0xC4FDF000
            .word   0xC4827000, 0xC3130000, 0xC2C40000, 0xC1280000
            .word   0x3F000000, 0x41980000, 0xC2E10000, 0x43A14000
            .word   0xC46CA000, 0x4542E800, 0xC50E8800, 0x46A7FE00
            .word   0xC711C300, 0xC6799600, 0xC57CE000, 0xC4FDF000
            .word   0xC4827000, 0xC3130000, 0xC2C40000, 0xC1280000
            .word   0x3F000000, 0x41A40000, 0xC2E30000, 0x43B1C000
            .word   0xC463C000, 0x454DE800, 0xC4EC0000, 0x46AF1500
            .word   0xC7112480, 0xC66B4000, 0xC584B000, 0xC4E79000
            .word   0xC4825000, 0xC2F40000, 0xC2BE0000, 0xC1180000
            .word   0x3F000000, 0x41A40000, 0xC2E30000, 0x43B1C000
            .word   0xC463C000, 0x454DE800, 0xC4EC0000, 0x46AF1500
            .word   0xC7112480, 0xC66B4000, 0xC584B000, 0xC4E79000
            .word   0xC4825000, 0xC2F40000, 0xC2BE0000, 0xC1180000
            .word   0x3F000000, 0x41B40000, 0xC2E40000, 0x43C2C000
            .word   0xC4596000, 0x4558B800, 0xC4B77000, 0x46B61900
            .word   0xC7105A00, 0xC65D0200, 0xC58A2000, 0xC4D17000
            .word   0xC481B000, 0xC2C50000, 0xC2B70000, 0xC1080000
            .word   0x3F000000, 0x41B40000, 0xC2E40000, 0x43C2C000
            .word   0xC4596000, 0x4558B800, 0xC4B77000, 0x46B61900
            .word   0xC7105A00, 0xC65D0200, 0xC58A2000, 0xC4D17000
            .word   0xC481B000, 0xC2C50000, 0xC2B70000, 0xC1080000
            .word   0x3F000000, 0x41C40000, 0xC2E40000, 0x43D40000
            .word   0xC44D8000, 0x45633800, 0xC47EA000, 0x46BD0600
            .word   0xC70F6380, 0xC64EE400, 0xC58ECC00, 0xC4BBC000
            .word   0xC4809000, 0xC2990000, 0xC2B00000, 0xC1000000
            .word   0x3F000000, 0x41C40000, 0xC2E40000, 0x43D40000
            .word   0xC44D8000, 0x45633800, 0xC47EA000, 0x46BD0600
            .word   0xC70F6380, 0xC64EE400, 0xC58ECC00, 0xC4BBC000
            .word   0xC4809000, 0xC2990000, 0xC2B00000, 0xC1000000
            .word   0x3F800000, 0x41D40000, 0xC2E30000, 0x43E5C000
            .word   0xC43FE000, 0x456D6800, 0xC4074000, 0x46C3D900
            .word   0xC70E4180, 0xC640EC00, 0xC592B400, 0xC4A67000
            .word   0xC47E0000, 0xC25E0000, 0xC2A90000, 0xC0E00000
            .word   0x3F800000, 0x41D40000, 0xC2E30000, 0x43E5C000
            .word   0xC43FE000, 0x456D6800, 0xC4074000, 0x46C3D900
            .word   0xC70E4180, 0xC640EC00, 0xC592B400, 0xC4A67000
            .word   0xC47E0000, 0xC25E0000, 0xC2A90000, 0xC0E00000
            .word   0x3F800000, 0x41E80000, 0xC2E00000, 0x43F7C000
            .word   0xC430C000, 0x45773000, 0xC20C0000, 0x46CA8D00
            .word   0xC70CF480, 0xC6332200, 0xC595E000, 0xC491A000
            .word   0xC47A2000, 0xC2100000, 0xC2A10000, 0xC0D00000
            .word   0x3F800000, 0x41E80000, 0xC2E00000, 0x43F7C000
            .word   0xC430C000, 0x45773000, 0xC20C0000, 0x46CA8D00
            .word   0xC70CF480, 0xC6332200, 0xC595E000, 0xC491A000
            .word   0xC47A2000, 0xC2100000, 0xC2A10000, 0xC0D00000
            .word   0x3F800000, 0x41FC0000, 0xC2DD0000, 0x44050000
            .word   0xC4200000, 0x45804400, 0x43F98000, 0x46D11E00
            .word   0xC70B7E00, 0xC6258A00, 0xC5985800, 0xC47AC000
            .word   0xC4754000, 0xC1900000, 0xC29A0000, 0xC0B00000
            .word   0x3F800000, 0x41FC0000, 0xC2DD0000, 0x44050000
            .word   0xC4200000, 0x45804400, 0x43F98000, 0x46D11E00
            .word   0xC70B7E00, 0xC6258A00, 0xC5985800, 0xC47AC000
            .word   0xC4754000, 0xC1900000, 0xC29A0000, 0xC0B00000
            .word   0x3F800000, 0x42080000, 0xC2D70000, 0x440E2000
            .word   0xC40D6000, 0x4584AC00, 0x4484A000, 0x46D78A00
            .word   0xC709DF00, 0xC6182C00, 0xC59A1C00, 0xC4538000
            .word   0xC46FE000, 0xBF800000, 0xC2930000, 0xC0A00000
            .word   0x3F800000, 0x42080000, 0xC2D70000, 0x440E2000
            .word   0xC40D6000, 0x4584AC00, 0x4484A000, 0x46D78A00
            .word   0xC709DF00, 0xC6182C00, 0xC59A1C00, 0xC4538000
            .word   0xC46FE000, 0xBF800000, 0xC2930000, 0xC0A00000
            .word   0x3FC00000, 0x42120000, 0xC2D00000, 0x44174000
            .word   0xC3F28000, 0x4588CC00, 0x44CE4000, 0x46DDCA00
            .word   0xC7081780, 0xC60B0E00, 0xC59B3C00, 0xC42D8000
            .word   0xC469C000, 0x41680000, 0xC28B0000, 0xC0900000
            .word   0x3FC00000, 0x42120000, 0xC2D00000, 0x44174000
            .word   0xC3F28000, 0x4588CC00, 0x44CE4000, 0x46DDCA00
            .word   0xC7081780, 0xC60B0E00, 0xC59B3C00, 0xC42D8000
            .word   0xC469C000, 0x41680000, 0xC28B0000, 0xC0900000
            .word   0x3FC00000, 0x421E0000, 0xC2C80000, 0x44206000
            .word   0xC3C68000, 0x458C9800, 0x450DA800, 0x46E3DD00
            .word   0xC7062A00, 0xC5FC6C00, 0xC59BB800, 0xC408E000
            .word   0xC4632000, 0x41E40000, 0xC2840000, 0xC0800000
            .word   0x3FC00000, 0x421E0000, 0xC2C80000, 0x44206000
            .word   0xC3C68000, 0x458C9800, 0x450DA800, 0x46E3DD00
            .word   0xC7062A00, 0xC5FC6C00, 0xC59BB800, 0xC408E000
            .word   0xC4632000, 0x41E40000, 0xC2840000, 0xC0800000
            .word   0x40000000, 0x422A0000, 0xC2BD0000, 0x44298000
            .word   0xC3974000, 0x45900C00, 0x4535D000, 0x46E9BE00
            .word   0xC7041680, 0xC5E35000, 0xC59B9C00, 0xC3CB8000
            .word   0xC45BE000, 0x42260000, 0xC27A0000, 0xC0600000
            .word   0x40000000, 0x422A0000, 0xC2BD0000, 0x44298000
            .word   0xC3974000, 0x45900C00, 0x4535D000, 0x46E9BE00
            .word   0xC7041680, 0xC5E35000, 0xC59B9C00, 0xC3CB8000
            .word   0xC45BE000, 0x42260000, 0xC27A0000, 0xC0600000
            .word   0x40000000, 0x42360000, 0xC2B10000, 0x44328000
            .word   0xC3490000, 0x45932000, 0x455F9000, 0x46EF6900
            .word   0xC701DF00, 0xC5CAD000, 0xC59AF000, 0xC3884000
            .word   0xC4544000, 0x42540000, 0xC26A0000, 0xC0600000
            .word   0x40000000, 0x42360000, 0xC2B10000, 0x44328000
            .word   0xC3490000, 0x45932000, 0x455F9000, 0x46EF6900
            .word   0xC701DF00, 0xC5CAD000, 0xC59AF000, 0xC3884000
            .word   0xC4544000, 0x42540000, 0xC26A0000, 0xC0600000
            .word   0x40200000, 0x42420000, 0xC2A30000, 0x443B4000
            .word   0xC2B90000, 0x4595C400, 0x45857000, 0x46F4DC00
            .word   0xC6FF0A00, 0xC5B2FC00, 0xC599B800, 0xC3100000
            .word   0xC44C4000, 0x427E0000, 0xC25E0000, 0xC0400000
            .word   0x40200000, 0x42420000, 0xC2A30000, 0x443B4000
            .word   0xC2B90000, 0x4595C400, 0x45857000, 0x46F4DC00
            .word   0xC6FF0A00, 0xC5B2FC00, 0xC599B800, 0xC3100000
            .word   0xC44C4000, 0x427E0000, 0xC25E0000, 0xC0400000
            .word   0x40200000, 0x42500000, 0xC2920000, 0x4443E000
            .word   0x41B40000, 0x4597FC00, 0x459BDC00, 0x46FA1300
            .word   0xC6FA1300, 0xC59BDC00, 0xC597FC00, 0xC1B40000
            .word   0xC443E000, 0x42920000, 0xC2500000, 0xC0200000
            .word   0x40200000, 0x42500000, 0xC2920000, 0x4443E000
            .word   0x41B40000, 0x4597FC00, 0x459BDC00, 0x46FA1300
            .word   0xC6FA1300, 0xC59BDC00, 0xC597FC00, 0xC1B40000
            .word   0xC443E000, 0x42920000, 0xC2500000, 0xC0200000

.section ".sbss"
.align 4
s_SynthBuf: .space  4352
s_Offset  : .space  4

.text

MP123_CoreInit:
    sw      $zero, s_Offset
    la      $a0, s_SynthBuf
    addu    $a1, $zero, $zero
    j       memset
    addiu   $a2, $zero, 4352

MP123_IMDCT36:
    addiu   $sp, $sp, -16
    sd      $s0, 0($sp)
    sd      $s1, 8($sp)
    pref    0, 0($a0)
    la      $at, s_Cos36
    pref    0, 0($at)
    ld      $t1,  0($a0)
    ld      $t2,  8($a0)
    ld      $t3, 16($a0)
    ld      $t4, 24($a0)
    pcpyld  $t1, $t2, $t1
    pcpyld  $t3, $t4, $t3
    ld      $t2, 32($a0)
    ld      $t4, 40($a0)
    ld      $t5, 48($a0)
    ld      $t6, 56($a0)
    pcpyld  $t2, $t4, $t2
    pcpyld  $t5, $t6, $t5
    qmtc2   $t1, $vf01
    ld      $t1, 64($a0)
    qmtc2   $t3, $vf02
    ld      $t3, 72($a0)
    qmtc2   $t2, $vf03
    qmtc2   $t5, $vf04
    pcpyld  $t1, $t3, $t1
    lqc2    $vf29,  0($at)
    lqc2    $vf30, 16($at)
    lqc2    $vf26, 32($at)
    lqc2    $vf27, 48($at)
    lqc2    $vf28, 64($at)
    qmtc2   $t1, $vf05
    .word   0x4A004938
    ldl     $t1,   7($a3)
    ldr     $t1,   0($a3)
    ldl     $t2,  15($a3)
    ldr     $t2,   8($a3)
    ldl     $t3,  23($a3)
    ldr     $t3,  16($a3)
    ldl     $t4,  31($a3)
    ldr     $t4,  24($a3)
    pcpyld  $t1, $t2, $t1
    pcpyld  $t3, $t4, $t3
    ldl     $t2,  39($a3)
    ldr     $t2,  32($a3)
    ldl     $t4,  47($a3)
    ldr     $t4,  40($a3)
    ldl     $t5,  55($a3)
    ldr     $t5,  48($a3)
    ldl     $t6,  63($a3)
    ldr     $t6,  56($a3)
    pcpyld  $t2, $t4, $t2
    pcpyld  $t5, $t6, $t5
    ldl     $t4,  71($a3)
    ldr     $t4,  64($a3)
    ldl     $t6,  79($a3)
    ldr     $t6,  72($a3)
    ldl     $t7,  87($a3)
    ldr     $t7,  80($a3)
    ldl     $t8,  95($a3)
    ldr     $t8,  88($a3)
    ldl     $t9, 103($a3)
    ldr     $t9,  96($a3)
    pcpyld  $t6, $t7, $t6
    pcpyld  $t8, $t9, $t8
    ldl     $t7, 111($a3)
    ldr     $t7, 104($a3)
    ldl     $t9, 119($a3)
    ldr     $t9, 112($a3)
    ldl     $v0, 127($a3)
    ldr     $v0, 120($a3)
    ldl     $v1, 135($a3)
    ldr     $v1, 128($a3)
    pcpyld  $t7, $t9, $t7
    pcpyld  $v0, $v1, $v0
    ldl     $t9, 143($a3)
    ldr     $t9, 136($a3)
    ldl     $v1,  7($a1)
    ldr     $v1,  0($a1)
    ldl     $at, 15($a1)
    ldr     $at,  8($a1)
    ldl     $a3, 23($a1)
    ldr     $a3, 16($a1)
    ldl     $a0, 31($a1)
    ldr     $a0, 24($a1)
    pcpyld  $v1, $at, $v1
    pcpyld  $a3, $a0, $a3
    ldl     $at, 39($a1)
    ldr     $at, 32($a1)
    ldl     $a0, 47($a1)
    ldr     $a0, 40($a1)
    ldl     $s0, 55($a1)
    ldr     $s0, 48($a1)
    ldl     $s1, 63($a1)
    ldr     $s1, 56($a1)
    pcpyld  $at, $a0, $at
    pcpyld  $s0, $s1, $s0
    ldl     $a0, 71($a1)
    ldr     $a0, 64($a1)
    qmtc2.i $t6, $vf15
    qmtc2   $t8, $vf16
    qmtc2   $t7, $vf17
    qmtc2   $v0, $vf18
    qmtc2   $t1, $vf01
    qmtc2   $t3, $vf02
    qmtc2   $t2, $vf03
    qmtc2   $t5, $vf04
    qmtc2   $t4, $vf05
    qmtc2   $t9, $vf19
    qmtc2   $v1, $vf26
    qmtc2   $a3, $vf27
    qmtc2   $at, $vf28
    qmtc2   $s0, $vf29
    qmtc2   $a0, $vf30
    vmul.xyzw   $vf10, $vf10, $vf15
    vmul.xyzw   $vf11, $vf11, $vf16
    vmul.xyzw   $vf12, $vf12, $vf17
    vmul.xyzw   $vf13, $vf13, $vf18
    vmul.xyzw   $vf14, $vf14, $vf19
    vmul.xyzw   $vf21, $vf21, $vf01
    vmul.xyzw   $vf22, $vf22, $vf02
    vmul.xyzw   $vf23, $vf23, $vf03
    vmul.xyzw   $vf24, $vf24, $vf04
    vmul.xyzw   $vf25, $vf25, $vf05
    vadd.xyzw   $vf21, $vf21, $vf26
    vadd.xyzw   $vf22, $vf22, $vf27
    vadd.xyzw   $vf23, $vf23, $vf28
    vadd.xyzw   $vf24, $vf24, $vf29
    vadd.xyzw   $vf25, $vf25, $vf30
    qmfc2   $t1, $vf10
    qmfc2   $t3, $vf11
    pcpyud  $t2, $t1, $zero
    pcpyud  $t4, $t3, $zero
    qmfc2   $t5, $vf12
    qmfc2   $t7, $vf13
    pcpyud  $t6, $t5, $zero
    pcpyud  $t8, $t7, $zero
    sdl     $t1,  7($a2)
    sdr     $t1,  0($a2)
    sdl     $t2, 15($a2)
    sdr     $t2,  8($a2)
    qmfc2   $t1, $vf14
    sdl     $t3, 23($a2)
    sdr     $t3, 16($a2)
    sdl     $t4, 31($a2)
    sdr     $t4, 24($a2)
    sdl     $t5, 39($a2)
    sdr     $t5, 32($a2)
    sdl     $t6, 47($a2)
    sdr     $t6, 40($a2)
    sdl     $t7, 55($a2)
    sdr     $t7, 48($a2)
    sdl     $t8, 63($a2)
    sdr     $t8, 56($a2)
    sdl     $t1, 71($a2)
    sdr     $t1, 64($a2)
    qmfc2   $t1, $vf21
    qmfc2   $t3, $vf22
    pcpyud  $t2, $t1, $zero
    pcpyud  $t4, $t3, $zero
    qmfc2   $t5, $vf23
    qmfc2   $t7, $vf24
    pcpyud  $t6, $t5, $zero
    pcpyud  $t8, $t7, $zero
    sw      $t1,    0($t0)
    dsrl32  $t1, $t1, 0
    sw      $t2,  256($t0)
    dsrl32  $t2, $t2, 0
    sw      $t1,  128($t0)
    sw      $t2,  384($t0)
    qmfc2   $t1, $vf25
    sw      $t3,  512($t0)
    dsrl32  $t3, $t3, 0
    dsrl32  $t2, $t1, 0
    sw      $t4,  768($t0)
    dsrl32  $t4, $t4, 0
    sw      $t3,  640($t0)
    sw      $t4,  896($t0)
    sw      $t5, 1024($t0)
    dsrl32  $t5, $t5, 0
    sw      $t6, 1280($t0)
    dsrl32  $t6, $t6, 0
    sw      $t5, 1152($t0)
    sw      $t6, 1408($t0)
    sw      $t7, 1536($t0)
    dsrl32  $t7, $t7, 0
    sw      $t8, 1792($t0)
    dsrl32  $t8, $t8, 0
    sw      $t7, 1664($t0)
    sw      $t8, 1920($t0)
    sw      $t1, 2048($t0)
    sw      $t2, 2176($t0)
    ld      $s0, 0($sp)
    ld      $s1, 8($sp)
    jr      $ra
    addiu   $sp, $sp, 16

MP123_IMDCT12:
    la      $at, s_Cos12
    pref    0, 0($at)
    ldl     $t1,  7($a0)
    ldr     $t1,  0($a0)
    lw      $t2,  8($a0)
    ldl     $t3, 19($a0)
    ldr     $t3, 12($a0)
    lw      $t4, 20($a0)
    ldl     $t5, 31($a0)
    ldr     $t5, 24($a0)
    lw      $t6, 32($a0)
    pcpyld  $t1, $t2, $t1
    pcpyld  $t3, $t4, $t3
    pcpyld  $t5, $t6, $t5
    qmtc2   $t1, $vf06
    qmtc2   $t3, $vf07
    qmtc2   $t5, $vf08
    ldl     $t1, 43($a0)
    ldr     $t1, 36($a0)
    lw      $t2, 44($a0)
    ldl     $t3, 55($a0)
    ldr     $t3, 48($a0)
    lw      $t4, 56($a0)
    ldl     $t5, 67($a0)
    ldr     $t5, 60($a0)
    lw      $t6, 68($a0)
    pcpyld  $t1, $t2, $t1
    pcpyld  $t3, $t4, $t3
    pcpyld  $t5, $t6, $t5
    qmtc2   $t1, $vf09
    qmtc2   $t3, $vf10
    qmtc2   $t5, $vf11
    lqc2    $vf01,  0($at)
    lqc2    $vf02, 16($at)
    lqc2    $vf03, 32($at)
    lqc2    $vf04, 48($at)
    lqc2    $vf05, 64($at)
    ldl     $t1,  7($a3)
    ldr     $t1,  0($a3)
    lw      $t2,  8($a3)
    ldl     $t3, 19($a3)
    ldr     $t3, 12($a3)
    lw      $t4, 20($a3)
    ldl     $t5, 31($a3)
    ldr     $t5, 24($a3)
    lw      $t6, 32($a3)
    ldl     $t7, 43($a3)
    ldr     $t7, 36($a3)
    lw      $t8, 44($a3)
    pcpyld  $t1, $t2, $t1
    pcpyld  $t3, $t4, $t3
    pcpyld  $t5, $t6, $t5
    pcpyld  $t7, $t8, $t7
    qmtc2   $t1, $vf12
    qmtc2   $t3, $vf13
    qmtc2   $t5, $vf14
    qmtc2   $t7, $vf15
    ldl     $t1, 31($a1)
    ldr     $t1, 24($a1)
    lw      $t2, 32($a1)
    ldl     $t3, 43($a1)
    ldr     $t3, 36($a1)
    lw      $t4, 44($a1)
    ldl     $t5, 55($a1)
    ldr     $t5, 48($a1)
    lw      $t6, 56($a1)
    ldl     $t7, 67($a1)
    ldr     $t7, 60($a1)
    lw      $t8, 68($a1)
    pcpyld  $t1, $t2, $t1
    pcpyld  $t3, $t4, $t3
    pcpyld  $t5, $t6, $t5
    pcpyld  $t7, $t8, $t7
    qmtc2   $t1, $vf16
    qmtc2   $t3, $vf17
    qmtc2   $t5, $vf18
    qmtc2   $t7, $vf19
    .word   0x4A003438
    lw      $t1,  0($a1)
    lw      $t2,  4($a1)
    lw      $t3,  8($a1)
    lw      $t4, 12($a1)
    lw      $t5, 16($a1)
    lw      $t6, 20($a1)
    sw      $t1,   0($t0)
    sw      $t2, 128($t0)
    sw      $t3, 256($t0)
    sw      $t4, 384($t0)
    sw      $t5, 512($t0)
    sw      $t6, 640($t0)
    sw      $zero, 48($a2)
    sw      $zero, 52($a2)
    sw      $zero, 56($a2)
    sw      $zero, 60($a2)
    sw      $zero, 64($a2)
    sw      $zero, 68($a2)
    qmfc2.i $t1, $vf16
    qmfc2   $t3, $vf17
    qmfc2   $t5, $vf18
    qmfc2   $t7, $vf19
    pcpyud  $t2, $t1, $zero
    pcpyud  $t4, $t3, $zero
    pcpyud  $t6, $t5, $zero
    pcpyud  $t8, $t7, $zero
    sw      $t1,  768($t0)
    dsrl32  $t1, $t1, 0
    sw      $t2, 1024($t0)
    sw      $t1,  896($t0)
    sw      $t3, 1152($t0)
    dsrl32  $t3, $t3, 0
    sw      $t4, 1408($t0)
    sw      $t3, 1280($t0)
    sw      $t5, 1536($t0)
    dsrl32  $t5, $t5, 0
    sw      $t6, 1792($t0)
    sw      $t5, 1664($t0)
    sw      $t7, 1920($t0)
    dsrl32  $t7, $t7, 0
    sw      $t8, 2176($t0)
    sw      $t7, 2048($t0)
    qmfc2   $t1, $vf23
    qmfc2   $t3, $vf24
    qmfc2   $t5, $vf25
    qmfc2   $t7, $vf26
    pcpyud  $t2, $t1, $zero
    pcpyud  $t4, $t3, $zero
    pcpyud  $t6, $t5, $zero
    pcpyud  $t8, $t7, $zero
    sdl     $t1,  7($a2)
    sdr     $t1,  0($a2)
    sw      $t2,  8($a2)
    sdl     $t3, 19($a2)
    sdr     $t3, 12($a2)
    sw      $t4, 20($a2)
    sdl     $t5, 31($a2)
    sdr     $t5, 24($a2)
    sw      $t6, 32($a2)
    sdl     $t7, 43($a2)
    sdr     $t7, 36($a2)
    jr      $ra
    sw      $t8, 44($a2)

MP123_Synth:
    addu    $t8, $zero, $a2
    addu    $a2, $zero, $a0
    lw      $v1, s_Offset
    bnel    $a1, $zero, 1f
    addu    $t8, $t8, 2
    addu    $v1, $v1, -1
    la      $t4, s_SynthBuf
    andi    $v1, $v1, 0x000F
    beq     $zero, $zero, 2f
    sw      $v1, s_Offset
1:
    la      $t4, s_SynthBuf + 2176
2:
    andi    $t5, $v1, 0x0001
    beql    $t5, $zero, 1f
    addiu   $t9, $t4, 1088
    addu    $t9, $zero, $t4
    addu    $t6, $zero, $v1
    addiu   $t5, $v1, 1
    addiu   $a0, $t4, 1088
    andi    $t5, $t5, 0x000F
    addu    $a1, $zero, $t4
    sll     $v1, $v1, 2
    sll     $t5, $t5, 2
    addu    $a1, $a1, $v1
    addu    $a0, $a0, $t5
    beq     $zero, $zero, 2f
    sll     $t6, $t6, 2
1:
    addiu   $t6, $v1, 1
    sll     $v1, $v1, 2
    sll     $t6, $t6, 2
    addu    $a0, $t4, $v1
    addu    $a1, $t9, $t6
2:
    mtsah   $zero, 6
    lqc2    $vf01,  0($a2)
    lqc2    $vf02, 16($a2)
    lqc2    $vf03, 32($a2)
    lqc2    $vf04, 48($a2)
    lq      $t3,   64($a2)
    lq      $t2,   80($a2)
    lq      $t1,   96($a2)
    lq      $t0,  112($a2)
    pexew   $t3, $t3
    pexew   $t2, $t2
    pexew   $t1, $t1
    pexew   $t0, $t0
    qfsrv   $t3, $t3
    qfsrv   $t2, $t2
    qfsrv   $t1, $t1
    qfsrv   $t0, $t0
    qmtc2   $t3, $vf08
    qmtc2   $t2, $vf07
    qmtc2   $t1, $vf06
    qmtc2   $t0, $vf05
    la      $at, s_Cos64
    vadd.xyzw   $vf12, $vf04, $vf08
    vadd.xyzw   $vf11, $vf03, $vf07
    vadd.xyzw   $vf10, $vf02, $vf06
    vadd.xyzw   $vf09, $vf01, $vf05
    pref    0, 64($at)
    vsub.xyzw   $vf01, $vf01, $vf05
    vsub.xyzw   $vf02, $vf02, $vf06
    vsub.xyzw   $vf03, $vf03, $vf07
    vsub.xyzw   $vf04, $vf04, $vf08
    lqc2    $vf13,  0($at)
    lqc2    $vf14, 16($at)
    lqc2    $vf15, 32($at)
    lqc2    $vf16, 48($at)
    vmul.xyzw   $vf01, $vf01, $vf13
    vmul.xyzw   $vf02, $vf02, $vf14
    vmul.xyzw   $vf03, $vf03, $vf15
    vmul.xyzw   $vf04, $vf04, $vf16
    qmfc2   $t0, $vf12
    qmfc2   $t1, $vf11
    pexew   $t0, $t0
    pexew   $t1, $t1
    qfsrv   $t0, $t0
    qfsrv   $t1, $t1
    qmtc2   $t0, $vf05
    qmtc2   $t1, $vf06
    vadd.xyzw   $vf13, $vf09, $vf05
    vadd.xyzw   $vf14, $vf10, $vf06
    vsub.xyzw   $vf15, $vf09, $vf05
    vsub.xyzw   $vf16, $vf10, $vf06
    lqc2    $vf05, 64($at)
    lqc2    $vf06, 80($at)
    qmfc2   $t0, $vf04
    qmfc2   $t1, $vf03
    pexew   $t0, $t0
    pexew   $t1, $t1
    vmul.xyzw   $vf15, $vf15, $vf05
    vmul.xyzw   $vf16, $vf16, $vf06
    qfsrv   $t0, $t0
    qfsrv   $t1, $t1
    qmtc2   $t0, $vf04
    qmtc2   $t1, $vf03
    vsub.xyzw   $vf19, $vf01, $vf04
    vsub.xyzw   $vf20, $vf02, $vf03
    vadd.xyzw   $vf17, $vf01, $vf04
    vadd.xyzw   $vf18, $vf02, $vf03
    vmul.xyzw   $vf19, $vf19, $vf05
    vmul.xyzw   $vf20, $vf20, $vf06
    qmfc2   $t0, $vf14
    qmfc2   $t1, $vf16
    qmfc2   $t2, $vf18
    qmfc2   $t3, $vf20
    pexew   $t0, $t0
    pexew   $t1, $t1
    pexew   $t2, $t2
    pexew   $t3, $t3
    qfsrv   $t0, $t0
    qfsrv   $t1, $t1
    qfsrv   $t2, $t2
    qfsrv   $t3, $t3
    qmtc2   $t0, $vf14
    qmtc2   $t1, $vf16
    qmtc2   $t2, $vf18
    qmtc2   $t3, $vf20
    vsub.xyzw   $vf10, $vf13, $vf14
    vsub.xyzw   $vf12, $vf15, $vf16
    vsub.xyzw   $vf03, $vf17, $vf18
    vsub.xyzw   $vf01, $vf19, $vf20
    lqc2    $vf05, 96($at)
    vadd.xyzw   $vf09, $vf13, $vf14
    vadd.xyzw   $vf11, $vf15, $vf16
    vadd.xyzw   $vf04, $vf17, $vf18
    vadd.xyzw   $vf02, $vf19, $vf20
    vmul.xyzw   $vf10, $vf10, $vf05
    vmul.xyzw   $vf12, $vf12, $vf05
    vmul.xyzw   $vf03, $vf03, $vf05
    vmul.xyzw   $vf01, $vf01, $vf05
    mtsah   $zero, 2
    qmfc2   $t0, $vf09
    qmfc2   $t1, $vf10
    ld      $v0, 112($at)
    pcpyld  $t2, $t0, $t1
    pcpyud  $t0, $t1, $t0
    pexew   $t0, $t0
    pcpyld  $v0, $v0, $v0
    qfsrv   $t0, $t0
    qmtc2   $t2, $vf09
    qmtc2   $t0, $vf10
    qmtc2   $v0, $vf05
    vsub.xyzw   $vf14, $vf09, $vf10
    vadd.xyzw   $vf13, $vf09, $vf10
    vmul.xyzw   $vf14, $vf14, $vf05
    qmfc2   $t0, $vf11
    qmfc2   $t1, $vf12
    pcpyld  $t2, $t0, $t1
    pcpyud  $t0, $t1, $t0
    pexew   $t0, $t0
    qfsrv   $t0, $t0
    qmtc2   $t2, $vf11
    qmtc2   $t0, $vf12
    vsub.xyzw   $vf15, $vf11, $vf12
    vadd.xyzw   $vf16, $vf11, $vf12
    vmul.xyzw   $vf15, $vf15, $vf05
    qmfc2   $t0, $vf04
    qmfc2   $t1, $vf03
    pcpyld  $t2, $t0, $t1
    pcpyud  $t0, $t1, $t0
    pexew   $t0, $t0
    qfsrv   $t0, $t0
    qmtc2   $t2, $vf04
    qmtc2   $t0, $vf03
    vsub.xyzw   $vf18, $vf04, $vf03
    vadd.xyzw   $vf17, $vf04, $vf03
    vmul.xyzw   $vf18, $vf18, $vf05
    qmfc2   $t0, $vf02
    qmfc2   $t1, $vf01
    pcpyld  $t2, $t0, $t1
    pcpyud  $t0, $t1, $t0
    pexew   $t0, $t0
    qfsrv   $t0, $t0
    qmtc2   $t2, $vf02
    qmtc2   $t0, $vf01
    vsub.xyzw   $vf19, $vf02, $vf01
    vadd.xyzw   $vf20, $vf02, $vf01
    vmul.xyzw   $vf19, $vf19, $vf05
    qmfc2   $t0, $vf13
    qmfc2   $t1, $vf14
    lw      $at, 120($at)
    pextlw  $t2, $t0, $t1
    pextuw  $t0, $t0, $t1
    pextlw  $at, $at, $at
    pcpyld  $t1, $t0, $t2
    pcpyud  $t0, $t2, $t0
    pcpyld  $at, $at, $at
    qmtc2   $t0, $vf13
    qmtc2   $t1, $vf14
    qmtc2   $at, $vf05
    vsub.xyzw   $vf10, $vf14, $vf13
    vadd.xyzw   $vf09, $vf14, $vf13
    vmul.xyzw   $vf10, $vf10, $vf05
    qmfc2   $t0, $vf16
    qmfc2   $t1, $vf15
    pextlw  $t2, $t0, $t1
    pextuw  $t0, $t0, $t1
    pcpyld  $t1, $t0, $t2
    pcpyud  $t0, $t2, $t0
    qmtc2   $t0, $vf16
    qmtc2   $t1, $vf15
    vsub.xyzw   $vf12, $vf15, $vf16
    vadd.xyzw   $vf11, $vf15, $vf16
    vmul.xyzw   $vf12, $vf12, $vf05
    qmfc2   $t0, $vf17
    qmfc2   $t1, $vf18
    pextlw  $t2, $t0, $t1
    pextuw  $t0, $t0, $t1
    pcpyld  $t1, $t0, $t2
    pcpyud  $t0, $t2, $t0
    qmtc2   $t0, $vf17
    qmtc2   $t1, $vf18
    vsub.xyzw   $vf03, $vf18, $vf17
    vadd.xyzw   $vf04, $vf18, $vf17
    vmul.xyzw   $vf03, $vf03, $vf05
    qmfc2   $t0, $vf20
    qmfc2   $t1, $vf19
    pextlw  $t2, $t0, $t1
    pextuw  $t0, $t0, $t1
    pcpyld  $t1, $t0, $t2
    pcpyud  $t0, $t2, $t0
    qmtc2   $t0, $vf20
    qmtc2   $t1, $vf19
    .word   0x4A002938
    la      $v1, s_DecWin
    subu    $v1, $v1, $t6
    lui     $t7, 0x46FF
    lui     $at, 0xC700
    addiu   $v1, $v1, 64
    ori     $t7, $t7, 0xFE00
    mtc1    $at, $f19
    mtc1    $t7, $f18
    mtc1    $zero, $f00
    addiu   $t7, $zero, 16
    sll     $a3, $a3, 1
    qmfc2.i $t0, $vf05
    qmfc2   $t1, $vf09
    qmfc2   $t2, $vf07
    qmfc2   $t3, $vf08
    qmfc2   $at, $vf13
    sw      $t0,    0($a0)
    sw      $t1,  256($a0)
    sw      $t2,  512($a0)
    sw      $t3,  768($a0)
    sw      $at, 1024($a0)
    qmfc2   $t0, $vf14
    qmfc2   $t1, $vf15
    qmfc2   $t2, $vf16
    qmfc2   $t3, $vf10
    sw      $t0,   0($a1)
    sw      $t1, 256($a1)
    sw      $t2, 512($a1)
    sw      $t3, 768($a1)
    vaddw.x     $vf05, $vf02, $vf03
    vaddz.x     $vf06, $vf04, $vf02
    vaddz.y     $vf07, $vf02, $vf04
    vaddw.y     $vf08, $vf04, $vf02
    vaddw.w     $vf13, $vf03, $vf01
    vaddy.y     $vf14, $vf01, $vf03
    vaddz.z     $vf15, $vf01, $vf03
    vaddx.x     $vf16, $vf03, $vf01
    qmfc2   $t0, $vf05
    qmfc2   $t1, $vf06
    qmfc2   $t2, $vf07
    qmfc2   $t3, $vf08
    dsrl32  $t2, $t2, 0
    dsrl32  $t3, $t3, 0
    sw      $t0,  64($a0)
    sw      $t1, 320($a0)
    sw      $t2, 576($a0)
    sw      $t3, 832($a0)
    qmfc2   $t0, $vf13
    qmfc2   $t1, $vf14
    qmfc2   $t2, $vf15
    qmfc2   $t3, $vf16
    pcpyud  $t0, $t0, $t0
    dsrl32  $t1, $t1, 0
    dsrl32  $t0, $t0, 0
    pcpyud  $t2, $t2, $t2
    sw      $t0,  64($a1)
    sw      $t1, 320($a1)
    sw      $t2, 576($a1)
    sw      $t3, 832($a1)
    vaddz.x     $vf06, $vf00, $vf11
    vaddy.x     $vf07, $vf00, $vf11
    vaddw.x     $vf08, $vf00, $vf11
    vaddw.x     $vf13, $vf00, $vf12
    vaddy.x     $vf14, $vf00, $vf12
    vaddz.x     $vf15, $vf00, $vf12
    qmfc2   $t0, $vf11
    qmfc2   $t1, $vf06
    qmfc2   $t2, $vf07
    qmfc2   $t3, $vf08
    sw      $t0, 128($a0)
    sw      $t1, 384($a0)
    sw      $t2, 640($a0)
    sw      $t3, 896($a0)
    qmfc2   $t0, $vf13
    qmfc2   $t1, $vf14
    qmfc2   $t2, $vf15
    qmfc2   $t3, $vf12
    sw      $t0, 128($a1)
    sw      $t1, 384($a1)
    sw      $t2, 640($a1)
    sw      $t3, 896($a1)
    vaddx.x     $vf05, $vf04, $vf02
    vaddz.z     $vf06, $vf04, $vf02
    vaddy.y     $vf07, $vf04, $vf02
    vaddw.w     $vf08, $vf04, $vf02
    vaddw.y     $vf13, $vf03, $vf01
    vaddz.y     $vf14, $vf01, $vf03
    vaddz.x     $vf15, $vf03, $vf01
    qmfc2   $t0, $vf05
    qmfc2   $t1, $vf06
    qmfc2   $t2, $vf07
    qmfc2   $t3, $vf08
    pcpyud  $t1, $t1, $t1
    dsrl32  $t2, $t2, 0
    pcpyud  $t3, $t3, $t3
    sw      $t0, 192($a0)
    dsrl32  $t3, $t3, 0
    sw      $t1, 448($a0)
    sw      $t2, 704($a0)
    sw      $t3, 960($a0)
    qmfc2   $t0, $vf13
    qmfc2   $t1, $vf14
    qmfc2   $t2, $vf15
    qmfc2   $t3, $vf01
    dsrl32  $t0, $t0, 0
    dsrl32  $t1, $t1, 0
    sw      $t0, 192($a1)
    sw      $t1, 448($a1)
    sw      $t2, 704($a1)
    sw      $t3, 960($a1)
1:
    lwc1    $f01,  0($v1)
    lwc1    $f02,  0($t9)
    lwc1    $f03,  4($v1)
    lwc1    $f04,  4($t9)
    mul.s   $f01, $f01, $f02
    lwc1    $f05,  8($v1)
    lwc1    $f06,  8($t9)
    lwc1    $f07, 12($v1)
    adda.s  $f01, $f00
    lwc1    $f08, 12($t9)
    msuba.s $f03, $f04
    lwc1    $f01, 16($v1)
    madda.s $f05, $f06
    lwc1    $f02, 16($t9)
    msuba.s $f07, $f08
    lwc1    $f03, 20($v1)
    lwc1    $f04, 20($t9)
    lwc1    $f05, 24($v1)
    lwc1    $f06, 24($t9)
    madda.s $f01, $f02
    lwc1    $f07, 28($v1)
    msuba.s $f03, $f04
    lwc1    $f08, 28($t9)
    madda.s $f05, $f06
    lwc1    $f01, 32($v1)
    lwc1    $f02, 32($t9)
    msuba.s $f07, $f08
    lwc1    $f03, 36($v1)
    lwc1    $f04, 36($t9)
    madda.s $f01, $f02
    lwc1    $f05, 40($v1)
    lwc1    $f06, 40($t9)
    msuba.s $f03, $f04
    lwc1    $f07, 44($v1)
    lwc1    $f08, 44($t9)
    madda.s $f05, $f06
    lwc1    $f01, 48($v1)
    lwc1    $f02, 48($t9)
    msuba.s $f07, $f08
    lwc1    $f03, 52($v1)
    lwc1    $f04, 52($t9)
    madda.s $f01, $f02
    lwc1    $f05, 56($v1)
    lwc1    $f06, 56($t9)
    msuba.s $f03, $f04
    lwc1    $f07, 60($v1)
    lwc1    $f08, 60($t9)
    madda.s $f05, $f06
    msuba.s $f07, $f08
    madd.s  $f01, $f00, $f00
    addiu   $v1, $v1, 128
    min.s   $f01, $f01, $f18
    addiu   $t9, $t9, 64
    max.s   $f01, $f01, $f19
    pref    0, 0($v1)
    pref    0, 0($t9)
    addiu   $t7, $t7, -1
    cvt.w.s $f01, $f01
    mfc1    $t4, $f01
    sh      $t4, 0($t8)
    bgtz    $t7, 1b
    addu    $t8, $t8, $a3
    lwc1    $f01,  0($v1)
    lwc1    $f02,  0($t9)
    lwc1    $f03,  8($v1)
    lwc1    $f04,  8($t9)
    mul.s   $f01, $f01, $f02
    lwc1    $f05, 16($v1)
    lwc1    $f06, 16($t9)
    lwc1    $f07, 24($v1)
    adda.s  $f01, $f00
    lwc1    $f08, 24($t9)
    madda.s $f03, $f04
    lwc1    $f01, 32($v1)
    madda.s $f05, $f06
    lwc1    $f02, 32($t9)
    madda.s $f07, $f08
    lwc1    $f03, 40($v1)
    lwc1    $f04, 40($t9)
    lwc1    $f05, 48($v1)
    lwc1    $f06, 48($t9)
    madda.s $f01, $f02
    lwc1    $f07, 56($v1)
    madda.s $f03, $f04
    lwc1    $f08, 56($t9)
    madda.s $f05, $f06
    madda.s $f07, $f08
    sll     $t6, $t6, 1
    madd.s  $f01, $f00, $f00
    min.s   $f01, $f01, $f18
    addiu   $t9, $t9, -64
    addiu   $t7, $zero, 15
    max.s   $f01, $f01, $f19
    addiu   $v1, $v1, -128
    cvt.w.s $f01, $f01
    addu    $v1, $v1, $t6
    mfc1    $t4, $f01
    sh      $t4, 0($t8)
    addu    $t8, $t8, $a3
1:
    lwc1    $f01,  -4($v1)
    lwc1    $f02,   0($t9)
    lwc1    $f03,  -8($v1)
    lwc1    $f04,   4($t9)
    mul.s   $f01, $f01, $f02
    lwc1    $f05, -12($v1)
    lwc1    $f06,   8($t9)
    lwc1    $f07, -16($v1)
    suba.s  $f00, $f01
    lwc1    $f08,  12($t9)
    msuba.s $f03, $f04
    lwc1    $f01, -20($v1)
    msuba.s $f05, $f06
    lwc1    $f02,  16($t9)
    msuba.s $f07, $f08
    lwc1    $f03, -24($v1)
    lwc1    $f04,  20($t9)
    lwc1    $f05, -28($v1)
    lwc1    $f06,  24($t9)
    msuba.s $f01, $f02
    lwc1    $f07, -32($v1)
    msuba.s $f03, $f04
    lwc1    $f08,  28($t9)
    msuba.s $f05, $f06
    lwc1    $f01, -36($v1)
    lwc1    $f02,  32($t9)
    msuba.s $f07, $f08
    lwc1    $f03, -40($v1)
    lwc1    $f04,  36($t9)
    msuba.s $f01, $f02
    lwc1    $f05, -44($v1)
    lwc1    $f06,  40($t9)
    msuba.s $f03, $f04
    lwc1    $f07, -48($v1)
    lwc1    $f08,  44($t9)
    msuba.s $f05, $f06
    lwc1    $f01, -52($v1)
    lwc1    $f02,  48($t9)
    msuba.s $f07, $f08
    lwc1    $f03, -56($v1)
    lwc1    $f04,  52($t9)
    msuba.s $f01, $f02
    lwc1    $f05, -60($v1)
    lwc1    $f06,  56($t9)
    msuba.s $f03, $f04
    lwc1    $f07, -64($v1)
    lwc1    $f08,  60($t9)
    msuba.s $f05, $f06
    msuba.s $f07, $f08
    madd.s  $f01, $f00, $f00
    addiu   $v1, $v1, -128
    min.s   $f01, $f01, $f18
    addiu   $t9, $t9, -64
    max.s   $f01, $f01, $f19
    addiu   $t7, $t7, -1
    cvt.w.s $f01, $f01
    mfc1    $t4, $f01
    sh      $t4, 0($t8)
    bgtz    $t7, 1b
    addu    $t8, $t8, $a3
    addiu   $v0, $zero, 16
    srl     $a3, $a3, 1
    jr      $ra
    sllv    $v0, $v0, $a3