Ejemplo 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;
        }
Ejemplo n.º 2
0
 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);
 }
Ejemplo n.º 3
0
 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);
 }