Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package inclass;
- import java.util.*;
- public class Assembler {
- public static LinkedList<Integer> wordlist = new LinkedList<Integer>();
- public static int makeI(byte opcode, byte rs, byte rt, short immed) {
- int result = 0;
- result |= opcode << 26;
- result |= rs << 21;
- result |= rt << 16;
- result |= immed;
- return result;
- }
- public static int makeR(byte opcode, int rs, int rt, int rd, byte shamt, byte funct) {
- int result = 0;
- result |= opcode << 26;
- result |= rs << 21;
- result |= rt << 16;
- result |= rd << 11;
- result |= shamt << 6;
- result |= funct;
- return result;
- }
- public static byte reg2bin(String w) {
- byte reg = 0;
- switch (w) {
- case "$zero":
- reg = 0;
- break;
- case "$v0":
- reg = 2;
- break;
- case "$v1":
- reg = 3;
- break;
- case "$a0":
- reg = 4;
- break;
- case "$a1":
- reg = 5;
- break;
- case "$a2":
- reg = 6;
- break;
- case "$a3":
- reg = 7;
- break;
- case "$t0":
- reg = 8;
- break;
- case "$t1":
- reg = 9;
- break;
- case "$t2":
- reg = 10;
- break;
- case "$t3":
- reg = 11;
- break;
- case "$t4":
- reg = 12;
- break;
- case "$t5":
- reg = 13;
- break;
- case "$t6":
- reg = 14;
- break;
- case "$t7":
- reg = 15;
- break;
- case "$s0":
- reg = 16;
- break;
- case "$s1":
- reg = 17;
- break;
- case "$s2":
- reg = 18;
- break;
- case "$s3":
- reg = 19;
- break;
- case "$s4":
- reg = 20;
- break;
- case "$s5":
- reg = 21;
- break;
- case "$s6":
- reg = 22;
- break;
- case "$s7":
- reg = 23;
- break;
- }
- return reg;
- }
- public static void main(String[] args) {
- Scanner kb = new Scanner(System.in);
- System.out.println("Assembler - C. Grey");
- String op = null;
- byte opcode = 0;
- String rs, rt, rd;
- byte shamt = 0;
- byte func = 0;
- byte rscode = 0;
- byte rtcode = 0;
- byte rdcode = 0;
- int word = 0;
- short immed = 0;
- short branch_address;
- System.out.println("Begin assembly");
- do {
- /*
- * op = null; rs = null; rt = null; rd = null; shamt = 0; func = 0; opcode = 0;
- * rscode = 0; rtcode = 0; rdcode = 0; word = 0;
- */
- op = kb.next();
- if (op.equalsIgnoreCase("HALT")) {
- continue;
- }
- else {
- rd = kb.next();
- rs = kb.next();
- rt = kb.next();
- }
- if (isNumeric(rd) == true) {
- immed = Short.parseShort(rd);
- rscode = reg2bin(rs);
- rtcode = reg2bin(rt);
- }
- else if (isNumeric(rs) == true) {
- immed = Short.parseShort(rs);
- rtcode = reg2bin(rt);
- rdcode = reg2bin(rd);
- }
- else if (isNumeric(rt) == true) {
- immed = Short.parseShort(rt);
- rdcode = reg2bin(rd);
- rscode = reg2bin(rs);
- }
- else {
- rdcode = reg2bin(rd);
- rscode = reg2bin(rs);
- rtcode = reg2bin(rt);
- }
- switch (op) {
- case "ADD":
- opcode = 0;
- func = 32;
- shamt = 0;
- word = makeR(opcode, rscode, rtcode, rdcode, shamt, func);
- break;
- case "AND":
- opcode = 0;
- func = 36;
- shamt = 0;
- word = makeR(opcode, rscode, rtcode, rdcode, shamt, func);
- break;
- case "ADDI":
- opcode = 8;
- word = makeI(opcode, rscode, rtcode, immed);
- break;
- case "ANDI":
- opcode = 12;
- word = makeI(opcode, rscode, rtcode, immed);
- break;
- case "BEQ":
- opcode = 4;
- word = makeI(opcode, rscode, rtcode, immed);
- break;
- case "LW":
- opcode = 35;
- word = makeI(opcode, rscode, rtcode, immed);
- break;
- }
- wordlist.add(word);
- } while (!op.equalsIgnoreCase("HALT"));
- for (int i = 0; i < wordlist.size(); i++) {
- System.out.println(
- "***: " + String.format("%32s", Integer.toBinaryString(wordlist.get(i))).replace(" ", "0"));
- }
- System.out.println("Assembly complete. Program required " + wordlist.size() + " words of memory.");
- }
- public static boolean isNumeric(String str) {
- try {
- Double.parseDouble(str);
- return true;
- } catch (NumberFormatException e) {
- return false;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement