From 1bdb35a8995ae4b6f2517efaed7e2f7d742e6a33 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Sun, 21 Apr 2024 22:17:49 +0200 Subject: [PATCH 01/13] Instruction abstract -> interface --- app/src/main/java/hatelace/Instruction.java | 13 +++++-------- app/src/main/java/hatelace/instructions/Add.java | 6 +++--- app/src/main/java/hatelace/instructions/Copy.java | 6 +++--- app/src/main/java/hatelace/instructions/Halt.java | 6 +++--- app/src/main/java/hatelace/instructions/Jump.java | 6 +++--- app/src/main/java/hatelace/instructions/JumpEq.java | 6 +++--- app/src/main/java/hatelace/instructions/Mul.java | 6 +++--- app/src/main/java/hatelace/instructions/Print.java | 6 +++--- 8 files changed, 26 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/hatelace/Instruction.java b/app/src/main/java/hatelace/Instruction.java index f7d04be..43d5bfb 100644 --- a/app/src/main/java/hatelace/Instruction.java +++ b/app/src/main/java/hatelace/Instruction.java @@ -1,11 +1,8 @@ package hatelace; -public abstract class Instruction { - public abstract void execute(Memory memory, ProgramCounter pc); - - protected abstract String opcode(); - - protected abstract Object[] operands(); - - public abstract String toString(); +public interface Instruction { + void execute(Memory memory, ProgramCounter pc); + String opcode(); + Object[] operands(); + String toString(); } diff --git a/app/src/main/java/hatelace/instructions/Add.java b/app/src/main/java/hatelace/instructions/Add.java index fc5c2ab..e45609c 100644 --- a/app/src/main/java/hatelace/instructions/Add.java +++ b/app/src/main/java/hatelace/instructions/Add.java @@ -2,7 +2,7 @@ package hatelace.instructions; import hatelace.*; -public class Add extends Instruction { +public class Add implements Instruction { private Address src; private Word imm; private Address dest; @@ -19,7 +19,7 @@ public class Add extends Instruction { PC.incPC(); } - protected String opcode() { + public String opcode() { return "ADD"; } @@ -27,7 +27,7 @@ public class Add extends Instruction { return String.format("%s [%s] %s [%s]", this.opcode(), this.src, this.imm, this.dest); } - protected Object[] operands() { + public Object[] operands() { 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 985ce1a..215b500 100644 --- a/app/src/main/java/hatelace/instructions/Copy.java +++ b/app/src/main/java/hatelace/instructions/Copy.java @@ -2,7 +2,7 @@ package hatelace.instructions; import hatelace.*; -public class Copy extends Instruction { +public class Copy implements Instruction { private Word imm; private Address dest; @@ -17,11 +17,11 @@ public class Copy extends Instruction { PC.incPC(); } - protected String opcode() { + public String opcode() { return "CPY"; } - protected Object[] operands() { + public Object[] operands() { 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 7823e35..3fc8485 100644 --- a/app/src/main/java/hatelace/instructions/Halt.java +++ b/app/src/main/java/hatelace/instructions/Halt.java @@ -2,7 +2,7 @@ package hatelace.instructions; import hatelace.*; -public class Halt extends Instruction { +public class Halt implements Instruction { /** Halts the CPU */ public Halt(){}; @@ -10,11 +10,11 @@ public class Halt extends Instruction { PC.halt(); } - protected String opcode() { + public String opcode() { return "HLT"; } - protected Object[] operands() { + public Object[] operands() { return new Object[] {}; } diff --git a/app/src/main/java/hatelace/instructions/Jump.java b/app/src/main/java/hatelace/instructions/Jump.java index 972945f..5761c4c 100644 --- a/app/src/main/java/hatelace/instructions/Jump.java +++ b/app/src/main/java/hatelace/instructions/Jump.java @@ -2,7 +2,7 @@ package hatelace.instructions; import hatelace.*; -public class Jump extends Instruction { +public class Jump implements Instruction { private int index; /** Unconditional jump, non-relative */ @@ -14,11 +14,11 @@ public class Jump extends Instruction { PC.setPC(this.index); } - protected String opcode() { + public String opcode() { return "JMP"; } - protected Object[] operands() { + public Object[] operands() { return new Object[] {this.index}; } diff --git a/app/src/main/java/hatelace/instructions/JumpEq.java b/app/src/main/java/hatelace/instructions/JumpEq.java index f2538be..9152637 100644 --- a/app/src/main/java/hatelace/instructions/JumpEq.java +++ b/app/src/main/java/hatelace/instructions/JumpEq.java @@ -2,7 +2,7 @@ package hatelace.instructions; import hatelace.*; -public class JumpEq extends Instruction { +public class JumpEq implements Instruction { private int index; private Address src; private Word imm; @@ -22,11 +22,11 @@ public class JumpEq extends Instruction { } } - protected String opcode() { + public String opcode() { return "JEQ"; } - protected Object[] operands() { + public Object[] operands() { 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 cd61d81..0cf60da 100644 --- a/app/src/main/java/hatelace/instructions/Mul.java +++ b/app/src/main/java/hatelace/instructions/Mul.java @@ -2,7 +2,7 @@ package hatelace.instructions; import hatelace.*; -public class Mul extends Instruction { +public class Mul implements Instruction { private Address src1; private Address src2; private Address dest; @@ -19,11 +19,11 @@ public class Mul extends Instruction { PC.incPC(); } - protected String opcode() { + public String opcode() { return "MUL"; } - protected Object[] operands() { + public Object[] operands() { 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 17e7ce6..f73ce0b 100644 --- a/app/src/main/java/hatelace/instructions/Print.java +++ b/app/src/main/java/hatelace/instructions/Print.java @@ -2,7 +2,7 @@ package hatelace.instructions; import hatelace.*; -public class Print extends Instruction { +public class Print implements Instruction { private Address address; /** Print content of memory address */ @@ -15,11 +15,11 @@ public class Print extends Instruction { PC.incPC(); } - protected String opcode() { + public String opcode() { return "PRT"; } - protected Object[] operands() { + public Object[] operands() { return new Object[] { this.address }; } From 422344097b2aeb1a5fe9b021d74dbf9d82806b68 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Sun, 21 Apr 2024 22:26:03 +0200 Subject: [PATCH 02/13] Word abstract -> interface --- app/src/main/java/hatelace/Word.java | 16 ++++++++-------- app/src/main/java/hatelace/memtypes/IntWord.java | 2 +- .../main/java/hatelace/memtypes/LongWord.java | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/hatelace/Word.java b/app/src/main/java/hatelace/Word.java index db74dbc..4ac199f 100644 --- a/app/src/main/java/hatelace/Word.java +++ b/app/src/main/java/hatelace/Word.java @@ -1,11 +1,11 @@ package hatelace; -public abstract class Word { - public abstract T getValue(); - public abstract Word add(Word other); - public abstract Word subtract(Word other); - public abstract Word multiply(Word other); - public abstract Word divide(Word other); - public abstract String toString(); - public abstract boolean equals(Object other); +public interface Word { + T getValue(); + Word add(Word other); + Word subtract(Word other); + Word multiply(Word other); + Word divide(Word other); + String toString(); + boolean equals(Object other); } diff --git a/app/src/main/java/hatelace/memtypes/IntWord.java b/app/src/main/java/hatelace/memtypes/IntWord.java index 75c00a8..eea0583 100644 --- a/app/src/main/java/hatelace/memtypes/IntWord.java +++ b/app/src/main/java/hatelace/memtypes/IntWord.java @@ -2,7 +2,7 @@ package hatelace.memtypes; import hatelace.Word; -public class IntWord extends Word { +public class IntWord implements Word { private Integer value; public IntWord(Integer value) { diff --git a/app/src/main/java/hatelace/memtypes/LongWord.java b/app/src/main/java/hatelace/memtypes/LongWord.java index f01ace2..adb8855 100644 --- a/app/src/main/java/hatelace/memtypes/LongWord.java +++ b/app/src/main/java/hatelace/memtypes/LongWord.java @@ -2,7 +2,7 @@ package hatelace.memtypes; import hatelace.Word; -public class LongWord extends Word { +public class LongWord implements Word { private Long value; public LongWord(Long value) { From 45703d743e67278d0e06496b6e5ef65dcc7b159a Mon Sep 17 00:00:00 2001 From: dDogge Date: Mon, 22 Apr 2024 00:17:07 +0200 Subject: [PATCH 03/13] Updated classdiagram --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index d97f036..2992174 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,8 @@ classDiagram Computer --> ProgramCounter Program <-- ArrayList Program : +toString() - Memory <|-- LongMemory - Word <|-- LongWord + Memory --|> LongMemory + Word --|> LongWord ``` @@ -73,15 +73,15 @@ classDiagram class JumpEq class Mul class Print - Instruction --|> Word - Instruction --|> Address - Add --|> Instruction - Copy --|> Instruction - Halt --|> Instruction - Jump --|> Instruction - JumpEq --|> Instruction - Mul --|> Instruction - Print --|> Instruction + Instruction <|-- Word + Instruction <|-- Address + Add <|-- Instruction + Copy <|-- Instruction + Halt <|-- Instruction + Jump <|-- Instruction + JumpEq <|-- Instruction + Mul <|-- Instruction + Print <|-- Instruction ``` ```mermaid From 8fe59115c49c53963ad8114c3fc0ed1523a43e96 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Mon, 22 Apr 2024 00:41:04 +0200 Subject: [PATCH 04/13] Ignore --- .gitignore | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.gitignore b/.gitignore index a5b1113..77b3a40 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.vscode .gradle **/build/ !src/**/build/ @@ -19,3 +20,22 @@ gradle-app.setting .project # JDT-specific (Eclipse Java Development Tools) .classpath + +# Compiled class file +*.class + +# Log file +*.log + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* From d139a45548e20b656ded34accc46fe8091224591 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Mon, 22 Apr 2024 00:41:27 +0200 Subject: [PATCH 05/13] Answers --- doc/answers.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/answers.md diff --git a/doc/answers.md b/doc/answers.md new file mode 100644 index 0000000..e69de29 From 86ad6dad28da72a70228fb23c2393e707f5b6e1b Mon Sep 17 00:00:00 2001 From: dDogge Date: Mon, 22 Apr 2024 01:30:22 +0200 Subject: [PATCH 06/13] Added old answers and images --- doc/answers.md | 15 +++++++++++++++ doc/mermaid-diagram-2024-04-22-010342.svg | 1 + doc/mermaid-diagram-2024-04-22-010404.svg | 1 + doc/mermaid-diagram-2024-04-22-010422.svg | 1 + 4 files changed, 18 insertions(+) create mode 100644 doc/mermaid-diagram-2024-04-22-010342.svg create mode 100644 doc/mermaid-diagram-2024-04-22-010404.svg create mode 100644 doc/mermaid-diagram-2024-04-22-010422.svg diff --git a/doc/answers.md b/doc/answers.md index e69de29..0112616 100644 --- a/doc/answers.md +++ b/doc/answers.md @@ -0,0 +1,15 @@ +1. En interface som alla typer av instruktioner kan ha gemensam borde inte vara helt fel. Vilket i sin tur betyder en klass för varje instruktion där ett instruktions interface implementeras. + +2. Man ärver lämplig collection, ex arraylist. Detta är kass design, då komposition är tydligare. + +3. "Program" och självaste "datorn" borde vara olika paket, paketet "program" rör program som skall köra på datorn, "datorn" har de klasser som är datorn som t.ex. memory och programCounter osv. + +4. Varje instruktion skulle kunna representeras som ett kommando, och datorn skulle utföra dessa kommandon utan att behöva veta exakt vad varje instruktion innebär. På så sätt separeras ansvar, och det blir enklare att lägga till eller ändra instruktioner i framtiden. + +5. Designmönstret Template Method kan vara användbart för att undvika duplicerad kod i likartade klasser, särskilt för de instruktionsklasser som ingår i programmet (t.ex. Copy, JumpEq, Mul, Add, Print, Halt). Eftersom dessa instruktionsklasser kan ha vissa gemensamma delar i hur de utför sin uppgift, kan ett template method-mönster användas för att abstrahera och återanvända gemensam kod. + +6. För att hantera olika sorters operander på ett enhetligt sätt med hjälp av Strategy-mönstret i en datormodell skulle man kunna implementera olika strategier för hur operander ska hanteras. Operander kan vara antingen konstanter eller adresser, och olika instruktioner kräver olika typer av operander. + +7. Additionen bör nog utföras i LongWord. + +8. \ No newline at end of file diff --git a/doc/mermaid-diagram-2024-04-22-010342.svg b/doc/mermaid-diagram-2024-04-22-010342.svg new file mode 100644 index 0000000..024943f --- /dev/null +++ b/doc/mermaid-diagram-2024-04-22-010342.svg @@ -0,0 +1 @@ +
Computer
- Memory memory
- Program program
+Computer(Memory Memory)
+void load(Program program)
+void run()
Memory
+Word read(Address address)
+int size()
+void write(Address address, Word data)
+void dump()
ProgramCounter
- int PC
- int SysTick
- boolean haltFlag
+ProgramCounter()
+ProgramCounter(int PC)
+int getPC()
+int getSysTicks()
+int incPC()
+int setPC(int PC)
+boolean halted()
+void halt()
Program
+toString()
ArrayList
Word
+T getValue()
+Word add(Word other)
+Word subtract(Word other)
+Word multiply(Word other)
+Word divide(Word other)
+String toString()
+boolean equals(Object other)
Address
- int address
+Address(int address)
+int getAddress()
+String toString()
LongMemory
LongWord
\ No newline at end of file diff --git a/doc/mermaid-diagram-2024-04-22-010404.svg b/doc/mermaid-diagram-2024-04-22-010404.svg new file mode 100644 index 0000000..e604ecd --- /dev/null +++ b/doc/mermaid-diagram-2024-04-22-010404.svg @@ -0,0 +1 @@ +
Instruction
+void execute(Memory memory, ProgramCounter pc)
#String opcode()
#Object[] operands()
+String toString()
Add
Copy
Halt
Jump
JumpEq
Mul
Print
Word
Address
\ No newline at end of file diff --git a/doc/mermaid-diagram-2024-04-22-010422.svg b/doc/mermaid-diagram-2024-04-22-010422.svg new file mode 100644 index 0000000..10b1d86 --- /dev/null +++ b/doc/mermaid-diagram-2024-04-22-010422.svg @@ -0,0 +1 @@ +InstructionProgramCounterMemoryProgramComputerInstructionProgramCounterMemoryProgramComputerloop[Instructions Execution]loop[Program Execution]load(program)run()incPC()getPC()executeInstruction()execute(memory, PC)read/write(address)incPC() \ No newline at end of file From 8b9b7a92906a1824de59f3ccf044715f3d6e30a5 Mon Sep 17 00:00:00 2001 From: dDogge Date: Mon, 22 Apr 2024 01:32:17 +0200 Subject: [PATCH 07/13] Added old answers and images --- doc/{mermaid-diagram-2024-04-22-010342.svg => image1.svg} | 0 doc/{mermaid-diagram-2024-04-22-010404.svg => image2.svg} | 0 doc/{mermaid-diagram-2024-04-22-010422.svg => image3.svg} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename doc/{mermaid-diagram-2024-04-22-010342.svg => image1.svg} (100%) rename doc/{mermaid-diagram-2024-04-22-010404.svg => image2.svg} (100%) rename doc/{mermaid-diagram-2024-04-22-010422.svg => image3.svg} (100%) diff --git a/doc/mermaid-diagram-2024-04-22-010342.svg b/doc/image1.svg similarity index 100% rename from doc/mermaid-diagram-2024-04-22-010342.svg rename to doc/image1.svg diff --git a/doc/mermaid-diagram-2024-04-22-010404.svg b/doc/image2.svg similarity index 100% rename from doc/mermaid-diagram-2024-04-22-010404.svg rename to doc/image2.svg diff --git a/doc/mermaid-diagram-2024-04-22-010422.svg b/doc/image3.svg similarity index 100% rename from doc/mermaid-diagram-2024-04-22-010422.svg rename to doc/image3.svg From 0d5382a71d7f43b6074d5a2015ac385a848699b9 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Sat, 11 May 2024 19:06:21 +0200 Subject: [PATCH 08/13] Makefile --- makefile | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/makefile b/makefile index 19c9fc7..8cca887 100644 --- a/makefile +++ b/makefile @@ -1,3 +1,8 @@ +GITHASH := $(shell git rev-parse --short HEAD)$(shell git diff-index --quiet HEAD || echo "-dirty") + +TARNAME := hatelace-imbus_$(GITHASH).tar.gz +DIRNAME := hatelace + run: ./gradlew run @@ -6,11 +11,35 @@ watch: build: ./gradlew build + ls -lh app/build/libs/*.jar clean: ./gradlew clean + rm -f *.tar.gz *.tar.gz.minisig *.zip *.jpg test: ./gradlew test -.PHONY: run build clean +$(TARNAME): + git archive --format=tar --prefix=$(DIRNAME)/ HEAD > intermediate.tar + tar -f intermediate.tar --delete $(DIRNAME)/doc + gzip -9 -c intermediate.tar > $(TARNAME) + rm intermediate.tar + +$(TARNAME).minisig: $(TARNAME) + minisign -Sm $(TARNAME) + +tar: $(TARNAME) + tar -tvf $(TARNAME) + +sign: $(TARNAME).minisig + +publish: $(TARNAME) $(TARNAME).minisig + @git diff-index --quiet HEAD || (echo "git is dirty, commit changes first"; exit 1) + ssh server mkdir -p /public/$(DIRNAME) + rsync -avz $(TARNAME).minisig server:/public/$(DIRNAME)/$(TARNAME).minisig + rsync -avz $(TARNAME) server:/public/$(DIRNAME)/$(TARNAME) + ssh server ln -sf /public/$(DIRNAME)/$(TARNAME).minisig /public/$(DIRNAME)/latest.tar.gz.minisig + ssh server ln -sf /public/$(DIRNAME)/$(TARNAME) /public/$(DIRNAME)/latest.tar.gz + +.PHONY: run watch build clean test archive sign publish From a00f27aa252d22c66ae40f500fd5c8713954a836 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Sat, 11 May 2024 19:08:25 +0200 Subject: [PATCH 09/13] Ignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) 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* From 66afdf9085c069861c8d51dc82467666c179d513 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Sat, 11 May 2024 19:27:59 +0200 Subject: [PATCH 10/13] Operand implemented, not used in instructions --- app/src/main/java/hatelace/Address.java | 6 +++++- app/src/main/java/hatelace/Operand.java | 5 +++++ app/src/main/java/hatelace/Word.java | 2 +- app/src/main/java/hatelace/memtypes/IntWord.java | 6 ++++++ app/src/main/java/hatelace/memtypes/LongWord.java | 6 ++++++ 5 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/hatelace/Operand.java 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/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()); } From 40c104f2feb59849d93c8b0e6bfc2b99cca9e37c Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Sat, 11 May 2024 19:43:33 +0200 Subject: [PATCH 11/13] Suited instructions now use Operand as operand --- .../main/java/hatelace/instructions/Add.java | 15 +++++++-------- .../main/java/hatelace/instructions/Copy.java | 12 ++++++------ .../java/hatelace/instructions/JumpEq.java | 18 ++++++++++-------- .../main/java/hatelace/instructions/Mul.java | 16 ++++++++-------- 4 files changed, 31 insertions(+), 30 deletions(-) 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..66712e5 100644 --- a/app/src/main/java/hatelace/instructions/JumpEq.java +++ b/app/src/main/java/hatelace/instructions/JumpEq.java @@ -4,18 +4,20 @@ import hatelace.*; public class JumpEq extends Instruction { private int index; - private Address src; - private Word imm; + // 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 +29,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); } } From dee1d42924a10b866ad9f7c63b3d5f119dd47d62 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Sat, 11 May 2024 19:43:58 +0200 Subject: [PATCH 12/13] JumpEq uses Operand --- app/src/main/java/hatelace/instructions/JumpEq.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/hatelace/instructions/JumpEq.java b/app/src/main/java/hatelace/instructions/JumpEq.java index 66712e5..a0b27ba 100644 --- a/app/src/main/java/hatelace/instructions/JumpEq.java +++ b/app/src/main/java/hatelace/instructions/JumpEq.java @@ -4,8 +4,6 @@ import hatelace.*; public class JumpEq extends Instruction { private int index; - // private Address src; - // private Word imm; private Operand o1; private Operand o2; From 14833d64b18928a76b292531a62ed886dc7d08d1 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Sat, 11 May 2024 20:07:19 +0200 Subject: [PATCH 13/13] Diagrams fixed --- README.md | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 2992174..8aa618a 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,9 @@ classDiagram ```mermaid classDiagram + class Operand { + + Word getValue() + } class Instruction { + void execute(Memory memory, ProgramCounter pc) # String opcode() @@ -73,15 +76,16 @@ classDiagram class JumpEq class Mul class Print - Instruction <|-- Word - Instruction <|-- Address - Add <|-- Instruction - Copy <|-- Instruction - Halt <|-- Instruction - Jump <|-- Instruction - JumpEq <|-- Instruction - Mul <|-- Instruction - Print <|-- Instruction + Instruction *-- Operand + Operand <|-- Word + Operand <|-- Address + Add --|> Instruction + Copy --|> Instruction + Halt --|> Instruction + Jump --|> Instruction + JumpEq --|> Instruction + Mul --|> Instruction + Print --|> Instruction ``` ```mermaid