aboutsummaryrefslogtreecommitdiffstats
path: root/src/ymh15/mips_cpu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ymh15/mips_cpu.cpp')
-rw-r--r--src/ymh15/mips_cpu.cpp19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/ymh15/mips_cpu.cpp b/src/ymh15/mips_cpu.cpp
index d3d4399..ea7cce1 100644
--- a/src/ymh15/mips_cpu.cpp
+++ b/src/ymh15/mips_cpu.cpp
@@ -151,21 +151,23 @@ mips_error exec_instruction(mips_cpu_h state, uint32_t inst) {
mips_error exec_R(mips_cpu_h state, uint32_t var[8]) {
if((var[FUNC]&0xf0) == 0x20 && (var[FUNC]&0xf) < 4) {
return add_sub(state, var, ((int32_t)-(var[FUNC]&0xf)/2)*2+1);
+ } else if((var[FUNC]&0xf0) == 0x20 && (var[FUNC]&0xf) < 7) {
+ return bitwise(state, var);
}
- return mips_Success;
+ return mips_ExceptionInvalidInstruction;
}
mips_error exec_J(mips_cpu_h state, uint32_t var[8]) {
//TODO
- return mips_Success;
+ return mips_ExceptionInvalidInstruction;
}
mips_error exec_I(mips_cpu_h state, uint32_t var[8]) {
//TODO
- return mips_Success;
+ return mips_ExceptionInvalidInstruction;
}
mips_error add_sub(mips_cpu_h state, uint32_t var[8], int32_t add_sub) {
@@ -179,3 +181,14 @@ mips_error add_sub(mips_cpu_h state, uint32_t var[8], int32_t add_sub) {
}
return mips_ExceptionArithmeticOverflow;
}
+
+mips_error bitwise(mips_cpu_h state, uint32_t var[8]) {
+ if((var[FUNC]&0xf) == 4) {
+ state->regs[var[REG_D]] = state->regs[var[REG_S]] & state->regs[var[REG_T]];
+ } else if((var[FUNC]&0xf) == 5) {
+ state->regs[var[REG_D]] = state->regs[var[REG_S]] | state->regs[var[REG_T]];
+ } else {
+ state->regs[var[REG_D]] = state->regs[var[REG_S]] ^ state->regs[var[REG_T]];
+ }
+ return mips_Success;
+}