/// <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; }
private string _saveDump(string fileName, RAM memory, ushort start, ushort end) { try { XmlSerializer dumpSerializer = new XmlSerializer(typeof(MemoryDump)); using (FileStream outputStream = new FileStream(fileName, FileMode.Create)) dumpSerializer.Serialize(outputStream, memory.Dump(start, end)); } catch { return "error"; } return String.Format("Dump successfully saved to {0}", fileName); }
private static string _loadDump(string fileName, RAM destinationMemory) { try { XmlSerializer dumpSerializer = new XmlSerializer(typeof(MemoryDump)); MemoryDump dump; using (FileStream inputStream = new FileStream(fileName, FileMode.Open)) dump = (MemoryDump)dumpSerializer.Deserialize(inputStream); destinationMemory.LoadDump(dump); } catch { return "error"; } return String.Format("{0} successfully loaded", fileName); }