private static void OutputResults(List <Instruction> finalBank, List <int> finalInstruction) { List <string> convertedInstruction = finalInstruction.Select(i => Literals.IntToBinaryString(i, 9)).ToList(); List <string> bankString = finalBank.Select(b => b.ToString()).ToList(); File.WriteAllLines(@"C:\Users\maxlu\Desktop\141L\instruction.txt", convertedInstruction); File.WriteAllLines(@"C:\Users\maxlu\Desktop\141L\bank.txt", bankString); }
public Branch(string instruction, int jumpLocation) { string cond, condBinary; cond = instruction.Split(" ", 2)[0].Trim().ToUpper(); condBinary = Literals.Branches[cond]; _operation = condBinary + TypeOp + Literals.IntToBinaryString(jumpLocation, 24); }
public LoadStore(string instruction) { string[] insPieces = instruction.Split(" ", 2); string l = "0"; string rd, rn, imm = "000000000000"; if (insPieces[0].ToUpper() == "LDB") { string[] split = insPieces[1].Split(","); l = "1"; rd = Literals.Registers[split[0].Trim()]; string rnRaw = split[1].Trim(new char[] { ' ', '[', ']' }); if (Int32.TryParse(rnRaw[0].ToString(), out int dead)) { rn = Literals.Registers["r15"]; imm = Literals.IntToBinaryString(Int32.Parse(rnRaw), 12); } else { if (rnRaw.Contains("+")) { rn = Literals.Registers[rnRaw.Split("+")[0]]; imm = Literals.IntToBinaryString(Int32.Parse(rnRaw.Split("+")[1]), 12); } else { rn = Literals.Registers[rnRaw]; } } } else { string[] split = insPieces[1].Split(","); rn = Literals.Registers[split[1].Trim()]; string rdRaw = split[0].Trim(new char[] { ' ', '[', ']' }); if (Int32.TryParse(rdRaw[0].ToString(), out int dead)) { rd = Literals.Registers["r15"]; imm = Literals.IntToBinaryString(Int32.Parse(rdRaw), 12); } else { if (rdRaw.Contains("+")) { rd = Literals.Registers[rdRaw.Split("+")[0]]; imm = Literals.IntToBinaryString(Int32.Parse(rdRaw.Split("+")[1]), 12); } else { rd = Literals.Registers[rdRaw]; } } } _operation = Prefix + l + rn + rd + imm; }
public DataProcessing(string instruction) { string[] insPieces = instruction.Split(" ", 2); string opcode = Literals.OpCodes[insPieces[0].ToUpper()]; string s = "1"; string I = "0"; OperationType type = Literals.GetOperation(insPieces[0].ToUpper()); string rd = "r15", rn = "r15", rs = "r15", imm = "00000000"; //Compare is weird because it doesn't have an rd, add it anyways because it isn't used. if (opcode.Equals("1000")) { insPieces[1] = "r15," + insPieces[1]; } string[] registers = insPieces[1].Split(','); if (type.HasFlag(OperationType.Rd)) { rd = registers[0]; } if (type.HasFlag(OperationType.Rn)) { if (Int32.TryParse(registers[1].ToString(), out int immInt)) { rn = "r15"; imm = Literals.IntToBinaryString(immInt); I = "1"; } else { rn = registers[1]; } } if (type.HasFlag(OperationType.Rs) || type.HasFlag(OperationType.Imm)) { if (!type.HasFlag(OperationType.Rs) && registers.Length == 2) { //Do nothing, we already did it in the last step } else if (Int32.TryParse(registers[2].ToString(), out int immInt)) { rs = "r15"; imm = Literals.IntToBinaryString(immInt); I = "1"; } else { rs = registers[2]; } } _operation = Prefix + I + opcode + s + Literals.Registers[rn] + Literals.Registers[rd] + Literals.Registers[rs] + imm; }