Compare commits

...

4 commits

Author SHA1 Message Date
Imbus
dee1d42924 JumpEq uses Operand 2024-05-11 19:43:58 +02:00
Imbus
40c104f2fe Suited instructions now use Operand as operand 2024-05-11 19:43:33 +02:00
Imbus
66afdf9085 Operand implemented, not used in instructions 2024-05-11 19:27:59 +02:00
Imbus
a00f27aa25 Ignore 2024-05-11 19:08:25 +02:00
10 changed files with 54 additions and 32 deletions

2
.gitignore vendored
View file

@ -36,6 +36,8 @@ gradle-app.setting
*.tar.gz *.tar.gz
*.rar *.rar
*.minisig
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid* hs_err_pid*
replay_pid* replay_pid*

View file

@ -1,6 +1,6 @@
package hatelace; package hatelace;
public class Address { public class Address implements Operand {
int address; int address;
public Address(int address) { public Address(int address) {
@ -14,4 +14,8 @@ public class Address {
public String toString() { public String toString() {
return Integer.toString(address); return Integer.toString(address);
} }
public Word getWord(Memory memory) {
return memory.read(this);
}
} }

View file

@ -0,0 +1,5 @@
package hatelace;
public interface Operand {
Word getWord(Memory memory);
}

View file

@ -1,6 +1,6 @@
package hatelace; package hatelace;
public abstract class Word { public abstract class Word implements Operand {
public abstract <T> T getValue(); public abstract <T> T getValue();
public abstract Word add(Word other); public abstract Word add(Word other);
public abstract Word subtract(Word other); public abstract Word subtract(Word other);

View file

@ -3,19 +3,18 @@ package hatelace.instructions;
import hatelace.*; import hatelace.*;
public class Add extends Instruction { public class Add extends Instruction {
private Address src;
private Word imm;
private Address dest; private Address dest;
private Operand o1, o2;
/** Add immediate value to memory address. */ /** Add immediate value to memory address. */
public Add(Address src, Word imm, Address dest) { public Add(Operand o1, Operand o2, Address dest) {
this.src = src; this.o1 = o1;
this.imm = imm; this.o2 = o2;
this.dest = dest; this.dest = dest;
} }
public void execute(Memory memory, ProgramCounter PC) { 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(); PC.incPC();
} }
@ -24,10 +23,10 @@ public class Add extends Instruction {
} }
public String toString() { 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() { protected Object[] operands() {
return new Object[] { this.src, this.imm, this.dest }; return new Object[] { this.o1, this.o2, this.dest };
} }
} }

View file

@ -3,17 +3,17 @@ package hatelace.instructions;
import hatelace.*; import hatelace.*;
public class Copy extends Instruction { public class Copy extends Instruction {
private Word imm; private Operand src;
private Address dest; private Address dest;
/** Copy immediate value to memory address. */ /** Copy immediate value to memory address. */
public Copy(Word imm, Address dest) { public Copy(Operand src, Address dest) {
this.imm = imm; this.src = src;
this.dest = dest; this.dest = dest;
} }
public void execute(Memory memory, ProgramCounter PC) { public void execute(Memory memory, ProgramCounter PC) {
memory.write(this.dest, this.imm); memory.write(this.dest, this.src.getWord(memory));
PC.incPC(); PC.incPC();
} }
@ -22,10 +22,10 @@ public class Copy extends Instruction {
} }
protected Object[] operands() { protected Object[] operands() {
return new Object[] {this.imm, this.dest}; return new Object[] {this.src, this.dest};
} }
public String toString() { 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);
} }
} }

View file

@ -4,18 +4,18 @@ import hatelace.*;
public class JumpEq extends Instruction { public class JumpEq extends Instruction {
private int index; private int index;
private Address src; private Operand o1;
private Word imm; private Operand o2;
/** Conditional jump */ /** Conditional jump */
public JumpEq(int index, Address src, Word imm) { public JumpEq(int index, Operand o1, Operand o2) {
this.index = index; this.index = index;
this.src = src; this.o1 = o1;
this.imm = imm; this.o2 = o2;
} }
public void execute(Memory memory, ProgramCounter PC) { 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); PC.setPC(this.index);
} else { } else {
PC.incPC(); PC.incPC();
@ -27,10 +27,10 @@ public class JumpEq extends Instruction {
} }
protected Object[] operands() { protected Object[] operands() {
return new Object[] {this.index, this.src, this.imm}; return new Object[] {this.index, this.o1, this.o2};
} }
public String toString() { 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);
} }
} }

View file

@ -3,19 +3,19 @@ package hatelace.instructions;
import hatelace.*; import hatelace.*;
public class Mul extends Instruction { public class Mul extends Instruction {
private Address src1; private Operand o1;
private Address src2; private Operand o2;
private Address dest; private Address dest;
/** Multiply contents of two addresses and store the result in a third memory address. */ /** Multiply contents of two addresses and store the result in a third memory address. */
public Mul(Address src1, Address src2, Address dest) { public Mul(Operand o1, Operand o2, Address dest) {
this.src1 = src1; this.o1 = o1;
this.src2 = src2; this.o2 = o2;
this.dest = dest; this.dest = dest;
} }
public void execute(Memory memory, ProgramCounter PC) { 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(); PC.incPC();
} }
@ -24,10 +24,10 @@ public class Mul extends Instruction {
} }
protected Object[] operands() { protected Object[] operands() {
return new Object[] { this.src1, this.src2, this.dest }; return new Object[] { this.o1, this.o2, this.dest };
} }
public String toString() { 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);
} }
} }

View file

@ -1,5 +1,6 @@
package hatelace.memtypes; package hatelace.memtypes;
import hatelace.Memory;
import hatelace.Word; import hatelace.Word;
public class IntWord extends Word { public class IntWord extends Word {
@ -15,6 +16,11 @@ public class IntWord extends Word {
return value; return value;
} }
@Override
public Word getWord(Memory memory) {
return this;
}
public Word add(Word other) { public Word add(Word other) {
return new IntWord(value + (Integer) other.getValue()); return new IntWord(value + (Integer) other.getValue());
} }

View file

@ -1,5 +1,6 @@
package hatelace.memtypes; package hatelace.memtypes;
import hatelace.Memory;
import hatelace.Word; import hatelace.Word;
public class LongWord extends Word { public class LongWord extends Word {
@ -15,6 +16,11 @@ public class LongWord extends Word {
return value; return value;
} }
@Override
public Word getWord(Memory memory) {
return this;
}
public Word add(Word other) { public Word add(Word other) {
return new LongWord(value + (Long) other.getValue()); return new LongWord(value + (Long) other.getValue());
} }