Exemplo n.º 1
0
        public void InitializeMicroASM(string[] asmCodeLines, string asmFileName)
        {
            Clear();

            if (asmFileName == null)
            {
                AssemblyLogger = new AssemblyLogger("Assembly");
            }
            else
            {
                AssemblyLogger = new AssemblyLogger(asmFileName);
            }


            Lexer lexer = new Lexer(asmCodeLines);

            Parser parser = new Parser(lexer);

            Compiler compiler = new Compiler(parser, AssemblyLogger);

            compiler.Compile();

            OBJFileLines = compiler.GetOutput();

            //Micro simulator setup
            VirtualMemory = new VirtualMemory(OBJFileLines);

            // state the last port for the micro
            IoManager = new IOManager(VirtualMemory.VirtualMemorySize - 1);

            Micro = new MicroSimulator(VirtualMemory, IoManager);
        }
Exemplo n.º 2
0
 public Interruptor(Processor processor, VirtualMemory virtualMemory, FileManager fileManager, RealMemory realMemory)
 {
     Processor     = processor;
     VirtualMemory = virtualMemory;
     FileManager   = fileManager;
     RealMemory    = realMemory;
 }
Exemplo n.º 3
0
        private bool FileWriteChosenInterrupt()
        {
            int[] xy = GetCurrentCommandLastTwoArguments();
            int   R1 = Processor.GetRegisterValue("R1").HexToInt();
            int   R2 = Processor.GetRegisterValue("R2").HexToInt();

            char[][] blockToFile = new char[R2][];

            bool first = true;

            for (int i = 0, block = 0; i < R2; block++)
            {
                for (int ii = 0; ii < Utility.BLOCK_SIZE || i < R2; ii++, i++)
                {
                    if (first)
                    {
                        ii = xy[1]; first = false;
                    }
                    int blockAddress = VirtualMemory.GetPager().GetCellRealAddress(((xy[0]) + block) * Utility.BLOCK_SIZE);
                    blockToFile[i] = RealMemory.GetUserMemoryValue(blockAddress + ii);
                }
            }

            bool result = FileManager.WriteFile(R1, blockToFile);

            if (!result)
            {
                return(false);
            }

            ResetSIRegister();
            return(true);
        }
Exemplo n.º 4
0
        public void MicroSimulatorTests_ProfTest3_Success()
        {
            string[] asmLines = FileManager.Instance.ToReadFile(test3);

            Lexer lexer = new Lexer(asmLines);

            Parser parser = new Parser(lexer);

            Compiler assembler = new Compiler(parser);

            assembler.Compile();

            string[] objData = assembler.GetOutput();

            VirtualMemory vm = new VirtualMemory(objData);

            MicroSimulator micro = new MicroSimulator(vm);

            int i = 0;

            while (i < 1000)
            {
                micro.NextInstruction();
                i++;
            }
            Console.WriteLine(micro.MicroRegisters);
            Console.WriteLine(vm.ToString());

            Assert.AreEqual("Registers[0,0,0,0,0,12,15,125]", micro.MicroRegisters.ToString());
        }
Exemplo n.º 5
0
        private bool FileReadChosenInterrupt()
        {
            int[] xy = GetCurrentCommandLastTwoArguments();
            int   R1 = Processor.GetRegisterValue("R1").HexToInt();
            int   R2 = Processor.GetRegisterValue("R2").HexToInt();

            char[][] blockFromFile = FileManager.ReadFile(R1, R2);
            if (blockFromFile == null)
            {
                return(false);
            }

            bool first = true;

            for (int i = 0, block = 0; i < R2; block++)
            {
                for (int ii = 0; ii < Utility.BLOCK_SIZE || i < R2; ii++, i++)
                {
                    if (first)
                    {
                        ii = xy[1]; first = false;
                    }
                    int blockAddress = VirtualMemory.GetPager().GetCellRealAddress(((xy[0]) + block) * Utility.BLOCK_SIZE);
                    RealMemory.SetUserMemoryValue(blockAddress + ii, blockFromFile[i]);
                }
            }

            ResetSIRegister();
            return(true);
        }
