diff --git a/HelloWorld.java b/HelloWorld.java index ea520bc..198d438 100644 --- a/HelloWorld.java +++ b/HelloWorld.java @@ -1,7 +1,14 @@ +import commands.Command; +import decoder.CommandDecoder; +import java.util.ArrayList; class HelloWorld { public static void main(String[] args) { - System.out.println(Parser.parser("TPicSim2.LST")); + //System.out.println(Parser.Parser.parser("TPicSim2.LST")); + ArrayList program = new ArrayList<>(); + int input1 = 0x3EFF; + program.add(CommandDecoder.decode(input1)); + program.get(0).execute(); } } \ No newline at end of file diff --git a/commands/Addlw.java b/commands/Addlw.java new file mode 100644 index 0000000..0fe48c6 --- /dev/null +++ b/commands/Addlw.java @@ -0,0 +1,25 @@ +package commands; + +import registers.Memory; + +public class Addlw extends CommandUtils implements Command +{ + private final int literal; + + public Addlw(int input) + { + literal = input & 0x00FF; + } + + @Override + public void execute() + { + int result = literal + Memory.workingRegister; + + checkZeroBit(result); + checkCarryBit(result); + checkDigitCarryBit(result, literal); + + Memory.workingRegister = result % 256; + } +} diff --git a/commands/Command.java b/commands/Command.java new file mode 100644 index 0000000..a5fab5d --- /dev/null +++ b/commands/Command.java @@ -0,0 +1,6 @@ +package commands; + +public interface Command +{ + void execute(); +} diff --git a/commands/CommandUtils.java b/commands/CommandUtils.java new file mode 100644 index 0000000..5ded754 --- /dev/null +++ b/commands/CommandUtils.java @@ -0,0 +1,33 @@ +package commands; + +import registers.Memory; + +public class CommandUtils +{ + protected void checkZeroBit(int result) + { + if(result == 0){ + Memory.setZeroBit(); + } else{ + Memory.clearZeroBit(); + } + } + + protected void checkCarryBit(int result) + { + if(result > 255){ + Memory.setCarryBit(); + } else{ + Memory.clearCarryBit(); + } + } + + protected void checkDigitCarryBit(int result, int literal) + { + if(((Memory.workingRegister & 0x0F) + (literal & 0x0F)) > 15){ + Memory.setDigitCarryBit(); + } else{ + Memory.clearDigitCarryBit(); + } + } +} diff --git a/CommandDecoder.java b/decoder/CommandDecoder.java similarity index 92% rename from CommandDecoder.java rename to decoder/CommandDecoder.java index 1c17782..56e6e6a 100644 --- a/CommandDecoder.java +++ b/decoder/CommandDecoder.java @@ -1,6 +1,11 @@ +package decoder; + +import commands.Addlw; +import commands.Command; + public class CommandDecoder { - public CommandDecoder(int input) + public static Command decode(int input) { switch(input & 0x3F00) { @@ -90,7 +95,8 @@ public class CommandDecoder { case 0x3E00: //addlw(); - break; + return new Addlw(input); + //break; case 0x3C00: //sublw(); break; @@ -141,5 +147,8 @@ public class CommandDecoder { //sleep(); } + + System.out.println("No command matched"); + return null; } } diff --git a/Parser.java b/parser/Parser.java similarity index 90% rename from Parser.java rename to parser/Parser.java index b92475b..a44f1fc 100644 --- a/Parser.java +++ b/parser/Parser.java @@ -1,11 +1,14 @@ +package parser; + import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; +import java.util.List; import java.util.Scanner; public class Parser { - public static ArrayList parser(String filePath) + public static List parser(String filePath) { ArrayList program = new ArrayList<>(); try { diff --git a/Registers.java b/registers/Memory.java similarity index 92% rename from Registers.java rename to registers/Memory.java index fdbfac0..ec4d8bb 100644 --- a/Registers.java +++ b/registers/Memory.java @@ -1,9 +1,11 @@ +package registers; + import java.util.Arrays; -public class Registers +public class Memory { private static final int MEMORY_SIZE = 0xFF; //Addressable Memory - public static final int workingRegister = 0; + public static int workingRegister = 0; private static final int[] memory = new int[MEMORY_SIZE]; private static final int[] bank0UniqueSpecialRegister = new int[] {0x01,0x05,0x06,0x08,0x09}; //and many more private static final int[] bank1UniqueSpecialRegister = new int[] {0x81,0x85,0x86,0x88,0x89}; //and many more @@ -50,7 +52,7 @@ public class Registers { return memory[address]; } - return memory[address % 128]; // else: Registers which are mapped + return memory[address % 128]; // else: Registers.Registers which are mapped } private static void setDataFromIndirectAddress(int address, int data) @@ -59,7 +61,7 @@ public class Registers { memory[address] = data; } - memory[address % 128] = data; // else: Registers which are mapped + memory[address % 128] = data; // else: Registers.Registers which are mapped } private static int getRegisterBank()