diff --git a/src/main/java/fabrik/simulator/pic16f84/Commands.java b/src/main/java/fabrik/simulator/pic16f84/Commands.java index 80eabb8..a0ef629 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Commands.java +++ b/src/main/java/fabrik/simulator/pic16f84/Commands.java @@ -172,11 +172,11 @@ public class Commands { return; case 0b1001: System.out.println("RETFIE"); - //TODO + RETFIE(); return; case 0b1000: System.out.println("RETURN"); - //TODO + DataRegister.setPC(ProgramStack.pop()); return; case 0b01100011: System.out.println("SLEEP"); @@ -196,12 +196,17 @@ public class Commands { } + public static void RETFIE() { + DataRegister.setPC(ProgramStack.pop()); + } + public static void GOTO(int jump) { DataRegister.setPC(jump-1); } public static void CALL(int jump) { - //TODO + ProgramStack.push(DataRegister.getPC()+1); + DataRegister.setPC(jump-1); } public static void MOVWF(int file) { @@ -439,7 +444,7 @@ public class Commands { public static void RETLW(int literal) { wRegister = literal; - //TODO: PC vom Stack holen und laden + DataRegister.setPC(ProgramStack.pop()); } public static void MOVLW(int literal) { diff --git a/src/main/java/fabrik/simulator/pic16f84/Controller_FileSelect.java b/src/main/java/fabrik/simulator/pic16f84/Controller_FileSelect.java index 7e8b17f..aa4c0ae 100644 --- a/src/main/java/fabrik/simulator/pic16f84/Controller_FileSelect.java +++ b/src/main/java/fabrik/simulator/pic16f84/Controller_FileSelect.java @@ -44,6 +44,8 @@ public class Controller_FileSelect { System.out.println("W: " + Commands.get_wRegister()); System.out.println("C: " + DataRegister.getCarryFlag()); System.out.println("DC: " + DataRegister.getDigitCarryFlag()); + System.out.println("StackPointer: " + ProgramStack.getStackPointer()); + System.out.println(ProgramStack.getStack()); System.out.printf(Arrays.toString(DataRegister.getDataRegister())); DataRegister.increasePC(); } diff --git a/src/main/java/fabrik/simulator/pic16f84/DataRegister.java b/src/main/java/fabrik/simulator/pic16f84/DataRegister.java index dbd78de..c01fbc9 100644 --- a/src/main/java/fabrik/simulator/pic16f84/DataRegister.java +++ b/src/main/java/fabrik/simulator/pic16f84/DataRegister.java @@ -210,4 +210,5 @@ public class DataRegister { public static int getDigitCarryFlag(){ return digitCarryFlag; } + } diff --git a/src/main/java/fabrik/simulator/pic16f84/ProgramStack.java b/src/main/java/fabrik/simulator/pic16f84/ProgramStack.java new file mode 100644 index 0000000..37af106 --- /dev/null +++ b/src/main/java/fabrik/simulator/pic16f84/ProgramStack.java @@ -0,0 +1,42 @@ +package fabrik.simulator.pic16f84; + +import java.util.ArrayList; +import java.util.List; + +public class ProgramStack { + private static List returnStack = new ArrayList<>(8); + private static int stackIndex = 0; + + private static void incIndex(){ + if (stackIndex == 7){ + stackIndex = 0; + } + else{ + stackIndex++; + } + } + + public static void push(int value) { + if (returnStack.size() != 8) { + returnStack.add(value); + incIndex(); + } + else { + returnStack.set(stackIndex, value); + incIndex(); + } + } + + public static int pop() { + stackIndex = (stackIndex > 0) ? --stackIndex : 7; + return returnStack.get(stackIndex)-1; + } + + public static int getStackPointer(){ + return stackIndex; + } + + public static List getStack() { + return returnStack; + } +}