From 3910731cae8427dbbf5106d615412a7d3433c0a5 Mon Sep 17 00:00:00 2001 From: Darkress <30271678+DarkressX@users.noreply.github.com> Date: Thu, 15 Jun 2023 20:53:19 +0200 Subject: [PATCH 1/6] get prescaler factor --- de/darkress/pic16f84sim/Main.java | 2 +- .../pic16f84sim/microcontroller/Memory.java | 5 +++++ .../pic16f84sim/microcontroller/Timer.java | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 de/darkress/pic16f84sim/microcontroller/Timer.java diff --git a/de/darkress/pic16f84sim/Main.java b/de/darkress/pic16f84sim/Main.java index 84500fb..8d2e52b 100644 --- a/de/darkress/pic16f84sim/Main.java +++ b/de/darkress/pic16f84sim/Main.java @@ -13,7 +13,7 @@ class Main { public static void main(String[] args) throws InterruptedException { - Command[] program = Parser.parser("de/darkress/pic16f84sim/TPicSim101.LST"); + Command[] program = Parser.parser("de/darkress/pic16f84sim/TestPrograms/TPicSim2.LST"); /*for(int i = 0; i < instructions.size(); i++) { program.add(CommandDecoder.decode(instructions.get(i))); diff --git a/de/darkress/pic16f84sim/microcontroller/Memory.java b/de/darkress/pic16f84sim/microcontroller/Memory.java index 4a4033b..dade9e9 100644 --- a/de/darkress/pic16f84sim/microcontroller/Memory.java +++ b/de/darkress/pic16f84sim/microcontroller/Memory.java @@ -121,6 +121,11 @@ public class Memory memory[0x8A] = data & 0x1F; } + public static int getOption() + { + return memory[0x81]; + } + public static boolean getZeroBit() { return (memory[0x03] & 0x04) == 0x04; diff --git a/de/darkress/pic16f84sim/microcontroller/Timer.java b/de/darkress/pic16f84sim/microcontroller/Timer.java new file mode 100644 index 0000000..e115609 --- /dev/null +++ b/de/darkress/pic16f84sim/microcontroller/Timer.java @@ -0,0 +1,19 @@ +package de.darkress.pic16f84sim.microcontroller; + +public class Timer +{ + private boolean getPrescalerAsssignment() { + return (Memory.getOption() & 0x08) == 0x08; + } + + private int getPrescalerFactor() { + final int MULTIPLIER = 2; + int prescalerPower = Memory.getOption() & 0x07; + int prescaler = (int)Math.pow(2, prescalerPower); + if(!getPrescalerAsssignment()) + { + return prescaler * MULTIPLIER; + } + return prescaler; + } +} -- 2.49.1 From f644d929fc11832c39409a585080569e22a6b8c4 Mon Sep 17 00:00:00 2001 From: Darkress <30271678+DarkressX@users.noreply.github.com> Date: Fri, 16 Jun 2023 20:03:16 +0200 Subject: [PATCH 2/6] Added increase Timer --- .../pic16f84sim/microcontroller/Timer.java | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/de/darkress/pic16f84sim/microcontroller/Timer.java b/de/darkress/pic16f84sim/microcontroller/Timer.java index e115609..f92e975 100644 --- a/de/darkress/pic16f84sim/microcontroller/Timer.java +++ b/de/darkress/pic16f84sim/microcontroller/Timer.java @@ -2,11 +2,13 @@ package de.darkress.pic16f84sim.microcontroller; public class Timer { - private boolean getPrescalerAsssignment() { + private static int cyclesToTimerIncrease = getPrescalerFactor(); + + private static boolean getPrescalerAsssignment() { return (Memory.getOption() & 0x08) == 0x08; } - private int getPrescalerFactor() { + private static int getPrescalerFactor() { final int MULTIPLIER = 2; int prescalerPower = Memory.getOption() & 0x07; int prescaler = (int)Math.pow(2, prescalerPower); @@ -16,4 +18,24 @@ public class Timer } return prescaler; } + + private static void increaseTimerRegister() + { + int timerRegister = Memory.getRegister(0x01); + timerRegister = (timerRegister + 1) % 256; + if(timerRegister == 0) //check for timer Overflow --> interrupt + { + System.out.println("Timer Overflow"); + } + Memory.setRegister(0x01, timerRegister); + } + + public static void addToTimer(int increase) + { + cyclesToTimerIncrease -= increase; // TODO: Rethink everything + if(cyclesToTimerIncrease == 0) + { + cyclesToTimerIncrease = getPrescalerFactor(); + } + } } -- 2.49.1 From bf182815d28783513cb553f5f23c9b991bbbb93f Mon Sep 17 00:00:00 2001 From: Darkress <30271678+DarkressX@users.noreply.github.com> Date: Fri, 16 Jun 2023 20:04:00 +0200 Subject: [PATCH 3/6] increase Cycle only by one per call --- de/darkress/pic16f84sim/microcontroller/Cycles.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/de/darkress/pic16f84sim/microcontroller/Cycles.java b/de/darkress/pic16f84sim/microcontroller/Cycles.java index c9dcaea..89df7e5 100644 --- a/de/darkress/pic16f84sim/microcontroller/Cycles.java +++ b/de/darkress/pic16f84sim/microcontroller/Cycles.java @@ -3,9 +3,9 @@ package de.darkress.pic16f84sim.microcontroller; public class Cycles { private static int cycles = 0; - public static void addToCycles(int increase) + public static void incCycles() { - cycles += increase; + cycles++; } public static int getCycles() { -- 2.49.1 From 324912080d33fcb7102ec34e2f9492d4f48510b7 Mon Sep 17 00:00:00 2001 From: Darkress <30271678+DarkressX@users.noreply.github.com> Date: Fri, 16 Jun 2023 20:04:50 +0200 Subject: [PATCH 4/6] Refactored incCycle command --- de/darkress/pic16f84sim/commands/Addlw.java | 4 ++-- de/darkress/pic16f84sim/commands/Addwf.java | 4 ++-- de/darkress/pic16f84sim/commands/Andlw.java | 4 ++-- de/darkress/pic16f84sim/commands/Andwf.java | 4 ++-- de/darkress/pic16f84sim/commands/Bcf.java | 4 ++-- de/darkress/pic16f84sim/commands/Bsf.java | 4 ++-- de/darkress/pic16f84sim/commands/Btfsc.java | 9 ++++----- de/darkress/pic16f84sim/commands/Btfss.java | 9 ++++----- de/darkress/pic16f84sim/commands/Call.java | 3 ++- de/darkress/pic16f84sim/commands/Clrf.java | 5 ++--- de/darkress/pic16f84sim/commands/Clrw.java | 4 ++-- de/darkress/pic16f84sim/commands/Comf.java | 4 ++-- de/darkress/pic16f84sim/commands/Decf.java | 4 ++-- de/darkress/pic16f84sim/commands/Decfsz.java | 8 ++++---- de/darkress/pic16f84sim/commands/Goto.java | 3 ++- de/darkress/pic16f84sim/commands/Incf.java | 4 ++-- de/darkress/pic16f84sim/commands/Incfsz.java | 8 ++++---- de/darkress/pic16f84sim/commands/Iorlw.java | 4 ++-- de/darkress/pic16f84sim/commands/Iorwf.java | 4 ++-- de/darkress/pic16f84sim/commands/Movf.java | 4 ++-- de/darkress/pic16f84sim/commands/Movlw.java | 4 ++-- de/darkress/pic16f84sim/commands/Movwf.java | 4 ++-- de/darkress/pic16f84sim/commands/Nop.java | 2 +- de/darkress/pic16f84sim/commands/Retlw.java | 3 ++- de/darkress/pic16f84sim/commands/Return.java | 3 ++- de/darkress/pic16f84sim/commands/Rlf.java | 4 ++-- de/darkress/pic16f84sim/commands/Rrf.java | 4 ++-- de/darkress/pic16f84sim/commands/Sublw.java | 4 ++-- de/darkress/pic16f84sim/commands/Subwf.java | 4 ++-- de/darkress/pic16f84sim/commands/Swapf.java | 4 ++-- de/darkress/pic16f84sim/commands/Xorlw.java | 4 ++-- de/darkress/pic16f84sim/commands/Xorwf.java | 4 ++-- 32 files changed, 71 insertions(+), 70 deletions(-) diff --git a/de/darkress/pic16f84sim/commands/Addlw.java b/de/darkress/pic16f84sim/commands/Addlw.java index 5f22577..accaa89 100644 --- a/de/darkress/pic16f84sim/commands/Addlw.java +++ b/de/darkress/pic16f84sim/commands/Addlw.java @@ -16,6 +16,8 @@ public class Addlw extends LiteralCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = literal + Memory.workingRegister; checkZeroBit(result); @@ -23,7 +25,5 @@ public class Addlw extends LiteralCommandUtils implements Command checkDigitCarryBit(literal); Memory.workingRegister = result % 256; - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Addwf.java b/de/darkress/pic16f84sim/commands/Addwf.java index 7c516ba..d439050 100644 --- a/de/darkress/pic16f84sim/commands/Addwf.java +++ b/de/darkress/pic16f84sim/commands/Addwf.java @@ -18,6 +18,8 @@ public class Addwf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address) + Memory.workingRegister; checkZeroBit(result); @@ -25,7 +27,5 @@ public class Addwf extends FileRegisterCommandUtils implements Command checkDigitCarryBit(address); writeToDestination(destinationBit, address, result); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Andlw.java b/de/darkress/pic16f84sim/commands/Andlw.java index cf7dff4..df8e2ab 100644 --- a/de/darkress/pic16f84sim/commands/Andlw.java +++ b/de/darkress/pic16f84sim/commands/Andlw.java @@ -15,12 +15,12 @@ public class Andlw extends LiteralCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = literal & Memory.workingRegister; checkZeroBit(result); Memory.workingRegister = result % 256; - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Andwf.java b/de/darkress/pic16f84sim/commands/Andwf.java index f59ea6b..4945a04 100644 --- a/de/darkress/pic16f84sim/commands/Andwf.java +++ b/de/darkress/pic16f84sim/commands/Andwf.java @@ -18,12 +18,12 @@ public class Andwf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address) & Memory.workingRegister; checkZeroBit(result); writeToDestination(destinationBit, address, result); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Bcf.java b/de/darkress/pic16f84sim/commands/Bcf.java index a23b565..8af6a87 100644 --- a/de/darkress/pic16f84sim/commands/Bcf.java +++ b/de/darkress/pic16f84sim/commands/Bcf.java @@ -18,11 +18,11 @@ public class Bcf extends BitOrientedCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address); result &= ~(1 << bitPlacement); //Mask n-th bit with 0 Memory.setRegister(address, result); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Bsf.java b/de/darkress/pic16f84sim/commands/Bsf.java index 5c09392..b1ccc2c 100644 --- a/de/darkress/pic16f84sim/commands/Bsf.java +++ b/de/darkress/pic16f84sim/commands/Bsf.java @@ -18,11 +18,11 @@ public class Bsf extends BitOrientedCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address); result |= (1 << bitPlacement); Memory.setRegister(address, result); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Btfsc.java b/de/darkress/pic16f84sim/commands/Btfsc.java index 0ad710b..0b70aaf 100644 --- a/de/darkress/pic16f84sim/commands/Btfsc.java +++ b/de/darkress/pic16f84sim/commands/Btfsc.java @@ -18,15 +18,14 @@ public class Btfsc extends BitOrientedCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address); if((result & (1 << bitPlacement)) == 0) //Test if bit is clear { - ProgramCounter.incPC(); - Cycles.addToCycles(1); + Nop nop = new Nop(); + nop.execute(); } - - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Btfss.java b/de/darkress/pic16f84sim/commands/Btfss.java index 39d3811..ef8ae98 100644 --- a/de/darkress/pic16f84sim/commands/Btfss.java +++ b/de/darkress/pic16f84sim/commands/Btfss.java @@ -18,15 +18,14 @@ public class Btfss extends BitOrientedCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address); if((result & (1 << bitPlacement)) > 0) //Test if bit is set { - ProgramCounter.incPC(); - Cycles.addToCycles(1); + Nop nop = new Nop(); + nop.execute(); } - - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Call.java b/de/darkress/pic16f84sim/commands/Call.java index 632f4df..5ed68dc 100644 --- a/de/darkress/pic16f84sim/commands/Call.java +++ b/de/darkress/pic16f84sim/commands/Call.java @@ -16,8 +16,9 @@ public class Call extends LiteralCommandUtils implements Command @Override public void execute() { + Cycles.incCycles(); Stack.push(ProgramCounter.getPc() + 1); ProgramCounter.setPcFrom11BitLiteral(literal); - Cycles.addToCycles(2); + Cycles.incCycles(); //Simulate nop and 2-Cycle instruction } } diff --git a/de/darkress/pic16f84sim/commands/Clrf.java b/de/darkress/pic16f84sim/commands/Clrf.java index 3da4505..739b32e 100644 --- a/de/darkress/pic16f84sim/commands/Clrf.java +++ b/de/darkress/pic16f84sim/commands/Clrf.java @@ -1,7 +1,6 @@ package de.darkress.pic16f84sim.commands; import de.darkress.pic16f84sim.microcontroller.Cycles; -import de.darkress.pic16f84sim.microcontroller.Memory; import de.darkress.pic16f84sim.microcontroller.ProgramCounter; public class Clrf extends FileRegisterCommandUtils implements Command @@ -18,12 +17,12 @@ public class Clrf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); final int result = 0; checkZeroBit(result); writeToDestination(destinationBit, address, result); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Clrw.java b/de/darkress/pic16f84sim/commands/Clrw.java index 22f7d06..5e25847 100644 --- a/de/darkress/pic16f84sim/commands/Clrw.java +++ b/de/darkress/pic16f84sim/commands/Clrw.java @@ -9,12 +9,12 @@ public class Clrw extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); final int result = 0; checkZeroBit(result); Memory.workingRegister = result; - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Comf.java b/de/darkress/pic16f84sim/commands/Comf.java index 38a66ff..15ebfdc 100644 --- a/de/darkress/pic16f84sim/commands/Comf.java +++ b/de/darkress/pic16f84sim/commands/Comf.java @@ -18,12 +18,12 @@ public class Comf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = 255 - Memory.getRegister(address); // Get inverse of 8Bit value checkZeroBit(result); writeToDestination(destinationBit, address, result); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Decf.java b/de/darkress/pic16f84sim/commands/Decf.java index 3497d38..a15b5e9 100644 --- a/de/darkress/pic16f84sim/commands/Decf.java +++ b/de/darkress/pic16f84sim/commands/Decf.java @@ -18,12 +18,12 @@ public class Decf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address) + 255; // Allow underflow checkZeroBit(result); writeToDestination(destinationBit, address, result % 256); // Catch underflow - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Decfsz.java b/de/darkress/pic16f84sim/commands/Decfsz.java index 56389ca..88ac924 100644 --- a/de/darkress/pic16f84sim/commands/Decfsz.java +++ b/de/darkress/pic16f84sim/commands/Decfsz.java @@ -18,6 +18,8 @@ public class Decfsz extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address) + 255; // Allow underflow checkZeroBit(result); @@ -26,10 +28,8 @@ public class Decfsz extends FileRegisterCommandUtils implements Command if((result % 256) == 0) { - ProgramCounter.incPC(); - Cycles.addToCycles(1); + Nop nop = new Nop(); + nop.execute(); } - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Goto.java b/de/darkress/pic16f84sim/commands/Goto.java index 6c2e185..4d64d4e 100644 --- a/de/darkress/pic16f84sim/commands/Goto.java +++ b/de/darkress/pic16f84sim/commands/Goto.java @@ -15,7 +15,8 @@ public class Goto extends LiteralCommandUtils implements Command @Override public void execute() { + Cycles.incCycles(); ProgramCounter.setPcFrom11BitLiteral(literal); - Cycles.addToCycles(2); + Cycles.incCycles(); } } diff --git a/de/darkress/pic16f84sim/commands/Incf.java b/de/darkress/pic16f84sim/commands/Incf.java index 0871b6a..0a90cd9 100644 --- a/de/darkress/pic16f84sim/commands/Incf.java +++ b/de/darkress/pic16f84sim/commands/Incf.java @@ -18,12 +18,12 @@ public class Incf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address) + 1; // Allow underflow checkZeroBit(result); writeToDestination(destinationBit, address, result % 256); // Catch underflow - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Incfsz.java b/de/darkress/pic16f84sim/commands/Incfsz.java index 769979f..a5553f8 100644 --- a/de/darkress/pic16f84sim/commands/Incfsz.java +++ b/de/darkress/pic16f84sim/commands/Incfsz.java @@ -18,6 +18,8 @@ public class Incfsz extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address) + 1; checkZeroBit(result); @@ -26,10 +28,8 @@ public class Incfsz extends FileRegisterCommandUtils implements Command if((result % 256) == 0) { - ProgramCounter.incPC(); - Cycles.addToCycles(1); + Nop nop = new Nop(); + nop.execute(); } - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Iorlw.java b/de/darkress/pic16f84sim/commands/Iorlw.java index 06ce030..601b92c 100644 --- a/de/darkress/pic16f84sim/commands/Iorlw.java +++ b/de/darkress/pic16f84sim/commands/Iorlw.java @@ -15,12 +15,12 @@ public class Iorlw extends LiteralCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = literal | Memory.workingRegister; checkZeroBit(result); Memory.workingRegister = result % 256; - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Iorwf.java b/de/darkress/pic16f84sim/commands/Iorwf.java index 21f02d6..19691b9 100644 --- a/de/darkress/pic16f84sim/commands/Iorwf.java +++ b/de/darkress/pic16f84sim/commands/Iorwf.java @@ -18,12 +18,12 @@ public class Iorwf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address) | Memory.workingRegister; checkZeroBit(result); writeToDestination(destinationBit, address, result); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Movf.java b/de/darkress/pic16f84sim/commands/Movf.java index 38d2e91..a29a0a2 100644 --- a/de/darkress/pic16f84sim/commands/Movf.java +++ b/de/darkress/pic16f84sim/commands/Movf.java @@ -18,12 +18,12 @@ public class Movf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address); checkZeroBit(result); writeToDestination(destinationBit, address, result); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Movlw.java b/de/darkress/pic16f84sim/commands/Movlw.java index 4476d6f..8b1db10 100644 --- a/de/darkress/pic16f84sim/commands/Movlw.java +++ b/de/darkress/pic16f84sim/commands/Movlw.java @@ -16,8 +16,8 @@ public class Movlw extends LiteralCommandUtils implements Command @Override public void execute() { - Memory.workingRegister = literal; ProgramCounter.incPC(); - Cycles.addToCycles(1); + Cycles.incCycles(); + Memory.workingRegister = literal; } } diff --git a/de/darkress/pic16f84sim/commands/Movwf.java b/de/darkress/pic16f84sim/commands/Movwf.java index c5cd16f..97910df 100644 --- a/de/darkress/pic16f84sim/commands/Movwf.java +++ b/de/darkress/pic16f84sim/commands/Movwf.java @@ -18,10 +18,10 @@ public class Movwf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.workingRegister; writeToDestination(destinationBit, address, result); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Nop.java b/de/darkress/pic16f84sim/commands/Nop.java index 1e103b6..59acbf4 100644 --- a/de/darkress/pic16f84sim/commands/Nop.java +++ b/de/darkress/pic16f84sim/commands/Nop.java @@ -11,6 +11,6 @@ public class Nop extends LiteralCommandUtils implements Command { // Do nothing, just increment the PC ProgramCounter.incPC(); - Cycles.addToCycles(1); + Cycles.incCycles(); } } diff --git a/de/darkress/pic16f84sim/commands/Retlw.java b/de/darkress/pic16f84sim/commands/Retlw.java index b1d4062..d798675 100644 --- a/de/darkress/pic16f84sim/commands/Retlw.java +++ b/de/darkress/pic16f84sim/commands/Retlw.java @@ -17,8 +17,9 @@ public class Retlw extends LiteralCommandUtils implements Command @Override public void execute() { + Cycles.incCycles(); Memory.workingRegister = literal; ProgramCounter.setPcFromStack(Stack.pop()); - Cycles.addToCycles(2); + Cycles.incCycles(); // Simulate 2-Cycle Instruction } } diff --git a/de/darkress/pic16f84sim/commands/Return.java b/de/darkress/pic16f84sim/commands/Return.java index a21b966..a2e41cb 100644 --- a/de/darkress/pic16f84sim/commands/Return.java +++ b/de/darkress/pic16f84sim/commands/Return.java @@ -9,7 +9,8 @@ public class Return extends LiteralCommandUtils implements Command @Override public void execute() { + Cycles.incCycles(); ProgramCounter.setPcFromStack(Stack.pop()); - Cycles.addToCycles(2); + Cycles.incCycles(); // Simulate 2-Cycle Instruction } } diff --git a/de/darkress/pic16f84sim/commands/Rlf.java b/de/darkress/pic16f84sim/commands/Rlf.java index 78091de..e84a907 100644 --- a/de/darkress/pic16f84sim/commands/Rlf.java +++ b/de/darkress/pic16f84sim/commands/Rlf.java @@ -18,6 +18,8 @@ public class Rlf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int register = Memory.getRegister(address); int newCarry = register >>7; int oldCarry = Memory.getCarryBit(); @@ -31,7 +33,5 @@ public class Rlf extends FileRegisterCommandUtils implements Command } writeToDestination(destinationBit, address, register); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Rrf.java b/de/darkress/pic16f84sim/commands/Rrf.java index 5d4f56a..2efea0b 100644 --- a/de/darkress/pic16f84sim/commands/Rrf.java +++ b/de/darkress/pic16f84sim/commands/Rrf.java @@ -18,6 +18,8 @@ public class Rrf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int register = Memory.getRegister(address); int newCarry = register & 0x01; int oldCarry = Memory.getCarryBit(); @@ -31,7 +33,5 @@ public class Rrf extends FileRegisterCommandUtils implements Command } writeToDestination(destinationBit, address, register); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Sublw.java b/de/darkress/pic16f84sim/commands/Sublw.java index 491da3d..c843fa9 100644 --- a/de/darkress/pic16f84sim/commands/Sublw.java +++ b/de/darkress/pic16f84sim/commands/Sublw.java @@ -36,6 +36,8 @@ public class Sublw extends LiteralCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = literal - Memory.workingRegister + 256; checkZeroBit(result); @@ -43,7 +45,5 @@ public class Sublw extends LiteralCommandUtils implements Command checkDigitCarryBit(literal); Memory.workingRegister = result % 256; - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Subwf.java b/de/darkress/pic16f84sim/commands/Subwf.java index 222efaa..3b93715 100644 --- a/de/darkress/pic16f84sim/commands/Subwf.java +++ b/de/darkress/pic16f84sim/commands/Subwf.java @@ -38,6 +38,8 @@ public class Subwf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address) - Memory.workingRegister + 256; checkZeroBit(result); @@ -45,7 +47,5 @@ public class Subwf extends FileRegisterCommandUtils implements Command checkDigitCarryBit(Memory.getRegister(address)); writeToDestination(destinationBit, address, result % 256); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Swapf.java b/de/darkress/pic16f84sim/commands/Swapf.java index c40f60d..7059884 100644 --- a/de/darkress/pic16f84sim/commands/Swapf.java +++ b/de/darkress/pic16f84sim/commands/Swapf.java @@ -18,12 +18,12 @@ public class Swapf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = (Memory.getRegister(address) <<4) & 0xF0; int tmp = Memory.getRegister(address) >>4; result += tmp; writeToDestination(destinationBit, address, result); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Xorlw.java b/de/darkress/pic16f84sim/commands/Xorlw.java index bf44303..a73bacd 100644 --- a/de/darkress/pic16f84sim/commands/Xorlw.java +++ b/de/darkress/pic16f84sim/commands/Xorlw.java @@ -15,12 +15,12 @@ public class Xorlw extends LiteralCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = literal ^ Memory.workingRegister; checkZeroBit(result); Memory.workingRegister = result % 256; - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } diff --git a/de/darkress/pic16f84sim/commands/Xorwf.java b/de/darkress/pic16f84sim/commands/Xorwf.java index 27a7248..ad6daa0 100644 --- a/de/darkress/pic16f84sim/commands/Xorwf.java +++ b/de/darkress/pic16f84sim/commands/Xorwf.java @@ -18,12 +18,12 @@ public class Xorwf extends FileRegisterCommandUtils implements Command @Override public void execute() { + ProgramCounter.incPC(); + Cycles.incCycles(); int result = Memory.getRegister(address) ^ Memory.workingRegister; checkZeroBit(result); writeToDestination(destinationBit, address, result); - ProgramCounter.incPC(); - Cycles.addToCycles(1); } } -- 2.49.1 From dbf6de10276bd2a70c42532480ac355f9026a1a3 Mon Sep 17 00:00:00 2001 From: Darkress <30271678+DarkressX@users.noreply.github.com> Date: Fri, 16 Jun 2023 22:05:30 +0200 Subject: [PATCH 5/6] Somewhat working timer. Increases one instruction too early --- de/darkress/pic16f84sim/Main.java | 13 ++++---- .../pic16f84sim/microcontroller/Cycles.java | 1 + .../pic16f84sim/microcontroller/Memory.java | 30 +++++++++++++++++-- .../pic16f84sim/microcontroller/Timer.java | 25 ++++++++++++---- 4 files changed, 55 insertions(+), 14 deletions(-) diff --git a/de/darkress/pic16f84sim/Main.java b/de/darkress/pic16f84sim/Main.java index 8d2e52b..ef676c8 100644 --- a/de/darkress/pic16f84sim/Main.java +++ b/de/darkress/pic16f84sim/Main.java @@ -13,17 +13,16 @@ class Main { public static void main(String[] args) throws InterruptedException { - Command[] program = Parser.parser("de/darkress/pic16f84sim/TestPrograms/TPicSim2.LST"); - /*for(int i = 0; i < instructions.size(); i++) - { - program.add(CommandDecoder.decode(instructions.get(i))); - }*/ + Command[] program = Parser.parser("de/darkress/pic16f84sim/TestPrograms/TPicSim7.LST"); + + Memory.initMemory(); while(ProgramCounter.getPc() < 1024) { program[ProgramCounter.getPc()].execute(); - System.out.println(Memory.workingRegister + " " + Cycles.getCycles()); - System.out.println(Memory.getPCLATH() + " " + Memory.getPCL() + "\n"); + System.out.println(Integer.toHexString(Memory.workingRegister) + " " + Cycles.getCycles()); + System.out.println(Integer.toHexString(Memory.getOption()) + " " + Integer.toHexString(Memory.getTimer())); + System.out.println(Integer.toHexString(Memory.getPCLATH()) + " " + Integer.toHexString(Memory.getPCL()) + "\n"); } } } \ No newline at end of file diff --git a/de/darkress/pic16f84sim/microcontroller/Cycles.java b/de/darkress/pic16f84sim/microcontroller/Cycles.java index 89df7e5..6dc5695 100644 --- a/de/darkress/pic16f84sim/microcontroller/Cycles.java +++ b/de/darkress/pic16f84sim/microcontroller/Cycles.java @@ -5,6 +5,7 @@ public class Cycles { public static void incCycles() { + Timer.increaseTimer(); cycles++; } diff --git a/de/darkress/pic16f84sim/microcontroller/Memory.java b/de/darkress/pic16f84sim/microcontroller/Memory.java index dade9e9..e38b227 100644 --- a/de/darkress/pic16f84sim/microcontroller/Memory.java +++ b/de/darkress/pic16f84sim/microcontroller/Memory.java @@ -4,6 +4,13 @@ import java.util.Arrays; public class Memory { + public static void initMemory() + { + Memory.memory[0x81] = 0xFF; //Option + Memory.memory[0x85] = 0x1F; //TrisA + Memory.memory[0x86] = 0xFF; //TrisB + Memory.setRegister(0x03, 0x18); //Status + } private static final int MEMORY_SIZE = 0xFF; //Addressable Memory public static int workingRegister = 0; private static final int[] memory = new int[MEMORY_SIZE]; @@ -52,13 +59,18 @@ public class Memory memory[address] = data; return; } - if((Arrays.stream(bank1UniqueSpecialRegister).anyMatch(x -> x == address)) && getRegisterBank() == 1) + if((Arrays.stream(bank0UniqueSpecialRegister).anyMatch(x -> x == address)) && getRegisterBank() == 1) //bank0 + // because of 7 Bit address { memory[address + 128] = data; return; } memory[address] = data; memory[address + 128] = data; //Ensure data is written to both banks to simulate mapping + if(address == 0x01) //Reset PrescalerCounter if change on Option or Timer Register + { + Timer.resetTimeToTimerIncrease(); + } if(address == 0x2) //Check if PCL is destination { ProgramCounter.loadPc(); @@ -79,7 +91,11 @@ public class Memory } memory[address % 128] = data; // else: Registers.Registers which are mapped memory[address % 128 + 128] = data; //Ensure data is written to both banks to simulate mapping - if(address == 0x2) //Check if PCL is destination + if(address == 0x81 || address == 0x01) //Reset PrescalerCounter if change on Option or Timer Register + { + Timer.resetTimeToTimerIncrease(); + } + if(address == 0x2 || address == 0x82) //Check if PCL is destination { ProgramCounter.loadPc(); } @@ -126,6 +142,16 @@ public class Memory return memory[0x81]; } + public static int getTimer() + { + return memory[0x01]; + } + + public static void setTimer(int data) + { + memory[0x01] = data; + } + public static boolean getZeroBit() { return (memory[0x03] & 0x04) == 0x04; diff --git a/de/darkress/pic16f84sim/microcontroller/Timer.java b/de/darkress/pic16f84sim/microcontroller/Timer.java index f92e975..f86f73a 100644 --- a/de/darkress/pic16f84sim/microcontroller/Timer.java +++ b/de/darkress/pic16f84sim/microcontroller/Timer.java @@ -2,7 +2,17 @@ package de.darkress.pic16f84sim.microcontroller; public class Timer { - private static int cyclesToTimerIncrease = getPrescalerFactor(); + private static int cyclesToTimerIncrease = 1; + + private static boolean timerEnabled() + { + return (Memory.getOption() & 0x20) != 0x20; + } + + public static void resetTimeToTimerIncrease() + { + cyclesToTimerIncrease = getPrescalerFactor(); + } private static boolean getPrescalerAsssignment() { return (Memory.getOption() & 0x08) == 0x08; @@ -27,15 +37,20 @@ public class Timer { System.out.println("Timer Overflow"); } - Memory.setRegister(0x01, timerRegister); + Memory.setTimer(timerRegister); } - public static void addToTimer(int increase) + public static void increaseTimer() { - cyclesToTimerIncrease -= increase; // TODO: Rethink everything + if(!timerEnabled()) + { + return; + } + cyclesToTimerIncrease--; if(cyclesToTimerIncrease == 0) { - cyclesToTimerIncrease = getPrescalerFactor(); + resetTimeToTimerIncrease(); + increaseTimerRegister(); } } } -- 2.49.1 From eeb7ba121e0f743f71dbd3d005cfbe21b9f6e575 Mon Sep 17 00:00:00 2001 From: Darkress <30271678+DarkressX@users.noreply.github.com> Date: Fri, 16 Jun 2023 22:39:52 +0200 Subject: [PATCH 6/6] Fixed timer increase --- de/darkress/pic16f84sim/Main.java | 2 ++ .../pic16f84sim/microcontroller/Memory.java | 24 +++++++++---------- .../pic16f84sim/microcontroller/Timer.java | 10 ++++++++ 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/de/darkress/pic16f84sim/Main.java b/de/darkress/pic16f84sim/Main.java index ef676c8..3f8d24f 100644 --- a/de/darkress/pic16f84sim/Main.java +++ b/de/darkress/pic16f84sim/Main.java @@ -19,7 +19,9 @@ class Main while(ProgramCounter.getPc() < 1024) { + System.out.println("Command: " + program[ProgramCounter.getPc()].toString()); program[ProgramCounter.getPc()].execute(); + System.out.println(Integer.toHexString(Memory.workingRegister) + " " + Cycles.getCycles()); System.out.println(Integer.toHexString(Memory.getOption()) + " " + Integer.toHexString(Memory.getTimer())); System.out.println(Integer.toHexString(Memory.getPCLATH()) + " " + Integer.toHexString(Memory.getPCL()) + "\n"); diff --git a/de/darkress/pic16f84sim/microcontroller/Memory.java b/de/darkress/pic16f84sim/microcontroller/Memory.java index e38b227..e091220 100644 --- a/de/darkress/pic16f84sim/microcontroller/Memory.java +++ b/de/darkress/pic16f84sim/microcontroller/Memory.java @@ -54,6 +54,12 @@ public class Memory setDataFromIndirectAddress(indirectAddress, data); return; } + if(address == 0x01) //Reset PrescalerCounter if change on Option or Timer Register + { + Timer.resetTimeToTimerIncrease(); + Timer.setCyclesToTimerIncrease(Timer.getCyclesToTimerIncrease() - 1); //Decrease by one to account for + // this command execution + } if((Arrays.stream(bank0UniqueSpecialRegister).anyMatch(x -> x == address)) && getRegisterBank() == 0) { memory[address] = data; @@ -67,10 +73,6 @@ public class Memory } memory[address] = data; memory[address + 128] = data; //Ensure data is written to both banks to simulate mapping - if(address == 0x01) //Reset PrescalerCounter if change on Option or Timer Register - { - Timer.resetTimeToTimerIncrease(); - } if(address == 0x2) //Check if PCL is destination { ProgramCounter.loadPc(); @@ -84,6 +86,12 @@ public class Memory private static void setDataFromIndirectAddress(int address, int data) { + if(address == 0x81 || address == 0x01) //Reset PrescalerCounter if change on Option or Timer Register + { + Timer.resetTimeToTimerIncrease(); + Timer.setCyclesToTimerIncrease(Timer.getCyclesToTimerIncrease() - 1); //Decrease by one to account for + // this command execution + } if((Arrays.stream(bank0UniqueSpecialRegister).anyMatch(x -> x == address)) || (Arrays.stream(bank1UniqueSpecialRegister).anyMatch(x -> x == address))) { memory[address] = data; @@ -91,14 +99,6 @@ public class Memory } memory[address % 128] = data; // else: Registers.Registers which are mapped memory[address % 128 + 128] = data; //Ensure data is written to both banks to simulate mapping - if(address == 0x81 || address == 0x01) //Reset PrescalerCounter if change on Option or Timer Register - { - Timer.resetTimeToTimerIncrease(); - } - if(address == 0x2 || address == 0x82) //Check if PCL is destination - { - ProgramCounter.loadPc(); - } } private static int getRegisterBank() diff --git a/de/darkress/pic16f84sim/microcontroller/Timer.java b/de/darkress/pic16f84sim/microcontroller/Timer.java index f86f73a..40b9cca 100644 --- a/de/darkress/pic16f84sim/microcontroller/Timer.java +++ b/de/darkress/pic16f84sim/microcontroller/Timer.java @@ -2,6 +2,16 @@ package de.darkress.pic16f84sim.microcontroller; public class Timer { + public static int getCyclesToTimerIncrease() + { + return cyclesToTimerIncrease; + } + + public static void setCyclesToTimerIncrease(int cyclesToTimerIncrease) + { + Timer.cyclesToTimerIncrease = cyclesToTimerIncrease; + } + private static int cyclesToTimerIncrease = 1; private static boolean timerEnabled() -- 2.49.1