#include #include # hacketty smackety # all a product of a deranged mind. # Jim pitts 29-9-97. www.playstation.co.uk/~Sig1LL #define C_SR 0 #define C_EPC 1 #define C_AT 2 #define C_V0 3 #define C_V1 4 #define C_A0 5 #define C_A1 6 #define C_A2 7 #define C_A3 8 #define C_T0 9 #define C_T1 10 #define C_T2 11 #define C_T3 12 #define C_T4 13 #define C_T5 14 #define C_T6 15 #define C_T7 16 #define C_T8 17 #define C_T9 18 #define C_RA 19 #define C_LO 20 #define C_HI 21 #define C_SIZE 22 .text .align 4 .globl OldHandler .globl OldHandlerEnd .globl ExceptionHandler .globl ExceptionHandlerEnd .extern CallBack .set noreorder .set noat NewHand: #not all these regs need to be saved # infact only at,v0,v1 and of course ra # All done "to be sure, to be sure" subu sp, C_SIZE*4 sw AT, C_AT*4(sp) sw v0, C_V0*4(sp) sw v1, C_V1*4(sp) sw a0, C_A0*4(sp) sw a1, C_A1*4(sp) sw a2, C_A2*4(sp) sw a3, C_A3*4(sp) sw t0, C_T0*4(sp) sw t1, C_T1*4(sp) sw t2, C_T2*4(sp) sw t3, C_T3*4(sp) sw t4, C_T4*4(sp) sw t5, C_T5*4(sp) sw t6, C_T6*4(sp) sw t7, C_T7*4(sp) sw t8, C_T8*4(sp) sw t9, C_T9*4(sp) sw ra, C_RA*4(sp) mflo t0 sw t0, C_LO*4(sp) mfhi t0 sw t0, C_HI*4(sp) mfc0 a0, C0_CAUSE mfc0 a1, C0_SR jal CallBack # off in to c land nop # restore every thing lw AT, C_AT*4(sp) lw v0, C_V0*4(sp) lw v1, C_V1*4(sp) lw a0, C_A0*4(sp) lw a1, C_A1*4(sp) lw a2, C_A2*4(sp) lw a3, C_A3*4(sp) lw t1, C_T1*4(sp) lw t2, C_T2*4(sp) lw t3, C_T3*4(sp) lw t4, C_T4*4(sp) lw t5, C_T5*4(sp) lw t6, C_T6*4(sp) lw t7, C_T7*4(sp) lw t8, C_T8*4(sp) lw t9, C_T9*4(sp) lw ra, C_RA*4(sp) lw t0, C_LO*4(sp) mtlo t0 lw t0, C_HI*4(sp) mthi t0 lw t0, C_T0*4(sp) addu sp, C_SIZE*4 # relink to old handler add k0, zero, 0xc80 jr k0 nop NewHandEnd: #patch that sucker ExceptionHandler: la k0, NewHand jr k0 nop ExceptionHandlerEnd: # the old fella OldHandler: addiu k0, zero, 0xc80 jr k0 nop OldHandlerEnd: