aboutsummaryrefslogtreecommitdiff
path: root/libpcsxcore
diff options
context:
space:
mode:
authornotaz2011-01-14 12:14:05 +0200
committernotaz2011-01-16 00:03:52 +0200
commit9ad4d757bdb3bc5081e0cdaa534a04a1371de0b3 (patch)
treee033bcd51bf21ef6c578ead56e1126e2a6762ae5 /libpcsxcore
parent447783f8d0108feedf3a5801c1f61853d046a733 (diff)
downloadpcsx_rearmed-9ad4d757bdb3bc5081e0cdaa534a04a1371de0b3.tar.gz
pcsx_rearmed-9ad4d757bdb3bc5081e0cdaa534a04a1371de0b3.tar.bz2
pcsx_rearmed-9ad4d757bdb3bc5081e0cdaa534a04a1371de0b3.zip
drc: rework bios fastboot hack a bit
it was not handling reloads/resets well.
Diffstat (limited to 'libpcsxcore')
-rw-r--r--libpcsxcore/new_dynarec/new_dynarec.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/libpcsxcore/new_dynarec/new_dynarec.c b/libpcsxcore/new_dynarec/new_dynarec.c
index 347fd3d..6061f51 100644
--- a/libpcsxcore/new_dynarec/new_dynarec.c
+++ b/libpcsxcore/new_dynarec/new_dynarec.c
@@ -385,9 +385,6 @@ void *get_addr(u_int vaddr)
//printf("TRACE: count=%d next=%d (get_addr no-match %x)\n",Count,next_interupt,vaddr);
int r=new_recompile_block(vaddr);
if(r==0) return get_addr(vaddr);
-#ifdef PCSX
- return (void *)r;
-#else
// Execute in unmapped page, generate pagefault execption
Status|=2;
Cause=(vaddr<<31)|0x8;
@@ -396,7 +393,6 @@ void *get_addr(u_int vaddr)
Context=(Context&0xFF80000F)|((BadVAddr>>9)&0x007FFFF0);
EntryHi=BadVAddr&0xFFFFE000;
return get_addr_ht(0x80000000);
-#endif
}
// Look up address in hash table first
void *get_addr_ht(u_int vaddr)
@@ -7747,8 +7743,7 @@ int new_recompile_block(int addr)
start = (u_int)addr&~3;
//assert(((u_int)addr&1)==0);
#ifdef PCSX
- if ((Config.HLE && start == 0x80001000) || // hlecall
- (/*psxRegs.pc != 0x80030000 &&*/ start == 0x80030000)) // fastbios thing
+ if (Config.HLE && start == 0x80001000) // hlecall
{
// XXX: is this enough? Maybe check hleSoftCall?
u_int beginning=(u_int)out;
@@ -7760,10 +7755,7 @@ int new_recompile_block(int addr)
#ifdef __arm__
__clear_cache((void *)beginning,out);
#endif
- if (start == 0x80030000)
- return beginning;
- else
- ll_add(jump_in+page,start,(void *)beginning);
+ ll_add(jump_in+page,start,(void *)beginning);
return 0;
}
else if ((u_int)addr < 0x00200000 ||
@@ -10515,6 +10507,19 @@ int new_recompile_block(int addr)
ds=1;
pagespan_ds();
}
+ u_int instr_addr0_override=0;
+
+#ifdef PCSX
+ if (start == 0x80030000) {
+ // nasty hack for fastbios thing
+ instr_addr0_override=(u_int)out;
+ emit_movimm(start,0);
+ emit_readword((int)&pcaddr,1);
+ emit_writeword(0,(int)&pcaddr);
+ emit_cmp(0,1);
+ emit_jne((int)new_dyna_leave);
+ }
+#endif
for(i=0;i<slen;i++)
{
//if(ds) printf("ds: ");
@@ -10708,6 +10713,9 @@ int new_recompile_block(int addr)
}
}
+ if (instr_addr0_override)
+ instr_addr[0] = instr_addr0_override;
+
/* Pass 9 - Linker */
for(i=0;i<linkcount;i++)
{