drc: fix BxxZAL
[pcsx_rearmed.git] / libpcsxcore / new_dynarec / assem_arm.c
index 633eeac..515f7c4 100644 (file)
@@ -2912,7 +2912,7 @@ do_unalignedwritestub(int n)
 #endif
     emit_xorimm(temp,24,temp);
   emit_movimm(-1,HOST_TEMPREG);
-  if (opcode[i]==0x2e) { // SWR
+  if (opcode[i]==0x2a) { // SWL
     emit_bic_lsr(temp2,HOST_TEMPREG,temp,temp2);
     emit_orrshr(rt,temp,temp2);
   }else{
@@ -2959,15 +2959,19 @@ do_invstub(int n)
 int do_dirty_stub(int i)
 {
   assem_debug("do_dirty_stub %x\n",start+i*4);
+  u_int addr=(int)start<(int)0xC0000000?(u_int)source:(u_int)start;
+  #ifdef PCSX
+  addr=(u_int)source;
+  #endif
   // Careful about the code output here, verify_dirty needs to parse it.
   #ifdef ARMv5_ONLY
-  emit_loadlp((int)start<(int)0xC0000000?(int)source:(int)start,1);
+  emit_loadlp(addr,1);
   emit_loadlp((int)copy,2);
   emit_loadlp(slen*4,3);
   #else
-  emit_movw(((int)start<(int)0xC0000000?(u_int)source:(u_int)start)&0x0000FFFF,1);
+  emit_movw(addr&0x0000FFFF,1);
   emit_movw(((u_int)copy)&0x0000FFFF,2);
-  emit_movt(((int)start<(int)0xC0000000?(u_int)source:(u_int)start)&0xFFFF0000,1);
+  emit_movt(addr&0xFFFF0000,1);
   emit_movt(((u_int)copy)&0xFFFF0000,2);
   emit_movw(slen*4,3);
   #endif
@@ -3238,7 +3242,7 @@ void loadlr_assemble_arm(int i,struct regstat *i_regs)
   else addr=s;
   if(s>=0) {
     c=(i_regs->wasconst>>s)&1;
-    memtarget=((signed int)(constmap[i][s]+offset))<(signed int)0x80800000;
+    memtarget=((signed int)(constmap[i][s]+offset))<(signed int)0x80000000+RAM_SIZE;
     if(using_tlb&&((signed int)(constmap[i][s]+offset))>=(signed int)0xC0000000) memtarget=1;
   }
   if(tl>=0) {
@@ -3252,7 +3256,7 @@ void loadlr_assemble_arm(int i,struct regstat *i_regs)
         }else{
           emit_andimm(addr,0xFFFFFFF8,temp2); // LDL/LDR
         }
-        emit_cmpimm(addr,0x800000);
+        emit_cmpimm(addr,RAM_SIZE);
         jaddr=(int)out;
         emit_jno(0);
       }