configure: various fixes
[pcsx_rearmed.git] / libpcsxcore / new_dynarec / pcsxmem.c
index 2306ca7..f98ae22 100644 (file)
 #include "emu_if.h"
 #include "pcsxmem.h"
 
 #include "emu_if.h"
 #include "pcsxmem.h"
 
+#ifdef __thumb__
+#error the dynarec is incompatible with Thumb functions,
+#error please add -marm to compile flags
+#endif
+
 //#define memprintf printf
 #define memprintf(...)
 
 //#define memprintf printf
 #define memprintf(...)
 
@@ -28,8 +33,10 @@ static u32 mem_unmwtab[(1+2+4) * 0x1000 / 4];
 static void map_item(u32 *out, const void *h, u32 flag)
 {
        u32 hv = (u32)h;
 static void map_item(u32 *out, const void *h, u32 flag)
 {
        u32 hv = (u32)h;
-       if (hv & 1)
-               fprintf(stderr, "%p has LSB set\n", h);
+       if (hv & 1) {
+               fprintf(stderr, "FATAL: %p has LSB set\n", h);
+               abort();
+       }
        *out = (hv >> 1) | (flag << 31);
 }
 
        *out = (hv >> 1) | (flag << 31);
 }
 
@@ -212,9 +219,17 @@ static void io_spu_write32(u32 value)
 
 static u32 io_gpu_read_status(void)
 {
 
 static u32 io_gpu_read_status(void)
 {
+       u32 v;
+
        // meh2, syncing for img bit, might want to avoid it..
        gpuSyncPluginSR();
        // meh2, syncing for img bit, might want to avoid it..
        gpuSyncPluginSR();
-       return HW_GPU_STATUS;
+       v = HW_GPU_STATUS;
+
+       // XXX: because of large timeslices can't use hSyncCount, using rough
+       // approximization instead. Perhaps better use hcounter code here or something.
+       if (hSyncCount < 240 && (HW_GPU_STATUS & PSXGPU_ILACE_BITS) != PSXGPU_ILACE_BITS)
+               v |= PSXGPU_LCF & (psxRegs.cycle << 20);
+       return v;
 }
 
 static void io_gpu_write_status(u32 value)
 }
 
 static void io_gpu_write_status(u32 value)
@@ -285,9 +300,15 @@ void new_dyna_pcsx_mem_init(void)
 {
        int i;
 
 {
        int i;
 
+#ifdef CUSTOM_MEMMAPS
+       // WIZ lack-of-RAM hack
+       extern void *memtab_mmap(void *addr, size_t size);
+       mem_readtab = memtab_mmap((void *)0x08000000, 0x200000 * 4);
+#else
        // have to map these further to keep tcache close to .text
        mem_readtab = mmap((void *)0x08000000, 0x200000 * 4, PROT_READ | PROT_WRITE,
                MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
        // have to map these further to keep tcache close to .text
        mem_readtab = mmap((void *)0x08000000, 0x200000 * 4, PROT_READ | PROT_WRITE,
                MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+#endif
        if (mem_readtab == MAP_FAILED) {
                fprintf(stderr, "failed to map mem tables\n");
                exit(1);
        if (mem_readtab == MAP_FAILED) {
                fprintf(stderr, "failed to map mem tables\n");
                exit(1);