static void *setIntrDMA(int chan, void (*callback)());


disassembled listing :
setIntrDMA:
    move    a2,a0
    lui     v1,_hi(data_4)
    addiu   v1,v1,_lo(data_4)
    sll     v0,a2,2
    addu    v1,v0,v1
    lw      a3,0(v1)
    move    a0,a1
    beq     a0,a3,text_270
    move    v0,a3
    beqz    a0,text_234
    lui     v0,$00FF
    lui     a1,_hi(sectbase(.data))
    lw      a1,_lo(sectbase(.data))(a1)
    ori     v0,v0,$FFFF
    sw      a0,0(v1)
    lw      a0,0(a1)
    addiu   v1,a2,16
    and     a0,a0,v0
    li      v0,1
    sllv    v0,v0,v1
    lui     v1,$0080
    or      v0,v0,v1
    or      a0,a0,v0
    sw      a0,0(a1)
    j       text_270
    move    v0,a3
text_234:
    lui     a1,_hi(sectbase(.data))
    lw      a1,_lo(sectbase(.data))(a1)
    ori     v0,v0,$FFFF
    sw      zero,0(v1)
    lw      v1,0(a1)
    addiu   a0,a2,16
    and     v1,v1,v0
    lui     v0,$0080
    or      v1,v1,v0
    li      v0,1
    sllv    v0,v0,a0
    nor     v0,zero,v0
    and     v1,v1,v0
    sw      v1,0(a1)
    move    v0,a3
text_270:
    jr  ra
    nop
source code :
static volatile u_long *dicr = (void *)0x1f8010f4;

static void (*cbIntrDMA[8])();

static void *setIntrDMA(int index, void (*callback)())
{
    void (*old)() = cbIntrDMA[index];

    if(callback != old)
    {
        if(callback)
        {
            cbIntrDMA[index] = callback;
            *dicr = ((*dicr & 0xffffff) | 0x800000) |  (1 << (index + 16));
        }
        else
        {
            cbIntrDMA[index] = 0;
            *dicr = ((*dicr & 0xffffff) | 0x800000) & ~(1 << (index + 16));
        }
    }

    return old;
}
reversed listing :
setIntrDMA:
    move    $6,$4
    la      $3,cbIntrDMA
    sll     $2,$6,2
    addu    $3,$2,$3
    lw      $7,0($3)
    move    $4,$5
    beq     $4,$7,$L2
    move    $2,$7
    beq     $4,$0,$L3
    li      $2,0x00ff0000
    lw      $5,dicr
    ori     $2,$2,0xffff
    sw      $4,0($3)
    lw      $4,0($5)
    addu    $3,$6,16
    and     $4,$4,$2
    li      $2,0x00000001
    sll     $2,$2,$3
    li      $3,0x00800000
    or      $2,$2,$3
    or      $4,$4,$2
    sw      $4,0($5)
    j       $L2
    move    $2,$7
$L3:
    lw      $5,dicr
    ori     $2,$2,0xffff
    sw      $0,0($3)
    lw      $3,0($5)
    addu    $4,$6,16
    and     $3,$3,$2
    li      $2,0x00800000
    or      $3,$3,$2
    li      $2,0x00000001
    sll     $2,$2,$4
    nor     $2,$0,$2
    and     $3,$3,$2
    sw      $3,0($5)
    move    $2,$7
$L2:
    j       $31
    nop
coincidence: 100%

STATUS: COMPLETE
14 Apr 2003
Hosted by uCoz