From 60b288a76297d7df051f99719a7e979ee27a2862 Mon Sep 17 00:00:00 2001 From: Darkress <30271678+DarkressX@users.noreply.github.com> Date: Sun, 18 Jun 2023 19:13:37 +0200 Subject: [PATCH 1/3] Somewhat working Timer0Interrupt --- de/darkress/pic16f84sim/Main.java | 2 +- de/darkress/pic16f84sim/commands/Retfie.java | 18 ++++++++++++++++++ .../pic16f84sim/decoder/CommandDecoder.java | 2 +- .../pic16f84sim/microcontroller/Interrupt.java | 14 ++++++++++++++ .../microcontroller/ProgramCounter.java | 9 ++++++--- .../pic16f84sim/microcontroller/Timer.java | 8 +++++++- .../pic16f84sim/microcontroller/Watchdog.java | 2 +- 7 files changed, 48 insertions(+), 7 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/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..e2c2ebd --- /dev/null +++ b/de/darkress/pic16f84sim/microcontroller/Interrupt.java @@ -0,0 +1,14 @@ +package de.darkress.pic16f84sim.microcontroller; + +public class Interrupt +{ + private static boolean globalInterruptEnabled() { + return (Memory.getRegister(0x0B) & 0x80) == 0x80; + + } + public static boolean checkTimerInterruptConditions() { + boolean timerInterruptEnabled = (Memory.getRegister(0x0B) & 0x20) == 0x20; + //boolean timerOverflowInterruptFlag = (Memory.getRegister(0x0B) & 0x04) == 0x04; + 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..99f881c 100644 --- a/de/darkress/pic16f84sim/microcontroller/Timer.java +++ b/de/darkress/pic16f84sim/microcontroller/Timer.java @@ -43,9 +43,15 @@ public class Timer { int timerRegister = Memory.getRegister(0x01); timerRegister = (timerRegister + 1) % 256; - if(timerRegister == 0) //check for timer Overflow --> interrupt + if(timerRegister == 0 && !((Memory.getRegister(0x0B) & 0x04) == 0x04)) //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; } -- 2.49.1 From 791201c8845d46cde44bc58ba63bedf034f551b6 Mon Sep 17 00:00:00 2001 From: Darkress <30271678+DarkressX@users.noreply.github.com> Date: Sun, 18 Jun 2023 19:24:40 +0200 Subject: [PATCH 2/3] timer0 Interrupt fully working --- de/darkress/pic16f84sim/cli/Cli.java | 2 ++ de/darkress/pic16f84sim/microcontroller/Interrupt.java | 2 +- de/darkress/pic16f84sim/microcontroller/Timer.java | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) 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/microcontroller/Interrupt.java b/de/darkress/pic16f84sim/microcontroller/Interrupt.java index e2c2ebd..78e2cdf 100644 --- a/de/darkress/pic16f84sim/microcontroller/Interrupt.java +++ b/de/darkress/pic16f84sim/microcontroller/Interrupt.java @@ -3,7 +3,7 @@ package de.darkress.pic16f84sim.microcontroller; public class Interrupt { private static boolean globalInterruptEnabled() { - return (Memory.getRegister(0x0B) & 0x80) == 0x80; + return (Memory.getRegister(0x0B) & 0x80) == 0x80; // Check GIE } public static boolean checkTimerInterruptConditions() { diff --git a/de/darkress/pic16f84sim/microcontroller/Timer.java b/de/darkress/pic16f84sim/microcontroller/Timer.java index 99f881c..a383fd7 100644 --- a/de/darkress/pic16f84sim/microcontroller/Timer.java +++ b/de/darkress/pic16f84sim/microcontroller/Timer.java @@ -43,7 +43,7 @@ public class Timer { int timerRegister = Memory.getRegister(0x01); timerRegister = (timerRegister + 1) % 256; - if(timerRegister == 0 && !((Memory.getRegister(0x0B) & 0x04) == 0x04)) //check for timer Overflow --> interrupt + if(timerRegister == 0)// && !((Memory.getRegister(0x0B) & 0x04) == 0x04)) //check for timer Overflow --> interrupt { System.out.println("Timer Overflow"); Memory.setRegister(0x0B, Memory.getRegister(0x0B) | 0x04); //set T0IF -- 2.49.1 From bc534505079a7d9ab662602394d1356cb5e6de91 Mon Sep 17 00:00:00 2001 From: Darkress <30271678+DarkressX@users.noreply.github.com> Date: Sun, 18 Jun 2023 19:25:30 +0200 Subject: [PATCH 3/3] Removed comments --- de/darkress/pic16f84sim/microcontroller/Interrupt.java | 1 - de/darkress/pic16f84sim/microcontroller/Timer.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/de/darkress/pic16f84sim/microcontroller/Interrupt.java b/de/darkress/pic16f84sim/microcontroller/Interrupt.java index 78e2cdf..0e5443b 100644 --- a/de/darkress/pic16f84sim/microcontroller/Interrupt.java +++ b/de/darkress/pic16f84sim/microcontroller/Interrupt.java @@ -8,7 +8,6 @@ public class Interrupt } public static boolean checkTimerInterruptConditions() { boolean timerInterruptEnabled = (Memory.getRegister(0x0B) & 0x20) == 0x20; - //boolean timerOverflowInterruptFlag = (Memory.getRegister(0x0B) & 0x04) == 0x04; return globalInterruptEnabled() && timerInterruptEnabled; } } diff --git a/de/darkress/pic16f84sim/microcontroller/Timer.java b/de/darkress/pic16f84sim/microcontroller/Timer.java index a383fd7..611fa73 100644 --- a/de/darkress/pic16f84sim/microcontroller/Timer.java +++ b/de/darkress/pic16f84sim/microcontroller/Timer.java @@ -43,7 +43,7 @@ public class Timer { int timerRegister = Memory.getRegister(0x01); timerRegister = (timerRegister + 1) % 256; - if(timerRegister == 0)// && !((Memory.getRegister(0x0B) & 0x04) == 0x04)) //check for timer Overflow --> interrupt + if(timerRegister == 0) //check for timer Overflow --> interrupt { System.out.println("Timer Overflow"); Memory.setRegister(0x0B, Memory.getRegister(0x0B) | 0x04); //set T0IF -- 2.49.1