diff options
author | Ian Moffett <ian@osmora.org> | 2025-07-22 02:43:20 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-07-22 02:43:20 -0400 |
commit | 8b7558a31bd06d815b138661be0af543cd596ec5 (patch) | |
tree | e7c9524ea9ec0761b80711e8909fbaa30f20e165 | |
parent | fa2bb7b2a5cc01c3c28c9dcd34cf65a499321b9c (diff) |
oemu: cpu: Introduce decoding logic for DIV
Signed-off-by: Ian Moffett <ian@osmora.org>
-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 ccac0b1..5689953 100644 --- a/usr.bin/oemu/cpu.c +++ b/usr.bin/oemu/cpu.c @@ -169,6 +169,35 @@ cpu_mul(struct oemu_cpu *cpu, inst_t *inst) } /* + * Decode the INST_DIV instruction + * + * @cpu: CPU that is executing + * @inst: Instruction dword + */ +static void +cpu_div(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 'div'\n"); + return; + } + + imm = regs->xreg[inst->rd]; + if (imm == 0) { + /* TODO: Some sort of interrupt */ + printf("** DIVIDE BY ZERO **\n"); + return; + } + + 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 @@ -213,6 +242,9 @@ cpu_kick(struct oemu_cpu *cpu, struct sysmem *mem) case INST_MUL: cpu_mul(cpu, inst); break; + case INST_DIV: + cpu_div(cpu, inst); + break; } /* Is this a halt instruction? */ |