diff options
Diffstat (limited to 'usr.bin/oemu/cpu.c')
-rw-r--r-- | usr.bin/oemu/cpu.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/usr.bin/oemu/cpu.c b/usr.bin/oemu/cpu.c index 61568f2..8ec106a 100644 --- a/usr.bin/oemu/cpu.c +++ b/usr.bin/oemu/cpu.c @@ -100,6 +100,29 @@ cpu_dec(struct oemu_cpu *cpu, inst_t *inst) } /* + * Decode the INST_ADD instruction + * + * @cpu: CPU that is executing + * @inst: Instruction dword + */ +static void +cpu_add(struct oemu_cpu *cpu, inst_t *inst) +{ + struct cpu_regs *regs = &cpu->regs; + imm_t imm; + + if (inst->rd > NELEM(regs->xreg)) { + printf("bad register operand for 'add'\n"); + return; + } + + imm = regs->xreg[inst->rd]; + regs->xreg[inst->rd] += inst->imm; + printf("%d + %d -> X%d, new=%d\n", + imm, inst->imm, inst->rd, regs->xreg[inst->rd]); +} + +/* * Reset a CPU to a default state */ void @@ -135,6 +158,15 @@ cpu_kick(struct oemu_cpu *cpu, struct sysmem *mem) case INST_DEC: cpu_dec(cpu, inst); break; + case INST_ADD: + cpu_add(cpu, inst); + break; + } + + /* Is this a halt instruction? */ + if (inst->opcode == INST_HLT) { + printf("HALTED\n"); + break; } if (regs->ip >= MEMORY_SIZE) { |