summaryrefslogtreecommitdiff
path: root/arm/arm_stub.S
diff options
context:
space:
mode:
Diffstat (limited to 'arm/arm_stub.S')
-rw-r--r--arm/arm_stub.S34
1 files changed, 28 insertions, 6 deletions
diff --git a/arm/arm_stub.S b/arm/arm_stub.S
index d7203f8..4d7e22b 100644
--- a/arm/arm_stub.S
+++ b/arm/arm_stub.S
@@ -67,8 +67,14 @@ _##symbol:
#define MODE_SUPERVISOR 3
-#define extract_u16(rd, rs) \
- uxth rd, rs
+#if __ARM_ARCH >= 6
+ #define extract_u16(rd, rs) \
+ uxth rd, rs
+#else
+ #define extract_u16(rd, rs) \
+ bic rd, rs, #0xff000000 ;\
+ bic rd, rd, #0x00ff0000
+#endif
@ Will load the register set from memory into the appropriate cached registers.
@ See arm_emit.h for listing explanation.
@@ -444,6 +450,8 @@ defsymbl(execute_swi_##mode) ;\
orr r0, r0, #0x13 /* set to supervisor mode */;\
str r0, [reg_base, #REG_CPSR] /* update cpsr */;\
;\
+ call_c_function(bios_region_read_allow) ;\
+ ;\
mov r0, #MODE_SUPERVISOR ;\
;\
store_registers_##mode() /* store regs for mode */;\
@@ -770,11 +778,22 @@ lookup_pc:
#define sign_extend_u16(reg)
#define sign_extend_u32(reg)
-#define sign_extend_s8(reg) ;\
- sxtb reg, reg
+#if __ARM_ARCH >= 6
+ #define sign_extend_s8(reg) ;\
+ sxtb reg, reg
-#define sign_extend_s16(reg) ;\
- sxth reg, reg
+ #define sign_extend_s16(reg) ;\
+ sxth reg, reg
+#else
+ #define sign_extend_s8(reg) ;\
+ mov reg, reg, lsl #24 /* shift reg into upper 8bits */;\
+ mov reg, reg, asr #24 /* shift down, sign extending */;\
+
+ #define sign_extend_s16(reg) ;\
+ mov reg, reg, lsl #16 /* shift reg into upper 16bits */;\
+ mov reg, reg, asr #16 /* shift down, sign extending */;\
+
+#endif
#define execute_load_op_u8(load_op) ;\
mov r0, r0, lsl #17 ;\
@@ -877,6 +896,9 @@ defsymbl(rom_translation_cache)
defsymbl(ram_translation_cache)
.space RAM_TRANSLATION_CACHE_SIZE
.size ram_translation_cache, .-ram_translation_cache
+defsymbl(bios_translation_cache)
+ .space BIOS_TRANSLATION_CACHE_SIZE
+.size bios_translation_cache, .-bios_translation_cache
#endif