From 4227d3998b916dcc39033eec3de1976ebe461c4e Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Tue, 16 Apr 2024 14:58:51 +0200 Subject: [PATCH 1/2] Better comments in instructions --- app/src/main/java/hatelace/instructions/Add.java | 15 ++++++++------- app/src/main/java/hatelace/instructions/Copy.java | 15 ++++++++------- app/src/main/java/hatelace/instructions/Halt.java | 1 + app/src/main/java/hatelace/instructions/Jump.java | 1 + .../main/java/hatelace/instructions/JumpEq.java | 15 ++++++++------- app/src/main/java/hatelace/instructions/Mul.java | 15 ++++++++------- .../main/java/hatelace/instructions/Print.java | 1 + 7 files changed, 35 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/hatelace/instructions/Add.java b/app/src/main/java/hatelace/instructions/Add.java index a81f1d9..76b3115 100644 --- a/app/src/main/java/hatelace/instructions/Add.java +++ b/app/src/main/java/hatelace/instructions/Add.java @@ -3,18 +3,19 @@ package hatelace.instructions; import hatelace.*; public class Add extends Instruction { - private Address op1; - private Word op2; + private Address src; + private Word imm; private Address dest; - public Add(Address op1, Word op2, Address dest) { - this.op1 = op1; - this.op2 = op2; + /** Add immediate value to memory address. */ + public Add(Address src, Word imm, Address dest) { + this.src = src; + this.imm = imm; this.dest = dest; } public void execute(Memory memory, ProgramCounter PC) { - memory.write(this.dest, memory.read(this.op1).add(this.op2)); + memory.write(this.dest, memory.read(this.src).add(this.imm)); PC.incPC(); } @@ -23,6 +24,6 @@ public class Add extends Instruction { } protected Object[] operands() { - return new Object[] { this.op1, this.op2, this.dest }; + return new Object[] { this.src, this.imm, this.dest }; } } diff --git a/app/src/main/java/hatelace/instructions/Copy.java b/app/src/main/java/hatelace/instructions/Copy.java index d9c602f..9521879 100644 --- a/app/src/main/java/hatelace/instructions/Copy.java +++ b/app/src/main/java/hatelace/instructions/Copy.java @@ -3,16 +3,17 @@ package hatelace.instructions; import hatelace.*; public class Copy extends Instruction { - private Word word; - private Address address; + private Word imm; + private Address dest; - public Copy(Word word, Address address) { - this.word = word; - this.address = address; + /** Copy immediate value to memory address. */ + public Copy(Word imm, Address dest) { + this.imm = imm; + this.dest = dest; } public void execute(Memory memory, ProgramCounter PC) { - memory.write(this.address, this.word); + memory.write(this.dest, this.imm); PC.incPC(); } @@ -21,6 +22,6 @@ public class Copy extends Instruction { } protected Object[] operands() { - return new Object[] {this.word, this.address}; + return new Object[] {this.imm, this.dest}; } } diff --git a/app/src/main/java/hatelace/instructions/Halt.java b/app/src/main/java/hatelace/instructions/Halt.java index 20804d9..569f868 100644 --- a/app/src/main/java/hatelace/instructions/Halt.java +++ b/app/src/main/java/hatelace/instructions/Halt.java @@ -3,6 +3,7 @@ package hatelace.instructions; import hatelace.*; public class Halt extends Instruction { + /** Halts the CPU */ public Halt(){}; public void execute(Memory memory, ProgramCounter PC) { diff --git a/app/src/main/java/hatelace/instructions/Jump.java b/app/src/main/java/hatelace/instructions/Jump.java index 4cd3b92..373dcb0 100644 --- a/app/src/main/java/hatelace/instructions/Jump.java +++ b/app/src/main/java/hatelace/instructions/Jump.java @@ -5,6 +5,7 @@ import hatelace.*; public class Jump extends Instruction { private int index; + /** Unconditional jump, non-relative */ public Jump(int index) { this.index = index; } diff --git a/app/src/main/java/hatelace/instructions/JumpEq.java b/app/src/main/java/hatelace/instructions/JumpEq.java index 2491248..ecfc138 100644 --- a/app/src/main/java/hatelace/instructions/JumpEq.java +++ b/app/src/main/java/hatelace/instructions/JumpEq.java @@ -4,17 +4,18 @@ import hatelace.*; public class JumpEq extends Instruction { private int index; - private Address address; - private Word value; + private Address src; + private Word imm; - public JumpEq(int index, Address address, Word value) { + /** Conditional jump */ + public JumpEq(int index, Address src, Word imm) { this.index = index; - this.address = address; - this.value = value; + this.src = src; + this.imm = imm; } public void execute(Memory memory, ProgramCounter PC) { - if (this.value.equals(memory.read(this.address))) { + if (this.imm.equals(memory.read(this.src))) { PC.setPC(this.index); } else { PC.incPC(); @@ -26,6 +27,6 @@ public class JumpEq extends Instruction { } protected Object[] operands() { - return new Object[] {this.index, this.address, this.value}; + return new Object[] {this.index, this.src, this.imm}; } } diff --git a/app/src/main/java/hatelace/instructions/Mul.java b/app/src/main/java/hatelace/instructions/Mul.java index c71f703..d70cb0b 100644 --- a/app/src/main/java/hatelace/instructions/Mul.java +++ b/app/src/main/java/hatelace/instructions/Mul.java @@ -3,18 +3,19 @@ package hatelace.instructions; import hatelace.*; public class Mul extends Instruction { - private Address op1; - private Address op2; + private Address src1; + private Address src2; private Address dest; - public Mul(Address op1, Address op2, Address dest) { - this.op1 = op1; - this.op2 = op2; + /** Multiply contents of two addresses and store the result in a third memory address. */ + public Mul(Address src1, Address src2, Address dest) { + this.src1 = src1; + this.src2 = src2; this.dest = dest; } public void execute(Memory memory, ProgramCounter PC) { - memory.write(this.dest, memory.read(this.op1).multiply(memory.read(this.op2))); + memory.write(this.dest, memory.read(this.src1).multiply(memory.read(this.src2))); PC.incPC(); } @@ -23,6 +24,6 @@ public class Mul extends Instruction { } protected Object[] operands() { - return new Object[] {this.op1, this.op2, this.dest}; + return new Object[] { this.src1, this.src2, this.dest }; } } diff --git a/app/src/main/java/hatelace/instructions/Print.java b/app/src/main/java/hatelace/instructions/Print.java index 6aa3cec..88f0f6c 100644 --- a/app/src/main/java/hatelace/instructions/Print.java +++ b/app/src/main/java/hatelace/instructions/Print.java @@ -5,6 +5,7 @@ import hatelace.*; public class Print extends Instruction { private Address address; + /** Print content of memory address */ public Print(Address address) { this.address = address; } From a3237826645c4114b76eba6ba9907ccc8bfc9ee0 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Tue, 16 Apr 2024 15:06:25 +0200 Subject: [PATCH 2/2] Finishing touches --- app/src/main/java/Programs/Factorial.java | 20 ++++++++++++++++++++ app/src/main/java/hatelace/Computer.java | 2 +- app/src/main/java/hatelace/Main.java | 17 +++-------------- app/src/main/java/hatelace/Program.java | 17 +++-------------- 4 files changed, 27 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/Programs/Factorial.java b/app/src/main/java/Programs/Factorial.java index e69de29..bc5fb38 100644 --- a/app/src/main/java/Programs/Factorial.java +++ b/app/src/main/java/Programs/Factorial.java @@ -0,0 +1,20 @@ +package Programs; + +import hatelace.*; +import hatelace.instructions.*; + +public class Factorial extends Program { + public Factorial() { + Address n = new Address(0), + fac = new Address(1); + + add(new Copy(new IntWord(5), n)); + add(new Copy(new IntWord(1), fac)); + add(new JumpEq(6, n, new IntWord(1))); + add(new Mul(fac, n, fac)); + add(new Add(n, new IntWord(-1), n)); + add(new Jump(2)); + add(new Print(fac)); + add(new Halt()); + } +} \ No newline at end of file diff --git a/app/src/main/java/hatelace/Computer.java b/app/src/main/java/hatelace/Computer.java index 50d762c..f8dcf99 100644 --- a/app/src/main/java/hatelace/Computer.java +++ b/app/src/main/java/hatelace/Computer.java @@ -15,7 +15,7 @@ public class Computer { public void run() { // Note that the instructions themselves are responsible for incrementing the PC for(ProgramCounter PC = new ProgramCounter(); PC.getPC() < this.program.size() && !PC.halted() && PC.getSysTicks() < 100; ) { - program.getInstructions()[PC.getPC()].execute(this.memory, PC); + program.get(PC.getPC()).execute(this.memory, PC); } } } diff --git a/app/src/main/java/hatelace/Main.java b/app/src/main/java/hatelace/Main.java index f06c53e..9dcb7f1 100644 --- a/app/src/main/java/hatelace/Main.java +++ b/app/src/main/java/hatelace/Main.java @@ -1,6 +1,6 @@ package hatelace; -import hatelace.instructions.*; +import Programs.Factorial; public class Main { public static void main(String[] args) { @@ -8,26 +8,15 @@ public class Main { Memory memory = new IntMemory(64); // 64 words of memory Computer computer = new Computer(memory); + Program program = new Factorial(); - Address n = new Address(0), fac = new Address(1); - - Program program = new Program(new Instruction[] { - new Copy(new IntWord(5), n), - new Copy(new IntWord(1), fac), - new JumpEq(6, n, new IntWord(1)), - new Mul(fac, n, fac), - new Add(n, new IntWord(-1), n), - new Jump(2), - new Print(fac), - new Halt() - }); computer.load(program); computer.run(); memory.dump(); // Print the program System.out.println("Program:"); - for (Instruction instruction : program.getInstructions()) { + for (Instruction instruction : program) { System.out.println(instruction); } diff --git a/app/src/main/java/hatelace/Program.java b/app/src/main/java/hatelace/Program.java index 859b86b..510478f 100644 --- a/app/src/main/java/hatelace/Program.java +++ b/app/src/main/java/hatelace/Program.java @@ -1,17 +1,6 @@ package hatelace; -public class Program { - private Instruction[] instructions; +import java.util.ArrayList; - public Program(Instruction[] instructions) { - this.instructions = instructions; - } - - public Instruction[] getInstructions() { - return this.instructions; - } - - public int size() { - return this.instructions.length; - } -} +// This is simply an intermediate class to comply with the specified API requirements. +public abstract class Program extends ArrayList {}