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 }); } }
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)); } }