IEnumerator StartFIBTestCoroutine() { yield return(new WaitForEndOfFrame()); var schemeName = "PC"; var ramName = "RAM"; var romName = "ROM"; var cpuName = "Corei7"; SchemeDesigner.Instance.LoadScheme(schemeName); yield return(new WaitForEndOfFrame()); var scheme = SchemeDesigner.Instance.CurrentScheme; var rom = (RAMX)scheme.Schemes[romName].Scheme; var ram = (RAMX)scheme.Schemes[ramName].Scheme; var cpu = scheme.Schemes[cpuName].Scheme; yield return(new WaitForEndOfFrame()); var commandCounter = 0; var addCommand = new Action <BitArray>((array) => { rom.LoadValue(array, commandCounter); commandCounter++; }); ram.LoadValue(Extensions.FromInt(FIBNumber, 16), 0); //BEGIN //[2] = 1 addCommand(Proggraming.SetDataAddr(2)); addCommand(Proggraming.WriteData(1)); //[1] = 0 addCommand(Proggraming.SetDataAddr(1)); addCommand(Proggraming.WriteData(1)); //JUMP TO INIT addCommand(Proggraming.SetDataAddr(commandCounter + 14)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.Constant, Destination.None, true, 0)); //LABEL: RETURN [1] var return1 = commandCounter; addCommand(Proggraming.SetDataAddr(1)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.Data, Destination.AR, false, 0)); addCommand(Proggraming.SetDataAddr(0)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.AR, Destination.Data, false, 0)); addCommand(Proggraming.SetDataAddr(commandCounter + 6)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.Constant, Destination.None, true, 0)); //LABEL: RETURN [2] var return2 = commandCounter; addCommand(Proggraming.SetDataAddr(2)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.Data, Destination.AR, false, 0)); addCommand(Proggraming.SetDataAddr(0)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.AR, Destination.Data, false, 0)); //LABEL: STOP //var stop = commandCounter; //JUMP TO END addCommand(Proggraming.SetDataAddr(38)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.Constant, Destination.None, true, 0)); //LABEL: INIT //var init = commandCounter; //AR = [0] - 1 addCommand(Proggraming.SetDataAddr(0)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.Data, Destination.AR, false, -1)); //JUMP IF AR = 0 TO RETURN [1] addCommand(Proggraming.BuildConst(return1)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.AR, Destination.None, true, 0)); //LABEL: CHECK var check = commandCounter; //AR = [0] - 2 addCommand(Proggraming.SetDataAddr(0)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.Data, Destination.AR, false, -2)); //JUMP IF AR = 0 TO RETURN [2] addCommand(Proggraming.SetDataAddr(return2)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.AR, Destination.None, true, 0)); //AR = [1] + [2] addCommand(Proggraming.SetDataAddr(1)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.Data, Destination.AR, false, 0)); addCommand(Proggraming.SetDataAddr(2)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.AR, Operand2.Data, Destination.AR, false, 0)); //[2] = AR addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.AR, Operand2.Constant, Destination.Data, false, 0)); //[1] = AR - [1] addCommand(Proggraming.SetDataAddr(1)); addCommand(Proggraming.BuildCommand(OperationCode.NegateIn2, Operand1.AR, Operand2.Data, Destination.AR, false, 0)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.AR, Operand2.Constant, Destination.Data, false, 1)); //[0] = [0]-1 addCommand(Proggraming.SetDataAddr(0)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.Data, Destination.Data, false, -1)); //JUMP TO CHECK addCommand(Proggraming.SetDataAddr(check)); addCommand(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.Constant, Destination.None, true, 0)); //LABEL: END addCommand(Proggraming.SetDataAddr(0)); var instrName = "instr"; var dataName = "data"; //var resetName = "reset"; var instrAddrName = "instrAddr"; var dataAddrName = "dataAddr"; var resultName = "result"; var writeName = "write"; var instr = cpu.IOGroups[instrName]; var data = cpu.IOGroups[dataName]; //var reset = cpu.IOGroups[resetName]; var instrAddr = cpu.IOGroups[instrAddrName]; var dataAddr = cpu.IOGroups[dataAddrName]; var result = cpu.IOGroups[resultName]; var write = cpu.IOGroups[writeName]; Console.Instance.Clear(); if (mLog != null) { CycleManager.Instance.Tick -= mLog; } mLog = (state) => { if (state != CycleManager.TickState.PreTick) { return; } Console.Instance.LogShort( "DATA " + data.IOArray.ToInt().ToString("00000") + " | INSTRUCTION " + instr.IOArray.Print() + " | WRITE " + write.IOArray.Print() + " | DATAADDR " + dataAddr.IOArray.ToInt().ToString("00000") + " | INSTRADDR " + instrAddr.IOArray.ToInt().ToString("00000") + " | RESULT " + result.IOArray.ToInt().ToString("00000")); if (instrAddr.IOArray.ToInt() == commandCounter) { CycleManager.Instance.Stop(); CycleManager.Instance.Tick -= mLog; mLog = null; } }; CycleManager.Instance.Tick += mLog; yield break; }
public static BitArray WriteData(int data) { return(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.AR, Destination.Data, false, data)); }