Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.73 KB | None | 0 0
  1.  
  2. private static String[] assembler(ArrayList<String>[] parser) {
  3. String[] assemblyCodeInstructions = new String[parser.length];
  4. for (int i = 0; i < assemblyCodeInstructions.length; i++) {
  5. String func = "000000000000";
  6. String op;
  7. String reg1;
  8. String reg2;
  9. String writeReg;
  10. String command = parser[i].get(0);
  11.  
  12. switch (command) {
  13. // a
  14. case "sum":
  15. op = "0000";
  16. reg1 = regAddress(parser[i].get(1));
  17. reg2 = regAddress(parser[i].get(2));
  18. writeReg = regAddress(parser[i].get(3));
  19. func += "0000";
  20. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  21. break;
  22. case "mul":
  23. op = "0000";
  24. reg1 = regAddress(parser[i].get(1));
  25. reg2 = regAddress(parser[i].get(2));
  26. writeReg = regAddress(parser[i].get(3));
  27. func += "0001";
  28. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  29. break;
  30. case "div":
  31. op = "0000";
  32. reg1 = regAddress(parser[i].get(1));
  33. reg2 = regAddress(parser[i].get(2));
  34. writeReg = regAddress(parser[i].get(3));
  35. func += "0010";
  36. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  37. break;
  38. case "sge":
  39. op = "0000";
  40. reg1 = regAddress(parser[i].get(1));
  41. reg2 = regAddress(parser[i].get(2));
  42. writeReg = regAddress(parser[i].get(3));
  43. func += "0011";
  44. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  45. break;
  46. case "sle":
  47. op = "0000";
  48. reg1 = regAddress(parser[i].get(1));
  49. reg2 = regAddress(parser[i].get(2));
  50. writeReg = regAddress(parser[i].get(3));
  51. func += "0100";
  52. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  53. break;
  54. case "and":
  55. op = "0000";
  56. reg1 = regAddress(parser[i].get(1));
  57. reg2 = regAddress(parser[i].get(2));
  58. writeReg = regAddress(parser[i].get(3));
  59. func += "0101";
  60. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  61. break;
  62. case "or":
  63. op = "0000";
  64. reg1 = regAddress(parser[i].get(1));
  65. reg2 = regAddress(parser[i].get(2));
  66. writeReg = regAddress(parser[i].get(3));
  67. func += "0110";
  68. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  69. break;
  70. case "eq":
  71. op = "0000";
  72. reg1 = regAddress(parser[i].get(1));
  73. reg2 = regAddress(parser[i].get(2));
  74. writeReg = regAddress(parser[i].get(3));
  75. func += "0111";
  76. assemblyCodeInstructions[i] = op + reg1 + reg2 + writeReg + func;
  77. break;
  78. // b
  79. case "sumi":
  80. op = "0001";
  81. reg1 = regAddress(parser[i].get(1));
  82. reg2 = regAddress(parser[i].get(2));
  83. func = makeItTweny(parser[i].get(3));
  84. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  85. break;
  86. case "ld":
  87. op = "0010";
  88. reg1 = regAddress(parser[i].get(1));
  89. reg2 = regAddress(parser[i].get(2));
  90. func = makeItTweny(parser[i].get(3));
  91. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  92. break;
  93. case "st":
  94. op = "0011";
  95. reg1 = regAddress(parser[i].get(1));
  96. reg2 = regAddress(parser[i].get(2));
  97. func = makeItTweny(parser[i].get(3));
  98. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  99.  
  100. break;
  101. case "muli":
  102. op = "0100";
  103. reg1 = regAddress(parser[i].get(1));
  104. reg2 = regAddress(parser[i].get(2));
  105. func = makeItTweny(parser[i].get(3));
  106. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  107.  
  108. break;
  109. case "divi":
  110. op = "0101";
  111. reg1 = regAddress(parser[i].get(1));
  112. reg2 = regAddress(parser[i].get(2));
  113. func = makeItTweny(parser[i].get(3));
  114. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  115.  
  116. break;
  117. case "inc":
  118. op = "0110";
  119. reg1 = regAddress(parser[i].get(1));
  120. reg2 = regAddress(parser[i].get(2));
  121. func = makeItTweny(parser[i].get(3));
  122. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  123.  
  124. break;
  125. case "clr":
  126. op = "0111";
  127. reg1 = regAddress(parser[i].get(1));
  128. reg2 = regAddress(parser[i].get(2));
  129. func = makeItTweny(parser[i].get(3));
  130. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  131.  
  132. break;
  133. case "set":
  134. op = "1000";
  135. reg1 = regAddress(parser[i].get(1));
  136. reg2 = regAddress(parser[i].get(2));
  137. func = makeItTweny(parser[i].get(3));
  138. assemblyCodeInstructions[i] = op + reg1 + reg2 + func;
  139.  
  140. break;
  141. // c
  142. case "not":
  143. op = "1001";
  144. reg1 = regAddress(parser[i].get(1));
  145. func += func;
  146. assemblyCodeInstructions[i] = op + reg1 + func;
  147.  
  148. break;
  149. case "neg":
  150. op = "1010";
  151. reg1 = regAddress(parser[i].get(1));
  152. func += func;
  153. assemblyCodeInstructions[i] = op + reg1 + func;
  154.  
  155. break;
  156. // d
  157. case "skp":
  158. op = "1011";
  159. reg1 = regAddress(parser[i].get(1));
  160. func += func; // dummy func
  161. assemblyCodeInstructions[i] = op + reg1 + func;
  162.  
  163. break;// don't care ?
  164. case "jmp":
  165. op = "1100";
  166. func = "00000000";
  167. String address = parser[i].get(1);
  168. assemblyCodeInstructions[i] = op + func + makeItTweny("" + findInParser(parser, address)); // not
  169.  
  170. break;
  171. default:
  172. assemblyCodeInstructions[i] = "11111111111111111111111111111111";
  173. }
  174.  
  175. }
  176.  
  177. return assemblyCodeInstructions;
  178.  
  179. }
  180.  
  181. private static int findInParser(ArrayList<String>[] parser, String address) {
  182. for (int i = 0; i < parser.length; i++) {
  183. if (parser[i].get(0).equals(address))
  184. return i;
  185. }
  186. return -1;
  187. }
  188.  
  189. private static String regAddress(String regName) {
  190. switch (regName) {
  191. case "g0":
  192. return "0000";
  193. case "g1":
  194. return "0001";
  195. case "g2":
  196. return "0010";
  197. case "g3":
  198. return "0011";
  199. case "g4":
  200. return "0100";
  201. case "g5":
  202. return "0101";
  203. case "g6":
  204. return "0110";
  205. case "g7":
  206. return "0111";
  207. case "sp":
  208. return "1000";
  209. case "p0":
  210. return "1001";
  211. case "p1":
  212. return "1010";
  213. case "p2":
  214. return "1011";
  215. case "p3":
  216. return "1100";
  217. case "r0":
  218. return "1101";
  219. case "zero":
  220. return "1110";
  221. case "pc":
  222. return "1111";
  223.  
  224. }
  225. return "wrongRegName";
  226. }
  227.  
  228. private static String makeItTweny(String i) {
  229. String s = Integer.toBinaryString(Integer.parseInt(i));
  230. while (s.length() < 20)
  231. s = "0" + s;
  232. return s;
  233. }
  234.  
  235. private static ArrayList<String>[] parser(Scanner sc) {
  236. ArrayList<String> temp = new ArrayList<String>();
  237.  
  238. while (sc.hasNextLine()) {
  239. temp.add(sc.nextLine());
  240. }
  241. ArrayList<String> returned[] = (ArrayList<String>[]) new ArrayList[temp.size()];
  242. for (int i = 0; i < returned.length; i++) {
  243. // System.out.println(temp.get(i));
  244.  
  245. String[] s = temp.get(i).split(" ");
  246. System.out.println(temp.get(i));
  247. returned[i] = new ArrayList<String>();
  248. for (int j = 0; j < s.length; j++) {
  249.  
  250. returned[i].add(s[j]);
  251. }
  252. }
  253.  
  254. return returned;
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement