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