CPU interpreter - group more case ranges together
This commit is contained in:
parent
701e2bbf50
commit
72573712d3
167
cpu.c
167
cpu.c
|
@ -3525,44 +3525,22 @@ thumb_loop:
|
||||||
|
|
||||||
case 0x48:
|
case 0x48:
|
||||||
/* LDR r0, [pc + imm] */
|
/* LDR r0, [pc + imm] */
|
||||||
thumb_access_memory(load, imm, (pc & ~2) + (imm * 4) + 4, reg[0], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x49:
|
case 0x49:
|
||||||
/* LDR r1, [pc + imm] */
|
/* LDR r1, [pc + imm] */
|
||||||
thumb_access_memory(load, imm, (pc & ~2) + (imm * 4) + 4, reg[1], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x4A:
|
case 0x4A:
|
||||||
/* LDR r2, [pc + imm] */
|
/* LDR r2, [pc + imm] */
|
||||||
thumb_access_memory(load, imm, (pc & ~2) + (imm * 4) + 4, reg[2], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x4B:
|
case 0x4B:
|
||||||
/* LDR r3, [pc + imm] */
|
/* LDR r3, [pc + imm] */
|
||||||
thumb_access_memory(load, imm, (pc & ~2) + (imm * 4) + 4, reg[3], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x4C:
|
case 0x4C:
|
||||||
/* LDR r4, [pc + imm] */
|
/* LDR r4, [pc + imm] */
|
||||||
thumb_access_memory(load, imm, (pc & ~2) + (imm * 4) + 4, reg[4], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x4D:
|
case 0x4D:
|
||||||
/* LDR r5, [pc + imm] */
|
/* LDR r5, [pc + imm] */
|
||||||
thumb_access_memory(load, imm, (pc & ~2) + (imm * 4) + 4, reg[5], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x4E:
|
case 0x4E:
|
||||||
/* LDR r6, [pc + imm] */
|
/* LDR r6, [pc + imm] */
|
||||||
thumb_access_memory(load, imm, (pc & ~2) + (imm * 4) + 4, reg[6], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x4F:
|
case 0x4F:
|
||||||
/* LDR r7, [pc + imm] */
|
/* LDR r7, [pc + imm] */
|
||||||
thumb_access_memory(load, imm, (pc & ~2) + (imm * 4) + 4, reg[7], u32);
|
thumb_access_memory(load, imm, (pc & ~2) + (imm * 4) + 4, reg[thumb_opcode_val & 0x7], u32);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x50 ... 0x51:
|
case 0x50 ... 0x51:
|
||||||
/* STR rd, [rb + ro] */
|
/* STR rd, [rb + ro] */
|
||||||
thumb_access_memory(store, mem_reg, reg[rb] + reg[ro], reg[rd], u32);
|
thumb_access_memory(store, mem_reg, reg[rb] + reg[ro], reg[rd], u32);
|
||||||
|
@ -3635,164 +3613,76 @@ thumb_loop:
|
||||||
|
|
||||||
case 0x90:
|
case 0x90:
|
||||||
/* STR r0, [sp + imm] */
|
/* STR r0, [sp + imm] */
|
||||||
thumb_access_memory(store, imm, reg[REG_SP] + (imm * 4), reg[0], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x91:
|
case 0x91:
|
||||||
/* STR r1, [sp + imm] */
|
/* STR r1, [sp + imm] */
|
||||||
thumb_access_memory(store, imm, reg[REG_SP] + (imm * 4), reg[1], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x92:
|
case 0x92:
|
||||||
/* STR r2, [sp + imm] */
|
/* STR r2, [sp + imm] */
|
||||||
thumb_access_memory(store, imm, reg[REG_SP] + (imm * 4), reg[2], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x93:
|
case 0x93:
|
||||||
/* STR r3, [sp + imm] */
|
/* STR r3, [sp + imm] */
|
||||||
thumb_access_memory(store, imm, reg[REG_SP] + (imm * 4), reg[3], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x94:
|
case 0x94:
|
||||||
/* STR r4, [sp + imm] */
|
/* STR r4, [sp + imm] */
|
||||||
thumb_access_memory(store, imm, reg[REG_SP] + (imm * 4), reg[4], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x95:
|
case 0x95:
|
||||||
/* STR r5, [sp + imm] */
|
/* STR r5, [sp + imm] */
|
||||||
thumb_access_memory(store, imm, reg[REG_SP] + (imm * 4), reg[5], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x96:
|
case 0x96:
|
||||||
/* STR r6, [sp + imm] */
|
/* STR r6, [sp + imm] */
|
||||||
thumb_access_memory(store, imm, reg[REG_SP] + (imm * 4), reg[6], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x97:
|
case 0x97:
|
||||||
/* STR r7, [sp + imm] */
|
/* STR r7, [sp + imm] */
|
||||||
thumb_access_memory(store, imm, reg[REG_SP] + (imm * 4), reg[7], u32);
|
thumb_access_memory(store, imm, reg[REG_SP] + (imm * 4), reg[thumb_opcode_val & 0x7], u32);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x98:
|
case 0x98:
|
||||||
/* LDR r0, [sp + imm] */
|
/* LDR r0, [sp + imm] */
|
||||||
thumb_access_memory(load, imm, reg[REG_SP] + (imm * 4), reg[0], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x99:
|
case 0x99:
|
||||||
/* LDR r1, [sp + imm] */
|
/* LDR r1, [sp + imm] */
|
||||||
thumb_access_memory(load, imm, reg[REG_SP] + (imm * 4), reg[1], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x9A:
|
case 0x9A:
|
||||||
/* LDR r2, [sp + imm] */
|
/* LDR r2, [sp + imm] */
|
||||||
thumb_access_memory(load, imm, reg[REG_SP] + (imm * 4), reg[2], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x9B:
|
case 0x9B:
|
||||||
/* LDR r3, [sp + imm] */
|
/* LDR r3, [sp + imm] */
|
||||||
thumb_access_memory(load, imm, reg[REG_SP] + (imm * 4), reg[3], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x9C:
|
case 0x9C:
|
||||||
/* LDR r4, [sp + imm] */
|
/* LDR r4, [sp + imm] */
|
||||||
thumb_access_memory(load, imm, reg[REG_SP] + (imm * 4), reg[4], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x9D:
|
case 0x9D:
|
||||||
/* LDR r5, [sp + imm] */
|
/* LDR r5, [sp + imm] */
|
||||||
thumb_access_memory(load, imm, reg[REG_SP] + (imm * 4), reg[5], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x9E:
|
case 0x9E:
|
||||||
/* LDR r6, [sp + imm] */
|
/* LDR r6, [sp + imm] */
|
||||||
thumb_access_memory(load, imm, reg[REG_SP] + (imm * 4), reg[6], u32);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x9F:
|
case 0x9F:
|
||||||
/* LDR r7, [sp + imm] */
|
/* LDR r7, [sp + imm] */
|
||||||
thumb_access_memory(load, imm, reg[REG_SP] + (imm * 4), reg[7], u32);
|
thumb_access_memory(load, imm, reg[REG_SP] + (imm * 4), reg[thumb_opcode_val & 0x7], u32);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xA0:
|
case 0xA0:
|
||||||
/* ADD r0, pc, +imm */
|
/* ADD r0, pc, +imm */
|
||||||
thumb_add_noflags(imm, 0, (pc & ~2) + 4, (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xA1:
|
case 0xA1:
|
||||||
/* ADD r1, pc, +imm */
|
/* ADD r1, pc, +imm */
|
||||||
thumb_add_noflags(imm, 1, (pc & ~2) + 4, (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xA2:
|
case 0xA2:
|
||||||
/* ADD r2, pc, +imm */
|
/* ADD r2, pc, +imm */
|
||||||
thumb_add_noflags(imm, 2, (pc & ~2) + 4, (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xA3:
|
case 0xA3:
|
||||||
/* ADD r3, pc, +imm */
|
/* ADD r3, pc, +imm */
|
||||||
thumb_add_noflags(imm, 3, (pc & ~2) + 4, (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xA4:
|
case 0xA4:
|
||||||
/* ADD r4, pc, +imm */
|
/* ADD r4, pc, +imm */
|
||||||
thumb_add_noflags(imm, 4, (pc & ~2) + 4, (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xA5:
|
case 0xA5:
|
||||||
/* ADD r5, pc, +imm */
|
/* ADD r5, pc, +imm */
|
||||||
thumb_add_noflags(imm, 5, (pc & ~2) + 4, (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xA6:
|
case 0xA6:
|
||||||
/* ADD r6, pc, +imm */
|
/* ADD r6, pc, +imm */
|
||||||
thumb_add_noflags(imm, 6, (pc & ~2) + 4, (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xA7:
|
case 0xA7:
|
||||||
/* ADD r7, pc, +imm */
|
/* ADD r7, pc, +imm */
|
||||||
thumb_add_noflags(imm, 7, (pc & ~2) + 4, (imm * 4));
|
thumb_add_noflags(imm, thumb_opcode_val & 0x7, (pc & ~2) + 4, (imm * 4));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xA8:
|
case 0xA8:
|
||||||
/* ADD r0, sp, +imm */
|
/* ADD r0, sp, +imm */
|
||||||
thumb_add_noflags(imm, 0, reg[REG_SP], (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xA9:
|
case 0xA9:
|
||||||
/* ADD r1, sp, +imm */
|
/* ADD r1, sp, +imm */
|
||||||
thumb_add_noflags(imm, 1, reg[REG_SP], (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xAA:
|
case 0xAA:
|
||||||
/* ADD r2, sp, +imm */
|
/* ADD r2, sp, +imm */
|
||||||
thumb_add_noflags(imm, 2, reg[REG_SP], (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xAB:
|
case 0xAB:
|
||||||
/* ADD r3, sp, +imm */
|
/* ADD r3, sp, +imm */
|
||||||
thumb_add_noflags(imm, 3, reg[REG_SP], (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xAC:
|
case 0xAC:
|
||||||
/* ADD r4, sp, +imm */
|
/* ADD r4, sp, +imm */
|
||||||
thumb_add_noflags(imm, 4, reg[REG_SP], (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xAD:
|
case 0xAD:
|
||||||
/* ADD r5, sp, +imm */
|
/* ADD r5, sp, +imm */
|
||||||
thumb_add_noflags(imm, 5, reg[REG_SP], (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xAE:
|
case 0xAE:
|
||||||
/* ADD r6, sp, +imm */
|
/* ADD r6, sp, +imm */
|
||||||
thumb_add_noflags(imm, 6, reg[REG_SP], (imm * 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xAF:
|
case 0xAF:
|
||||||
/* ADD r7, sp, +imm */
|
/* ADD r7, sp, +imm */
|
||||||
thumb_add_noflags(imm, 7, reg[REG_SP], (imm * 4));
|
thumb_add_noflags(imm, thumb_opcode_val & 0x7, reg[REG_SP], (imm * 4));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xB0 ... 0xB3:
|
case 0xB0 ... 0xB3:
|
||||||
if((opcode >> 7) & 0x01)
|
if((opcode >> 7) & 0x01)
|
||||||
{
|
{
|
||||||
|
@ -3828,82 +3718,39 @@ thumb_loop:
|
||||||
|
|
||||||
case 0xC0:
|
case 0xC0:
|
||||||
/* STMIA r0!, rlist */
|
/* STMIA r0!, rlist */
|
||||||
thumb_block_memory(store, no_op, up, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xC1:
|
case 0xC1:
|
||||||
/* STMIA r1!, rlist */
|
/* STMIA r1!, rlist */
|
||||||
thumb_block_memory(store, no_op, up, 1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xC2:
|
case 0xC2:
|
||||||
/* STMIA r2!, rlist */
|
/* STMIA r2!, rlist */
|
||||||
thumb_block_memory(store, no_op, up, 2);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xC3:
|
case 0xC3:
|
||||||
/* STMIA r3!, rlist */
|
/* STMIA r3!, rlist */
|
||||||
thumb_block_memory(store, no_op, up, 3);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xC4:
|
case 0xC4:
|
||||||
/* STMIA r4!, rlist */
|
/* STMIA r4!, rlist */
|
||||||
thumb_block_memory(store, no_op, up, 4);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xC5:
|
case 0xC5:
|
||||||
/* STMIA r5!, rlist */
|
/* STMIA r5!, rlist */
|
||||||
thumb_block_memory(store, no_op, up, 5);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xC6:
|
case 0xC6:
|
||||||
/* STMIA r6!, rlist */
|
/* STMIA r6!, rlist */
|
||||||
thumb_block_memory(store, no_op, up, 6);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xC7:
|
case 0xC7:
|
||||||
/* STMIA r7!, rlist */
|
/* STMIA r7!, rlist */
|
||||||
thumb_block_memory(store, no_op, up, 7);
|
thumb_block_memory(store, no_op, up, thumb_opcode_val & 0x7);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xC8:
|
case 0xC8:
|
||||||
/* LDMIA r0!, rlist */
|
/* LDMIA r0!, rlist */
|
||||||
thumb_block_memory(load, no_op, up, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xC9:
|
case 0xC9:
|
||||||
/* LDMIA r1!, rlist */
|
/* LDMIA r1!, rlist */
|
||||||
thumb_block_memory(load, no_op, up, 1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xCA:
|
case 0xCA:
|
||||||
/* LDMIA r2!, rlist */
|
/* LDMIA r2!, rlist */
|
||||||
thumb_block_memory(load, no_op, up, 2);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xCB:
|
case 0xCB:
|
||||||
/* LDMIA r3!, rlist */
|
/* LDMIA r3!, rlist */
|
||||||
thumb_block_memory(load, no_op, up, 3);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xCC:
|
case 0xCC:
|
||||||
/* LDMIA r4!, rlist */
|
/* LDMIA r4!, rlist */
|
||||||
thumb_block_memory(load, no_op, up, 4);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xCD:
|
case 0xCD:
|
||||||
/* LDMIA r5!, rlist */
|
/* LDMIA r5!, rlist */
|
||||||
thumb_block_memory(load, no_op, up, 5);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xCE:
|
case 0xCE:
|
||||||
/* LDMIA r6!, rlist */
|
/* LDMIA r6!, rlist */
|
||||||
thumb_block_memory(load, no_op, up, 6);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xCF:
|
case 0xCF:
|
||||||
/* LDMIA r7!, rlist */
|
/* LDMIA r7!, rlist */
|
||||||
thumb_block_memory(load, no_op, up, 7);
|
thumb_block_memory(load, no_op, up, thumb_opcode_val & 0x7);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xD0:
|
case 0xD0:
|
||||||
|
|
Loading…
Reference in New Issue