package elw.dp.mips; import org.akraievoy.base.Die; public class InstructionContext { private final Instructions instructions; private final Memory memory; private final Registers registers; private Instruction instruction; public InstructionContext(final Instructions instructions, final Memory memory, final Registers registers) { this.instructions = instructions; this.memory = memory; this.registers = registers; } public Instructions getInstructions() { return instructions; } public Memory getMemory() { return memory; } public Registers getRegisters() { return registers; } public Instruction getInstruction() { return instruction; } public void setInstruction(final Instruction instruction) { this.instruction = instruction; } public int getS() { Die.ifNull("instruction", instruction); Die.ifNull("instruction.s", instruction.getReg(Instruction.T_REG_S)); return registers.getReg(instruction.getReg(Instruction.T_REG_S)); } public int setS(final int s) { Die.ifNull("instruction", instruction); Die.ifNull("instruction.s", instruction.getReg(Instruction.T_REG_S)); return registers.setReg(instruction.getReg(Instruction.T_REG_S), s); } public int getT() { Die.ifNull("instruction", instruction); Die.ifNull("instruction.t", instruction.getReg(Instruction.T_REG_T)); return registers.getReg(instruction.getReg(Instruction.T_REG_T)); } public int setT(final int t) { Die.ifNull("instruction", instruction); Die.ifNull("instruction.t", instruction.getReg(Instruction.T_REG_T)); return registers.setReg(instruction.getReg(Instruction.T_REG_T), t); } public int getD() { Die.ifNull("instruction", instruction); Die.ifNull("instruction.d", instruction.getReg(Instruction.T_REG_D)); return registers.getReg(instruction.getReg(Instruction.T_REG_D)); } public int setD(final int d) { Die.ifNull("instruction", instruction); Die.ifNull("instruction.d", instruction.getReg(Instruction.T_REG_D)); return registers.setReg(instruction.getReg(Instruction.T_REG_D), d); } public int getI16() { Die.ifNull("instruction", instruction); Die.ifNull("instruction.i16", instruction.getBits(Instruction.T_IMM16)); return instruction.getBits(Instruction.T_IMM16); } public int getI26() { Die.ifNull("instruction", instruction); Die.ifNull("instruction.i26", instruction.getBits(Instruction.T_IMM26)); return instruction.getBits(Instruction.T_IMM26); } protected void advPc() { advPc(4); } protected void advPc(int offset) { registers.setReg(Reg.pc, registers.getReg(Reg.pc) + offset); } public void storeRa() { registers.setReg(Reg.ra, registers.getReg(Reg.pc) + 4); } }