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] 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; }