Exemplo n.º 6
0
        static void PrintElem(VirtualMemory vm)
        {
            var pageNumber = AskInt(new[] { $"Введите номер страницы (0 - {vm.PageNumber - 1})" }, 0, vm.PageNumber - 1);
            var elemNumber = AskInt(new[] { $"Введите номер элемента (0 - {vm.PageCapacity - 1})" }, 0, vm.PageCapacity - 1);

            Message(new [] { $"Page #{pageNumber} Elem #{elemNumber}: {vm[pageNumber, elemNumber]}" });
        }
Exemplo n.º 7
0
        static void Check(VirtualMemory vm)
        {
            var pageNumber = AskInt(new[] { $"Введите номер страницы (0 - {vm.PageNumber - 1})" }, 0, vm.PageNumber - 1);
            var elemNumber = AskInt(new[] { $"Введите номер элемента (0 - {vm.PageCapacity - 1})" }, 0, vm.PageCapacity - 1);

            Message(new[] { $"Page #{pageNumber} Elem #{elemNumber}: { (vm.IsEmpty(pageNumber, elemNumber) ? "EMPTY" : "NOT EMPTY") }" });
        }
Exemplo n.º 8
0
        /// <summary>
        /// Executes the algorithm.
        /// </summary>
        /// <param name="virtualMemory">Virtual memory to use</param>
        /// <param name="pageSequence">Page sequence to use</param>
        /// <returns>Amount of misses</returns>
        public int Execute(VirtualMemory virtualMemory, string[] pageSequence)
        {
            var missCount = 0;
            var i         = 0;
            var hashtable = new Hashtable();

            foreach (var page in pageSequence)
            {
                Console.WriteLine("==========================================================");
                Console.WriteLine($"LRU Solicitud del procesador para ingresar página {page}");
                Console.WriteLine($"Memoria disponible: {virtualMemory.GetCurrentFreeCapacity()} [KB]");
                // While the virtual memory is not full
                if (i < virtualMemory.PageCount)
                {
                    // If the page is not added, add it
                    if (!hashtable.ContainsKey(page))
                    {
                        hashtable.Add(page, 1);
                        Console.WriteLine($"Página {page} agregada a la hashtable");
                    }
                    else                         // If the page exists, increment its counter
                    {
                        hashtable[page] = (int)hashtable[page] + 1;
                        Console.WriteLine($"Página {page} ya existente en la hashtable. Cantidad: {hashtable[page]}");
                    }
                    virtualMemory[i++] = page;
                    Console.WriteLine($"Página {page} agregada a la memoria virtual en la posición {i}");
                    continue;
                }
                // While the virtual memory is full and we have a miss
                if (virtualMemory.FindPage(page) == -1)
                {
                    Console.WriteLine("(i) Miss (i)");
                    var pageToReplace = "MinKey";
                    var currentMin    = int.MaxValue;
                    foreach (var k in hashtable.Keys)
                    {
                        if ((int)hashtable[k] < currentMin)
                        {
                            pageToReplace = k as string;
                            currentMin    = (int)hashtable[k];
                        }
                    }
                    Console.WriteLine($"Página a reemplazar: {pageToReplace}");
                    var indexToReplace = virtualMemory.FindPage(pageToReplace);
                    Console.WriteLine($"Posición a reemplazar dentro de la memoria virtual: {indexToReplace}");
                    virtualMemory[indexToReplace] = page;
                    hashtable.Remove(pageToReplace);
                    Console.WriteLine($"Página {pageToReplace} eliminada de la hashtable");
                    hashtable.Add(page, 1);
                    Console.WriteLine($"Página {page} agregada a la hashtable");
                    missCount++;
                }
                else
                {
                    Console.WriteLine("(i) Hit (i)");
                }
            }
            return(missCount);
        }
Exemplo n.º 9
0
        public Processor(RealMemory realMemory, ChannelTool channelTool, VirtualMemory virtualMemory = null, Pager pager = null)
        {
            RealMemory           = realMemory;
            VirtualMemory        = virtualMemory;
            ChannelTool          = channelTool;
            Pager                = pager;
            FileManager          = new FileManager(RealMemory, this);
            CommandInterpretator = new CommandInterpretator(this, virtualMemory);
            Interruptor          = new Interruptor(this, virtualMemory, FileManager, RealMemory);

            // STOPS PROGRAM AFTER MAX STEP COUNT
            UseMaxStep = true;
            // CURRENT STEP
            CurrentStep = 0;

            registers = new Dictionary <string, Register>
            {
                { "R1", new Register(value: 0) },                                           // Word length general register
                { "R2", new Register(value: 0) },                                           // Word length general register
                { "IC", new HexRegister(2) },                                               // Current command adress in memory register
                { "PTR", new HexRegister(4) },                                              // Page table adress register
                { "SF", new StatusFlagRegister() },                                         // Aritmetic operation logic values
                { "MODE", new ChoiceRegister('N', 'S') },                                   // Processor mode "N" - user, "S" - supervisor
                { "PI", new ChoiceRegister(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) },     // Program interuptor
                { "SI", new ChoiceRegister(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) },     // Supervisor interuptor
                { "TI", new HexRegister(Utility.TIMER_VALUE, 1) }                           // Timer interuptor
            };
        }
