cdrom: change pause timing again
[pcsx_rearmed.git] / libpcsxcore / new_dynarec / pcsxmem_inline.c
index 30338eb..69227f2 100644 (file)
  * 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