Example #1
0
        /// Обрабатывает команды для работы с памятью
        private void ProcessRamCommand(string highBin, string highHex)
        {
            //WR
            if (highHex[1] == 'A')
            {
                _y44();
                _y49();
                _y4();
                return;
            }

            if (highBin[3] == '1')
            {
                // Константы
                _y61();
            }
            else
            {
                //прямая
                _y44();
                _y1();
            }

            //NOT
            if (highHex[1] == '0')
            {
                _flags.SetPreviousState(_rdb);
                _y52();
                _flags.UpdateFlags(_rdb, "not");
                _y4();
                return;
            }
            //ADD
            if (highHex[1] == '1')
            {
                _flags.SetPreviousState(_acc);
                _flags.SetArgument(_rdb);
                var overflow = _acc.Add(_rdb);
                _flags.UpdateFlags(_acc, "add", overflow, _rdb);
                return;
            }
            //SUB
            if (highHex[1] == '2')
            {
                _flags.SetPreviousState(_acc);
                _flags.SetArgument(_rdb);
                var overflow = _acc.Sub(_rdb);
                _flags.UpdateFlags(_acc, "sub", overflow, _rdb);
                return;
            }
            //MUL
            if (highHex[1] == '3')
            {
                _flags.SetPreviousState(_acc);
                _flags.SetArgument(_rdb);
                _perform_mul();
                var overflow = false;
                _flags.UpdateFlags(_acc, "mul", overflow);
                return;
            }
            //DIV
            if (highHex[1] == '4')
            {
                _flags.SetPreviousState(_acc);
                _flags.SetArgument(_rdb);
                _acc.Div(_rdb);
                _flags.UpdateFlags(_acc, "div");
                return;
            }
            //AND
            if (highHex[1] == '5')
            {
                _flags.SetPreviousState(_acc);
                _acc.And(_rdb);
                _flags.UpdateFlags(_acc, "and");
                return;
            }
            //OR
            if (highHex[1] == '6')
            {
                _flags.SetPreviousState(_acc);
                _acc.Or(_rdb);
                _flags.UpdateFlags(_acc, "or");
                return;
            }
            //XOR
            if (highHex[1] == '7')
            {
                _flags.SetPreviousState(_acc);
                _acc.Xor(_rdb);
                _flags.UpdateFlags(_acc, "xor");
                return;
            }
            //CMP
            if (highHex[1] == '8')
            {
                var temp = new ExtendedBitArray(_rdb);
                _flags.SetArgument(_rdb);
                _flags.SetPreviousState(_rdb);
                bool overflow = temp.Sub(_acc);
                _flags.UpdateFlags(temp, "cmp", overflow, _rdb);
                return;
            }
            //RD
            if (highHex[1] == '9')
            {
                _acc = new ExtendedBitArray(_rdb);
                return;
            }
            //INC
            if (highHex[1] == 'B')
            {
                _flags.SetPreviousState(_rdb);
                var overflow = _y50();
                _y4();
                _flags.UpdateFlags(_rdb, "inc", overflow);
                return;
            }
            //DEC A
            if (highHex[1] == 'C')
            {
                _flags.SetPreviousState(_rdb);
                var overflow = _y51();
                _y4();
                _flags.UpdateFlags(_rdb, "dec", overflow);
                return;
            }
            //ADC A
            if (highHex[1] == 'D')
            {
                _flags.SetPreviousState(_acc);
                _flags.SetArgument(_rdb);
                var overflow = _acc.Add(_rdb);
                if (_flags.C)
                {
                    overflow |= _acc.Inc();
                }
                _flags.UpdateFlags(_acc, "adc", overflow, _rdb);
                return;
            }
            //SUBB A
            if (highHex[1] == 'D')
            {
                _flags.SetPreviousState(_acc);
                _flags.SetArgument(_rdb);
                var overflow = _acc.Add(_rdb);
                if (_flags.C)
                {
                    overflow |= _acc.Inc();
                }
                _flags.UpdateFlags(_acc, "subb", overflow, _rdb);
                return;
            }
            //XCH
            if (highHex[1] == 'F')
            {
                var temp = new ExtendedBitArray(_acc);
                _acc = new ExtendedBitArray(_rdb);
                _rdb = temp;
                _y4();
            }
        }
Example #2
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);
            }
        }