Advertisement
Guest User

Untitled

a guest
Dec 13th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.76 KB | None | 0 0
  1. public class InstructionThree extends Instruction {
  2. private Character n;
  3. private Character i;
  4. private Character x;
  5. private Character b;
  6. private Character p;
  7. private String disp;
  8. final private Character e = '0';
  9.  
  10. public InstructionThree(String label, String mnemonic, Integer opCode, String format, String operand) {
  11. setFields(label, mnemonic, opCode, format, operand);
  12. }
  13.  
  14. private void setRelativity(Integer targetAddr, Integer baseAddr) {
  15. Integer pc = address + Integer.valueOf(format, 10);
  16.  
  17. //System.out.println("TargetAddress " + targetAddr + "\n\n");
  18.  
  19. Integer diff = targetAddr - pc;
  20. if (diff > 2047 || diff < -2048) { //Base Relative
  21. try {
  22. diff = targetAddr - baseAddr;
  23. if (diff > 4095 || diff < 0) {
  24. throw new Exception("Out of base range");
  25. }
  26. } catch (Exception e) {
  27. System.out.println(e.toString());
  28. }
  29. b = '1';
  30. p = '0';
  31. } else {
  32.  
  33. // System.out.println("PC relative");
  34. // System.out.println("Diff " + diff);
  35. b = '0';
  36. p = '1';
  37. }
  38. disp = NumberUtils.adjustSize(Integer.toBinaryString(diff), 12);
  39. }
  40.  
  41. public void constructMachineCode(Assembler asm) {
  42. //Special case
  43. if (mnemonic.equals("RSUB")) {
  44. machineCode = trimmedOpcode() + "110000000000000000";
  45. return;
  46. }
  47.  
  48. //System.out.println(mnemonic + " " + operand);
  49.  
  50. operand = operand.replace(" ", "");
  51.  
  52. if (operand.startsWith("@")) { //indirect
  53. //invariants
  54. n = '1';
  55. i = '0';
  56. x = '0';
  57. if (asm.getSymTab().containsLabel(operand.substring(1))) {
  58. String symb = operand.substring(1);
  59. Integer targetAddr = asm.getSymTab().getAddress(symb);
  60. setRelativity(targetAddr, asm.getBaseAddr());
  61. } else { //immediate , etc @1000
  62. b = '0';
  63. p = '0';
  64. Integer targetAddr = Integer.valueOf(operand.substring(1), 10);
  65. disp = NumberUtils.adjustSize(Integer.toBinaryString(targetAddr), 12);
  66. }
  67. } else if (operand.startsWith("#")) { //Immediate
  68. n = '0';
  69. i = '1';
  70. x = '0';
  71. String[] operands = operand.replace("#", "").split("(?=[-+])");
  72. // etc: LDA #LENGTH
  73. if(operands.length == 1 && asm.getSymTab().containsLabel(operands[0])) {
  74. Integer targetAddr = asm.getSymTab().getAddress(operands[0]);
  75. setRelativity(targetAddr, asm.getBaseAddr());
  76. } else { //etc: LDA #LENGTH + LIST + 5, result must be absolute
  77. b = '0';
  78. p = '0';
  79. Integer absValue = 0;
  80. operands[0] = "+" + operands[0];
  81. for(String operand : operands) {
  82. if(asm.getSymTab().containsLabel(operand.substring(1))) {
  83. absValue = (operand.charAt(0) == '+' ? 1 : -1) * asm.getSymTab().getAddress(operand.substring(1));
  84. } else {
  85. absValue += (operand.charAt(0) == '+' ? 1 : -1) * Integer.valueOf(operand.substring(1), 10);
  86. }
  87. }
  88. disp = NumberUtils.adjustSize(Integer.toBinaryString(absValue), 12);
  89. }
  90. } else if (operand.startsWith("=")) {
  91. n = '1';
  92. i = '1';
  93. x = '0';
  94. String val = getOperandHexValue();
  95. Integer targetAddr = asm.getLitTab().getLiteralAddr(val);
  96. setRelativity(targetAddr, asm.getBaseAddr());
  97. } else { //Simple, op m, x OR op c, x
  98. String[] operands = operand.split("\\s*(?=[-+,])\\s*");
  99. n = '1';
  100. i = '1';
  101. //mem, X OR mem OR mem + constant
  102. x = operands.length == 1 || !operands[1].equals(",") ? '0' : '1';
  103.  
  104. Integer targetAddr = asm.getSymTab().getAddress(operands[0]);
  105. //System.out.println("Operands " + operands[0]);
  106. // if(operands.length > 1)
  107. // System.out.println("Operands " + operands[1]);
  108.  
  109. // +Constant
  110. if (operands.length > 1 && operands[1].charAt(0) != ',' ) {
  111. targetAddr += (operands[1].charAt(0) == '+' ? 1 : -1) * Integer.valueOf(operands[1].substring(1), 10);
  112. }
  113.  
  114. setRelativity(targetAddr, asm.getBaseAddr());
  115. }
  116. machineCode = trimmedOpcode() + n + i + x + b + p + e + disp;
  117. machineCode = NumberUtils.adjustSize(NumberUtils.binaryToHex(machineCode),6);
  118. }
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement