Beispiel #1
0
 private void NextAddress()
 {
     if (IsAutoincrement())
     {
         _ar.Inc();
     }
 }
Beispiel #2
0
 private void NextAddress()
 {
     if (IsAutoincrement())
     {
         _arL.Inc();
         if (_arL.NumValue() == 0)
         {
             _arH.Inc();
         }
         GetDr();
     }
 }
Beispiel #3
0
        //установка видеопамяти
        private void SetVideoMem(ExtendedBitArray memory)
        {
            int index = new ExtendedBitArray(_addr.ToBinString().Substring(CountIgnoredBits())).NumValue();

            if (_form.SevenSegmentCount == 6)
            {
                index = index % 6;
            }

            _videoMem[index] = memory;

            if (IsAutoincrement())
            {
                _addr.Inc();
                _addr.Mod(new ExtendedBitArray(_form.SevenSegmentCount));
            }
        }
        private void OnTimerEvent(object sender, MicroTimerEventArgs e)
        {
            if (++_internalCounter < GetDividerMode())
            {
                return;
            }

            _internalCounter = 0;

            if (_tcntL.Inc())
            {
                if (_tcntH.Inc())
                {
                    SetOverflowFlag(true);
                }
            }
            byte mode = GetMode();

            if (mode == 2)   // сравнение
            {
                if (_tcntL.NumValue() == _tiorL.NumValue() && _tcntH.NumValue() == _tiorH.NumValue())
                {
                    SetComparisonFlag(true);

                    if (IsResetOnCmp())
                    {
                        _tcntH = new ExtendedBitArray();
                        _tcntL = new ExtendedBitArray();
                    }
                }
            }

            double nowMillis = DateTime.Now.ToUniversalTime().Subtract(
                new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
                ).TotalMilliseconds;

            if (nowMillis - _lastUpdateMillis > UPDATE_PERIOD_MILLIS)
            {
                _form.Invoke(_updateFormDelegate);
                _lastUpdateMillis = nowMillis;
            }
        }
