static void *setIntr(int index, void (*callback)());


disassembled listing :
setIntr:
    addiu   sp,sp,-40
    sw      s1,20(sp)
    move    s1,a0
    sw      s2,24(sp)
    move    s2,a1
    lui     a1,_hi(data_5C)
    addiu   a1,a1,_lo(data_5C)
    sll     v0,s1,2
    addu    a0,v0,a1
    sw      ra,36(sp)
    sw      s4,32(sp)
    sw      s3,28(sp)
    sw      s0,16(sp)
    lw      s4,0(a0)
    nop
    beq     s2,s4,text_564
    move    v0,s4
    lhu     v0,-4(a1)
    nop
    beqz    v0,text_560
    addiu   a2,a1,-4
    lui     v0,_hi(data_10E8)
    lw      v0,_lo(data_10E8)(v0)
    nop
    lhu     v1,0(v0)
    sh      zero,0(v0)
    beqz    s2,text_4CC
    andi    s3,v1,$FFFF
    li      v1,1
    sllv    v1,v1,s1
    sw      s2,0(a0)
    lhu     v0,48(a2)
    or      s3,s3,v1
    or      v0,v0,v1
    j       text_4EC
    sh      v0,48(a2)
text_4CC:
    li      v0,1
    sllv    v0,v0,s1
    nor     v0,zero,v0
    sw      zero,0(a0)
    lhu     v1,44(a1)
    and     s3,s3,v0
    and     v1,v1,v0
    sh      v1,44(a1)
text_4EC:
    bnez    s1,text_510
    li      v0,4
    sltiu   s0,s2,1
    jal     ChangeClearPAD
    move    a0,s0
    li      a0,3
    jal     ChangeClearRCnt
    move    a1,s0
    li      v0,4
text_510:
    bne     s1,v0,text_528
    li      v0,5
    move    a0,zero
    jal     ChangeClearRCnt
    sltiu   a1,s2,1
    li      v0,5
text_528:
    bne     s1,v0,text_540
    li      v0,6
    li      a0,1
    jal     ChangeClearRCnt
    sltiu   a1,s2,1
    li      v0,6
text_540:
    bne     s1,v0,text_550
    li      a0,2
    jal     ChangeClearRCnt
    sltiu   a1,s2,1
text_550:
    lui     v0,_hi(data_10E8)
    lw      v0,_lo(data_10E8)(v0)
    nop
    sh      s3,0(v0)
text_560:
    move    v0,s4
text_564:
    lw      ra,36(sp)
    lw      s4,32(sp)
    lw      s3,28(sp)
    lw      s2,24(sp)
    lw      s1,20(sp)
    lw      s0,16(sp)
    jr      ra
    addiu   sp,sp,40
source code :
static struct
{
    u_short     started;
    u_short     trapped;
    void        (*cbIntr[11])();
    u_short     mask, oldmask;
    u_long      dma;
    jmp_buf     trap;
    u_char      stack[0x1000];
} intrData;

static volatile u_short *int_mask = (void *)0x1f801074;

static void *setIntr(int index, void (*callback)())
{
    void (*old)() = intrData.cbIntr[index];
    int mask;

    if(callback == old || !intrData.started)
        return old;
       
    mask = *int_mask;
    *int_mask = 0;

    if(callback)
    {
        intrData.cbIntr[index] = callback;
        mask |= 1 << index;
        intrData.mask |= 1 << index;
    }
    else
    {
        intrData.cbIntr[index] = 0;
        mask &= ~(1 << index);
        intrData.mask &= ~(1 << index);
    }

    if(index == 0)
    {
        ChangeClearPAD(callback == 0);
        ChangeClearRCnt(3, callback == 0);
    }
    if(index == 4) ChangeClearRCnt(0, callback == 0);
    if(index == 5) ChangeClearRCnt(1, callback == 0);
    if(index == 6) ChangeClearRCnt(2, callback == 0);
    
    *int_mask = mask;

    return old;
}
reversed listing :
setIntr:
    subu    $sp,$sp,40
    sw      $17,20($sp)
    move    $17,$4
    sw      $18,24($sp)
    move    $18,$5
    la      $5,intrData+4
    sll     $2,$17,2
    addu    $4,$2,$5
    sw      $31,36($sp)
    sw      $20,32($sp)
    sw      $19,28($sp)
    sw      $16,16($sp)
    lw      $20,0($4)
    nop
    beq     $18,$20,$L25
    move    $2,$20
    lhu     $2,-4($5)
    nop
    beq     $2,$0,$L25
    move    $2,$20
    lw      $2,int_mask
    nop
    lhu     $3,0($2)
    sh      $0,0($2)
    beq     $18,$0,$L19
    andi    $19,$3,0xffff
    li      $3,0x00000001
    sll     $3,$3,$17
    sw      $18,0($4)
    lhu     $2,44($5)
    or      $19,$19,$3
    or      $2,$2,$3
    j       $L20
    sh      $2,44($5)
$L19:
    li      $2,0x00000001
    sll     $2,$2,$17
    nor     $2,$0,$2
    sw      $0,0($4)
    lhu     $3,intrData+48
    and     $19,$19,$2
    and     $3,$3,$2
    sh      $3,intrData+48
$L20:
    bne     $17,$0,$L26
    li      $2,0x00000004
    sltu    $16,$18,1
    jal     ChangeClearPAD
    move    $4,$16
    li      $4,0x00000003
    jal     ChangeClearRCnt
    move    $5,$16
    li      $2,0x00000004
$L26:
    bne     $17,$2,$L27
    li      $2,0x00000005
    move    $4,$0
    jal     ChangeClearRCnt
    sltu    $5,$18,1
    li      $2,0x00000005
$L27:
    bne     $17,$2,$L28
    li      $2,0x00000006
    li      $4,0x00000001
    jal     ChangeClearRCnt
    sltu    $5,$18,1
    li      $2,0x00000006
$L28:
    bne     $17,$2,$L24
    li      $4,0x00000002
    jal     ChangeClearRCnt
    sltu    $5,$18,1
$L24:
    lw      $3,int_mask
    move    $2,$20
    sh      $19,0($3)
$L25:
    lw      $31,36($sp)
    lw      $20,32($sp)
    lw      $19,28($sp)
    lw      $18,24($sp)
    lw      $17,20($sp)
    lw      $16,16($sp)
    j       $31
    addu    $sp,$sp,40
coincidence: 97%

STATUS: GOOD MATCH
19 Apr 2003
Hosted by uCoz