aboutsummaryrefslogtreecommitdiff
path: root/libpcsxcore/new_dynarec/pcsxmem_inline.c
diff options
context:
space:
mode:
authornotaz2011-10-11 23:03:03 +0300
committernotaz2011-10-30 23:48:07 +0200
commitb1be1eeee94d3547c20719acfa6b0082404897f1 (patch)
tree6c6169ff7fa815a1097e75f7ad5ecf8f226a5554 /libpcsxcore/new_dynarec/pcsxmem_inline.c
parent9f7ee52edab5d7ba8f7da69f3c15d1d0025bd15b (diff)
downloadpcsx_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.c55
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