Beispiel #5
0
        public void DrawMemory()

        {
            ExtendedBitArray _arL1 = new ExtendedBitArray();
            ExtendedBitArray _arH1 = new ExtendedBitArray();


            bool maxmemory = false;

            while (!maxmemory)
            {
                ChangeTwoPixels(_arH1, _arL1);

                if (_arL1.NumValue() == 255)
                {
                    if (_arH1.NumValue() == 15)
                    {
                        maxmemory = true;
                    }
                    _arH1.Inc();
                }
                _arL1.Inc();
            }
        }
        private void OnTimerEvent(object sender, MicroTimerEventArgs e)
        {
            if (++_internalCounter < GetDivider())
            {
                return;
            }

            _internalCounter = 0;

            bool equalUpperLimit = _tcntL.NumValue() == upperLimit[0].NumValue() && _tcntH.NumValue() == upperLimit[1].NumValue();
            bool equalLowerLimit = _tcntL.NumValue() == 0 && _tcntH.NumValue() == 0;

            // Инкремент/декремент
            if (dec)
            {
                if (_tcntL.Dec())
                {
                    if (_tcntH.Dec())
                    {
                        // 0000 -> FFFF underflow
                        Console.WriteLine("Shouldn't normally happen! 0000.Dec()");
                    }
                }
            }
            else
            {
                if (equalUpperLimit)
                {
                    _tcntL.And(new ExtendedBitArray());
                    _tcntH.And(new ExtendedBitArray());

                    SetOverflowFlag(true);
                }
                else if (_tcntL.Inc())
                {
                    if (_tcntH.Inc())
                    {
                        // FFFF -> 0000 overflow
                        Console.WriteLine("Shouldn't normally happen! FFFF.Inc()");
                        SetOverflowFlag(true);
                    }
                }
            }

            equalUpperLimit = _tcntL.NumValue() == upperLimit[0].NumValue() && _tcntH.NumValue() == upperLimit[1].NumValue();
            equalLowerLimit = _tcntL.NumValue() == 0 && _tcntH.NumValue() == 0;
            bool equalTcntOcr = _tcntL.NumValue() == _ocrL.NumValue() && _tcntH.NumValue() == _ocrH.NumValue();

            byte mode = GetMode();

            switch (mode)
            {
            case 1:     // сброс при совпадении
                if (equalTcntOcr)
                {
                    SetComparisonFlag(true);

                    _tcntH = new ExtendedBitArray();
                    _tcntL = new ExtendedBitArray();
                }
                break;

            case 2:     // быстрый ШИМ
                break;

            case 3:     // ШИМ с фазовой коррекцией
                // проверка совпадения с верхним пределом
                if (equalUpperLimit)
                {
                    dec = true;
                }
                else if (equalLowerLimit)
                {
                    dec = false;
                }
                break;
            }

            byte outputMode = GetOutputMode();

            switch (outputMode)
            {
            case 0:
                outputPinValue = false;
                break;

            case 1:     // инверсия при совпадении TCNT == OCR
                if (equalTcntOcr)
                {
                    outputPinValue = !outputPinValue;
                }
                break;

            case 2:
                if (mode < 2)         // Без ШИМ
                {
                    if (equalTcntOcr) // сброс при совпадении
                    {
                        outputPinValue = false;
                    }
                }
                if (mode == 2)        // Быстрый ШИМ
                {
                    if (equalTcntOcr) // сброс при совпадении
                    {
                        outputPinValue = false;
                    }
                    else if (equalUpperLimit)         // установка на вершине счета
                    {
                        outputPinValue = true;
                    }
                }
                if (mode == 3)       // ШИМ с ФК
                {
                    if (equalTcntOcr)
                    {
                        if (dec)
                        {
                            outputPinValue = true;     // установка при совпадении во время обратного счета
                        }
                        else
                        {
                            outputPinValue = false;     // сброс при совпадении во время прямого счета
                        }
                    }
                }
                break;

            case 3:
                if (mode < 2)         // Без ШИМ
                {
                    if (equalTcntOcr) // установка при совпадении
                    {
                        outputPinValue = true;
                    }
                }
                if (mode == 2)        // Быстрый ШИМ
                {
                    if (equalTcntOcr) // установка при совпадении
                    {
                        outputPinValue = true;
                    }
                    else if (equalUpperLimit)         // сброс на вершине счета
                    {
                        outputPinValue = false;
                    }
                }
                if (mode == 3)       // ШИМ с ФК
                {
                    if (equalTcntOcr)
                    {
                        if (dec)
                        {
                            outputPinValue = false;     // сброс при совпадении во время обратного счета
                        }
                        else
                        {
                            outputPinValue = true;     // установка при совпадении во время прямого счета
                        }
                    }
                }
                break;
            }

            double nowMillis = DateTime.Now.ToUniversalTime().Subtract(
                new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
                ).TotalMilliseconds;

            if (nowMillis - _lastUpdateMillis > UPDATE_PERIOD_MILLIS)
            {
                _form.Invoke(_updateFormDelegate);
                _lastUpdateMillis = nowMillis;
            }
        }
