diff options
author | twinaphex | 2014-12-12 06:31:16 +0100 |
---|---|---|
committer | twinaphex | 2014-12-12 06:31:16 +0100 |
commit | ade2bed5149e817f8bea94b5d232899c60352888 (patch) | |
tree | 2ba1e7b1b791bbee4d5e7b56529536f8787b291a /cpu.c | |
parent | f9079ff9fb8567f2464972c93e96c7d9835dc865 (diff) | |
download | picogpsp-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.c | 27 |
1 files changed, 4 insertions, 23 deletions
@@ -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: |