private void ExecuteIndexOperation(byte jumpCond, bool checkOnTrue, byte jumpBase, byte index) { switch (jumpCond) { case 1: { RegisterMAR.Value++; } break; case 2: { int jumpDestination = jumpBase; RegisterMAR.Value = (ushort)jumpDestination; } break; case 3: { int jumpDestination = jumpBase; jumpDestination += CalculateOffset(index); RegisterMAR.Value = (ushort)jumpDestination; } break; case 4: { int jumpDestination = jumpBase; if (RegisteredINTRCommands["INTR"].Active ^ checkOnTrue) { RegisterMAR.Value = (ushort)jumpDestination; } else { RegisterMAR.Value++; } } break; case 5: { if (GetInstructionClass() == 0) { int jumpDestination = jumpBase; jumpDestination += CalculateOffset(index); RegisterMAR.Value = (ushort)jumpDestination; } else { RegisterMAR.Value++; } } break; case 6: { if ((((registerIR.Value >> 4) & 0x00000003) == 1) ^ checkOnTrue) { int jumpDestination = jumpBase; jumpDestination += CalculateOffset(index); RegisterMAR.Value = (ushort)jumpDestination; } else { RegisterMAR.Value++; } } break; case 7: { if ((!FLAGSRegister.GetFlag(ProcessorSimulator.Controls.Flags.FlagsRegister.Flags.ZF)) ^ checkOnTrue) { int jumpDestination = jumpBase; jumpDestination += CalculateOffset(index); RegisterMAR.Value = (ushort)jumpDestination; } else { RegisterMAR.Value++; } } break; case 8: { if ((!FLAGSRegister.GetFlag(ProcessorSimulator.Controls.Flags.FlagsRegister.Flags.CF)) ^ checkOnTrue) { int jumpDestination = jumpBase; jumpDestination += CalculateOffset(index); RegisterMAR.Value = (ushort)jumpDestination; } else { RegisterMAR.Value++; } } break; case 9: { if ((!FLAGSRegister.GetFlag(ProcessorSimulator.Controls.Flags.FlagsRegister.Flags.VF)) ^ checkOnTrue) { int jumpDestination = jumpBase; jumpDestination += CalculateOffset(index); RegisterMAR.Value = (ushort)jumpDestination; } else { RegisterMAR.Value++; } } break; case 10: { if ((!FLAGSRegister.GetFlag(ProcessorSimulator.Controls.Flags.FlagsRegister.Flags.SF)) ^ checkOnTrue) { int jumpDestination = jumpBase; jumpDestination += CalculateOffset(index); RegisterMAR.Value = (ushort)jumpDestination; } else { RegisterMAR.Value++; } } break; case 11: { int jumpDestination = jumpBase; if ((RegisteredINTRCommands["INTR"].Active) ^ checkOnTrue) { RegisterMAR.Value = (ushort)jumpDestination; } else { RegisterMAR.Value++; } } break; default: break; } }
private bool ExecuteAluOperation(Command operation) { operation.Activate(DataBuses.NONE); previousActivatedCommandsListBox.Items.Add(operation); int s, d; if (VirtualRegSBUS.Value > short.MaxValue) { s = (int)((short)VirtualRegSBUS.Value); } else { s = (int)((short)VirtualRegSBUS.Value); } if (VirtualRegDBUS.Value > short.MaxValue) { d = (int)((short)VirtualRegDBUS.Value); } else { d = (int)((short)VirtualRegDBUS.Value); } switch (operation.Code) { case 1: { int res = s + d; VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } case 2: { int res = s & d; VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } case 3: { int res = s | d; VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } case 4: { int res = s ^ d; VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } case 5: { int res = ~d; VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } case 6: { int res = d / 2; VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } case 7: { int res = d * 2; VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } case 8: { int res = d >> 1; VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } case 9: { int res = d << 1 | (d >> 15 & 0x0001); VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } case 10: { int res = d >> 1 | ((d & 0x0001) << 15); VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } case 11: { int res = d << 1 | (FLAGSRegister.GetFlag(ProcessorSimulator.Controls.Flags.FlagsRegister.Flags.CF) ? 0x0001 : 0x0000); FLAGSRegister.SetFlag(ProcessorSimulator.Controls.Flags.FlagsRegister.Flags.CF, (d & 0x1000) == 1 ? true : false); VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } case 12: { int res = d >> 1 | (FLAGSRegister.GetFlag(ProcessorSimulator.Controls.Flags.FlagsRegister.Flags.CF) ? 0x1000 : 0x0000); FLAGSRegister.SetFlag(ProcessorSimulator.Controls.Flags.FlagsRegister.Flags.CF, (d & 0x0001) == 1 ? true : false); VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } case 13: { int res = d - s; VirtualRegRBUS.Value = ConvertToUnsignedShort(res); return(true); } default: return(false); } }