Beispiel #7
0
        private void ProcessRegisterCommand(string highHex, string lowBin)
        {
            //MOV
            if (highHex[1] == 'F')
            {
                _y46();
                _y2();
                _y47();
                _y5();
                return;
            }
            //POP
            if (highHex[1] == 'D')
            {
                _y45();
                _y1();
                _y34();
                _y47();
                _y5();
                return;
            }
            //WR
            if (highHex[1] == 'A')
            {
                if (lowBin[1] != '0' || lowBin[2] != '0' || lowBin[3] != '0')
                {
                    LoadRegister(lowBin);
                    _y49();
                    _y4();
                    ModifyRegister(lowBin);
                }
                else
                {
                    // Прямая адресация
                    _y49();
                    _y47();
                    _y5();
                }
                return;
            }

            LoadRegister(lowBin);
            //NOT
            if (highHex[1] == '0')
            {
                _flags.SetPreviousState(_rdb);
                _y52();
                _flags.UpdateFlags(_rdb, "not");
                UnloadRegister(lowBin);
                ModifyRegister(lowBin);
                return;
            }
            //ADD
            if (highHex[1] == '1')
            {
                _flags.SetPreviousState(_acc);
                _flags.SetArgument(_rdb);
                bool overflow = _acc.Add(_rdb);
                _flags.UpdateFlags(_acc, "add", overflow, _rdb);
                ModifyRegister(lowBin);
                return;
            }
            //SUB
            if (highHex[1] == '2')
            {
                _flags.SetPreviousState(_acc);
                _flags.SetArgument(_rdb);
                bool overflow = _acc.Sub(_rdb);
                _flags.UpdateFlags(_acc, "sub", overflow, _rdb);
                ModifyRegister(lowBin);
                return;
            }
            //MUL
            if (highHex[1] == '3')
            {
                _flags.SetPreviousState(_acc);
                _flags.SetArgument(_rdb);
                _perform_mul();
                bool overflow = false;
                _flags.UpdateFlags(_acc, "mul", overflow);
                ModifyRegister(lowBin);
                return;
            }
            //DIV
            if (highHex[1] == '4')
            {
                _flags.SetPreviousState(_acc);
                _flags.SetArgument(_rdb);
                _acc.Div(_rdb);
                _flags.UpdateFlags(_acc, "div");
                ModifyRegister(lowBin);
                return;
            }
            //AND
            if (highHex[1] == '5')
            {
                _flags.SetPreviousState(_acc);
                _acc.And(_rdb);
                _flags.UpdateFlags(_acc, "and");
                ModifyRegister(lowBin);
                return;
            }
            //OR
            if (highHex[1] == '6')
            {
                _flags.SetPreviousState(_acc);
                _acc.Or(_rdb);
                _flags.UpdateFlags(_acc, "or");
                ModifyRegister(lowBin);
                return;
            }
            //XOR
            if (highHex[1] == '7')
            {
                _flags.SetPreviousState(_acc);
                _acc.Xor(_rdb);
                _flags.UpdateFlags(_acc, "xor");
                ModifyRegister(lowBin);
                return;
            }
            //CMP
            if (highHex[1] == '8')
            {
                var temp = new ExtendedBitArray(_rdb);
                _flags.SetPreviousState(temp);
                _flags.SetArgument(_rdb);
                bool overflow = temp.Sub(_acc);
                _flags.UpdateFlags(temp, "cmp", overflow, _rdb);
                UnloadRegister(lowBin);
                ModifyRegister(lowBin);
                return;
            }
            //RD
            if (highHex[1] == '9')
            {
                _acc = new ExtendedBitArray(_rdb);
                ModifyRegister(lowBin);
                return;
            }
            //INC
            if (highHex[1] == 'B')
            {
                _flags.SetPreviousState(_rdb);
                var overflow = _rdb.Inc();
                _flags.UpdateFlags(_rdb, "inc", overflow);
                UnloadRegister(lowBin);
                ModifyRegister(lowBin);
                return;
            }
            //DEC
            if (highHex[1] == 'C')
            {
                _flags.SetPreviousState(_rdb);
                var overflow = _rdb.Dec();
                _flags.UpdateFlags(_rdb, "dec", overflow);
                UnloadRegister(lowBin);
                ModifyRegister(lowBin);
                return;
            }
            //PUSH
            if (highHex[1] == 'E')
            {
                _y35();
                _y45();
                _y4();
                ModifyRegister(lowBin);
                return;
            }
            //ADC
            if (highHex == "F0")
            {
                _flags.SetPreviousState(_acc);
                _flags.SetArgument(_rdb);
                var overflow = _acc.Add(_rdb);
                if (_flags.C)
                {
                    overflow |= _acc.Inc();
                }
                _flags.UpdateFlags(_acc, "adc", overflow, _rdb);
                ModifyRegister(lowBin);
                return;
            }
            //SUBB
            if (highHex == "F1")
            {
                _flags.SetPreviousState(_acc);
                _flags.SetArgument(_rdb);
                var overflow = _acc.Sub(_rdb);
                if (_flags.C)
                {
                    overflow |= _acc.Dec();
                }
                _flags.UpdateFlags(_acc, "subb", overflow, _rdb);
                ModifyRegister(lowBin);
            }
        }
Beispiel #8
0
        public void IncOverflowExceptionTest()
        {
            var extendedBitArray = new ExtendedBitArray("11111111");

            Assert.IsTrue(extendedBitArray.Inc());
        }