Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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;
- if (immed >= 0) {
- result |= opcode << 26;
- result |= rs << 21;
- result |= rt << 16;
- result |= immed;
- }
- else {
- 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 - Caleb);
- 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;
- int counter = 0;
- 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")) {
- break;
- }
- else {
- switch (op) {
- case "ADD": {
- opcode = 0;
- func = 32;
- rd = kb.next();
- rs = kb.next();
- rt = kb.next();
- rdcode = reg2bin(rd);
- rscode = reg2bin(rs);
- rtcode = reg2bin(rt);
- shamt = 0;
- word = makeR(opcode, rscode, rtcode, rdcode, shamt, func);
- System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
- counter++;
- break;
- }
- case "AND": {
- opcode = 0;
- func = 36;
- rd = kb.next();
- rs = kb.next();
- rt = kb.next();
- rdcode = reg2bin(rd);
- rscode = reg2bin(rs);
- rtcode = reg2bin(rt);
- shamt = 0;
- word = makeR(opcode, rscode, rtcode, rdcode, shamt, func);
- System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
- counter++;
- break;
- }
- case "ADDI": {
- rt = kb.next();
- rs = kb.next();
- rd = kb.next();
- rtcode = reg2bin(rt);
- rscode = reg2bin(rs);
- immed = Short.parseShort(rd);
- opcode = 8;
- word = makeI(opcode, rscode, rtcode, immed);
- System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
- counter++;
- break;
- }
- case "ANDI": {
- opcode = 12;
- rt = kb.next();
- rs = kb.next();
- rd = kb.next();
- rtcode = reg2bin(rt);
- rscode = reg2bin(rs);
- immed = Short.parseShort(rd);
- word = makeI(opcode, rscode, rtcode, immed);
- System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
- counter++;
- break;
- }
- case "BEQ": {
- opcode = 4;
- rs = kb.next();
- rt = kb.next();
- rd = kb.next();
- rscode = reg2bin(rs);
- rtcode = reg2bin(rt);
- immed = Short.parseShort(rd);
- word = makeI(opcode, rscode, rtcode, immed);
- System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
- counter++;
- break;
- }
- case "LW": {
- opcode = 35;
- rt = kb.next();
- rd = kb.next();
- rs = kb.next();
- rtcode = reg2bin(rt);
- rscode = reg2bin(rs);
- immed = Short.parseShort(rd);
- word = makeI(opcode, rscode, rtcode, immed);
- System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
- counter++;
- break;
- }
- case "SW": {
- opcode = 43;
- rt = kb.next();
- rd = kb.next();
- rs = kb.next();
- rtcode = reg2bin(rt);
- rscode = reg2bin(rs);
- immed = Short.parseShort(rd);
- word = makeI(opcode, rscode, rtcode, immed);
- System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
- counter++;
- break;
- }
- case "SRL": {
- opcode = 0;
- func = 2;
- rd = kb.next();
- rt = kb.next();
- rs = kb.next();
- rdcode = reg2bin(rd);
- rscode = Byte.parseByte(rs);
- rtcode = reg2bin(rt);
- shamt = rscode;
- rscode = 0;
- word = makeR(opcode, rscode, rtcode, rdcode, shamt, func);
- System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
- counter++;
- break;
- }
- case "SLL": {
- opcode = 0;
- func = 0;
- rd = kb.next();
- rt = kb.next();
- rs = kb.next();
- rdcode = reg2bin(rd);
- rscode = Byte.parseByte(rs);
- rtcode = reg2bin(rt);
- shamt = rscode;
- rscode = 0;
- word = makeR(opcode, rscode, rtcode, rdcode, shamt, func);
- System.out.println("***: " + String.format("%32s", Integer.toBinaryString(word)).replace(" ", "0"));
- counter++;
- break;
- }
- }
- }
- } while (!op.equalsIgnoreCase("HALT"));
- System.out.println("Assembly complete. Program required " + counter + " words of memory.");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement