summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortwinaphex2014-12-10 17:06:09 +0100
committertwinaphex2014-12-10 17:06:09 +0100
commit51d78afa091d296e5545e69ed11201ee436053a1 (patch)
treede64f89c9c353493b471db18f32d10b89ba6733f
parent512f7f5b275ec011ff0bf406771fcbeada1caf29 (diff)
downloadpicogpsp-51d78afa091d296e5545e69ed11201ee436053a1.tar.gz
picogpsp-51d78afa091d296e5545e69ed11201ee436053a1.tar.bz2
picogpsp-51d78afa091d296e5545e69ed11201ee436053a1.zip
Add HAVE_DYNAREC ifdef
-rw-r--r--Makefile5
-rw-r--r--Makefile.common4
-rw-r--r--cpu.c5
-rw-r--r--cpu_threaded.c4
-rw-r--r--gba_memory.c42
-rw-r--r--jni/Android.mk2
-rw-r--r--libretro.c16
-rw-r--r--main.c2
-rw-r--r--main.h1
9 files changed, 59 insertions, 22 deletions
diff --git a/Makefile b/Makefile
index bdf1797..6e6d742 100644
--- a/Makefile
+++ b/Makefile
@@ -48,6 +48,7 @@ ifeq ($(platform), unix)
fpic := -fPIC
FORCE_32BIT := -m32
CPU_ARCH := x86_32
+ HAVE_DYNAREC := 1
SHARED := -shared $(FORCE_32BIT) -Wl,--version-script=link.T
ifneq ($(findstring Haiku,$(shell uname -a)),)
LIBM :=
@@ -215,6 +216,10 @@ OBJECTS := $(SOURCES_C:.c=.o) $(SOURCES_ASM:.S=.o)
DEFINES = -DHAVE_STRINGS_H -DHAVE_STDINT_H -DHAVE_INTTYPES_H -D__LIBRETRO__ -DINLINE=inline -DPC_BUILD -Wall -Werror=implicit-function-declaration
+ifeq ($(HAVE_DYNAREC), 1)
+DEFINES += -DHAVE_DYNAREC
+endif
+
ifeq ($(CPU_ARCH), arm)
DEFINES += -DARM_ARCH
endif
diff --git a/Makefile.common b/Makefile.common
index aef6d23..b1790da 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -18,6 +18,8 @@ SOURCES_C := $(CORE_DIR)/main.c \
endif
+ifeq ($(HAVE_DYNAREC), 1)
+
ifeq ($(CPU_ARCH), x86_32)
SOURCES_ASM += $(CORE_DIR)/x86/x86_stub.S
endif
@@ -27,4 +29,6 @@ SOURCES_ASM += $(CORE_DIR)/arm/arm_stub.S \
$(CORE_DIR)/arm/video_blend.S
endif
+endif
+
INCFLAGS := -I$(CORE_DIR)
diff --git a/cpu.c b/cpu.c
index f1cbfaa..4c2f455 100644
--- a/cpu.c
+++ b/cpu.c
@@ -4054,6 +4054,11 @@ void raise_interrupt(irq_type irq_raised)
}
}
+#ifndef HAVE_DYNAREC
+u8 *memory_map_read [8 * 1024];
+u8 *memory_map_write[8 * 1024];
+#endif
+
void execute_arm(u32 cycles)
{
u32 pc = reg[REG_PC];
diff --git a/cpu_threaded.c b/cpu_threaded.c
index 4436a69..99887ec 100644
--- a/cpu_threaded.c
+++ b/cpu_threaded.c
@@ -48,11 +48,13 @@ u32 ewram_code_max = 0xFFFFFFFF;
u32 *rom_branch_hash[ROM_BRANCH_HASH_SIZE];
// Default
+#ifdef HAVE_DYNAREC
u32 idle_loop_target_pc = 0xFFFFFFFF;
+u32 iwram_stack_optimize = 1;
+#endif
u32 force_pc_update_target = 0xFFFFFFFF;
u32 translation_gate_target_pc[MAX_TRANSLATION_GATES];
u32 translation_gate_targets = 0;
-u32 iwram_stack_optimize = 1;
u32 allow_smc_ram_u8 = 1;
u32 allow_smc_ram_u16 = 1;
u32 allow_smc_ram_u32 = 1;
diff --git a/gba_memory.c b/gba_memory.c
index 106a342..98a025c 100644
--- a/gba_memory.c
+++ b/gba_memory.c
@@ -2280,23 +2280,26 @@ s32 load_game_config(char *gamepak_title, char *gamepak_code, char *gamepak_make
return 0;
}
- if(!strcmp(current_variable, "idle_loop_eliminate_target"))
- idle_loop_target_pc = strtol(current_value, NULL, 16);
-
- if(!strcmp(current_variable, "translation_gate_target"))
+ if (dynarec_enable)
{
- if(translation_gate_targets < MAX_TRANSLATION_GATES)
- {
- translation_gate_target_pc[translation_gate_targets] =
- strtol(current_value, NULL, 16);
- translation_gate_targets++;
- }
- }
+ if(!strcmp(current_variable, "idle_loop_eliminate_target"))
+ idle_loop_target_pc = strtol(current_value, NULL, 16);
- if(!strcmp(current_variable, "iwram_stack_optimize") &&
- !strcmp(current_value, "no\0")) /* \0 for broken toolchain workaround */
- {
- iwram_stack_optimize = 0;
+ if(!strcmp(current_variable, "translation_gate_target"))
+ {
+ if(translation_gate_targets < MAX_TRANSLATION_GATES)
+ {
+ translation_gate_target_pc[translation_gate_targets] =
+ strtol(current_value, NULL, 16);
+ translation_gate_targets++;
+ }
+ }
+
+ if(!strcmp(current_variable, "iwram_stack_optimize") &&
+ !strcmp(current_value, "no\0")) /* \0 for broken toolchain workaround */
+ {
+ iwram_stack_optimize = 0;
+ }
}
if(!strcmp(current_variable, "flash_rom_type") &&
@@ -3381,9 +3384,12 @@ void gba_load_state(const void* src)
state_mem_read_ptr = src;
savestate_block(read);
- flush_translation_cache_ram();
- flush_translation_cache_rom();
- flush_translation_cache_bios();
+ if (dynarec_enable)
+ {
+ flush_translation_cache_ram();
+ flush_translation_cache_rom();
+ flush_translation_cache_bios();
+ }
oam_update = 1;
gbc_sound_update = 1;
diff --git a/jni/Android.mk b/jni/Android.mk
index b3b81aa..2b2e0d1 100644
--- a/jni/Android.mk
+++ b/jni/Android.mk
@@ -9,11 +9,13 @@ ifeq ($(TARGET_ARCH),arm)
LOCAL_CFLAGS += -DANDROID_ARM -DARM_ARCH
LOCAL_ARM_MODE := arm
CPU_ARCH := arm
+HAVE_DYNAREC := 1
endif
ifeq ($(TARGET_ARCH),x86)
LOCAL_CFLAGS += -DANDROID_X86
CPU_ARCH := x86_32
+HAVE_DYNAREC := 1
endif
#ifeq ($(TARGET_ARCH),mips)
diff --git a/libretro.c b/libretro.c
index d834ede..c753f01 100644
--- a/libretro.c
+++ b/libretro.c
@@ -20,6 +20,7 @@ struct retro_perf_callback perf_cb;
static cothread_t main_thread;
static cothread_t cpu_thread;
+int dynarec_enable;
void switch_to_main_thread(void)
{
@@ -33,7 +34,10 @@ static inline void switch_to_cpu_thread(void)
static void cpu_thread_entry(void)
{
- execute_arm_translate(execute_cycles);
+#ifdef HAVE_DYNAREC
+ if (dynarec_enable)
+ execute_arm_translate(execute_cycles);
+#endif
execute_arm(execute_cycles);
}
@@ -97,7 +101,10 @@ void retro_init()
init_gamepak_buffer();
init_sound(1);
-#ifdef HAVE_MMAP
+#if defined(HAVE_DYNAREC)
+ dynarec_enable = 1;
+#if defined(HAVE_MMAP)
+
rom_translation_cache = mmap(NULL, ROM_TRANSLATION_CACHE_SIZE,
PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0);
ram_translation_cache = mmap(NULL, RAM_TRANSLATION_CACHE_SIZE,
@@ -109,6 +116,9 @@ void retro_init()
ram_translation_ptr = ram_translation_cache;
bios_translation_ptr = bios_translation_cache;
#endif
+#else
+ dynarec_enable = 0;
+#endif
}
void retro_deinit()
@@ -116,7 +126,7 @@ void retro_deinit()
perf_cb.perf_log();
memory_term();
-#ifdef HAVE_MMAP
+#if defined(HAVE_MMAP) && defined(HAVE_DYNAREC)
munmap(rom_translation_cache, ROM_TRANSLATION_CACHE_SIZE);
munmap(ram_translation_cache, RAM_TRANSLATION_CACHE_SIZE);
munmap(bios_translation_cache, BIOS_TRANSLATION_CACHE_SIZE);
diff --git a/main.c b/main.c
index 3a9dcdb..ce416ce 100644
--- a/main.c
+++ b/main.c
@@ -117,9 +117,11 @@ void init_main(void)
execute_cycles = 960;
video_count = 960;
+#ifdef HAVE_DYNAREC
flush_translation_cache_rom();
flush_translation_cache_ram();
flush_translation_cache_bios();
+#endif
}
u32 no_alpha = 0;
diff --git a/main.h b/main.h
index bf7e1fa..b775402 100644
--- a/main.h
+++ b/main.h
@@ -97,6 +97,7 @@ extern u32 real_frame_count;
extern u32 virtual_frame_count;
extern u32 max_frameskip;
extern u32 num_skipped_frames;
+extern int dynarec_enable;
void change_ext(const char *src, char *buffer, const char *extension);