diff options
author | notaz | 2011-10-11 23:03:03 +0300 |
---|---|---|
committer | notaz | 2011-10-30 23:48:07 +0200 |
commit | b1be1eeee94d3547c20719acfa6b0082404897f1 (patch) | |
tree | 6c6169ff7fa815a1097e75f7ad5ecf8f226a5554 /libpcsxcore/new_dynarec/pcsxmem_inline.c | |
parent | 9f7ee52edab5d7ba8f7da69f3c15d1d0025bd15b (diff) | |
download | pcsx_rearmed-b1be1eeee94d3547c20719acfa6b0082404897f1.tar.gz pcsx_rearmed-b1be1eeee94d3547c20719acfa6b0082404897f1.tar.bz2 pcsx_rearmed-b1be1eeee94d3547c20719acfa6b0082404897f1.zip |
inline/parametrize rootcounter reads
makes rcnt1 hack impossible though, overclock PSX instead
Diffstat (limited to 'libpcsxcore/new_dynarec/pcsxmem_inline.c')
-rw-r--r-- | libpcsxcore/new_dynarec/pcsxmem_inline.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/libpcsxcore/new_dynarec/pcsxmem_inline.c b/libpcsxcore/new_dynarec/pcsxmem_inline.c new file mode 100644 index 0000000..210ce0e --- /dev/null +++ b/libpcsxcore/new_dynarec/pcsxmem_inline.c @@ -0,0 +1,55 @@ +/* + * (C) GraÅžvydas "notaz" Ignotas, 2011 + * + * This work is licensed under the terms of GNU GPL version 2 or later. + * See the COPYING file in the top-level directory. + */ + +static int pcsx_direct_read(int type, u_int addr, int cc_adj, int cc, int rs, int 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; + emit_readword((int)&rcnts[2].mode, HOST_TEMPREG); + emit_readword((int)&rcnts[2].cycleStart, rt); + emit_testimm(HOST_TEMPREG, 0x200); + emit_readword((int)&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); + 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((int)&rcnts[t].mode, rt); + emit_andimm(rt, ~0x1800, HOST_TEMPREG); + emit_writeword(HOST_TEMPREG, (int)&rcnts[t].mode); + mov_loadtype_adj(type, rt, rt); + goto hit; + } + } + else { + if (rt < 0) + goto dont_care; + } + + return 0; + +hit: + assem_debug("pcsx_direct_read %08x end\n", addr); + return 1; + +dont_care: + assem_debug("pcsx_direct_read %08x dummy\n", addr); + return 1; +} + +// vim:shiftwidth=2:expandtab |