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
|
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);
}
}
|
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
|