/*
#     ___  _ _      ___
#    |    | | |    |
# ___|    |   | ___|    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 noat
.set nomacro

.globl IPU_FDEC
.globl IPU_IDEC
.globl IPU_FRST

.text

IPU_FDEC:
    lui  $at, 0x4000
    lui  $v1, 0x1000
    or   $at, $at, $a0
    sw   $at, 0x2000($v1)
1:
    lw      $at, 0x2010($v1)
    nop
    nop
    nop
    nop
    nop
    bltz    $at, 1b
    nop
    jr      $ra
    lw      $v0, 0x2000($v1)

IPU_IDEC:
    lui     $v1, 0x1000
    sll     $t1, $t1, 27
    sll     $t0, $t0, 26
    or      $a0, $a0, $t1
    sll     $a3, $a3, 25
    or      $a0, $a0, $t0
    sll     $a2, $a2, 24
    or      $a0, $a0, $a3
    sll     $a1, $a1, 16
    or      $a0, $a0, $a2
    or      $a0, $a0, $v1
    or      $a0, $a0, $a1
    sw      $a0, 0x2000($v1)
    lw      $at, 0x2010($v1)
1:
    andi     $v0, $at, 0x4000
    bgtzl    $v0, 1f
    move     $v0, $zero
    andi     $v0, $at, 0x00F0
    bgtzl    $v0, 1f
    srl      $v0, $v0, 4
    b        1b
    lw       $at, 0x2010($v1)
1:
    jr      $ra
    nop

IPU_FRST:
    lui     $at, 0x1001
    lui     $v0, 0x0001
1:
    di
    sync.p
    mfc0    $a0, $12
    and     $a0, $a0, $v0
    bne     $a0, $zero, 1b
    lw      $a0, -2784($at)
    nor     $a2, $zero, $v0
    or      $a0, $a0, $v0
    sw      $a0, -2672($at)
    sw      $zero, -20480($at)
    sw      $zero, -19456($at)
    sw      $zero, -20448($at)
    sw      $zero, -19424($at)
    lw      $a0, -2784($at)
    lui     $v1, 0x1000
    and     $a0, $a0, $a2
    sw      $a0, -2672($at)
    ei
    lw      $a0, 0x2010($v1)
    sll     $v0, $v0, 14
    sw      $v0, 0x2010($v1)
1:
    lw      $v0, 0x2010($v1)
    bltz    $v0, 1b
    nop
    sw      $zero, 0x2000($v1)
1:
    lw      $v0, 0x2010($v1)
    bltz    $v0, 1b
    nop
    jr      $ra
    sw      $a0, 0x2010($v1)