示例#1
0
        public void JumpTests_ConditionalReturn()
        {
            var sourceCode = "      RET  Z";

            var parser           = new Z80LineParser();
            var actualCommand    = AssertExtension.IsCorrectCommandType <ConditionalReturnCommand>(parser.ParseLine(sourceCode));
            var conditionOperand = AssertExtension.IsCorrectOperandType <ConditionOperand>(actualCommand.Operand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.RET, actualCommand.OpCode);
            Assert.AreEqual(JumpConditions.Z, conditionOperand.Condition);
        }
示例#2
0
        public void JumpTests_UnconditionalCallCommand()
        {
            var sourceCode = "      CALL 45B2h";

            var parser        = new Z80LineParser();
            var actualCommand = AssertExtension.IsCorrectCommandType <UnconditionalCallCommand>(parser.ParseLine(sourceCode));
            var actualOperand = AssertExtension.IsCorrectOperandType <AddressWithoutParenthesisOperand>(actualCommand.Operand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.CALL, actualCommand.OpCode);
            Assert.AreEqual(0x45b2, actualOperand.MemoryAddress);
        }
示例#3
0
        public void JumpTests_DJNZ()
        {
            var sourceCode = "      DJNZ loop1";

            var parser        = new Z80LineParser();
            var actualCommand = AssertExtension.IsCorrectCommandType <DjnzCommand>(parser.ParseLine(sourceCode));
            var actualOperand = AssertExtension.IsCorrectOperandType <LabeledAddressWithoutParenthesisOperand>(actualCommand.Operand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.DJNZ, actualCommand.OpCode);
            Assert.AreEqual("loop1", actualOperand.Label);
        }
示例#4
0
        public void Jump_Unconditional_Labeled()
        {
            var sourceCode = "      JP   toplace";

            var parser        = new Z80LineParser();
            var actualCommand = AssertExtension.IsCorrectCommandType <UnconditionalJumpCommand>(parser.ParseLine(sourceCode));
            var actualOperand = AssertExtension.IsCorrectOperandType <LabeledAddressWithoutParenthesisOperand>(actualCommand.Operand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.JP, actualCommand.OpCode);
            Assert.AreEqual("toplace", actualOperand.Label);
        }
示例#5
0
        public void JumpRelative_Unconditional_IndirectRegister()
        {
            var sourceCode = "      JR   (IY)";

            var parser        = new Z80LineParser();
            var actualCommand = AssertExtension.IsCorrectCommandType <UnconditionalRelativeJumpCommand>(parser.ParseLine(sourceCode));
            var actualOperand = AssertExtension.IsCorrectOperandType <IndirectRegisterOperand>(actualCommand.Operand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.JR, actualCommand.OpCode);
            Assert.AreEqual(ExtendedRegister.IY, actualOperand.Register);
        }
示例#6
0
        public void JumpTests_UnconditionalCallCommand_ToLabeledAddress()
        {
            var sourceCode = "      CALL overThere";

            var parser        = new Z80LineParser();
            var actualCommand = AssertExtension.IsCorrectCommandType <UnconditionalCallCommand>(parser.ParseLine(sourceCode));
            var actualOperand = AssertExtension.IsCorrectOperandType <LabeledAddressWithoutParenthesisOperand>(actualCommand.Operand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.CALL, actualCommand.OpCode);
            Assert.AreEqual("overThere", actualOperand.Label);
        }
示例#7
0
        public void JumpRelative_Unconditional_Address()
        {
            var sourceCode = "      JR   4210h";

            var parser        = new Z80LineParser();
            var actualCommand = AssertExtension.IsCorrectCommandType <UnconditionalRelativeJumpCommand>(parser.ParseLine(sourceCode));
            var actualOperand = AssertExtension.IsCorrectOperandType <AddressWithoutParenthesisOperand>(actualCommand.Operand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.JR, actualCommand.OpCode);
            Assert.AreEqual(0x4210, actualOperand.MemoryAddress);
        }
示例#8
0
        public void LoadParing_LoadCommand_FromMemory_SixteenBit()
        {
            var sourceCode = "      LD   BC,(#48a9)";

            var parser                   = new Z80LineParser("#", "");
            var actualCommand            = AssertExtension.IsCorrectCommandType <LoadCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <ExtendedAddressOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <RegisterExtendedOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(0x48a9, actualSourceOperand.MemoryAddress);
            Assert.AreEqual(ExtendedRegister.BC, actualDestinationOperand.Register);
        }
示例#9
0
        public void LoadParing_LoadCommand_HexNumberNoPrefix()
        {
            var sourceCode = "      LD   B,AA";

            var parser                   = new Z80LineParser("", "");
            var actualCommand            = AssertExtension.IsCorrectCommandType <LoadCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <ImmediateOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(0xAA, actualSourceOperand.ImmediateValue);
            Assert.AreEqual(Register.B, actualDestinationOperand.Register);
        }
