public override IEnumerable <TmsCommand> Translate(Z80AssemblyParsing.Commands.UnconditionalReturnCommand returnCommand)
        {
            var stackOperand    = new IndirectAutoIncrementTmsOperand(_extendedRegisterMap[Z80AssemblyParsing.ExtendedRegister.SP]);
            var registerOperand = new RegisterTmsOperand(WorkspaceRegister.R11);

            yield return(new MoveCommand(returnCommand, stackOperand, registerOperand));

            yield return(new ReturnCommand(returnCommand));
        }
        public override IEnumerable <TmsCommand> Translate(ConditionalReturnCommand returnCommand)
        {
            var stackPointerOperand   = new IndirectAutoIncrementTmsOperand(_extendedRegisterMap[Z80AssemblyParsing.ExtendedRegister.SP]);
            var returnAddressRegister = new RegisterTmsOperand(WorkspaceRegister.R11);

            if (returnCommand.ConditionOperand.Condition == Z80AssemblyParsing.JumpConditions.PO ||
                returnCommand.ConditionOperand.Condition == Z80AssemblyParsing.JumpConditions.PE)
            {
                yield return(new UntranslateableComment(returnCommand, $"ret translations on PO or PE condition are not automated."));

                yield return(new UntranslateableComment(returnCommand, "Z80 used a single flag for Parity and Overflow, TMS9900 used two flags."));

                yield return(new UntranslateableComment(returnCommand, "A human must decide whether to use JNO or JOP."));

                yield return(new UntranslateableComment(returnCommand, returnCommand.SourceText));
            }
            else if (_typesByCondition.ContainsKey(returnCommand.ConditionOperand.Condition))
            {
                var retLabel = _labelHighlighter.GetNextRtLabel();
                yield return(GetInverseJumpCommand(returnCommand, retLabel));

                yield return(new MoveCommand(returnCommand, stackPointerOperand, returnAddressRegister));

                yield return(new ReturnCommand(returnCommand));

                yield return(new BlankLineInTms(returnCommand)
                {
                    Label = retLabel
                });
            }
            else if (returnCommand.ConditionOperand.Condition == Z80AssemblyParsing.JumpConditions.M)
            {
                var retLabel1 = _labelHighlighter.GetNextRtLabel();
                var retLabel2 = _labelHighlighter.GetNextRtLabel();
                yield return(new JumpIfLessThanCommand(returnCommand, new LabeledAddressWithoutAtTmsOperand(retLabel1)));

                yield return(new JumpCommand(returnCommand, new LabeledAddressWithoutAtTmsOperand(retLabel2)));

                yield return(new BlankLineInTms(returnCommand)
                {
                    Label = retLabel1
                });

                yield return(new MoveCommand(returnCommand, stackPointerOperand, returnAddressRegister));

                yield return(new ReturnCommand(returnCommand));

                yield return(new BlankLineInTms(returnCommand)
                {
                    Label = retLabel2
                });
            }
        }
Esempio n. 3
0
        public override IEnumerable <TmsCommand> Translate(Z80AssemblyParsing.Commands.PopCommand popCommand)
        {
            var stackPointerIndirect = new IndirectAutoIncrementTmsOperand(_extendedRegisterMap[Z80ExtendedRegister.SP]);
            var destinationOperand   = GetOperand(popCommand.Operand, false);

            yield return(new MoveCommand(popCommand, stackPointerIndirect, destinationOperand));

            if (MustSeparateRegisterPairs(popCommand.Operand, out var copyFromOperand1, out var copyToOperand1))
            {
                yield return(new MoveByteCommand(popCommand, copyFromOperand1, copyToOperand1));
            }
        }