X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fnew_dynarec%2Fpcsxmem_inline.c;h=305931ae394c3b9bff68dd7b81318a1f4c2a0ce2;hp=30338eb8a2544047bf2f55fc02dde9abd3a30eba;hb=HEAD;hpb=274c424338d914fdc0076306c769ba4fadeebdaa diff --git a/libpcsxcore/new_dynarec/pcsxmem_inline.c b/libpcsxcore/new_dynarec/pcsxmem_inline.c index 30338eb8..69227f2a 100644 --- a/libpcsxcore/new_dynarec/pcsxmem_inline.c +++ b/libpcsxcore/new_dynarec/pcsxmem_inline.c @@ -5,123 +5,66 @@ * See the COPYING file in the top-level directory. */ -static int emit_ldr_type(int type, int offs, int rs, int rt) -{ - switch(type) { - case LOADB_STUB: - emit_movsbl_indexed(offs,rs,rt); - break; - case LOADBU_STUB: - emit_movzbl_indexed(offs,rs,rt); - break; - case LOADH_STUB: - emit_movswl_indexed(offs,rs,rt); - break; - case LOADHU_STUB: - emit_movzwl_indexed(offs,rs,rt); - break; - case LOADW_STUB: - emit_readword_indexed(offs,rs,rt); - break; - default: - assert(0); - } -} +#ifndef DRC_DBG -static int emit_str_type(int type, int offs, int rs, int rt) +static int pcsx_direct_read(int type, u_int addr, int cc_adj, int cc, int rs, int rt) { - switch(type) { - case STOREB_STUB: - emit_writebyte_indexed(rt,offs,rs); - break; - case STOREH_STUB: - emit_writehword_indexed(rt,offs,rs); - break; - case STOREW_STUB: - emit_writeword_indexed(rt,offs,rs); - break; - default: - assert(0); - } -} - -static void convert_ram_addr(u_int a_rs, u_int a_rt, int rs, int rt) -{ - if(rs<0) - emit_movimm(a_rt,rt); - else if((a_rs&~0x60000000)==a_rt) - emit_andimm(rs,~0x60000000,rt); - else if((a_rs&~0x00600000)==a_rt) - emit_andimm(rs,~0x00600000,rt); - else - emit_movimm(a_rt,rt); -} - -static int pcsx_direct_read(int type, u_int addr, int rs, int rt) -{ - if((addr & 0x1f800000) == 0) { - assem_debug("pcsx_direct_read %08x ram\n",addr); - if(rt<0) - return 1; - u_int a=(addr&~0x60600000)|0x80000000; - convert_ram_addr(addr,a,rs,rt); - emit_ldr_type(type,0,rt,rt); - return 1; - } - if((addr & 0x1ff80000) == 0x1fc00000) { - assem_debug("pcsx_direct_read %08x bios\n",addr); - if(rt<0) - return 1; - emit_movimm((u_int)&psxR[addr&0x7ffff],rt); - emit_ldr_type(type,0,rt,rt); - return 1; - } - if((addr & 0xfffff000) == 0x1f800000) { - assem_debug("pcsx_direct_read %08x scratchpad\n",addr); - if(rt<0) - return 1; - if(type==LOADW_STUB||type==LOADBU_STUB||(addr&0xf00)==0) { - emit_readword((int)&psxH_ptr,rt); - emit_ldr_type(type,addr&0xfff,rt,rt); - } else { - emit_movimm((u_int)&psxH[addr&0xfff],rt); - emit_ldr_type(type,0,rt,rt); + if ((addr & 0xfffff000) == 0x1f801000) { + u_int t; + switch (addr & 0xffff) { + case 0x1120: // rcnt2 count + if (rt < 0) goto dont_care; + if (cc < 0) return 0; + host_tempreg_acquire(); + emit_readword(&rcnts[2].mode, HOST_TEMPREG); + emit_readword(&rcnts[2].cycleStart, rt); + emit_testimm(HOST_TEMPREG, 0x200); + emit_readword(&last_count, HOST_TEMPREG); + emit_sub(HOST_TEMPREG, rt, HOST_TEMPREG); + emit_add(HOST_TEMPREG, cc, HOST_TEMPREG); + if (cc_adj) + emit_addimm(HOST_TEMPREG, cc_adj, rt); + host_tempreg_release(); + emit_shrne_imm(rt, 3, rt); + mov_loadtype_adj(type!=LOADW_STUB?type:LOADH_STUB, rt, rt); + goto hit; + case 0x1104: + case 0x1114: + case 0x1124: // rcnt mode + if (rt < 0) return 0; + t = (addr >> 4) & 3; + emit_readword(&rcnts[t].mode, rt); + host_tempreg_acquire(); + emit_andimm(rt, ~0x1800, HOST_TEMPREG); + emit_writeword(HOST_TEMPREG, &rcnts[t].mode); + host_tempreg_release(); + mov_loadtype_adj(type, rt, rt); + goto hit; } - return 1; + } + else { + if (rt < 0) + goto dont_care; } - assem_debug("pcsx_direct_read %08x miss\n",addr); return 0; -} -static int pcsx_direct_write(int type, u_int addr, int rs, int rt, signed char *regmap) -{ - if((addr & 0x1f800000) == 0) { - assem_debug("pcsx_direct_write %08x ram\n",addr); - u_int a=(addr&~0x60600000)|0x80000000; - convert_ram_addr(addr,a,rs,HOST_TEMPREG); - emit_str_type(type,0,HOST_TEMPREG,rt); +hit: + assem_debug("pcsx_direct_read %08x end\n", addr); + return 1; - int ir=get_reg(regmap,INVCP); - assert(ir>=0); - emit_cmpmem_indexedsr12_reg(ir,HOST_TEMPREG,1); - emit_callne(invalidate_addr_reg[rs]); - return 1; - } - if((addr & 0xfffff000) == 0x1f800000) { - assem_debug("pcsx_direct_write %08x scratchpad\n",addr); - if(type==STOREW_STUB||type==STOREB_STUB||(addr&0xf00)==0) { - emit_readword((int)&psxH_ptr,HOST_TEMPREG); - emit_str_type(type,addr&0xfff,HOST_TEMPREG,rt); - } else { - emit_movimm((u_int)&psxH[addr&0xfff],HOST_TEMPREG); - emit_str_type(type,0,HOST_TEMPREG,rt); - } - return 1; - } +dont_care: + assem_debug("pcsx_direct_read %08x dummy\n", addr); + return 1; +} + +#else - assem_debug("pcsx_direct_write %08x miss\n",addr); +static int pcsx_direct_read(int type, u_int addr, int cc_adj, int cc, int rs, int rt) +{ return 0; } +#endif + // vim:shiftwidth=2:expandtab