Esempio n. 1
0
        /// <summary>
        /// Конструктор, позволяет указывать стандартный обработчик изменения ячейки основной памяти
        /// </summary>
        /// <param name="memoryCellsChangedHandler">Стандартный обработчик измененения ячейки основной памяти</param>
        public Machine(Memory.DataCellEventHandler memoryCellsChangedHandler)
        {
            /* Инициализируем основную память (2К ячеек) и назначаем для всех ячеек
             * общий стандартный обработчик изменения
             * */
            MainMemory = new Memory.RAM(2048);
            MainMemory.CellChangedHandler = memoryCellsChangedHandler;
            // Инициализируем память микрокоманд
            MicrocommandsMemory = new Cleancode.Snow.Memory.RAM(256);

            var registersList = new Register[]{
                // Инициализируем регистры, указывая в качестве ID элемент перечисления RegisterTypes
                new Memory.Register(16, RegisterTypes.Data),
                new Memory.Register(16, RegisterTypes.Command),
                new Memory.Register(11, RegisterTypes.CommandCounter),
                new Memory.Register(16, RegisterTypes.Accumulator),
                new Memory.Register(13, RegisterTypes.State),
                new Memory.Register(16, RegisterTypes.Keyboard),
                new Memory.Register(12, RegisterTypes.Address),
                new Memory.Register(1, RegisterTypes.Carry),

                // Инициализируем внутренние регистры
                new Memory.Register(16, RegisterTypes.AluLeftInput),
                new Memory.Register(16, RegisterTypes.AluRightInput),
                new Memory.Register(16, RegisterTypes.BufferRegister),
                new Memory.Register(16, RegisterTypes.CarryBufferRegister),
                new Memory.Register(8, RegisterTypes.MicrocommandsCounter),
                new Memory.Register(16, RegisterTypes.Microcommand)
            }.ToList();

            this.registers = new Dictionary<RegisterTypes, Cleancode.Snow.Memory.Register>();

            registersList.ForEach(
                register => this.registers.Add((RegisterTypes)register.Id, register)
            );

            IODevices = new IO.IODevice[3];
            for (int e = 0; e < IODevices.Length; e++)
                IODevices[e] = new IO.IODevice(this);

            /* Устаналвиваем флаг, используемый для организации безусловных переходов (GOTO)
             * Его значение не должно меняться ни при каких условиях
             * */
            State.Data |= 2;

            MicrocommandsCounter.Data = 1;
        }
Esempio n. 2
0
 public IODevice(Core.Machine machine)
 {
     _ready = false;
     DataRegister = new Register(8);
     _machine = machine;
 }