Beispiel #1
0
        public void TestSetAndReadBytes() //MOV AL, BH
        {
            byte[] test;
            RegistersController registry = new PointerRegisters();

            registry.SetBytesToRegistry("BP", 0, 1);
            test = registry.GetRegistry("BP");
            Assert.AreEqual(BitConverter.ToUInt16(test), 256);

            registry.SetBytesToRegistry("SP", 0, 255);
            test = registry.GetRegistry("SP");
            Assert.AreEqual(BitConverter.ToUInt16(test), 65280);

            registry.SetBytesToRegistry("BP", 1, 0, 1, 0, 1, 0);
            test = registry.GetRegistry("BP");
            Assert.AreEqual(BitConverter.ToUInt16(test), 1);

            registry.SetBytesToRegistry("SP", 255);
            test = registry.GetRegistry("SP");
            Assert.AreEqual(BitConverter.ToUInt16(test), 255);

            registry.SetBytesToRegistry("BP");
            test = registry.GetRegistry("BP");
            Assert.AreEqual(BitConverter.ToUInt16(test), 1);
        }
Beispiel #2
0
        public void TestPOP()
        {
            MemoryModel.SetAddressBusLength = 20;
            MemoryModel             memory = MemoryModel.GetInstance();
            GeneralPurposeRegisters generalRegistersMock = new GeneralPurposeRegisters();
            SegmentRegisters        segmentRegistersMock = new SegmentRegisters();
            PointerRegisters        pointerRegistersMock = new PointerRegisters();
            LoggerMock        loggerMock      = new LoggerMock();
            RegistryCommander registryCommand = new RegistryCommander(loggerMock);

            POP              pop      = new POP(generalRegistersMock, pointerRegistersMock, segmentRegistersMock);
            PUSH             push     = new PUSH(generalRegistersMock, pointerRegistersMock, segmentRegistersMock);
            XCHG             xchg     = new XCHG(generalRegistersMock, segmentRegistersMock);
            MOV              mov      = new MOV(generalRegistersMock, segmentRegistersMock);
            AssignToRegistry assignTo = new AssignToRegistry(generalRegistersMock, pointerRegistersMock, segmentRegistersMock);

            registryCommand.AddHandler(pop);
            registryCommand.AddHandler(push);
            registryCommand.AddHandler(xchg);
            registryCommand.AddHandler(mov);
            registryCommand.AddHandler(assignTo);

            byte[] word;

            registryCommand.InputCommand("ax 1122");
            registryCommand.InputCommand("push ax");
            registryCommand.InputCommand("pop cx");
            word = generalRegistersMock.GetRegistry("CX");
            Assert.AreEqual(34, word[0]);
            Assert.AreEqual(17, word[1]);
            Assert.AreEqual("Value 1122h from physical address 0h popped from stack to registry CX.\r\n", loggerMock.outputResult);

            word = pointerRegistersMock.GetRegistry("SP");
            Assert.AreEqual(0, word[0]);

            registryCommand.InputCommand("ax FFEE");
            registryCommand.InputCommand("bx AA99");
            registryCommand.InputCommand("SS FF");
            registryCommand.InputCommand("push ax");
            registryCommand.InputCommand("push bx");
            registryCommand.InputCommand("pop dx");
            word = generalRegistersMock.GetRegistry("DX");
            Assert.AreEqual(153, word[0]);
            Assert.AreEqual(170, word[1]);
            Assert.AreEqual("Value AA99h from physical address FF2h popped from stack to registry DX.\r\n", loggerMock.outputResult);

            word = pointerRegistersMock.GetRegistry("SP");
            Assert.AreEqual(2, word[0]);
        }
Beispiel #3
0
        public void TestMOVInvalidCommands()
        {
            MemoryModel.SetAddressBusLength = 20;
            GeneralPurposeRegisters registersMock = new GeneralPurposeRegisters();
            SegmentRegisters        segmentsMock  = new SegmentRegisters();
            PointerRegisters        pointersMock  = new PointerRegisters();
            LoggerMock        loggerMock          = new LoggerMock();
            RegistryCommander registryCommand     = new RegistryCommander(loggerMock);

            MOV mov = new MOV(registersMock, pointersMock, segmentsMock);
            AssignToRegistry assign = new AssignToRegistry(registersMock, pointersMock, segmentsMock);

            registryCommand.AddHandler(mov);
            registryCommand.AddHandler(assign);

            registryCommand.InputCommand("mov ak, bh");
            Assert.AreEqual(loggerMock.outputResult, "AK is unsupported registry name.");

            registryCommand.InputCommand("mov ah, bk");
            Assert.AreEqual(loggerMock.outputResult, "BK is unsupported registry name.");

            registryCommand.InputCommand("mov ah bk");
            Assert.AreEqual(loggerMock.outputResult, "MOV arguments must be separated by comma.");

            registryCommand.InputCommand("mov ch,");
            Assert.AreEqual(loggerMock.outputResult, "Too few arguments to function MOV.");

            registryCommand.InputCommand("mov ax, [0");
            Assert.AreEqual(loggerMock.outputResult, "Argument is missing bracket.");

            registryCommand.InputCommand("mov [0, ax");
            Assert.AreEqual(loggerMock.outputResult, "Argument is missing bracket.");

            registryCommand.InputCommand("mov [0, ch");
            Assert.AreEqual(loggerMock.outputResult, "Argument is missing bracket.");

            registryCommand.InputCommand("BP ffff");
            registryCommand.InputCommand("DS ffff");
            registryCommand.InputCommand("mov [BP], CX");
            Assert.AreEqual("Converting arguments into effective address FFFFh.\r\nPhysical address 10FFEFh is out of range memory.\nAborting operation MOV.\r\n", loggerMock.outputResult);

            registryCommand.InputCommand("mov CX, [BP]");
            Assert.AreEqual("Converting arguments into effective address FFFFh.\r\nPhysical address 10FFEFh is out of range memory.\nAborting operation MOV.\r\n", loggerMock.outputResult);

            MemoryModel.SetAddressBusLength = 0;
        }
Beispiel #4
0
        public void TestPUSH()
        {
            MemoryModel.SetAddressBusLength = 20;
            MemoryModel             memory = MemoryModel.GetInstance();
            GeneralPurposeRegisters generalRegistersMock = new GeneralPurposeRegisters();
            SegmentRegisters        segmentRegistersMock = new SegmentRegisters();
            PointerRegisters        pointerRegistersMock = new PointerRegisters();
            LoggerMock        loggerMock      = new LoggerMock();
            RegistryCommander registryCommand = new RegistryCommander(loggerMock);

            PUSH             push     = new PUSH(generalRegistersMock, pointerRegistersMock, segmentRegistersMock);
            XCHG             xchg     = new XCHG(generalRegistersMock, segmentRegistersMock);
            MOV              mov      = new MOV(generalRegistersMock, segmentRegistersMock);
            AssignToRegistry assignTo = new AssignToRegistry(generalRegistersMock, pointerRegistersMock, segmentRegistersMock);

            registryCommand.AddHandler(push);
            registryCommand.AddHandler(xchg);
            registryCommand.AddHandler(mov);
            registryCommand.AddHandler(assignTo);

            byte[] word;

            registryCommand.InputCommand("ax 1122");
            registryCommand.InputCommand("push ax");
            word = memory.GetMemoryWord(0);
            Assert.AreEqual(word[0], 34);
            Assert.AreEqual(word[1], 17);
            Assert.AreEqual("Value 1122h from registry AX pushed on stack with physical address 0h.\r\n", loggerMock.outputResult);

            word = pointerRegistersMock.GetRegistry("SP");
            Assert.AreEqual(word[0], 2);

            registryCommand.InputCommand("ax FFEE");
            registryCommand.InputCommand("bx AA99");
            registryCommand.InputCommand("SS FF");
            registryCommand.InputCommand("push ax");
            registryCommand.InputCommand("push bx");
            word = memory.GetMemoryWord(4083);
            Assert.AreEqual(word[0], 255);
            Assert.AreEqual(word[1], 153);
            Assert.AreEqual("Value AA99h from registry BX pushed on stack with physical address FF4h.\r\n", loggerMock.outputResult);

            word = pointerRegistersMock.GetRegistry("SP");
            Assert.AreEqual(word[0], 6);
        }
        public MainWindow()
        {
            InitializeComponent();

            MemoryModel.SetAddressBusLength = 20;
            MemoryModel.GetInstance().AddObserver(this);
            memoryView = new MemoryView();
            Go_Click(null, null);

            generalPurposeRegisters = new GeneralPurposeRegisters();
            indexRegisters          = new IndexRegisters();
            pointerRegisters        = new PointerRegisters();
            segmentRegisters        = new SegmentRegisters();

            commandInterpreter = InitDefaultRegistryCommander();

            generalPurposeRegistersView = new GeneralPurposeRegistersView(new HexParser());
            indexRegistersView          = new IndexRegistersView(new HexParser());
            pointerRegistersView        = new PointerRegistersView(new HexParser());
            segmentRegistersView        = new SegmentRegistersView(new HexParser());

            if (generalPurposeRegisters is Observable observableGeneralPurposeReg)
            {
                observableGeneralPurposeReg.AddObserver(generalPurposeRegistersView);
            }
            if (indexRegisters is Observable observableIndexReg)
            {
                observableIndexReg.AddObserver(indexRegistersView);
            }
            if (pointerRegisters is Observable observablePointersReg)
            {
                observablePointersReg.AddObserver(pointerRegistersView);
            }
            if (segmentRegisters is Observable observableSegmentsReg)
            {
                observableSegmentsReg.AddObserver(segmentRegistersView);
            }

            SetBlockDataContext();
        }