Skip to content

Commit a57eda0

Browse files
Merge pull request mahdihaghverdi#4 from Sayed-Hossein-Hosseini/main
Complete the project and add the Logisim CPU file
2 parents 3bf0f92 + 54ee590 commit a57eda0

File tree

10 files changed

+1629
-0
lines changed

10 files changed

+1629
-0
lines changed

Assembler/Assembler/.idea/.gitignore

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assembler/Assembler/Assembler.iml

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" inherit-compiler-output="true">
4+
<exclude-output />
5+
<content url="file://$MODULE_DIR$">
6+
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
7+
</content>
8+
<orderEntry type="inheritedJdk" />
9+
<orderEntry type="sourceFolder" forTests="false" />
10+
</component>
11+
</module>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
public class DecimalToBinary {
2+
3+
public static String computing(String result) { // Decimal to Binary
4+
int number = Integer.parseInt(result);
5+
result = "";
6+
7+
while(number > 0) {
8+
result = (number % 2) + result;
9+
number /= 2;
10+
}
11+
12+
return result;
13+
}
14+
15+
public static String extend(String result) { // extend to 21 bit
16+
result = computing(result);
17+
int siza = result.length();
18+
for (int i = 0; i < 21 - siza; i++) {
19+
result = "0" + result;
20+
}
21+
22+
return result;
23+
}
24+
}
+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import java.util.HashMap;
2+
import java.util.Map;
3+
import java.util.Scanner;
4+
5+
public class Instruction {
6+
private static String machineCode;
7+
private static Map<String, String> lable = new HashMap<>();
8+
9+
public static String main(String instructs) {
10+
instructs = lable(instructs);
11+
String result = "";
12+
Scanner scanner = new Scanner(instructs);
13+
while (scanner.hasNextLine()) {
14+
result += instruct(scanner.nextLine()) + "\n";
15+
}
16+
17+
return result;
18+
}
19+
private static String instruct(String instruct) {
20+
machineCode = "";
21+
instruct = instruct.trim();
22+
String[] type = instruct.split(" ", 2); // Command Type Separation
23+
String typeValidation = R_type.callOrder(type[0]); // To help with validation
24+
25+
if (typeValidation != null) { // R-type
26+
String[] register = type[1].split(", ");
27+
machineCode += "000" + // OpCode
28+
RegisterFile.callRegister(register[0]) + // rs
29+
RegisterFile.callRegister(register[1]) + // rt
30+
RegisterFile.callRegister(register[2]) + // rd
31+
"00000000000000" + // Don't Care
32+
typeValidation; // Function
33+
34+
} else { // V-type
35+
machineCode += V_type.callOrder(type[0]);
36+
37+
if (type[0].equals("lw") || type[0].equals("sw")) { // sw & lw commands
38+
String[] register = type[1].split(", ");
39+
machineCode += RegisterFile.callRegister(register[0].substring(0, 3)) + // rs
40+
RegisterFile.callRegister(register[1].substring(register[1].indexOf('(') + 1, register[1].indexOf(')'))) + // rt
41+
DecimalToBinary.extend(register[1].substring(0, register[1].indexOf('('))); // immediate
42+
43+
} else {
44+
String[] register = type[1].split(", ");
45+
if (type[0].equals("bnq")) { // bnq commands
46+
machineCode += RegisterFile.callRegister(register[0]) + // rs
47+
RegisterFile.callRegister(register[1]) + // rt
48+
DecimalToBinary.extend(lable.get(register[2].trim())); // immediate
49+
50+
} else { // other commands
51+
machineCode += RegisterFile.callRegister(register[0]) + // rs
52+
RegisterFile.callRegister(register[1]) + // rt
53+
DecimalToBinary.extend(register[2]); // immediate
54+
55+
}
56+
}
57+
}
58+
return machineCode;
59+
}
60+
61+
private static String lable(String instructs) {
62+
Scanner scanner = new Scanner(instructs);
63+
String instruct = "";
64+
int count = 0;
65+
66+
while (scanner.hasNextLine()) {
67+
String place = scanner.nextLine();
68+
69+
if (place.indexOf(':') != -1) {
70+
lable.put(place.substring(0, place.indexOf(':')).trim(), Integer.toString(count)); // lables
71+
instruct += place.substring(place.indexOf(':') + 1) + "\n";
72+
} else {
73+
instruct += place + "\n";
74+
}
75+
76+
count++;
77+
}
78+
79+
return instruct;
80+
}
81+
}