Exemplo n.º 10
0
        public bool Step()
        {
            char[] stepCommand   = VirtualMemory.GetValue(GetICRegisterValue());
            char[] nextCommand   = VirtualMemory.GetValue(GetICRegisterValue() + 1);
            string stringCommand = new string(stepCommand);
            string stringNext    = new string(nextCommand);

            Console.WriteLine("STEP: " + stringCommand + " (NEXT: " + stringNext + ")");
            bool commandResult = CommandInterpretator.ParseCommand(stepCommand);

            if (Test())
            {
                if (!Interrupt())
                {
                    FileManager.CloseAll(); return(false);
                }
            }

            if (ChangedIC)
            {
                ChangedIC = false;
            }
            else
            {
                IncICRegisterValue(1);
            }

            if (UseMaxStep && CurrentStep++ >= Utility.MAX_STEPS)
            {
                return(StopProgram());
            }

            return(commandResult);
        }
Exemplo n.º 11
0
 public void SetVirtualMemory(VirtualMemory virtualMemory, Pager pager)
 {
     VirtualMemory = virtualMemory;
     Pager         = pager;
     SetPTRRegisterValue(pager.GetPTR());
     CommandInterpretator.SetVirtualMemory(virtualMemory);
     Interruptor.SetVirtualMemory(virtualMemory);
 }
Exemplo n.º 12
0
        private bool OutputBlockInterrupt()
        {
            int x = GetCurrentCommandLastArgument();

            Processor.UseChannelTool(VirtualMemory.GetPager().GetCellRealAddress(x * Utility.BLOCK_SIZE), 0, 1, 4);
            ResetSIRegister();
            return(true);
        }
Exemplo n.º 13
0
 public void SetVirtualHarware(Error error)
 {
     memory   = new VirtualMemory(memoryCapacity);
     register = new Register();
     cpu      = new VirtualCPU();
     cpu.SetVirtualCPU(memory, register, error);
     this.error = error;
 }
Exemplo n.º 14
0
        public void VirtualMemoryTest_ReadStringLines_BiggerThan16Bit_Fail()
        {
            string[] lines = FileManager.Instance.ToReadFile(machineCodeFileInvalid);

            Assert.IsNotNull(lines);

            VirtualMemory vm = new VirtualMemory(lines);
        }
Exemplo n.º 15
0
        public void ASCIIDisplayTests_TestPorts_Write()
        {
            VirtualMemory vm = new VirtualMemory(new string[] {
                "0000",
                "0000",
                "0000",
                "0000",
                "0000",
                "0000",
                "0000",
                "0000"
            });

            IOManager manager = new IOManager(100);

            MicroSimulator micro = new MicroSimulator(vm, manager);

            Console.WriteLine("Starting State:");
            Console.Write(vm);
            Console.WriteLine(manager);
            Console.WriteLine(micro);

            ushort        start_port = 5;
            ASCII_Display display    = new ASCII_Display(start_port, true);

            manager.AddIODevice(start_port, display);

            Console.WriteLine("\nAfter adding ASCII Display:");
            Console.WriteLine(manager);

            Console.WriteLine($"\nIO Device: {display}");

            Assert.AreEqual("00", display.ReadFromPort(5));

            //Write To Valid port range
            Assert.IsTrue(display.WriteInPort(5, "48"));
            Assert.IsTrue(display.WriteInPort(6, "6F"));
            Assert.IsTrue(display.WriteInPort(7, "6C"));
            Assert.IsTrue(display.WriteInPort(8, "61"));

            Console.WriteLine(display);

            //Writing into invalid Ports

            //Positive before valid range
            Assert.AreEqual(display.WriteInPort(4, "X"), false);

            //Positive after valid range
            Assert.AreEqual(display.WriteInPort(13, "X"), false);

            //Maximum Port Number
            Assert.AreEqual(display.WriteInPort(short.MaxValue, "X"), false);

            //Negative Port Number
            Assert.AreEqual(display.WriteInPort(short.MinValue, "X"), false);
        }
