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
|