Assembler/Assembler/src/Main.java

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import java.util.Scanner;
2+
3+
public class Main {
4+
public static void main(String[] args) {
5+
Scanner scanner = new Scanner(System.in);
6+
System.out.println("*** Wellcome to Program to convert assembly language to machine code ***\n" +
7+
"Please enter the assembly instructions : \n" +
8+
"(Note: At the end of the commands, enter the word 'end')");
9+
String order = "";
10+
while (scanner.hasNextLine()) {
11+
String line = scanner.nextLine();
12+
if (!line.equals("end"))
13+
order += line + "\n";
14+
else
15+
break;
16+
}
17+
System.out.print(Instruction.main(order));
18+
}
19+
}
20+
21+
/*
22+
You can enter the following commands as an example
23+
test :
24+
ori $t8, $t7, 15
25+
bnq $a1, $t3, Hossein
26+
ori $t5, $t2, 15
27+
add $t1, $t2, $a1
28+
Hossein: ori $l1, $t2, 15
29+
end
30+
*/

Assembler/Assembler/src/R_type.java

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import java.util.HashMap;
2+
import java.util.Map;
3+
4+
public class R_type {
5+
private static Map <String,String> order = new HashMap<>();
6+
7+
private static void addOrder() { // Specify machine code commands (Function)
8+
order.put("add", "001");
9+
order.put("sub", "010");
10+
order.put("mul", "011");
11+
order.put("and", "100");
12+
order.put("or", "101");
13+
order.put("nor", "110");
14+
order.put("nand", "111");
15+
}
16+
17+
public static String callOrder(String name) {
18+
addOrder();
19+
return order.get(name);
20+
}
21+
}
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import java.util.HashMap;
2+
import java.util.Map;
3+
4+
public class RegisterFile {
5+
private static Map<String,String> register = new HashMap<>();
6+
7+
private static void addRegister() {
8+
register.put("$zero", "0000");
9+
register.put("$at", "0001");
10+
register.put("$a1", "0010");
11+
register.put("$a2", "0011");
12+
register.put("$a3", "0100");
13+
register.put("$l1", "0101");
14+
register.put("$l2", "0110");
15+
register.put("$l3", "0111");
16+
register.put("$t1", "1000");
17+
register.put("$t2", "1001");
18+
register.put("$t3", "1010");
19+
register.put("$t4", "1011");
20+
register.put("$t5", "1100");
21+
register.put("$t6", "1101");
22+
register.put("$t7", "1110");
23+
register.put("$t8", "1111");
24+
}
25+
26+
public static String callRegister(String name) {
27+
addRegister();
28+
return register.get(name);
29+
}
30+
}

Assembler/Assembler/src/V_type.java

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import java.util.HashMap;
2+
import java.util.Map;
3+
4+
public class V_type {
5+
private static Map <String,String> order = new HashMap<>();
6+
7+
private static void addOrder() { // Specify machine code commands (Opcode)
8+
order.put("bnq", "111");
9+
order.put("lw", "001");
10+
order.put("sw", "010");
11+
order.put("andi", "100");
12+
order.put("ori", "101");
13+
}
14+
15+
public static String callOrder(String name) {
16+
addOrder();
17+
return order.get(name);
18+
}
19+
}

docs/images/CPU.jpg

518 KB
Loading

0 commit comments

Comments
 (0)