Exemplo n.º 16
0
        static void Menu(VirtualMemory vm)
        {
            int command;

            while (true)
            {
                command = AskInt(_menu, 0, 6);
                _menuActions[command].Invoke(vm);
            }
        }
Exemplo n.º 17
0
 public override void Copy(VirtualMemory source)
 {
     base.Copy(source);
     Height           = ((VirtualFrame)source).Height;
     Width            = ((VirtualFrame)source).Width;
     xOffset          = ((VirtualFrame)source).xOffset;
     yOffset          = ((VirtualFrame)source).yOffset;
     BytesPerPixel    = ((VirtualFrame)source).BytesPerPixel;
     TransparentColor = ((VirtualFrame)source).TransparentColor;
 }
Exemplo n.º 18
0
        public void VirtualMemoryTest_ReadStringLines_InvalidHexAddress()
        {
            string[] lines = FileManager.Instance.ToReadFile(machineCodeFile);

            Assert.IsNotNull(lines);

            VirtualMemory vm = new VirtualMemory(lines);

            vm.GetContentsInHex("1194");
        }
Exemplo n.º 19
0
        public void VirtualMemoryTest_InvalidData_InvalidHexAddress()
        {
            string[] lines = FileManager.Instance.ToReadFile(machineCodeFile);

            Assert.IsNotNull(lines);

            VirtualMemory vm = new VirtualMemory(lines);

            vm.SetContentInMemory(45, "1194");
        }
Exemplo n.º 20
0
        public void ResolvesIndexedIndirectAddress()
        {
            var memory = new VirtualMemory();
            var state  = Mos6502State.PowerUp.With(pc: 0x01, x: 0x02);

            memory.Attach(0x0000, new byte[] { 0xAB, 0xAB, 0x10 });
            memory.Attach(0x0010, new byte[] { 0xAB, 0xAB, 0xEF, 0xBE });
            var(address, _) = Mos6502Executor.ResolveAddress(Mos6502AddressingMode.IndexedIndirect, in state, memory);

            Assert.Equal(0xBEEF, address);
        }
Exemplo n.º 21
0
        public void LoadNextPage()
        {
            var replacing = _pagesToLoad.Current;

            if (replacing == null)
            {
                throw new NullReferenceException("no more pages to load");
            }
            VirtualMemory.Accept(replacing);
            PhysicalMemory.Accept(replacing);
            _pagesToLoad.MoveNext();
        }
Exemplo n.º 22
0
        public void ResolvesIndirectIndexedAddress()
        {
            var memory = new VirtualMemory();
            var state  = Mos6502State.PowerUp.With(pc: 0x01, y: 0x02);

            memory.Attach(0x0000, new byte[] { 0xAB, 0xAB, 0x12 });
            memory.Attach(0x0010, new byte[] { 0xAB, 0xAB, 0x10, 0x10 });
            var(address, crossesBoundary) = Mos6502Executor.ResolveAddress(Mos6502AddressingMode.IndirectIndexed, in state, memory);

            Assert.Equal(0x1012, address);
            Assert.False(crossesBoundary);
        }
Exemplo n.º 23
0
        public void IndicatesIfAPageBoundaryIsCrossedByIndirectIndexing()
        {
            var memory = new VirtualMemory();
            var state  = Mos6502State.PowerUp.With(pc: 0x01, y: 0x01);

            memory.Attach(0x0000, new byte[] { 0xAB, 0xAB, 0x12 });
            memory.Attach(0x0010, new byte[] { 0xAB, 0xAB, 0xFF, 0x1F });
            var(address, crossesBoundary) = Mos6502Executor.ResolveAddress(Mos6502AddressingMode.IndirectIndexed, in state, memory);

            Assert.Equal(0x2000, address);
            Assert.True(crossesBoundary);
        }
