drc: optional address error exception support
[pcsx_rearmed.git] / libpcsxcore / new_dynarec / linkage_arm.S
index 513911c..a7f4d79 100644 (file)
@@ -30,7 +30,7 @@
 #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)
@@ -242,6 +242,7 @@ FUNCTION(cc_interrupt):
 @@     str     r10, [fp, #LO_reg_cop0+36]      /* Count - not on PSX */
        mov     r10, lr
 
+       add     r0, fp, #(LO_psxRegs + 34*4)    /* CP0 */
        bl      gen_interupt
        mov     lr, r10
        ldr     r10, [fp, #LO_cycle]
@@ -260,48 +261,44 @@ FUNCTION(cc_interrupt):
        .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_psxRegs + 34*4)    /* CP0 */
        bl      psxException
 
        /* note: psxException might do recursive recompiler call from it's HLE code,
@@ -401,7 +398,7 @@ invalidate_addr_call:
        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