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