private void RewritePush(Z80Instruction instr) { var sp = frame.EnsureRegister(Registers.sp); var op = RewriteOp(instr.Op1); emitter.Assign(sp, emitter.ISub(sp, op.DataType.Size)); emitter.Assign(emitter.Load(PrimitiveType.Word16, sp), op); }
private void RewriteShift(Z80Instruction instr, Func <Expression, Expression, Expression> op) { var reg = RewriteOp(instr.Op1); var sh = emitter.Byte(1); emitter.Assign(reg, op(reg, sh)); AssignCond(FlagM.CF | FlagM.ZF | FlagM.SF | FlagM.PF, reg); }
private void RewritePush(Z80Instruction instr) { var sp = binder.EnsureRegister(Registers.sp); var op = RewriteOp(instr.Operands[0]); m.Assign(sp, m.ISub(sp, op.DataType.Size)); m.Assign(m.Mem(PrimitiveType.Word16, sp), op); }
private void RewriteJp(Z80Instruction instr) { var cOp = instr.Op1 as ConditionOperand; if (cOp != null) { EmitBranch(cOp, (ImmediateOperand)instr.Op2); } else { var target = (ImmediateOperand)instr.Op1; emitter.Goto(target.Value); } }
private void RewriteCall(Z80Instruction instr) { if (instr.Operands[0] is ConditionOperand cOp) { m.BranchInMiddleOfInstruction( GenerateTestExpression(cOp, true), instr.Address + instr.Length, InstrClass.ConditionalTransfer); m.Call(((AddressOperand)instr.Operands[1]).Address, 2); } else { m.Call(((AddressOperand)instr.Operands[0]).Address, 2); } }
private void RewriteJp(Z80Instruction instr) { var cOp = instr.Op1 as ConditionOperand; if (cOp != null) { EmitBranch(cOp, (ImmediateOperand)instr.Op2); } else { var target = (ImmediateOperand)instr.Op1; rtlc.Class = RtlClass.Transfer; emitter.Goto(Address.Ptr16(target.Value.ToUInt16())); } }
private void RewriteCall(Z80Instruction instr) { rtlc = RtlClass.Transfer | RtlClass.Call; if (instr.Op1 is ConditionOperand cOp) { m.BranchInMiddleOfInstruction( GenerateTestExpression(cOp, true), instr.Address + instr.Length, RtlClass.ConditionalTransfer); m.Call(((AddressOperand)instr.Op2).Address, 2); } else { m.Call(((AddressOperand)instr.Op1).Address, 2); } }
private void RewriteJp(Z80Instruction instr) { switch (instr.Operands[0]) { case ConditionOperand cOp: EmitBranch(cOp, ((AddressOperand)instr.Operands[1]).Address); break; case AddressOperand target: m.Goto(target.Address); break; case MemoryOperand mTarget: m.Goto(binder.EnsureRegister(mTarget.Base)); break; } }
private void RewriteCall(Z80Instruction instr) { var cOp = instr.Op1 as ConditionOperand; if (cOp != null) { emitter.BranchInMiddleOfInstruction( GenerateTestExpression(cOp, true), instr.Address + instr.Length, RtlClass.ConditionalTransfer); emitter.Call(((ImmediateOperand)instr.Op2).Value, 2); } else { emitter.Call(((ImmediateOperand)instr.Op1).Value, 2); } }
private void RewriteJp(Z80Instruction instr) { rtlc = RtlClass.Transfer; switch (instr.Op1) { case ConditionOperand cOp: EmitBranch(cOp, ((AddressOperand)instr.Op2).Address); break; case AddressOperand target: rtlc = RtlClass.Transfer; m.Goto(target.Address); break; case MemoryOperand mTarget: m.Goto(binder.EnsureRegister(mTarget.Base)); break; } }
private void RewriteJp(Z80Instruction instr) { rtlc.Class = RtlClass.Transfer; var cOp = instr.Op1 as ConditionOperand; if (cOp != null) { EmitBranch(cOp, ((AddressOperand)instr.Op2).Address); } else { var target = instr.Op1 as AddressOperand; if (target != null) { rtlc.Class = RtlClass.Transfer; emitter.Goto(target.Address); } var mTarget = instr.Op1 as MemoryOperand; if (mTarget != null) { emitter.Goto(frame.EnsureRegister(mTarget.Base)); } } }