SBSPSS/source/system/except_a.mip
2000-10-20 21:52:46 +00:00

272 lines
3.4 KiB
Plaintext

opt at-,c+
xref exc_c
xdef install_exc
xdef uninstall_exc
xdef reg_lst
xdef dev_kit
rsreset
OFS_AT rw 1
OFS_V0 rw 1
OFS_V1 rw 1
OFS_A0 rw 1
OFS_A1 rw 1
OFS_A2 rw 1
OFS_A3 rw 1
OFS_T0 rw 1
OFS_T1 rw 1
OFS_T2 rw 1
OFS_T3 rw 1
OFS_T4 rw 1
OFS_T5 rw 1
OFS_T6 rw 1
OFS_T7 rw 1
OFS_S0 rw 1
OFS_S1 rw 1
OFS_S2 rw 1
OFS_S3 rw 1
OFS_S4 rw 1
OFS_S5 rw 1
OFS_S6 rw 1
OFS_S7 rw 1
OFS_T8 rw 1
OFS_T9 rw 1
OFS_GP rw 1
OFS_SP rw 1
OFS_FP rw 1
OFS_RA rw 1
OFS_HI rw 1
OFS_LO rw 1
OFS_SR rw 1
OFS_CA rw 1
OFS_EPC rw 1
section .text
;-------------------------------- install_exc ----------------------------
install_exc
la t0,exc_onoff
lw t1,0(t0)
nop
beqz t1,exc_off
nop
jr ra
nop
exc_off li t1,1
sw t1,0(t0)
;detect dev_kit
la t0,dev_kit
lw t1,0(t0)
nop
bgez t1,dev_2 ;just chk once
nop
lw t1,$80(zero)
move t2,zero
lui t3,$3c1a
or t3,t3,$1fa0
beq t1,t3,dev_0 ;DTL-H2000
lui t3,$3c1a
or t3,t3,$1fc2
beq t1,t3,dev_0 ;DTL-H2500
nop
b dev_1
nop
dev_0 li t2,1
dev_1 sw t2,0(t0)
dev_2
;install new exception-handler
; mfc0 v0,SR
dw $40026000
lui at,$ffff
or at,at,$00fc ;mask off IM,KUc,IEc
and at,at,v0
; mtc0 at,SR
dw $40816000
nop
li t0,$80
la t1,old_handler
lw t2,0(t0)
lw t3,4(t0)
lw t4,8(t0)
lw t5,12(t0)
sw t2,0(t1)
sw t3,4(t1)
sw t4,8(t1)
sw t5,12(t1)
la t1,new_exc_code
lw t2,0(t1)
lw t3,4(t1)
lw t4,8(t1)
lw t5,12(t1)
sw t2,0(t0)
sw t3,4(t0)
sw t4,8(t0)
sw t5,12(t0)
; mtc0 v0,SR ;restore irq
dw $40826000
nop
jr ra
nop
new_exc_code
la k0,exc_asm
jr k0
nop
;------------------------------- uninstall_exc ----------------------------
uninstall_exc
la t0,exc_onoff
lw t1,0(t0)
nop
bnez t1,exc_on
nop
jr ra
nop
exc_on li t1,0
sw t1,0(t0)
; mfc0 v0,SR
dw $40026000
lui at,$ffff
or at,at,$00fc ;mask off IM,KUc,IEc
and at,at,v0
; mtc0 at,SR
dw $40816000
nop
la t0,old_handler
li t1,$80
lw t2,0(t0)
lw t3,4(t0)
lw t4,8(t0)
lw t5,12(t0)
sw t2,0(t1)
sw t3,4(t1)
sw t4,8(t1)
sw t5,12(t1)
; mtc0 v0,SR ;restore irq
dw $40826000
nop
jr ra
nop
;------------------------------- exc_asm ----------------------------
exc_asm
; mfc0 k0,Cause
dw $401a6800
nop
li k1,%1111011111110
srl k0,k0,2
andi k0,k0,$1f
srlv k1,k1,k0
andi k1,k1,1
beqz k1,old_handler
nop
;chk break
li k1,9
bne k0,k1,go_on
nop
; mfc0 k0,EPC
dw $401a7000
nop
lw k0,0(k0)
nop
srl k0,k0,16
li k1,6
beq k0,k1,go_on
li k1,7
beq k0,k1,go_on
nop
old_handler
nop
nop
nop
nop
go_on la k0,reg_save
sw at,OFS_AT(k0)
sw v0,OFS_V0(k0)
sw v1,OFS_V1(k0)
sw a0,OFS_A0(k0)
sw a1,OFS_A1(k0)
sw a2,OFS_A2(k0)
sw a3,OFS_A3(k0)
sw t0,OFS_T0(k0)
sw t1,OFS_T1(k0)
sw t2,OFS_T2(k0)
sw t3,OFS_T3(k0)
sw t4,OFS_T4(k0)
sw t5,OFS_T5(k0)
sw t6,OFS_T6(k0)
sw t7,OFS_T7(k0)
sw s0,OFS_S0(k0)
sw s1,OFS_S1(k0)
sw s2,OFS_S2(k0)
sw s3,OFS_S3(k0)
sw s4,OFS_S4(k0)
sw s5,OFS_S5(k0)
sw s6,OFS_S6(k0)
sw s7,OFS_S7(k0)
sw t8,OFS_T8(k0)
sw t9,OFS_T9(k0)
sw gp,OFS_GP(k0)
sw sp,OFS_SP(k0)
sw fp,OFS_FP(k0)
sw ra,OFS_RA(k0)
mfhi k1
nop
sw k1,OFS_HI(k0)
mflo k1
nop
sw k1,OFS_LO(k0)
; mfc0 k1,SR
dw $401b6000
nop
sw k1,OFS_SR(k0)
; mfc0 k1,Cause
dw $401b6800
nop
sw k1,OFS_CA(k0)
; mfc0 k1,EPC
dw $401b7000
nop
nop
sw k1,OFS_EPC(k0)
la k0,exc_c
jr k0
nop
section .data
dev_kit dw -1 ;-1=undefined, 0=playstation, 1=devkit
exc_onoff dw 0 ;internal exc-handler status onoff-flag
reg_lst dw reg_save
section .bss
reg_save dsw 34