public UnitàOperativa() { _sr = ShiftRegister.GetInstance(); _alu = ALU.GetInstance(); _busC = BusC.GetInstance(); _busB = BusB.GetInstance(); _registers = Registro.GetInstance(); _systemBus = BusDiSistema.GetInstance(); }
public static ShiftRegister GetInstance() { if (_sr != null) { return(_sr); } lock (Object) { if (_sr == null) { _sr = new ShiftRegister(); } } return(_sr); }
public void execute_op() { _sr = ShiftRegister.GetInstance(); // f0 e f1 stabiliscono l'operazione che l'ALU deve eseguire var f0 = Operation[0]; var f1 = Operation[1]; // enA e enB abilitano rispettivamente i due ingressi A e B dell'ALU var enA = Operation[2]; var enB = Operation[3]; // invA inverte l'operando A se abilitato var invA = Operation[4]; // inc effettua un incremento unitario se abilitato var inc = Operation[5]; string tResult; var tOperandA = enA == '1' ? OperandA : "00000000000000000000000000000000"; var tOperandAInv = invA == '1' ? Utility.ToBin(~Convert.ToInt32(tOperandA, 2), 32) : tOperandA; var tOperandB = enB == '1' ? OperandB : "00000000000000000000000000000000"; var tInc = inc.ToString(); var tUSum = Convert.ToUInt32(tOperandAInv, 2) + Convert.ToUInt32(tOperandB, 2) + Convert.ToUInt32(tInc, 2); char[] chars = { f0, f1 }; var fn = new string(chars); switch (fn) { case "00": //AND tResult = Utility.ToBin(Convert.ToInt32(tOperandAInv, 2) & Convert.ToInt32(tOperandB, 2), 32); break; case "01": //OR tResult = Utility.ToBin(Convert.ToInt32(tOperandAInv, 2) | Convert.ToInt32(tOperandB, 2), 32); break; case "10": tResult = Utility.ToBin(~Convert.ToInt32(tOperandB, 2), 32); break; case "11": //SOMMA ALGEBRICA { var tSum = Convert.ToString(tUSum, 2); tResult = tSum; break; } default: tResult = "00000000000000000000000000000000"; break; } Risultato = Utility.ToBin(Convert.ToInt32(tResult, 2), 32); _sr.Dato = Risultato; //scrittura risultato nel registro a scorrimento NFlag = Risultato[0] == '1'; //aggiornamento negative flag ZFlag = Risultato == "00000000000000000000000000000000"; //aggiornamento zero flag DebugInfo(); }