diff --git a/src/mipscpu.cpp b/src/mipscpu.cpp index 3b0f54b..2932972 100644 --- a/src/mipscpu.cpp +++ b/src/mipscpu.cpp @@ -78,6 +78,7 @@ namespace tememu REG_OP_FUNC(op_or, 0x25 << 4); REG_OP_FUNC(op_ori, 0x0D); REG_OP_FUNC(op_xor, 0x26 << 4); + REG_OP_FUNC(op_nor, 0x27 << 4); } void MipsCPU::reset() @@ -297,6 +298,12 @@ namespace tememu step(); } + void MipsCPU::op_nor(int32 instr) + { + _GPR[RD(instr)] = ~(_GPR[RS(instr)] | _GPR[RT(instr)]); + step(); + } + void MipsCPU::loadProgram(boost::shared_ptr< std::vector > program) { _program = program; diff --git a/src/mipscpu.h b/src/mipscpu.h index d794f9d..a65f3f7 100644 --- a/src/mipscpu.h +++ b/src/mipscpu.h @@ -108,6 +108,7 @@ namespace tememu void op_or(int32); void op_ori(int32); void op_xor(int32); + void op_nor(int32); private: std::vector _GPR, _FPR, _FCR; diff --git a/test/main.cpp b/test/main.cpp index a3f5c97..24faa60 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -596,3 +596,32 @@ TEST(Logical, op_xor) cpu.runProgram(); EXPECT_EQ(cpu.gprValue(7), 0x0ff00ff0); } + +TEST(Logical, op_nor) +{ + tememu::MipsCPU cpu; + boost::shared_ptr< std::vector > program(new std::vector); + + program->push_back(0x00a63827); // xor $a3, $a1, $a2 + cpu.loadProgram(program); + + cpu.setGPR(5, 0xffffffff); + cpu.setGPR(6, 0); + cpu.runProgram(); + EXPECT_EQ(cpu.gprValue(7), 0); + + cpu.reset(); + + cpu.setGPR(5, 0x0000ffff); + cpu.setGPR(6, 0xfffff000); + cpu.runProgram(); + EXPECT_EQ(cpu.gprValue(7), 0); + + cpu.reset(); + + cpu.setGPR(5, 0xff00ff00); + cpu.setGPR(6, 0xf0f0f0f0); + cpu.runProgram(); + EXPECT_EQ(cpu.gprValue(7), 0x000f000f); +} +