} dops[MAXBLOCK];
static u_char *out;
+ static char invalid_code[0x100000];
static struct ht_entry hash_table[65536];
static struct block_info *blocks[PAGE_COUNT];
static struct jump_info *jumps[PAGE_COUNT];
return ndrc_get_addr_ht(vaddr);
// generate an address error
- psxRegs.CP0.n.Status |= 2;
+ psxRegs.CP0.n.SR |= 2;
psxRegs.CP0.n.Cause = (vaddr<<31) | (4<<2);
psxRegs.CP0.n.EPC = (vaddr&1) ? vaddr-5 : vaddr;
psxRegs.CP0.n.BadVAddr = vaddr & ~1;
assert(dops[i].opcode2==0x10);
//if((source[i]&0x3f)==0x10) // RFE
{
- emit_readword(&psxRegs.CP0.n.Status,0);
+ emit_readword(&psxRegs.CP0.n.SR,0);
emit_andimm(0,0x3c,1);
emit_andimm(0,~0xf,0);
emit_orrshr_imm(1,2,0);
- emit_writeword(0,&psxRegs.CP0.n.Status);
+ emit_writeword(0,&psxRegs.CP0.n.SR);
}
}
}
//else {printf("fp exception in delay slot\n");}
wb_dirtys(i_regs->regmap_entry,i_regs->wasdirty);
if(regs[i].regmap_entry[HOST_CCREG]!=CCREG) emit_loadreg(CCREG,HOST_CCREG);
- emit_movimm(start+(i-ds)*4,EAX); // Get PC
+ emit_movimm(start+(i-ds)*4,0); // Get PC
emit_addimm(HOST_CCREG,ccadj[i],HOST_CCREG); // CHECK: is this right? There should probably be an extra cycle...
emit_far_jump(ds?fp_exception_ds:fp_exception);
}
emit_addimm(HOST_CCREG,ccadj_,HOST_CCREG);
emit_add(2,HOST_CCREG,2);
emit_writeword(2,&psxRegs.cycle);
+ emit_addimm_ptr(FP,(u_char *)&psxRegs - (u_char *)&dynarec_local,0);
emit_far_call(func);
emit_far_jump(jump_to_new_pc);
}
emit_far_jump(func);
}
+static void hlecall_bad()
+{
+ SysPrintf("bad hlecall\n");
+}
+
static void hlecall_assemble(int i, const struct regstat *i_regs, int ccadj_)
{
- void *hlefunc = gteNULL;
+ void *hlefunc = hlecall_bad;
uint32_t hleCode = source[i] & 0x03ffffff;
if (hleCode < ARRAY_SIZE(psxHLEt))
hlefunc = psxHLEt[hleCode];
if(stubs[n].c!=-1)
{
// Save PC as return address
- emit_movimm(stubs[n].c,EAX);
- emit_writeword(EAX,&pcaddr);
+ emit_movimm(stubs[n].c,0);
+ emit_writeword(0,&pcaddr);
}
else
{