From 9cab40db2fdf944d51551191a49227350dc9bf77 Mon Sep 17 00:00:00 2001 From: darkress <30271678+darkressx@users.noreply.github.com> Date: Sun, 18 Jun 2023 19:25:53 +0200 Subject: [PATCH] timer0Interrupt (#37) Co-authored-by: Darkress <30271678+DarkressX@users.noreply.github.com> Reviewed-on: https://git.darkress.xyz/darkress/pic16f84-sim/pulls/37 --- de/darkress/pic16f84sim/Main.java | 2 +- de/darkress/pic16f84sim/cli/Cli.java | 2 ++ de/darkress/pic16f84sim/commands/Retfie.java | 18 ++++++++++++++++++ .../pic16f84sim/decoder/CommandDecoder.java | 2 +- .../pic16f84sim/microcontroller/Interrupt.java | 13 +++++++++++++ .../microcontroller/ProgramCounter.java | 9 ++++++--- .../pic16f84sim/microcontroller/Timer.java | 6 ++++++ .../pic16f84sim/microcontroller/Watchdog.java | 2 +- 8 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 de/darkress/pic16f84sim/commands/Retfie.java create mode 100644 de/darkress/pic16f84sim/microcontroller/Interrupt.java diff --git a/de/darkress/pic16f84sim/Main.java b/de/darkress/pic16f84sim/Main.java index aa6dc7c..d083c25 100644 --- a/de/darkress/pic16f84sim/Main.java +++ b/de/darkress/pic16f84sim/Main.java @@ -11,7 +11,7 @@ class Main { public static void main(String[] args) { - Command[] program = Parser.parser("de/darkress/pic16f84sim/TestPrograms/TPicSim11.LST"); + Command[] program = Parser.parser("de/darkress/pic16f84sim/TestPrograms/TPicSim8.LST"); Memory.initMemory(); diff --git a/de/darkress/pic16f84sim/cli/Cli.java b/de/darkress/pic16f84sim/cli/Cli.java index 80b25f2..edc7bdc 100644 --- a/de/darkress/pic16f84sim/cli/Cli.java +++ b/de/darkress/pic16f84sim/cli/Cli.java @@ -26,6 +26,8 @@ public class Cli System.out.printf("%s:\t\t%s\t", "PortA", Integer.toBinaryString(Memory.getPortA())); System.out.printf("%s:\t\t%s\t", "PortB", Integer.toBinaryString(Memory.getPortB())); System.out.printf("%n"); + printf(Memory.getRegister(0x0B), "IntCon", true); + System.out.printf("%n"); } private static void printf(int value, String description, boolean hex) { diff --git a/de/darkress/pic16f84sim/commands/Retfie.java b/de/darkress/pic16f84sim/commands/Retfie.java new file mode 100644 index 0000000..f41a868 --- /dev/null +++ b/de/darkress/pic16f84sim/commands/Retfie.java @@ -0,0 +1,18 @@ +package de.darkress.pic16f84sim.commands; + +import de.darkress.pic16f84sim.microcontroller.Cycles; +import de.darkress.pic16f84sim.microcontroller.Memory; +import de.darkress.pic16f84sim.microcontroller.ProgramCounter; +import de.darkress.pic16f84sim.microcontroller.Stack; + +public class Retfie extends LiteralCommandUtils implements Command +{ + @Override + public void execute() + { + Cycles.incCycles(); + Memory.setRegister(0x0B, Memory.getRegister(0x0B) | 0x80); //Set GIE + ProgramCounter.setPcFromStack(Stack.pop() + 1); + Cycles.incCycles(); // Simulate 2-Cycle Instruction + } +} diff --git a/de/darkress/pic16f84sim/decoder/CommandDecoder.java b/de/darkress/pic16f84sim/decoder/CommandDecoder.java index 0d480d0..8e7615d 100644 --- a/de/darkress/pic16f84sim/decoder/CommandDecoder.java +++ b/de/darkress/pic16f84sim/decoder/CommandDecoder.java @@ -102,7 +102,7 @@ public class CommandDecoder if (input == 0x0009) { - //retfie(); + return new Retfie(); } if (input == 0x0008) diff --git a/de/darkress/pic16f84sim/microcontroller/Interrupt.java b/de/darkress/pic16f84sim/microcontroller/Interrupt.java new file mode 100644 index 0000000..0e5443b --- /dev/null +++ b/de/darkress/pic16f84sim/microcontroller/Interrupt.java @@ -0,0 +1,13 @@ +package de.darkress.pic16f84sim.microcontroller; + +public class Interrupt +{ + private static boolean globalInterruptEnabled() { + return (Memory.getRegister(0x0B) & 0x80) == 0x80; // Check GIE + + } + public static boolean checkTimerInterruptConditions() { + boolean timerInterruptEnabled = (Memory.getRegister(0x0B) & 0x20) == 0x20; + return globalInterruptEnabled() && timerInterruptEnabled; + } +} diff --git a/de/darkress/pic16f84sim/microcontroller/ProgramCounter.java b/de/darkress/pic16f84sim/microcontroller/ProgramCounter.java index 9a4e84d..9d584af 100644 --- a/de/darkress/pic16f84sim/microcontroller/ProgramCounter.java +++ b/de/darkress/pic16f84sim/microcontroller/ProgramCounter.java @@ -37,8 +37,11 @@ public class ProgramCounter Memory.setPCL(pc & 0x00FF); } - public static void resetProgramCounter() { - pc = 0; - Memory.setPCL(0x0); + public static void setProgramCounter(int value) { + if(value <= 0xFF && value >= 0) + { + pc = value; + Memory.setPCL(pc); + } } } diff --git a/de/darkress/pic16f84sim/microcontroller/Timer.java b/de/darkress/pic16f84sim/microcontroller/Timer.java index cb7d407..611fa73 100644 --- a/de/darkress/pic16f84sim/microcontroller/Timer.java +++ b/de/darkress/pic16f84sim/microcontroller/Timer.java @@ -46,6 +46,12 @@ public class Timer if(timerRegister == 0) //check for timer Overflow --> interrupt { System.out.println("Timer Overflow"); + Memory.setRegister(0x0B, Memory.getRegister(0x0B) | 0x04); //set T0IF + if(Interrupt.checkTimerInterruptConditions()) + { + Stack.push(ProgramCounter.getPc()); + ProgramCounter.setProgramCounter(0x04); // Interrupt Vector + } } Memory.setTimer(timerRegister); } diff --git a/de/darkress/pic16f84sim/microcontroller/Watchdog.java b/de/darkress/pic16f84sim/microcontroller/Watchdog.java index 60c5897..456feaa 100644 --- a/de/darkress/pic16f84sim/microcontroller/Watchdog.java +++ b/de/darkress/pic16f84sim/microcontroller/Watchdog.java @@ -30,7 +30,7 @@ public class Watchdog public static void resetProgram() { Memory.setRegister(0x03, Memory.getRegister(0x03) | 0x10); //Set !T0 in StatusReg - ProgramCounter.resetProgramCounter(); + ProgramCounter.setProgramCounter(0); watchdogTimer = 18000; }