/// <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; }
public IODevice(Core.Machine machine) { _ready = false; DataRegister = new Register(8); _machine = machine; }