示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
            }
        }
示例#5
0
 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);
     }
 }
示例#6
0
        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()));
            }
        }
示例#7
0
 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);
     }
 }
示例#8
0
        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;
            }
        }
示例#9
0
        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);
            }
        }
示例#10
0
        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;
            }
        }
示例#11
0
        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));
                }
            }
        }