startIntr: addiu sp,sp,-24 sw s0,16(sp) lui s0,_hi(data_58) addiu s0,s0,_lo(data_58) sw ra,20(sp) lhu v0,0(s0) nop bnez v0,text_25C move v0,zero lui v1,_hi(data_10E4) lw v1,_lo(data_10E4)(v1) lui v0,_hi(data_10E8) lw v0,_lo(data_10E8)(v0) lui a1,$3333 sh zero,0(v0) lhu v0,0(v0) ori a1,a1,$3333 sh v0,0(v1) lui v0,_hi(data_10EC) lw v0,_lo(data_10EC)(v0) move a0,s0 sw a1,0(v0) jal text_69C li a1,1050 jal setjmp addiu a0,s0,56 beqz v0,text_20C nop jal text_26C nop text_20C: lui s0,_hi(data_94) addiu s0,s0,_lo(data_94) addiu a0,s0,-4 addiu v0,s0,4060 jal HookEntryInt sw v0,0(s0) li v0,1 jal startIntrVSync sh v0,-60(s0) lui v1,_hi(data_10E0) lw v1,_lo(data_10E0)(v1) jal startIntrDMA sw v0,20(v1) lui a0,_hi(data_10E0) lw a0,_lo(data_10E0)(a0) jal _96_remove sw v0,4(a0) jal ExitCriticalSection addiu s0,s0,-60 move v0,s0 text_25C: lw ra,20(sp) lw s0,16(sp) jr ra addiu sp,sp,24 |
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_reg = (void *)0x1f801070; static volatile u_short *int_mask = (void *)0x1f801074; static u_long *dpcr = (void *)0x1f8010f0; static void *startIntr() { if(!intrData.started) { *int_reg = *int_mask = 0; *dpcr = 0x33333333; memclr(&intrData, sizeof(intrData) / 4); if(setjmp(intrData.trap)) trapIntr(); (void *)intrData.trap[JB_SP] = &intrData.stack[0xfb0]; HookEntryInt(intrData.trap); intrData.started = 1; intrCB->setIntrVSync = startIntrVSync(); intrCB->setIntrDMA = startIntrDMA(); _96_remove(); ExitCriticalSection(); return &intrData; } else return NULL; } |
startIntr: subu $sp,$sp,24 sw $16,16($sp) la $16,intrData sw $31,20($sp) lhu $2,0($16) nop bne $2,$0,$L11 move $2,$0 lw $3,int_reg lw $2,int_mask li $5,0x33330000 sh $0,0($2) lhu $2,0($2) ori $5,$5,0x3333 sh $2,0($3) lw $2,dpcr move $4,$16 sw $5,0($2) jal memclr li $5,0x0000041a jal setjmp addu $4,$16,56 beq $2,$0,$L12 jal trapIntr $L12: la $16,intrData+60 addu $4,$16,-4 addu $2,$16,4060 jal HookEntryInt sw $2,0($16) li $2,0x00000001 jal startIntrVSync sh $2,-60($16) lw $3,intrCB jal startIntrDMA sw $2,20($3) lw $3,intrCB jal _96_remove sw $2,4($3) jal ExitCriticalSection addu $16,$16,-60 move $2,$16 $L11: lw $31,20($sp) lw $16,16($sp) j $31 addu $sp,$sp,24 |