コード例 #1
0
 public int Add(PUSH item)
 {
     if (!Contains(item))
     {
         return(this.List.Add(item));
     }
     return(0);
 }
コード例 #2
0
 public PUSH[] InnerList()
 {
     PUSH[] list = new PUSH[this.Count];
     for (int i = 0; i < this.Count; i++)
     {
         list[i] = this[i];
     }
     return(list);
 }
コード例 #3
0
ファイル: CommandTest.cs プロジェクト: JakubWier/Intel-8086
        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]);
        }
コード例 #4
0
ファイル: CommandTest.cs プロジェクト: JakubWier/Intel-8086
        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);
        }
コード例 #5
0
        private CommandInterpreter InitDefaultRegistryCommander()
        {
            RegistryCommander commander = new RegistryCommander(this);

            POP              pop      = new POP(generalPurposeRegisters, pointerRegisters, segmentRegisters);
            PUSH             push     = new PUSH(generalPurposeRegisters, pointerRegisters, segmentRegisters);
            XCHG             xchg     = new XCHG(generalPurposeRegisters, indexRegisters, pointerRegisters, segmentRegisters);
            MOV              mov      = new MOV(generalPurposeRegisters, indexRegisters, pointerRegisters, segmentRegisters);
            AssignToRegistry assignTo = new AssignToRegistry(generalPurposeRegisters, indexRegisters, pointerRegisters, segmentRegisters);

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

            return(commander);
        }
コード例 #6
0
        public static void AssociateOpcodes()
        {
            instructions[0] = new NOP();
            instructions[1] = new PRNT();

            instructions[16] = new PUSH();
            instructions[17] = new POP();
            instructions[18] = new SAVE();
            instructions[19] = new CPY();
            instructions[20] = new RNDM();
            instructions[21] = new EMPTY();

            instructions[128] = new ADD();
            instructions[129] = new SUB();
            instructions[130] = new MUL();
            instructions[131] = new DIV();

            instructions[132] = new SUB2();
            instructions[133] = new DIV2();

            instructions[134] = new NEG();
            instructions[135] = new ABS();

            instructions[144] = new INC();
            instructions[145] = new DEC();

            instructions[64] = new JMP();
            instructions[65] = new JGZ();
            instructions[66] = new JLZ();
            instructions[67] = new JEZ();
            instructions[68] = new JNZ();
            instructions[69] = new CALL();
            instructions[70] = new RET();
            instructions[71] = new LDLOC();
            instructions[72] = new STLOC();
            instructions[73] = new LDARG();
            instructions[74] = new STARG();

            instructions[0b10100100] = new CMP();
コード例 #7
0
ファイル: CommandTest.cs プロジェクト: JakubWier/Intel-8086
        public void TestInvalidPUSHCommand()
        {
            MemoryModel.SetAddressBusLength = 20;
            GeneralPurposeRegisters registersMock = new GeneralPurposeRegisters();
            LoggerMock        loggerMock          = new LoggerMock();
            RegistryCommander registryCommand     = new RegistryCommander(loggerMock);

            PUSH push = new PUSH(registersMock);

            registryCommand.AddHandler(push);

            registryCommand.InputCommand("push");
            Assert.AreEqual(loggerMock.outputResult, "Pushing registry on stack requires two arguments.");

            registryCommand.InputCommand("push ak");
            Assert.AreEqual(loggerMock.outputResult, "AK is unsupported registry name.\r\n");

            registryCommand.InputCommand("push ax");
            Assert.AreEqual(loggerMock.outputResult, "Command interpreter couldn't find SP registry.\r\n");

            registryCommand = new RegistryCommander(loggerMock);
            push            = new PUSH(registersMock, new PointerRegisters());
            registryCommand.AddHandler(push);

            registryCommand.InputCommand("push ax");
            Assert.AreEqual(loggerMock.outputResult, "Command interpreter couldn't find SS registry.\r\n");

            registryCommand = new RegistryCommander(loggerMock);
            push            = new PUSH(registersMock, new PointerRegisters(), new SegmentRegisters());
            registryCommand.AddHandler(push);

            registryCommand.InputCommand("push ah");
            Assert.AreEqual(loggerMock.outputResult, "Cannot use command PUSH for half registers.\r\n");

            MemoryModel.SetAddressBusLength = 0;
        }
コード例 #8
0
 public NMIHandler(Z80Cpu cpu)
 {
     _pcPush             = new PUSH(cpu, WideRegister.PC);
     _restartInstruction = new RST(cpu, 0x66);
 }
コード例 #9
0
        public void Test_PUSH(byte opcode)
        {
            ushort sp = 0x4242;

            var expectedState = new CpuState();

            expectedState.StackPointer = (ushort)(sp - 2);

            var actualState = new CpuState();

            actualState.StackPointer = sp;

            actualState.Registers.BC   = 0x1111;
            expectedState.Registers.BC = 0x1111;
            actualState.Registers.DE   = 0x2222;
            expectedState.Registers.DE = 0x2222;
            actualState.Registers.HL   = 0x3333;
            expectedState.Registers.HL = 0x3333;
            expectedState.Registers.F  = 0x44;
            expectedState.Registers.A  = 0x55;
            actualState.Registers.F    = 0x44;
            actualState.Registers.A    = 0x55;

            var memoryMock = new Mock <IRandomAccessMemory>();

            var instruction = new PUSH();

            instruction.Initialize(opcode);

            //act
            while (!instruction.IsFetchNecessary())
            {
                instruction.ExecuteCycle(actualState, memoryMock.Object);
            }

            //assert
            TestHelper.AssertCpuState(expectedState, actualState);

            switch (opcode)
            {
            case 0xC5:
                memoryMock.Verify(m => m.WriteByte((ushort)(sp - 1), actualState.Registers.B), Times.Once);
                memoryMock.Verify(m => m.WriteByte((ushort)(sp - 2), actualState.Registers.C), Times.Once);
                break;

            case 0xD5:
                memoryMock.Verify(m => m.WriteByte((ushort)(sp - 1), actualState.Registers.D), Times.Once);
                memoryMock.Verify(m => m.WriteByte((ushort)(sp - 2), actualState.Registers.E), Times.Once);
                break;

            case 0xE5:
                memoryMock.Verify(m => m.WriteByte((ushort)(sp - 1), actualState.Registers.H), Times.Once);
                memoryMock.Verify(m => m.WriteByte((ushort)(sp - 2), actualState.Registers.L), Times.Once);
                break;

            case 0xF5:
                memoryMock.Verify(m => m.WriteByte((ushort)(sp - 1), actualState.Registers.A), Times.Once);
                memoryMock.Verify(m => m.WriteByte((ushort)(sp - 2), actualState.Registers.F), Times.Once);
                break;
            }
        }
コード例 #10
0
 public bool Contains(PUSH item)
 {
     return(this.List.Contains(item));
 }
コード例 #11
0
 public void Remove(PUSH push)
 {
     this.List.Remove(push);
 }