Exemplo n.º 24
0
        public void ASCIIDisplayTests_ReadFromMicro_Success()
        {
            VirtualMemory vm = new VirtualMemory(new string[] {
                "0000",
                "0000",
                "0000",
                "0000",
                "0000",
                "0000",
                "0000",
                "0000"
            });

            IOManager manager = new IOManager(100);

            MicroSimulator micro = new MicroSimulator(vm, manager);

            Console.WriteLine("Starting State:");
            Console.Write(vm);
            Console.WriteLine(manager);
            Console.WriteLine(micro);

            ASCII_Display display = new ASCII_Display(5, true);

            manager.AddIODevice(5, display);

            Console.WriteLine("\nAfter adding ASCII Display:");
            Console.WriteLine(manager);

            Console.WriteLine($"\nIO Device: {display}");

            Assert.AreEqual("00", display.ReadFromPort(5));

            display.WriteInPort(5, "48");
            display.WriteInPort(6, "6F");
            display.WriteInPort(7, "6C");
            display.WriteInPort(8, "61");

            Console.WriteLine(display);

            string h = micro.ReadFromMemory(5);
            string o = micro.ReadFromMemory(6);
            string l = micro.ReadFromMemory(7);
            string a = micro.ReadFromMemory(8);

            Assert.AreEqual("48", h);
            Assert.AreEqual("6F", o);
            Assert.AreEqual("6C", l);
            Assert.AreEqual("61", a);

            Console.WriteLine($"\nContent read in Hex: {h} {o} {l} {a}");
        }
Exemplo n.º 25
0
        private bool FileDeleteInterrupt()
        {
            int x = GetCurrentCommandSecondLastArgument();

            char[][] fileNameBlock = VirtualMemory.GetBlockValues(x * Utility.BLOCK_SIZE);
            if (!FileManager.DeleteFile(fileNameBlock))
            {
                return(false);
            }

            ResetSIRegister();
            return(false);
        }
Exemplo n.º 26
0
        private string GetPrettyInstruction(IMCInstruction instruction)
        {
            if (instruction == null)
            {
                return("");
            }

            string addressHex = UnitConverter.IntToHex(instruction.InstructionAddressDecimal, defaultWidth: 3);

            string contentHex = VirtualMemory.GetContentsInHex(instruction.InstructionAddressDecimal) +
                                VirtualMemory.GetContentsInHex(instruction.InstructionAddressDecimal + 1);

            return($"{addressHex}: {contentHex}: {instruction.ToString()}");
        }
Exemplo n.º 27
0
        public void InitializeMicroOBJ(string[] objFileLines)
        {
            Clear();

            OBJFileLines = objFileLines;

            //Micro simulator setup
            VirtualMemory = new VirtualMemory(OBJFileLines);

            // state the last port for the micro
            IoManager = new IOManager(VirtualMemory.VirtualMemorySize - 1);

            Micro = new MicroSimulator(VirtualMemory, IoManager);
        }
Exemplo n.º 28
0
        public void MCLoaderTests_ExecuteOneInstruction_Success()
        {
            string expected = "MCInstructionF3[InstructionAddressDecimal: (decimal)'0', opcode:'21', AddressParamHex:'06']";

            VirtualMemory vm = new VirtualMemory(new string[] { "A8 06" });

            MCLoader l = new MCLoader(vm, new MicroSimulator(vm));

            IMCInstruction i = l.NextInstruction();

            Console.WriteLine(i);

            Assert.AreEqual(expected, i.ToString());
        }
Exemplo n.º 29
0
        private bool FileReadBlockInterrupt()
        {
            int[]    xy            = GetCurrentCommandLastTwoArguments();
            char[][] blockFromFile = FileManager.ReadFile(xy[0]);
            if (blockFromFile == null)
            {
                return(false);
            }

            VirtualMemory.SetBlockValues(xy[1] * Utility.BLOCK_SIZE, blockFromFile);

            ResetSIRegister();
            return(true);
        }
Exemplo n.º 30
0
        private bool FileWriteBlockInterrupt()
        {
            int[]    xy          = GetCurrentCommandLastTwoArguments();
            char[][] blockToFile = VirtualMemory.GetBlockValues(xy[1] * Utility.BLOCK_SIZE);
            bool     result      = FileManager.WriteFile(xy[0], blockToFile);

            if (!result)
            {
                return(false);
            }

            ResetSIRegister();
            return(true);
        }