diff --git a/contracts/MIPS.sol b/contracts/MIPS.sol index 2057df4c567fc9fda83c1d8c53fe8499975c2a44..57f935e46ac4eb807533bee6ec2c3a8d0ea9d4f4 100644 --- a/contracts/MIPS.sol +++ b/contracts/MIPS.sol @@ -141,13 +141,14 @@ contract MIPS { uint32 storeAddr = REG_ZERO; uint32 rs; uint32 rt; + uint32 rtReg = REG_OFFSET + ((insn >> 14) & 0x7C); // R-type or I-type (stores rt) rs = ReadMemory(stateHash, REG_OFFSET + ((insn >> 19) & 0x7C)); storeAddr = REG_OFFSET + ((insn >> 14) & 0x7C); if (opcode == 0 || opcode == 0x1c) { // R-type (stores rd) - rt = ReadMemory(stateHash, REG_OFFSET + ((insn >> 14) & 0x7C)); + rt = ReadMemory(stateHash, rtReg); storeAddr = REG_OFFSET + ((insn >> 9) & 0x7C); } else if (opcode < 0x20) { // rt is SignExtImm @@ -161,10 +162,10 @@ contract MIPS { } } else if (opcode >= 0x28 || opcode == 0x22 || opcode == 0x26) { // store rt value with store - rt = ReadMemory(stateHash, REG_OFFSET + ((insn >> 14) & 0x7C)); + rt = ReadMemory(stateHash, rtReg); // store actual rt with lwl and lwr - storeAddr = REG_OFFSET + ((insn >> 14) & 0x7C); + storeAddr = rtReg; } @@ -187,7 +188,7 @@ contract MIPS { bool shouldBranch = false; if (opcode == 4 || opcode == 5) { // beq/bne - rt = ReadMemory(stateHash, REG_OFFSET + ((insn >> 14) & 0x7C)); + rt = ReadMemory(stateHash, rtReg); shouldBranch = (rs == rt && opcode == 4) || (rs != rt && opcode == 5); } else if (opcode == 6) { shouldBranch = int32(rs) <= 0; // blez } else if (opcode == 7) { shouldBranch = int32(rs) > 0; // bgtz @@ -265,8 +266,8 @@ contract MIPS { } // stupid sc, write a 1 to rt - if (opcode == 0x38) { - stateHash = WriteMemory(stateHash, REG_OFFSET + ((insn >> 14) & 0x7C), 1); + if (opcode == 0x38 && rtReg != REG_ZERO) { + stateHash = WriteMemory(stateHash, rtReg, 1); } // write back