Пример #1
0
        public void EmitLoadAddress(Format12OpCode opCode, LowRegister targetRegister, int target, bool thumbAdjustment)
        {
            var offset = target - ((CurrentAddress + 4) & ~2);

            if (offset >= 0)
            {
                Emit(opCode, targetRegister, target);
                if (thumbAdjustment)
                {
                    Emit(Format3OpCode.ADD, targetRegister, 1);
                }
            }
            else
            {
                //While the Format12 instruction will clear the 1 bit of the PC, this code does not
                var remainder = -(target - (CurrentAddress + 4));
                if (thumbAdjustment)
                {
                    --remainder;
                }
                Emit(Format5OpCode.MOV, targetRegister, Register.PC);
                while (remainder != 0)
                {
                    var amountToUse = Math.Min(remainder, 255);
                    Emit(Format3OpCode.SUB, targetRegister, (byte)remainder);
                    remainder -= amountToUse;
                }
            }
        }
Пример #2
0
        public void Emit(Format12OpCode opCode, LowRegister rd, int target)
        {
            var offset = target - ((CurrentAddress + 4) & ~2);

            CheckRange(offset, 0, 1023, 3);
            var fluentComment = opCode.ToHumanReadable().MyConcat(" ", rd, ",#0x", ((short)target).ToHex());
            var offsetBits    = (offset >> 2) & 0xff;

            EmitHelper(rd, 12, fluentComment, 10, 4, (int)opCode, 1, rd.Index, 3, offsetBits, 8);
        }
Пример #3
0
 public void Emit(Format12OpCode opCode, LowRegister rd, int target)
 {
     var offset=target-((CurrentAddress+4)&~2);
       CheckRange(offset, 0, 1023, 3);
       var fluentComment=opCode.ToHumanReadable().MyConcat(" ", rd, ",#0x", ((short)target).ToHex());
       var offsetBits=(offset>>2)&0xff;
       EmitHelper(rd, 12, fluentComment, 10, 4, (int)opCode, 1, rd.Index, 3, offsetBits, 8);
 }
Пример #4
0
 public void EmitLoadAddress(Format12OpCode opCode, LowRegister targetRegister, int target, bool thumbAdjustment)
 {
     var offset=target-((CurrentAddress+4)&~2);
       if(offset>=0) {
     Emit(opCode, targetRegister, target);
     if(thumbAdjustment) {
       Emit(Format3OpCode.ADD, targetRegister, 1);
     }
       } else {
     //While the Format12 instruction will clear the 1 bit of the PC, this code does not
     var remainder=-(target-(CurrentAddress+4));
     if(thumbAdjustment) {
       --remainder;
     }
     Emit(Format5OpCode.MOV, targetRegister, Register.PC);
     while(remainder!=0) {
       var amountToUse=Math.Min(remainder, 255);
       Emit(Format3OpCode.SUB, targetRegister, (byte)remainder);
       remainder-=amountToUse;
     }
       }
 }
Пример #5
0
 public static string ToHumanReadable(this Format12OpCode opCode)
 {
     return("LDADDR_PCLDADDR_SP".Substring((int)opCode * 9, 9));
 }