X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fnew_dynarec%2Flinkage_arm.S;h=d2d6d8740665c3f2e3088c8b72e20160062a765d;hb=a01b90c372831080aa3f9dedf5251f76f300038c;hp=7a6d2edd827c2dfd04c2bbaae5497124cdfdc9ea;hpb=bc7c5acb6eb1ac9adc6b4381a2c2b2baffd5aebe;p=pcsx_rearmed.git diff --git a/libpcsxcore/new_dynarec/linkage_arm.S b/libpcsxcore/new_dynarec/linkage_arm.S index 7a6d2edd..d2d6d874 100644 --- a/libpcsxcore/new_dynarec/linkage_arm.S +++ b/libpcsxcore/new_dynarec/linkage_arm.S @@ -239,10 +239,9 @@ FUNCTION(cc_interrupt): 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_psxRegs + 34*4) /* CP0 */ + add r0, fp, #LO_reg_cop0 /* CP0 */ bl gen_interupt mov lr, r10 ldr r10, [fp, #LO_cycle] @@ -261,41 +260,36 @@ 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 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: @@ -303,17 +297,20 @@ call_psxException: str r2, [fp, #LO_pcaddr] add r10, r3, r10 str r10, [fp, #LO_cycle] /* PCSX cycles */ - add r2, fp, #(LO_psxRegs + 34*4) /* CP0 */ + add r2, fp, #LO_reg_cop0 /* CP0 */ bl psxException /* note: psxException might do recursive recompiler call from it's HLE code, * so be ready for this */ FUNCTION(jump_to_new_pc): + ldr r2, [fp, #LO_stop] ldr r1, [fp, #LO_next_interupt] ldr r10, [fp, #LO_cycle] ldr r0, [fp, #LO_pcaddr] - sub r10, r10, r1 + tst r2, r2 str r1, [fp, #LO_last_count] + sub r10, r10, r1 + bne new_dyna_leave bl ndrc_get_addr_ht mov pc, r0 .size jump_to_new_pc, .-jump_to_new_pc @@ -523,7 +520,7 @@ FUNCTION(jump_handle_swl): 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 @@ -546,11 +543,6 @@ FUNCTION(jump_handle_swl): 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 */ @@ -558,7 +550,7 @@ FUNCTION(jump_handle_swr): 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 @@ -572,11 +564,14 @@ FUNCTION(jump_handle_swr): 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 */