Ejemplo n.º 1
0
        public void DoNextInstruction()
        {
            if (IsFinished)
            {
                return;
            }

            string command = m_realMachine.ReadMem(PagesTable.GetPhysicalAddress(PC)).GetString().TrimStart();

            PC++;

            if (command.StartsWith(Commands.ADD.ToString()))
            {
                DoAdd();
                return;
            }
            if (command.StartsWith(Commands.SUB.ToString()))
            {
                DoSub();
                return;
            }
            if (command.StartsWith(Commands.CMP.ToString()))
            {
                DoCmp();
                return;
            }
            if (command.StartsWith(Commands.MUL.ToString()))
            {
                DoMul();
                return;
            }
            if (command.StartsWith(Commands.DIV.ToString()))
            {
                DoDiv();
                return;
            }
            if (command.StartsWith(Commands.WR.ToString()))
            {
                DoWR(command);
                return;
            }
            if (command.StartsWith(Commands.RD.ToString()))
            {
                DoRd(command);
                return;
            }
            if (command.StartsWith(Commands.LD.ToString()))
            {
                DoLD(command);
                return;
            }
            if (command.StartsWith(Commands.PT.ToString()))
            {
                DoPT(command);
                return;
            }
            if (command.StartsWith(Commands.JP.ToString()))
            {
                DoJp(command);
                return;
            }
            if (command.StartsWith(Commands.JE.ToString()))
            {
                DoJe(command);
                return;
            }
            if (command.StartsWith(Commands.JL.ToString()))
            {
                DoJL(command);
                return;
            }
            if (command.StartsWith(Commands.JG.ToString()))
            {
                DoJG(command);
                return;
            }
            if (command.StartsWith(Commands.FORK.ToString()))
            {
                DoFork();
                return;
            }
            // flush stack - removes one element from stack
            if (command.StartsWith(Commands.FLUS.ToString()))
            {
                DoFlus();
                return;
            }
            if (command.StartsWith(Commands.COPY.ToString()))
            {
                DoCopy();
                return;
            }
            if (command.StartsWith(Commands.STOP.ToString()))
            {
                DoStop();
                return;
            }
            //print symbol
            if (command.StartsWith(Commands.PRTS.ToString()))
            {
                DoPRTS();
                return;
            }
            //print number
            if (command.StartsWith(Commands.PRTN.ToString()))
            {
                DoPRTN();
                return;
            }
            //prints until & symbol is found - print buffer
            if (command.StartsWith(Commands.PF.ToString()))
            {
                DoPF(command);
                return;
            }
            //stack data address
            if (command.StartsWith(Commands.DA.ToString()))
            {
                DoDA(command);
                return;
            }
            //STACK DATA
            if (command.StartsWith(Commands.SD.ToString()))
            {
                DoSD(command);
                return;
            }
            //PUSH
            if (command.StartsWith(Commands.PS.ToString()))
            {
                DoPs(command);
                return;
            }
            if (String.IsNullOrWhiteSpace(command))
            {
                throw new ProgramContractException("Command instruction is blank line");
            }
            throw new ProgramContractException("Cound not find instruction: " + command);
        }
Ejemplo n.º 2
0
 private Word ReadMem(int virtualAddress)
 {
     return(m_realMachine.ReadMem(PagesTable.GetPhysicalAddress(virtualAddress)));
 }
Ejemplo n.º 3
0
 private void WriteMem(int virtualAddress, Word word)
 {
     m_realMachine.WriteMem(PagesTable.GetPhysicalAddress(virtualAddress), word);
 }
Ejemplo n.º 4
0
        //Loads program (file) to memory and checks if program is good
        public void LoadProgramToMemmory(string programFilePath)
        {
            StreamReader file = new StreamReader(@programFilePath);

            try
            {
                //first line must be $AMJ
                var line = file.ReadLine();
                checkLine(line);
                if (!line.ToUpper().Equals(Settings.Default.ProgramCodeStartSymbol))
                {
                    throw new ProgramContractException("Program must start with $AMJ sign");
                }

                line = file.ReadLine();
                checkLine(line);
                Name = line;

                int  programPointer         = 0;
                var  maxProgramPointerValue = Settings.Default.ProgramSegmentPagesCount * Settings.Default.PageSize - 1;
                bool stopReadingProgramCode = false;
                do
                {
                    line = file.ReadLine();
                    checkLine(line);

                    if (programPointer > maxProgramPointerValue)
                    {
                        throw new ProgramContractException("Program's code is too long!");
                    }
                    if (!line.ToUpper().Equals(Settings.Default.ProgramDataStartSymbol))
                    {
                        var physicalAddress = PagesTable.GetPhysicalAddress(programPointer);
                        m_realMachine.WriteMem(physicalAddress, new Word(line));
                    }
                    else
                    {
                        stopReadingProgramCode = true;
                    }
                    programPointer++;
                } while (!stopReadingProgramCode);

                var dataPointer         = maxProgramPointerValue + 1;
                var maxDataPointerValue = dataPointer + Settings.Default.DataSegmentPagesCount * Settings.Default.PageSize;
                var stopReadingDataCode = false;
                do
                {
                    line = file.ReadLine();
                    checkLine(line);
                    if (dataPointer > maxDataPointerValue)
                    {
                        throw new ProgramContractException("Data code is too long!");
                    }
                    if (!line.ToUpper().Equals(Settings.Default.ProgramEndSymbol))
                    {
                        m_realMachine.WriteMem(PagesTable.GetPhysicalAddress(dataPointer), new Word(line));
                    }
                    else
                    {
                        stopReadingDataCode = true;
                    }
                    dataPointer++;
                } while (!stopReadingDataCode);
            }
            catch (Exception e)
            {
                PagesTable.DeallocateAllPages();
                throw;
            }
            finally
            {
                file.Close();
            }
        }