Advertisement
Guest User

Untitled

a guest
Sep 20th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.27 KB | None | 0 0
  1.  
  2. import java.util.*;
  3.  
  4. public class Assembler {
  5.  
  6. public static LinkedList<Integer> wordlist = new LinkedList<Integer>();
  7.  
  8. public static int makeI(byte opcode, byte rs, byte rt, short immed) {
  9. int result = 0;
  10.  
  11. if (immed >= 0) {
  12.  
  13. result |= opcode << 26;
  14. result |= rs << 21;
  15. result |= rt << 16;
  16. result |= immed;
  17.  
  18. }
  19.  
  20. else {
  21.  
  22. result ^= opcode << 26;
  23. result ^= rs << 21;
  24. result ^= ~rt << 16;
  25. result ^= immed;
  26.  
  27. }
  28.  
  29. return result;
  30. }
  31.  
  32. public static int makeR(byte opcode, int rs, int rt, int rd, byte shamt, byte funct) {
  33. int result = 0;
  34. result |= opcode << 26;
  35. result |= rs << 21;
  36. result |= rt << 16;
  37. result |= rd << 11;
  38. result |= shamt << 6;
  39. result |= funct;
  40.  
  41. return result;
  42. }
  43.  
  44. public static byte reg2bin(String w) {
  45. byte reg = 0;
  46. switch (w) {
  47. case "$zero":
  48. reg = 0;
  49. break;
  50. case "$v0":
  51. reg = 2;
  52. break;
  53. case "$v1":
  54. reg = 3;
  55. break;
  56. case "$a0":
  57. reg = 4;
  58. break;
  59. case "$a1":
  60. reg = 5;
  61. break;
  62. case "$a2":
  63. reg = 6;
  64. break;
  65. case "$a3":
  66. reg = 7;
  67. break;
  68. case "$t0":
  69. reg = 8;
  70. break;
  71. case "$t1":
  72. reg = 9;
  73. break;
  74. case "$t2":
  75. reg = 10;
  76. break;
  77. case "$t3":
  78. reg = 11;
  79. break;
  80. case "$t4":
  81. reg = 12;
  82. break;
  83. case "$t5":
  84. reg = 13;
  85. break;
  86. case "$t6":
  87. reg = 14;
  88. break;
  89. case "$t7":
  90. reg = 15;
  91. break;
  92. case "$s0":
  93. reg = 16;
  94. break;
  95. case "$s1":
  96. reg = 17;
  97. break;
  98. case "$s2":
  99. reg = 18;
  100. break;
  101. case "$s3":
  102. reg = 19;
  103. break;
  104. case "$s4":
  105. reg = 20;
  106. break;
  107. case "$s5":
  108. reg = 21;
  109. break;
  110. case "$s6":
  111. reg = 22;
  112. break;
  113. case "$s7":
  114. reg = 23;
  115. break;
  116.  
  117. }
  118.  
  119. return reg;
  120. }
  121.  
  122. public static void main(String[] args) {
  123. Scanner kb = new Scanner(System.in);
  124. System.out.println("Assembler - Caleb);
  125.  
  126. String op = null;
  127. byte opcode = 0;
  128. String rs, rt, rd;
  129. byte shamt = 0;
  130. byte func = 0;
  131. byte rscode = 0;
  132. byte rtcode = 0;
  133. byte rdcode = 0;
  134. int word = 0;
  135. short immed = 0;
  136. int counter = 0;
  137.  
  138. System.out.println("Begin assembly");
  139.  
  140. do {
  141.  
  142. /*
  143. * op = null; rs = null; rt = null; rd = null; shamt = 0; func = 0; opcode = 0;
  144. * rscode = 0; rtcode = 0; rdcode = 0; word = 0;
  145. */
  146.  
  147. op = kb.next();
  148.  
  149. if (op.equalsIgnoreCase("HALT")) {
  150.  
  151. break;
  152. }
  153.  
  154. else {
  155.  
  156. switch (op) {
  157.  
  158. case "ADD": {
  159.  
  160. opcode = 0;
  161. func = 32;
  162. rd = kb.next();
  163. rs = kb.next();
  164. rt = kb.next();
  165. rdcode = reg2bin(rd);
  166. rscode = reg2bin(rs);
  167. rtcode = reg2bin(rt);
  168. shamt = 0;
  169. word = makeR(opcode, rscode, rtcode, rdcode, shamt, func);
  170. System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
  171. counter++;
  172. break;
  173.  
  174. }
  175.  
  176. case "AND": {
  177.  
  178. opcode = 0;
  179. func = 36;
  180. rd = kb.next();
  181. rs = kb.next();
  182. rt = kb.next();
  183. rdcode = reg2bin(rd);
  184. rscode = reg2bin(rs);
  185. rtcode = reg2bin(rt);
  186. shamt = 0;
  187. word = makeR(opcode, rscode, rtcode, rdcode, shamt, func);
  188. System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
  189. counter++;
  190. break;
  191.  
  192. }
  193.  
  194. case "ADDI": {
  195.  
  196. rt = kb.next();
  197. rs = kb.next();
  198. rd = kb.next();
  199. rtcode = reg2bin(rt);
  200. rscode = reg2bin(rs);
  201. immed = Short.parseShort(rd);
  202. opcode = 8;
  203. word = makeI(opcode, rscode, rtcode, immed);
  204. System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
  205. counter++;
  206. break;
  207.  
  208. }
  209.  
  210. case "ANDI": {
  211.  
  212. opcode = 12;
  213. rt = kb.next();
  214. rs = kb.next();
  215. rd = kb.next();
  216. rtcode = reg2bin(rt);
  217. rscode = reg2bin(rs);
  218. immed = Short.parseShort(rd);
  219. word = makeI(opcode, rscode, rtcode, immed);
  220. System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
  221. counter++;
  222. break;
  223.  
  224. }
  225.  
  226. case "BEQ": {
  227.  
  228. opcode = 4;
  229. rs = kb.next();
  230. rt = kb.next();
  231. rd = kb.next();
  232. rscode = reg2bin(rs);
  233. rtcode = reg2bin(rt);
  234. immed = Short.parseShort(rd);
  235. word = makeI(opcode, rscode, rtcode, immed);
  236. System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
  237. counter++;
  238. break;
  239.  
  240. }
  241.  
  242. case "LW": {
  243.  
  244. opcode = 35;
  245. rt = kb.next();
  246. rd = kb.next();
  247. rs = kb.next();
  248. rtcode = reg2bin(rt);
  249. rscode = reg2bin(rs);
  250. immed = Short.parseShort(rd);
  251. word = makeI(opcode, rscode, rtcode, immed);
  252. System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
  253. counter++;
  254. break;
  255.  
  256. }
  257.  
  258. case "SW": {
  259.  
  260. opcode = 43;
  261. rt = kb.next();
  262. rd = kb.next();
  263. rs = kb.next();
  264. rtcode = reg2bin(rt);
  265. rscode = reg2bin(rs);
  266. immed = Short.parseShort(rd);
  267. word = makeI(opcode, rscode, rtcode, immed);
  268. System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
  269. counter++;
  270. break;
  271. }
  272.  
  273. case "SRL": {
  274.  
  275. opcode = 0;
  276. func = 2;
  277. rd = kb.next();
  278. rt = kb.next();
  279. rs = kb.next();
  280.  
  281. rdcode = reg2bin(rd);
  282. rscode = Byte.parseByte(rs);
  283. rtcode = reg2bin(rt);
  284. shamt = rscode;
  285. rscode = 0;
  286. word = makeR(opcode, rscode, rtcode, rdcode, shamt, func);
  287. System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
  288. counter++;
  289. break;
  290.  
  291. }
  292.  
  293. case "SLL": {
  294.  
  295. opcode = 0;
  296. func = 0;
  297. rd = kb.next();
  298. rt = kb.next();
  299. rs = kb.next();
  300.  
  301. rdcode = reg2bin(rd);
  302. rscode = Byte.parseByte(rs);
  303. rtcode = reg2bin(rt);
  304. shamt = rscode;
  305. rscode = 0;
  306. word = makeR(opcode, rscode, rtcode, rdcode, shamt, func);
  307. System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
  308. counter++;
  309. break;
  310.  
  311. }
  312.  
  313. }
  314. }
  315.  
  316. } while (!op.equalsIgnoreCase("HALT"));
  317.  
  318. System.out.println("Assembly complete. Program required " + counter + " words of memory.");
  319. }
  320.  
  321. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement