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