diff --git a/de/darkress/pic16f84sim/Main.java b/de/darkress/pic16f84sim/Main.java index 84500fb..3f8d24f 100644 --- a/de/darkress/pic16f84sim/Main.java +++ b/de/darkress/pic16f84sim/Main.java @@ -13,17 +13,18 @@ class Main { public static void main(String[] args) throws InterruptedException { - Command[] program = Parser.parser("de/darkress/pic16f84sim/TPicSim101.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) { + System.out.println("Command: " + program[ProgramCounter.getPc()].toString()); 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/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); } } diff --git a/de/darkress/pic16f84sim/microcontroller/Cycles.java b/de/darkress/pic16f84sim/microcontroller/Cycles.java index c9dcaea..6dc5695 100644 --- a/de/darkress/pic16f84sim/microcontroller/Cycles.java +++ b/de/darkress/pic16f84sim/microcontroller/Cycles.java @@ -3,9 +3,10 @@ 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; + Timer.increaseTimer(); + cycles++; } public static int getCycles() { diff --git a/de/darkress/pic16f84sim/microcontroller/Memory.java b/de/darkress/pic16f84sim/microcontroller/Memory.java index 4a4033b..e091220 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]; @@ -47,12 +54,19 @@ 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; 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; @@ -72,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; @@ -79,10 +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 == 0x2) //Check if PCL is destination - { - ProgramCounter.loadPc(); - } } private static int getRegisterBank() @@ -121,6 +137,21 @@ public class Memory memory[0x8A] = data & 0x1F; } + public static int getOption() + { + 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 new file mode 100644 index 0000000..40b9cca --- /dev/null +++ b/de/darkress/pic16f84sim/microcontroller/Timer.java @@ -0,0 +1,66 @@ +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() + { + return (Memory.getOption() & 0x20) != 0x20; + } + + public static void resetTimeToTimerIncrease() + { + cyclesToTimerIncrease = getPrescalerFactor(); + } + + private static boolean getPrescalerAsssignment() { + return (Memory.getOption() & 0x08) == 0x08; + } + + private static 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; + } + + 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.setTimer(timerRegister); + } + + public static void increaseTimer() + { + if(!timerEnabled()) + { + return; + } + cyclesToTimerIncrease--; + if(cyclesToTimerIncrease == 0) + { + resetTimeToTimerIncrease(); + increaseTimerRegister(); + } + } +}