summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhizzlekizzle2019-10-22 15:19:04 -0500
committerGitHub2019-10-22 15:19:04 -0500
commita6d35e0165e270e7fc760b9a559a57ca9318ec11 (patch)
treecc0ddb321febbce3925d404b7340da7704dfe582
parent24af89596e6484ff5a7a08efecfa8288cfbc02f3 (diff)
parenta60de42f3a7fba8e22d5b2a602a035c68ea4223c (diff)
downloadpicogpsp-a6d35e0165e270e7fc760b9a559a57ca9318ec11.tar.gz
picogpsp-a6d35e0165e270e7fc760b9a559a57ca9318ec11.tar.bz2
picogpsp-a6d35e0165e270e7fc760b9a559a57ca9318ec11.zip
Merge pull request #56 from bmaupin/enable-psp-dynarec
Reenable dynarec for PSP
-rw-r--r--.gitignore1
-rw-r--r--Makefile4
-rw-r--r--Makefile.common3
-rw-r--r--common.h14
-rw-r--r--cpu.h2
-rw-r--r--cpu_threaded.c6
-rw-r--r--gba_memory.c6
-rw-r--r--main.c6
-rw-r--r--main.h4
-rw-r--r--psp/mips_emit.h17
-rw-r--r--psp/mips_stub.S14
11 files changed, 52 insertions, 25 deletions
diff --git a/.gitignore b/.gitignore
index bf5c80b..5bc8246 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+*.a
*.o
*.u
*.z
diff --git a/Makefile b/Makefile
index c962e5f..e0e9a81 100644
--- a/Makefile
+++ b/Makefile
@@ -217,9 +217,11 @@ else ifeq ($(platform), psp1)
CFLAGS += -DPSP -G0
CFLAGS += -I$(shell psp-config --pspsdk-path)/include
CFLAGS += -march=allegrex -mfp32 -mgp32 -mlong32 -mabi=eabi
- CFLAGS += -fomit-frame-pointer -ffast-math -fstrict-aliasing
+ CFLAGS += -fomit-frame-pointer -ffast-math
CFLAGS += -falign-functions=32 -falign-loops -falign-labels -falign-jumps
STATIC_LINKING = 1
+ HAVE_DYNAREC = 1
+ CPU_ARCH := mips
# Vita
else ifeq ($(platform), vita)
diff --git a/Makefile.common b/Makefile.common
index 312b18b..dc8c106 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -29,6 +29,9 @@ endif
ifeq ($(CPU_ARCH), arm)
SOURCES_ASM += $(CORE_DIR)/arm/arm_stub.S
endif
+ifeq ($(CPU_ARCH), mips)
+SOURCES_ASM += $(CORE_DIR)/psp/mips_stub.S
+endif
endif
ifeq ($(CPU_ARCH), arm)
diff --git a/common.h b/common.h
index 8b1df6b..5d52981 100644
--- a/common.h
+++ b/common.h
@@ -49,7 +49,7 @@
// Huge thanks to pollux for the heads up on using native file I/O
// functions on PSP for vastly improved memstick performance.
-#ifdef PSP_BUILD
+#ifdef PSP
#define fastcall
#include <pspkernel.h>
@@ -90,12 +90,6 @@
#include <stdio.h>
#else
-#define GBA_SCREEN_WIDTH (240)
-#define GBA_SCREEN_HEIGHT (160)
-#define GBA_SCREEN_PITCH (240)
-
-void switch_to_main_thread(void);
-
typedef unsigned char u8;
typedef signed char s8;
typedef unsigned short int u16;
@@ -133,6 +127,12 @@ void switch_to_main_thread(void);
#endif
+#define GBA_SCREEN_WIDTH (240)
+#define GBA_SCREEN_HEIGHT (160)
+#define GBA_SCREEN_PITCH (240)
+
+void switch_to_main_thread(void);
+
// These must be variables, not constants.
#define file_read_variable(filename_tag, variable) \
diff --git a/cpu.h b/cpu.h
index 3ed9f07..2659b10 100644
--- a/cpu.h
+++ b/cpu.h
@@ -119,7 +119,7 @@ s32 translate_block_arm(u32 pc, translation_region_type translation_region,
s32 translate_block_thumb(u32 pc, translation_region_type translation_region,
u32 smc_enable);
-#if defined(PSP_BUILD)
+#if defined(PSP)
#define ROM_TRANSLATION_CACHE_SIZE (1024 * 512 * 4)
#define RAM_TRANSLATION_CACHE_SIZE (1024 * 384)
diff --git a/cpu_threaded.c b/cpu_threaded.c
index c3f172b..7386d0c 100644
--- a/cpu_threaded.c
+++ b/cpu_threaded.c
@@ -227,7 +227,7 @@ extern u8 bit_count[256];
u32 offset = opcode & 0x07FF \
-#ifdef PSP_BUILD
+#ifdef PSP
#include "psp/mips_emit.h"
@@ -257,8 +257,10 @@ static INLINE void RW_END(void)
/* Cache invalidation */
-#if defined(PSP_BUILD)
+#if defined(PSP)
#define translate_invalidate_dcache() sceKernelDcacheWritebackAll()
+#define invalidate_icache_region(addr, size) (void)0
+
#elif defined(VITA)
#define translate_invalidate_dcache_one(which) \
if (which##_translation_ptr > last_##which##_translation_ptr) \
diff --git a/gba_memory.c b/gba_memory.c
index 15ad808..970fbee 100644
--- a/gba_memory.c
+++ b/gba_memory.c
@@ -343,7 +343,7 @@ gamepak_swap_entry_type *gamepak_memory_map;
// This is global so that it can be kept open for large ROMs to swap
// pages from, so there's no slowdown with opening and closing the file
// a lot.
-#ifdef PSP_BUILD
+#ifdef PSP
file_tag_type gamepak_file_large = -1;
@@ -2391,9 +2391,7 @@ static s32 load_game_config(char *gamepak_title, char *gamepak_code, char *gamep
fclose(config_file);
}
-#ifndef PSP_BUILD
printf("game config missing\n");
-#endif
return -1;
}
@@ -2418,7 +2416,7 @@ static s32 load_gamepak_raw(const char *name)
file_close(gamepak_file);
-#ifdef PSP_BUILD
+#ifdef PSP
gamepak_file_large = -1;
#else
gamepak_file_large = NULL;
diff --git a/main.c b/main.c
index bc8a408..0f9bb88 100644
--- a/main.c
+++ b/main.c
@@ -280,13 +280,15 @@ void reset_gba(void)
reset_sound();
}
-u32 file_length(const char *dummy, FILE *fp)
+#ifdef PSP
+u32 file_length(const char *filename, s32 dummy)
{
-#ifdef PSP_BUILD
SceIoStat stats;
sceIoGetstat(filename, &stats);
return stats.st_size;
#else
+u32 file_length(const char *dummy, FILE *fp)
+{
u32 length;
fseek(fp, 0, SEEK_END);
diff --git a/main.h b/main.h
index f34d7db..1f730c0 100644
--- a/main.h
+++ b/main.h
@@ -83,8 +83,8 @@ void main_write_savestate(void);
void main_read_savestate(void);
-#ifdef PSP_BUILD
-u32 file_length(char *filename, s32 dummy);
+#ifdef PSP
+u32 file_length(const char *filename, s32 dummy);
#else
u32 file_length(const char *dummy, FILE *fp);
#endif
diff --git a/psp/mips_emit.h b/psp/mips_emit.h
index f2ab1e8..9510156 100644
--- a/psp/mips_emit.h
+++ b/psp/mips_emit.h
@@ -1553,9 +1553,13 @@ typedef enum
#define arm_generate_op_imm(name, load_op) \
arm_decode_data_proc_imm(opcode); \
+ ror(imm, imm, imm_ror); \
arm_op_check_##load_op(); \
generate_op_##name##_imm(arm_to_mips_reg[rd], arm_to_mips_reg[rn]) \
+#define arm_generate_op_imm_flags(name, load_op) \
+ arm_generate_op_imm(name, load_op) \
+
#define arm_data_proc(name, type, flags_op) \
{ \
arm_generate_op_##type(name, yes); \
@@ -2137,10 +2141,16 @@ u32 execute_store_cpsr_body(u32 _cpsr, u32 store_mask, u32 address)
mips_emit_addiu(arm_to_mips_reg[_rd], reg_r13, (imm * 4)); \
} \
-#define thumb_adjust_sp(value) \
+#define thumb_adjust_sp_up() \
+ mips_emit_addiu(reg_r13, reg_r13, (imm * 4)); \
+
+#define thumb_adjust_sp_down() \
+ mips_emit_addiu(reg_r13, reg_r13, -(imm * 4)); \
+
+#define thumb_adjust_sp(direction) \
{ \
thumb_decode_add_sp(); \
- mips_emit_addiu(reg_r13, reg_r13, (value)); \
+ thumb_adjust_sp_##direction(); \
} \
// Decode types: shift, alu_op
@@ -2203,6 +2213,9 @@ u32 execute_store_cpsr_body(u32 _cpsr, u32 store_mask, u32 address)
#define thumb_access_memory_generate_address_reg_imm(offset, reg_rb, reg_ro) \
mips_emit_addiu(reg_a0, arm_to_mips_reg[reg_rb], (offset)) \
+#define thumb_access_memory_generate_address_reg_imm_sp(offset, reg_rb, reg_ro) \
+ mips_emit_addiu(reg_a0, arm_to_mips_reg[reg_rb], (offset * 4)) \
+
#define thumb_access_memory_generate_address_reg_reg(offset, reg_rb, reg_ro) \
mips_emit_addu(reg_a0, arm_to_mips_reg[reg_rb], arm_to_mips_reg[reg_ro]) \
diff --git a/psp/mips_stub.S b/psp/mips_stub.S
index aaef70b..dd91ea8 100644
--- a/psp/mips_stub.S
+++ b/psp/mips_stub.S
@@ -3343,8 +3343,13 @@ ror_zero_shift:
execute_arm_translate:
addu $17, $4, $0 # load cycle counter register
- lui $16, %hi(reg) # load base register
- addiu $16, %lo(reg)
+
+ lui $4, %hi(arm_reg) # load arm_reg address into $4
+ addiu $4, %lo(arm_reg)
+
+ jal move_reg # update reg to point to arm_reg
+ addu $16, $4, $0 # copy address of arm_reg into $16
+
extract_flags # load flag variables
and $1, $1, 0x20 # see if Thumb bit is set in flags
@@ -3405,9 +3410,10 @@ iac_loop:
memory_map_read:
.space 0x8000
-reg:
+# This must be between memory_map_read and memory_map_write because it's used
+# to calculate their addresses elsewhere in this file.
+arm_reg:
.space 0x100
memory_map_write:
.space 0x8000
-