diff --git a/de/darkress/pic16f84sim/Main.java b/de/darkress/pic16f84sim/Main.java index 607b558..ad933ab 100644 --- a/de/darkress/pic16f84sim/Main.java +++ b/de/darkress/pic16f84sim/Main.java @@ -12,9 +12,9 @@ class Main public static void main(String[] args) { ArrayList program = new ArrayList<>(); - Memory.clearCarryBit(); - Memory.setRegister(0x14, 0B00000001); //240 << 224 - program.add(CommandDecoder.decode(0x0C94)); + Memory.workingRegister = 0x01; + Memory.setRegister(0x14, 0x01); //240 << 224 + program.add(CommandDecoder.decode(0x0294)); for(int i = 0; i < program.size(); i++) { program.get(ProgramCounter.getPc()).execute(); diff --git a/de/darkress/pic16f84sim/commands/Subwf.java b/de/darkress/pic16f84sim/commands/Subwf.java new file mode 100644 index 0000000..7b9b225 --- /dev/null +++ b/de/darkress/pic16f84sim/commands/Subwf.java @@ -0,0 +1,49 @@ +package de.darkress.pic16f84sim.commands; + +import de.darkress.pic16f84sim.microcontroller.Memory; +import de.darkress.pic16f84sim.microcontroller.ProgramCounter; + +public class Subwf extends FileRegisterCommandUtils implements Command +{ + private final int address; + private final boolean destinationBit; + + public Subwf(int input) + { + address = input & 0x007F; + destinationBit = checkDestinationBit(input); + } + + @Override + protected void checkCarryBit(int result) + { + if(result <= 255){ + Memory.clearCarryBit(); + } else{ + Memory.setCarryBit(); + } + } + + @Override + protected void checkDigitCarryBit(int literal) + { + if(((literal & 0x0F) - (Memory.workingRegister & 0x0F)) < 0){ + Memory.clearDigitCarryBit(); + } else{ + Memory.setDigitCarryBit(); + } + } + + @Override + public void execute() + { + int result = Memory.getRegister(address) - Memory.workingRegister + 256; + + checkZeroBit(result); + checkCarryBit(result); + checkDigitCarryBit(Memory.getRegister(address)); + + writeToDestination(destinationBit, address, result % 256); + ProgramCounter.incPC(); + } +} diff --git a/de/darkress/pic16f84sim/decoder/CommandDecoder.java b/de/darkress/pic16f84sim/decoder/CommandDecoder.java index 6657fb0..9e88a03 100644 --- a/de/darkress/pic16f84sim/decoder/CommandDecoder.java +++ b/de/darkress/pic16f84sim/decoder/CommandDecoder.java @@ -31,8 +31,7 @@ public class CommandDecoder case 0xC00: return new Rrf(input); case 0x200: - //subwf(); - break; + return new Subwf(input); case 0xE00: //swapf(); break;