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; } } }
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); }
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); }
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; } } }
public static string ToHumanReadable(this Format12OpCode opCode) { return("LDADDR_PCLDADDR_SP".Substring((int)opCode * 9, 9)); }