diff --git a/de/darkress/pic16f84sim/Main.java b/de/darkress/pic16f84sim/Main.java index 4b64698..64bec6a 100644 --- a/de/darkress/pic16f84sim/Main.java +++ b/de/darkress/pic16f84sim/Main.java @@ -3,16 +3,23 @@ package de.darkress.pic16f84sim; import de.darkress.pic16f84sim.commands.Command; import de.darkress.pic16f84sim.decoder.CommandDecoder; import de.darkress.pic16f84sim.microcontroller.Memory; +import de.darkress.pic16f84sim.microcontroller.ProgramCounter; + import java.util.ArrayList; class Main { public static void main(String[] args) { + ArrayList program = new ArrayList<>(); Memory.workingRegister = 0xAA; - int input1 = 0x3AFF; + int input1 = 0x2FFF; program.add(CommandDecoder.decode(input1)); + + Memory.setPCLATH(0xFF); program.get(0).execute(); + //ProgramCounter.incPC(); + } } \ No newline at end of file diff --git a/de/darkress/pic16f84sim/commands/Addlw.java b/de/darkress/pic16f84sim/commands/Addlw.java index 1532ac9..f630022 100644 --- a/de/darkress/pic16f84sim/commands/Addlw.java +++ b/de/darkress/pic16f84sim/commands/Addlw.java @@ -1,6 +1,7 @@ package de.darkress.pic16f84sim.commands; import de.darkress.pic16f84sim.microcontroller.Memory; +import de.darkress.pic16f84sim.microcontroller.ProgramCounter; public class Addlw extends CommandUtils implements Command { @@ -21,5 +22,6 @@ public class Addlw extends CommandUtils implements Command checkDigitCarryBit(literal); Memory.workingRegister = result % 256; + ProgramCounter.incPC(); } } diff --git a/de/darkress/pic16f84sim/commands/Goto.java b/de/darkress/pic16f84sim/commands/Goto.java new file mode 100644 index 0000000..7d3ffd8 --- /dev/null +++ b/de/darkress/pic16f84sim/commands/Goto.java @@ -0,0 +1,20 @@ +package de.darkress.pic16f84sim.commands; + +import de.darkress.pic16f84sim.microcontroller.Memory; +import de.darkress.pic16f84sim.microcontroller.ProgramCounter; + +public class Goto extends CommandUtils implements Command +{ + private final int literal; + + public Goto(int input) + { + literal = input & 0x07FF; + } + + @Override + public void execute() + { + ProgramCounter.setPcForGotoCall(literal); + } +} diff --git a/de/darkress/pic16f84sim/decoder/CommandDecoder.java b/de/darkress/pic16f84sim/decoder/CommandDecoder.java index 00f0f9e..c699140 100644 --- a/de/darkress/pic16f84sim/decoder/CommandDecoder.java +++ b/de/darkress/pic16f84sim/decoder/CommandDecoder.java @@ -103,8 +103,7 @@ public class CommandDecoder //call(); break; case 0x2800: - //goto(); - break; + return new Goto(input); } switch(input & 0x3C00) diff --git a/de/darkress/pic16f84sim/microcontroller/Memory.java b/de/darkress/pic16f84sim/microcontroller/Memory.java index 6a6b729..fdf8a6d 100644 --- a/de/darkress/pic16f84sim/microcontroller/Memory.java +++ b/de/darkress/pic16f84sim/microcontroller/Memory.java @@ -91,6 +91,28 @@ public class Memory return memory[0x4]; } + public static int getPCL() + { + return memory[0x2]; + } + + public static void setPCL(int data) + { + memory[0x2] = data; + memory[0x82] = data; + } + + public static int getPCLATH() + { + return memory[0xA] & 0x1F; + } + + public static void setPCLATH(int data) + { + memory[0xA] = data & 0x1F; + memory[0x8A] = data & 0x1F; + } + public static boolean getZeroBit() { return (memory[0x03] & 0x04) == 0x04; @@ -99,6 +121,7 @@ public class Memory public static void setZeroBit() { memory[0x03] |= 0x04; + memory[0x83] |= 0x04; } public static void clearZeroBit() @@ -114,6 +137,7 @@ public class Memory public static void setDigitCarryBit() { memory[0x03] |= 0x02; + memory[0x83] |= 0x02; } public static void clearDigitCarryBit() @@ -129,6 +153,7 @@ public class Memory public static void setCarryBit() { memory[0x03] |= 0x01; + memory[0x83] |= 0x01; } public static void clearCarryBit() diff --git a/de/darkress/pic16f84sim/microcontroller/ProgramCounter.java b/de/darkress/pic16f84sim/microcontroller/ProgramCounter.java index 196d02e..8b5888d 100644 --- a/de/darkress/pic16f84sim/microcontroller/ProgramCounter.java +++ b/de/darkress/pic16f84sim/microcontroller/ProgramCounter.java @@ -4,20 +4,35 @@ public class ProgramCounter //This class is not actual part of the µC. It is a storage for the current value of the PC { - private static int PC = 0; + private static int pc = 0; - public static int getPC() + public static int getPc() { - return PC; + return pc; } - public static void setPC(int PC) + public static void setPcForGotoCall(int data) { - ProgramCounter.PC = PC; + int pcl = data & 0x00FF; + int pch = Memory.getPCLATH(); + pch = ((pch & 0xF8) <<8) + (data & 0x700); + Memory.setPCL(pcl); + pc = (pch) + pcl; } - public static void incPC() + public static void incPC() //is called after every instruction execution { - PC++; + int pcl = Memory.getPCL(); + int pclath = Memory.getPCLATH(); + if(pcl == 0xFF) + { + pclath++; + pcl = 0; + } else { + pcl++; + } + Memory.setPCL(pcl); + Memory.setPCLATH(pclath); + pc = (pclath <<8) + pcl; } }