diff --git a/.gitignore b/.gitignore index 77b3a40..a007f0d 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,8 @@ gradle-app.setting *.tar.gz *.rar +*.minisig + # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* replay_pid* diff --git a/app/src/main/java/hatelace/Address.java b/app/src/main/java/hatelace/Address.java index fb4d249..f914865 100644 --- a/app/src/main/java/hatelace/Address.java +++ b/app/src/main/java/hatelace/Address.java @@ -1,6 +1,6 @@ package hatelace; -public class Address { +public class Address implements Operand { int address; public Address(int address) { @@ -14,4 +14,8 @@ public class Address { public String toString() { return Integer.toString(address); } + + public Word getWord(Memory memory) { + return memory.read(this); + } } diff --git a/app/src/main/java/hatelace/Operand.java b/app/src/main/java/hatelace/Operand.java new file mode 100644 index 0000000..bcdc6be --- /dev/null +++ b/app/src/main/java/hatelace/Operand.java @@ -0,0 +1,5 @@ +package hatelace; + +public interface Operand { + Word getWord(Memory memory); +} diff --git a/app/src/main/java/hatelace/Word.java b/app/src/main/java/hatelace/Word.java index db74dbc..b0bbb17 100644 --- a/app/src/main/java/hatelace/Word.java +++ b/app/src/main/java/hatelace/Word.java @@ -1,6 +1,6 @@ package hatelace; -public abstract class Word { +public abstract class Word implements Operand { public abstract T getValue(); public abstract Word add(Word other); public abstract Word subtract(Word other); diff --git a/app/src/main/java/hatelace/instructions/Add.java b/app/src/main/java/hatelace/instructions/Add.java index fc5c2ab..1b88504 100644 --- a/app/src/main/java/hatelace/instructions/Add.java +++ b/app/src/main/java/hatelace/instructions/Add.java @@ -3,19 +3,18 @@ package hatelace.instructions; import hatelace.*; public class Add extends Instruction { - private Address src; - private Word imm; private Address dest; + private Operand o1, o2; /** Add immediate value to memory address. */ - public Add(Address src, Word imm, Address dest) { - this.src = src; - this.imm = imm; + public Add(Operand o1, Operand o2, Address dest) { + this.o1 = o1; + this.o2 = o2; this.dest = dest; } public void execute(Memory memory, ProgramCounter PC) { - memory.write(this.dest, memory.read(this.src).add(this.imm)); + memory.write(this.dest, this.o1.getWord(memory).add(this.o2.getWord(memory))); PC.incPC(); } @@ -24,10 +23,10 @@ public class Add extends Instruction { } public String toString() { - return String.format("%s [%s] %s [%s]", this.opcode(), this.src, this.imm, this.dest); + return String.format("%s [%s] %s [%s]", this.opcode(), this.o1, this.o2, this.dest); } protected Object[] operands() { - return new Object[] { this.src, this.imm, this.dest }; + return new Object[] { this.o1, this.o2, this.dest }; } } diff --git a/app/src/main/java/hatelace/instructions/Copy.java b/app/src/main/java/hatelace/instructions/Copy.java index 985ce1a..a88c27e 100644 --- a/app/src/main/java/hatelace/instructions/Copy.java +++ b/app/src/main/java/hatelace/instructions/Copy.java @@ -3,17 +3,17 @@ package hatelace.instructions; import hatelace.*; public class Copy extends Instruction { - private Word imm; + private Operand src; private Address dest; /** Copy immediate value to memory address. */ - public Copy(Word imm, Address dest) { - this.imm = imm; + public Copy(Operand src, Address dest) { + this.src = src; this.dest = dest; } public void execute(Memory memory, ProgramCounter PC) { - memory.write(this.dest, this.imm); + memory.write(this.dest, this.src.getWord(memory)); PC.incPC(); } @@ -22,10 +22,10 @@ public class Copy extends Instruction { } protected Object[] operands() { - return new Object[] {this.imm, this.dest}; + return new Object[] {this.src, this.dest}; } public String toString() { - return String.format("%s %s [%s]", this.opcode(), this.imm, this.dest); + return String.format("%s %s [%s]", this.opcode(), this.src, this.dest); } } diff --git a/app/src/main/java/hatelace/instructions/JumpEq.java b/app/src/main/java/hatelace/instructions/JumpEq.java index f2538be..a0b27ba 100644 --- a/app/src/main/java/hatelace/instructions/JumpEq.java +++ b/app/src/main/java/hatelace/instructions/JumpEq.java @@ -4,18 +4,18 @@ import hatelace.*; public class JumpEq extends Instruction { private int index; - private Address src; - private Word imm; + private Operand o1; + private Operand o2; /** Conditional jump */ - public JumpEq(int index, Address src, Word imm) { + public JumpEq(int index, Operand o1, Operand o2) { this.index = index; - this.src = src; - this.imm = imm; + this.o1 = o1; + this.o2 = o2; } public void execute(Memory memory, ProgramCounter PC) { - if (this.imm.equals(memory.read(this.src))) { + if (this.o1.getWord(memory).equals(this.o2.getWord(memory))) { PC.setPC(this.index); } else { PC.incPC(); @@ -27,10 +27,10 @@ public class JumpEq extends Instruction { } protected Object[] operands() { - return new Object[] {this.index, this.src, this.imm}; + return new Object[] {this.index, this.o1, this.o2}; } public String toString() { - return String.format("%s %s [%s] %s", this.opcode(), this.index, this.src, this.imm); + return String.format("%s %s [%s] %s", this.opcode(), this.index, this.o1, this.o2); } } diff --git a/app/src/main/java/hatelace/instructions/Mul.java b/app/src/main/java/hatelace/instructions/Mul.java index cd61d81..4536682 100644 --- a/app/src/main/java/hatelace/instructions/Mul.java +++ b/app/src/main/java/hatelace/instructions/Mul.java @@ -3,19 +3,19 @@ package hatelace.instructions; import hatelace.*; public class Mul extends Instruction { - private Address src1; - private Address src2; + private Operand o1; + private Operand o2; private Address dest; /** 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; + public Mul(Operand o1, Operand o2, Address dest) { + this.o1 = o1; + this.o2 = o2; this.dest = dest; } public void execute(Memory memory, ProgramCounter PC) { - memory.write(this.dest, memory.read(this.src1).multiply(memory.read(this.src2))); + memory.write(this.dest, this.o1.getWord(memory).multiply(this.o2.getWord(memory))); PC.incPC(); } @@ -24,10 +24,10 @@ public class Mul extends Instruction { } protected Object[] operands() { - return new Object[] { this.src1, this.src2, this.dest }; + return new Object[] { this.o1, this.o2, this.dest }; } public String toString() { - return String.format("%s [%s] [%s] [%s]", this.opcode(), this.src1, this.src2, this.dest); + return String.format("%s [%s] [%s] [%s]", this.opcode(), this.o1, this.o2, this.dest); } } diff --git a/app/src/main/java/hatelace/memtypes/IntWord.java b/app/src/main/java/hatelace/memtypes/IntWord.java index 75c00a8..ba8402d 100644 --- a/app/src/main/java/hatelace/memtypes/IntWord.java +++ b/app/src/main/java/hatelace/memtypes/IntWord.java @@ -1,5 +1,6 @@ package hatelace.memtypes; +import hatelace.Memory; import hatelace.Word; public class IntWord extends Word { @@ -15,6 +16,11 @@ public class IntWord extends Word { return value; } + @Override + public Word getWord(Memory memory) { + return this; + } + public Word add(Word other) { return new IntWord(value + (Integer) other.getValue()); } diff --git a/app/src/main/java/hatelace/memtypes/LongWord.java b/app/src/main/java/hatelace/memtypes/LongWord.java index f01ace2..272ffd5 100644 --- a/app/src/main/java/hatelace/memtypes/LongWord.java +++ b/app/src/main/java/hatelace/memtypes/LongWord.java @@ -1,5 +1,6 @@ package hatelace.memtypes; +import hatelace.Memory; import hatelace.Word; public class LongWord extends Word { @@ -15,6 +16,11 @@ public class LongWord extends Word { return value; } + @Override + public Word getWord(Memory memory) { + return this; + } + public Word add(Word other) { return new LongWord(value + (Long) other.getValue()); }