summaryrefslogtreecommitdiff
path: root/cpu.c
diff options
context:
space:
mode:
authortwinaphex2014-12-12 06:31:16 +0100
committertwinaphex2014-12-12 06:31:16 +0100
commitade2bed5149e817f8bea94b5d232899c60352888 (patch)
tree2ba1e7b1b791bbee4d5e7b56529536f8787b291a /cpu.c
parentf9079ff9fb8567f2464972c93e96c7d9835dc865 (diff)
downloadpicogpsp-ade2bed5149e817f8bea94b5d232899c60352888.tar.gz
picogpsp-ade2bed5149e817f8bea94b5d232899c60352888.tar.bz2
picogpsp-ade2bed5149e817f8bea94b5d232899c60352888.zip
CPU interpreter - group Thumb opcode case ranges 0x20 - 0x27 together
Diffstat (limited to 'cpu.c')
-rw-r--r--cpu.c27
1 files changed, 4 insertions, 23 deletions
diff --git a/cpu.c b/cpu.c
index 5e36c52..3362eaf 100644
--- a/cpu.c
+++ b/cpu.c
@@ -1656,6 +1656,7 @@ void execute_arm(u32 cycles)
cpu_alert_type cpu_alert;
u32 old_pc;
+ u32 thumb_opcode_val = 0, arm_opcode_val = 0;
if(!pc_address_block)
pc_address_block = load_gamepak_page(pc_region & 0x3FF);
@@ -3261,8 +3262,9 @@ thumb_loop:
check_pc_region();
pc &= ~0x01;
opcode = address16(pc_address_block, (pc & 0x7FFF));
+ thumb_opcode_val = (opcode >> 8) & 0xFF;
- switch((opcode >> 8) & 0xFF)
+ switch(thumb_opcode_val)
{
case 0x00 ... 0x07:
/* LSL rd, rs, offset */
@@ -3301,42 +3303,21 @@ thumb_loop:
case 0x20:
/* MOV r0, imm */
- thumb_logic(imm, 0, imm);
- break;
-
case 0x21:
/* MOV r1, imm */
- thumb_logic(imm, 1, imm);
- break;
-
case 0x22:
/* MOV r2, imm */
- thumb_logic(imm, 2, imm);
- break;
-
case 0x23:
/* MOV r3, imm */
- thumb_logic(imm, 3, imm);
- break;
-
case 0x24:
/* MOV r4, imm */
- thumb_logic(imm, 4, imm);
- break;
-
case 0x25:
/* MOV r5, imm */
- thumb_logic(imm, 5, imm);
- break;
-
case 0x26:
/* MOV r6, imm */
- thumb_logic(imm, 6, imm);
- break;
-
case 0x27:
/* MOV r7, imm */
- thumb_logic(imm, 7, imm);
+ thumb_logic(imm, thumb_opcode_val - 0x20, imm);
break;
case 0x28: