#define ndrc_try_restore_block ESYM(ndrc_try_restore_block)
#define ndrc_get_addr_ht ESYM(ndrc_get_addr_ht)
#define ndrc_get_addr_ht_param ESYM(ndrc_get_addr_ht_param)
-#define ndrc_invalidate_addr ESYM(ndrc_invalidate_addr)
+#define ndrc_write_invalidate_one ESYM(ndrc_write_invalidate_one)
#define gen_interupt ESYM(gen_interupt)
#define gteCheckStallRaw ESYM(gteCheckStallRaw)
#define psxException ESYM(psxException)
add r10, r0, r10
str r1, [fp, #LO_pending_exception]
str r10, [fp, #LO_cycle] /* PCSX cycles */
-@@ str r10, [fp, #LO_reg_cop0+36] /* Count - not on PSX */
mov r10, lr
+ add r0, fp, #LO_reg_cop0 /* CP0 */
bl gen_interupt
mov lr, r10
ldr r10, [fp, #LO_cycle]
.size cc_interrupt, .-cc_interrupt
.align 2
-FUNCTION(fp_exception):
- mov r2, #0x10000000
-.E7:
- ldr r1, [fp, #LO_reg_cop0+48] /* Status */
- mov r3, #0x80000000
- str r0, [fp, #LO_reg_cop0+56] /* EPC */
- orr r1, #2
- add r2, r2, #0x2c
- str r1, [fp, #LO_reg_cop0+48] /* Status */
- str r2, [fp, #LO_reg_cop0+52] /* Cause */
- add r0, r3, #0x80
- bl ndrc_get_addr_ht
- mov pc, r0
- .size fp_exception, .-fp_exception
- .align 2
-FUNCTION(fp_exception_ds):
- mov r2, #0x90000000 /* Set high bit if delay slot */
- b .E7
- .size fp_exception_ds, .-fp_exception_ds
-
- .align 2
+FUNCTION(jump_addrerror_ds): /* R3000E_AdEL / R3000E_AdES in r0 */
+ str r1, [fp, #(LO_psxRegs + (34+8)*4)] /* BadVaddr */
+ mov r1, #1
+ b call_psxException
+FUNCTION(jump_addrerror):
+ str r1, [fp, #(LO_psxRegs + (34+8)*4)] /* BadVaddr */
+ mov r1, #0
+ b call_psxException
+FUNCTION(jump_overflow_ds):
+ mov r0, #(12<<2) /* R3000E_Ov */
+ mov r1, #1
+ b call_psxException
+FUNCTION(jump_overflow):
+ mov r0, #(12<<2)
+ mov r1, #0
+ b call_psxException
FUNCTION(jump_break_ds):
- mov r0, #0x24
+ mov r0, #(9<<2) /* R3000E_Bp */
mov r1, #1
b call_psxException
FUNCTION(jump_break):
- mov r0, #0x24
+ mov r0, #(9<<2)
mov r1, #0
b call_psxException
FUNCTION(jump_syscall_ds):
- mov r0, #0x20
- mov r1, #1
+ mov r0, #(8<<2) /* R3000E_Syscall */
+ mov r1, #2
b call_psxException
FUNCTION(jump_syscall):
- mov r0, #0x20
+ mov r0, #(8<<2)
mov r1, #0
call_psxException:
ldr r3, [fp, #LO_last_count]
str r2, [fp, #LO_pcaddr]
add r10, r3, r10
- str r10, [fp, #LO_cycle] /* PCSX cycles */
+ str r10, [fp, #LO_cycle] /* PCSX cycles */
+ add r2, fp, #LO_reg_cop0 /* CP0 */
bl psxException
/* note: psxException might do recursive recompiler call from it's HLE code,
ldr lr, [fp, #LO_inv_code_end]
cmp r0, r12
cmpcs lr, r0
- blcc ndrc_invalidate_addr
+ blcc ndrc_write_invalidate_one
ldmia fp, {r0, r1, r2, r3, EXTRA_UNSAVED_REGS r12, pc}
.size invalidate_addr_call, .-invalidate_addr_call
mov r12,r0,lsr #12
ldr r3, [r3, r12, lsl #2]
lsls r3, #1
- bcs 4f
+ bcs jump_handle_swx_interp
add r3, r0, r3
mov r0, r2
tst r3, #2
strhne r1, [r3, #-1]
strbeq r12, [r3]
bx lr
-4:
- mov r0, r2
-@ b abort
- bx lr @ TODO?
-
FUNCTION(jump_handle_swr):
/* r0 = address, r1 = data, r2 = cycles */
mov r12,r0,lsr #12
ldr r3, [r3, r12, lsl #2]
lsls r3, #1
- bcs 4f
+ bcs jump_handle_swx_interp
add r3, r0, r3
and r12,r3, #3
mov r0, r2
strb r1, [r3]
strh r2, [r3, #1]
bx lr
-4:
- mov r0, r2
-@ b abort
- bx lr @ TODO?
+jump_handle_swx_interp: /* almost never happens */
+ ldr r3, [fp, #LO_last_count]
+ add r0, fp, #LO_psxRegs
+ add r2, r3, r2
+ str r2, [fp, #LO_cycle] /* PCSX cycles */
+ bl execI
+ b jump_to_new_pc
.macro rcntx_read_mode0 num
/* r0 = address, r2 = cycles */