示例#10
0
        public void LoadParing_LoadCommand_IndirectRegisterOperand()
        {
            var sourceCode = "      LD   (HL),47h";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <LoadCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <ImmediateOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <IndirectRegisterOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(0x47, actualSourceOperand.ImmediateValue);
            Assert.AreEqual(ExtendedRegister.HL, actualDestinationOperand.Register);
        }
示例#11
0
        public void LoadParing_LoadCommand_EightBitImmediate()
        {
            var sourceCode = "      LD   B,132";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <LoadCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <ImmediateOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(132, actualSourceOperand.ImmediateValue);
            Assert.AreEqual(Register.B, actualDestinationOperand.Register);
        }
        public void ArithmeticParing_CompareCommand()
        {
            var sourceCode = "      CP   (IX-#7f)";

            var parser        = new Z80LineParser("#", "");
            var actualCommand = AssertExtension.IsCorrectCommandType <CompareCommand>(parser.ParseLine(sourceCode));
            var actualOperand = AssertExtension.IsCorrectOperandType <DisplacementOperand>(actualCommand.Operand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.CP, actualCommand.OpCode);
            Assert.AreEqual(ExtendedRegister.IX, actualOperand.Register);
            Assert.AreEqual(-127, actualOperand.Displacement);
        }
示例#13
0
        public void LoadParing_LoadCommand_TwoExtendedRegisters()
        {
            var sourceCode = "      LD   DE,HL";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <LoadCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <RegisterExtendedOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <RegisterExtendedOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(ExtendedRegister.HL, actualSourceOperand.Register);
            Assert.AreEqual(ExtendedRegister.DE, actualDestinationOperand.Register);
        }
        public void ArithmeticParing_AddCommand()
        {
            var sourceCode = "      ADD  A,0x47";

            var parser                   = new Z80LineParser("0x", "");
            var actualCommand            = AssertExtension.IsCorrectCommandType <AddCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <ImmediateOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.ADD, actualCommand.OpCode);
            Assert.AreEqual(0x47, actualSourceOperand.ImmediateValue);
            Assert.AreEqual(Register.A, actualDestinationOperand.Register);
        }
示例#15
0
        public void LoadParing_LoadCommand_LabeledAddress()
        {
            var sourceCode = "      LD   E,(curScore)";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <LoadCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <LabeledAddressOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual("curScore", actualSourceOperand.Label);
            Assert.AreEqual("(curScore)", actualSourceOperand.DisplayValue);
            Assert.AreEqual(Register.E, actualDestinationOperand.Register);
        }
示例#16
0
        public void LoadParing_LoadCommand_LabeledImmediate()
        {
            var sourceCode = "      LD   HL,currentScore";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <LoadCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <LabeledImmediateOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <RegisterExtendedOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual("currentScore", actualSourceOperand.Label);
            Assert.AreEqual("currentScore", actualSourceOperand.DisplayValue);
            Assert.AreEqual(ExtendedRegister.HL, actualDestinationOperand.Register);
        }
示例#17
0
        public void JumpRelative_Conditional_Labeled()
        {
            var sourceCode = "      JR   C,hither";

            var parser           = new Z80LineParser();
            var actualCommand    = AssertExtension.IsCorrectCommandType <ConditionalRelativeJumpCommand>(parser.ParseLine(sourceCode));
            var conditionOperand = AssertExtension.IsCorrectOperandType <ConditionOperand>(actualCommand.ConditionOperand);
            var addressOperand   = AssertExtension.IsCorrectOperandType <LabeledAddressWithoutParenthesisOperand>(actualCommand.AddressOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(JumpConditions.C, conditionOperand.Condition);
            Assert.AreEqual(OpCode.JR, actualCommand.OpCode);
            Assert.AreEqual("hither", addressOperand.Label);
        }
示例#18
0
        public void LoadParsing_LowerCaseRegisters()
        {
            var sourceCode = "      LD   b,c";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <LoadCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.LD, actualCommand.OpCode);
            Assert.AreEqual(Register.C, actualSourceOperand.Register);
            Assert.AreEqual(Register.B, actualDestinationOperand.Register);
        }
