Example #1
0
 public static BitArray WriteData(int data)
 {
     return(Proggraming.BuildCommand(OperationCode.ADD, Operand1.Constant, Operand2.AR, Destination.Data, false, data));
 }
Example #2
0
    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;
    }
Example #3
0
 public static BitArray SetDataAddr(int address)
 {
     return(Proggraming.BuildConst(address));
 }