static void trapIntrDMA();


disassembled listing :
trapIntrDMA:
    lui     v0,_hi(sectbase(.data))
    lw      v0,_lo(sectbase(.data))(v0)
    addiu   sp,sp,-48
    sw      ra,40(sp)
    sw      s5,36(sp)
    sw      s4,32(sp)
    sw      s3,28(sp)
    sw      s2,24(sp)
    sw      s1,20(sp)
    sw      s0,16(sp)
    lw      v0,0(v0)
    nop
    srl     v0,v0,24
    andi    s1,v0,$007F
    beqz    s1,text_128
    nop
    li      s4,1
    lui     s3,$00FF
    ori     s3,s3,$FFFF
    lui     s5,_hi(data_4)
    addiu   s5,s5,_lo(data_4)
text_A0:
    beqz    s1,text_104
    move    s0,zero
    move    s2,s5
text_AC:
    slti    v0,s0,7
    beqz    v0,text_104
    andi    v0,s1,$0001
    beqz    v0,text_F4
    addiu   v0,s0,24
    lui     a0,_hi(sectbase(.data))
    lw      a0,_lo(sectbase(.data))(a0)
    sllv    v0,s4,v0
    lw      v1,0(a0)
    or      v0,v0,s3
    and     v1,v1,v0
    sw      v1,0(a0)
    lw      v0,0(s2)
    nop
    beqz    v0,text_F4
    nop
    jalr    ra,v0
    nop
text_F4:
    addiu   s2,s2,4
    srl     s1,s1,1
    bnez    s1,text_AC
    addiu   s0,s0,1
text_104:
    lui     v0,_hi(sectbase(.data))
    lw      v0,_lo(sectbase(.data))(v0)
    nop
    lw      v0,0(v0)
    nop
    srl     v0,v0,24
    andi    s1,v0,$007F
    bnez    s1,text_A0
    nop
text_128:
    lui     a1,_hi(sectbase(.data))
    lw      a1,_lo(sectbase(.data))(a1)
    nop
    lw      v0,0(a1)
    lui     v1,$FF00
    and     v0,v0,v1
    lui     v1,$8000
    beq     v0,v1,text_160
    nop
    lw      v0,0(a1)
    nop
    andi    v0,v0,$8000
    beqz    v0,text_1A8
    nop
text_160:
    lui     a0,_hi(sectbase(.rdata))
    addiu   a0,a0,_lo(sectbase(.rdata))
    lw      a1,0(a1)
    jal     printf
    move    s0,zero
text_174:
    lui     a0,_hi(rdata_1C)
    addiu   a0,a0,_lo(rdata_1C)
    move    a1,s0
    lui     v0,_hi(data_24)
    lw      v0,_lo(data_24)(v0)
    sll     v1,s0,4
    addu    v1,v1,v0
    lw      a2,0(v1)
    jal     printf
    addiu   s0,s0,1
    slti    v0,s0,7
    bnez    v0,text_174
    nop
text_1A8:
    lw      ra,40(sp)
    lw      s5,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,48
source code :
static volatile u_long *dicr = (void *)0x1f8010f4;

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

typedef struct
{
    u_long  madr;
    u_long  bcr;
    u_long  chcr;
    long    pad;
} DMA;

static DMA *dma = (void *)0x1f801080;

static void trapIntrDMA()
{
    int i;
    u_long mask;

    while(mask = (*dicr >> 24) & 0x7f)
    {
        i = 0;

        while(mask && i<7)
        {
            if(mask & 1)
            {
                *dicr &= (1 << (24 + i)) | 0xffffff;

                if(cbIntrDMA[i])
                    cbIntrDMA[i]();
            }

            i++;
            mask >>= 1;
        }
    }

    if(((*dicr & 0xff000000) == 0x80000000) || (*dicr & 0x8000))
    {
        printf("DMA bus error: code=%08x\n", *dicr);
        for(i=0; i<7; i++)
            printf("MADR[%d]=%08x\n", i, dma[i].madr);
    }
}
reversed listing :
trapIntrDMA:
    lw      $2,dicr
    subu    $sp,$sp,48
    sw      $31,40($sp)
    sw      $21,36($sp)
    sw      $20,32($sp)
    sw      $19,28($sp)
    sw      $18,24($sp)
    sw      $17,20($sp)
    sw      $16,16($sp)
    lw      $2,0($2)
    nop
    srl     $2,$2,24
    andi    $17,$2,0x007f
    beq     $17,$0,$L3
    nop
    li      $20,0x00000001
    li      $19,0x00ff0000
    ori     $19,$19,0xffff
    la      $21,cbIntrDMA
$L4:
    beq     $17,$0,$L2
    move    $16,$0
    move    $18,$21
$L11:
    slt     $2,$16,7
    beq     $2,$0,$L2
    andi    $2,$17,0x0001
    beq     $2,$0,$L9
    addu    $2,$16,24
    lw      $4,dicr
    sll     $2,$20,$2
    lw      $3,0($4)
    or      $2,$2,$19
    and     $3,$3,$2
    sw      $3,0($4)
    lw      $2,0($18)
    nop
    beq     $2,$0,$L9
    nop
    jal     $31,$2
    nop
$L9:
    addu    $18,$18,4
    srl     $17,$17,1
    bne     $17,$0,$L11
    addu    $16,$16,1
$L2:
    lw      $2,dicr
    nop
    lw      $2,0($2)
    nop
    srl     $2,$2,24
    andi    $17,$2,0x007f
    bne     $17,$0,$L4
    nop
$L3:
    lw      $5,dicr
    nop
    lw      $2,0($5)
    li      $3,0xff000000
    and     $2,$2,$3
    li      $3,0x80000000
    beq     $2,$3,$L14
    nop
    lw      $2,0($5)
    nop
    andi    $2,$2,0x8000
    beq     $2,$0,$L13
    nop
$L14:
    la      $4,$LC0
    lw      $5,0($5)
    jal     printf
    move    $16,$0
$L18:
    la      $4,$LC1
    move    $5,$16
    lw      $2,dma
    sll     $3,$16,4
    addu    $3,$3,$2
    lw      $6,0($3)
    jal     printf
    addu    $16,$16,1
    slt     $2,$16,7
    bne     $2,$0,$L18
    nop
$L13:
    lw      $31,40($sp)
    lw      $21,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,48
coincidence: 100%

STATUS: COMPLETE
15 Apr 2003
Hosted by uCoz