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()