示例#19
0
        public void Jump_Conditional_Address()
        {
            var sourceCode = "      JP   PE,194Fh";

            var parser           = new Z80LineParser();
            var actualCommand    = AssertExtension.IsCorrectCommandType <ConditionalJumpCommand>(parser.ParseLine(sourceCode));
            var conditionOperand = AssertExtension.IsCorrectOperandType <ConditionOperand>(actualCommand.ConditionOperand);
            var addressOperand   = AssertExtension.IsCorrectOperandType <AddressWithoutParenthesisOperand>(actualCommand.AddressOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(JumpConditions.PE, conditionOperand.Condition);
            Assert.AreEqual(OpCode.JP, actualCommand.OpCode);
            Assert.AreEqual(0x194F, addressOperand.MemoryAddress);
        }
        public void TwoOperandParsing_OutCommand_ToCIndirect()
        {
            var sourceCode = "      OUT  (c),b";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <OutCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <IndirectShortRegOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.OUT, actualCommand.OpCode);
            Assert.AreEqual(Register.B, actualSourceOperand.Register);
            Assert.AreEqual(Register.C, actualDestinationOperand.Register);
        }
        public void TwoOperandParsing_OutCommand_FromAccumulator()
        {
            var sourceCode = "      OUT  (34),A";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <OutCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <ExtendedAddressOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.OUT, actualCommand.OpCode);
            Assert.AreEqual(Register.A, actualSourceOperand.Register);
            Assert.AreEqual(34, actualDestinationOperand.MemoryAddress);
        }
示例#22
0
        public void LoadParing_LoadCommand_ExtraneousSpace()
        {
            var sourceCode = "      LD   BC, 132";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <LoadCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <ImmediateExtendedOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <RegisterExtendedOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.LD, actualCommand.OpCode);
            Assert.AreEqual(132, actualSourceOperand.ImmediateValue);
            Assert.AreEqual(ExtendedRegister.BC, actualDestinationOperand.Register);
        }
        public void TwoOperandParsing_OutCommand_WithComment()
        {
            var sourceCode = "      OUT  c,b    ; A trailing comment you are reading";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <OutCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.OUT, actualCommand.OpCode);
            Assert.AreEqual(Register.B, actualSourceOperand.Register);
            Assert.AreEqual(Register.C, actualDestinationOperand.Register);
            Assert.AreEqual("A trailing comment you are reading", actualCommand.TrailingComment);
        }
示例#24
0
        public void LoadParsing_IY_Displacement2()
        {
            var sourceCode = "      ld      (iy+00h),a";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <LoadCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <DisplacementOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.LD, actualCommand.OpCode);
            Assert.AreEqual(Register.A, actualSourceOperand.Register);
            Assert.AreEqual(ExtendedRegister.IY, actualDestinationOperand.Register);
            Assert.AreEqual(0x00, actualDestinationOperand.Displacement);
        }
示例#25
0
        public void LoadParsing_IX_Displacement()
        {
            var sourceCode = "      LD   b,(IX+4ch)";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <LoadCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <DisplacementOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.LD, actualCommand.OpCode);
            Assert.AreEqual(ExtendedRegister.IX, actualSourceOperand.Register);
            Assert.AreEqual(0x4c, actualSourceOperand.Displacement);
            Assert.AreEqual(Register.B, actualDestinationOperand.Register);
            Assert.AreEqual("(IX+76)", actualSourceOperand.DisplayValue);
        }
示例#26
0
        public void LoadParsing_IY_Displacement()
        {
            var sourceCode = "      LD   (IY-72h),l";

            var parser                   = new Z80LineParser();
            var actualCommand            = AssertExtension.IsCorrectCommandType <LoadCommand>(parser.ParseLine(sourceCode));
            var actualSourceOperand      = AssertExtension.IsCorrectOperandType <RegisterOperand>(actualCommand.SourceOperand);
            var actualDestinationOperand = AssertExtension.IsCorrectOperandType <DisplacementOperand>(actualCommand.DestinationOperand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.LD, actualCommand.OpCode);
            Assert.AreEqual(Register.L, actualSourceOperand.Register);
            Assert.AreEqual(ExtendedRegister.IY, actualDestinationOperand.Register);
            Assert.AreEqual((sbyte)-114, actualDestinationOperand.Displacement);
            Assert.AreEqual("(IY-114)", actualDestinationOperand.DisplayValue);
        }
示例#27
0
        public void SingleOperandParsing_Xor_CalculatedImmediate()
        {
            var sourceCode = "      XOR  margin+14h";

            var parser        = new Z80LineParser();
            var actualCommand = AssertExtension.IsCorrectCommandType <XorCommand>(parser.ParseLine(sourceCode));
            var actualOperand = AssertExtension.IsCorrectOperandType <CalculatedImmediateOperand>(actualCommand.Operand);

            Assert.AreEqual(sourceCode, actualCommand.SourceText);
            Assert.AreEqual(OpCode.XOR, actualCommand.OpCode);
            Assert.AreEqual("margin+20", actualOperand.DisplayValue);
            var expectedClauses = new List <object>()
            {
                "margin",
                MathOperator.PLUS,
                (byte)0x14
            };

            CollectionAssert.AreEquivalent(expectedClauses, actualOperand.Clauses);
        }