implemented Addwf Instruction #7

Merged
Darkress merged 1 commits from addwfInstruction into main 2023-05-31 19:34:57 +02:00
15 changed files with 98 additions and 18 deletions

View File

@@ -13,11 +13,10 @@ class Main
ArrayList<Command> program = new ArrayList<>();
int input1 = 0x27FF;
program.add(CommandDecoder.decode(0x3011));
program.add(CommandDecoder.decode(0x2003));
program.add(CommandDecoder.decode(0x3022));
program.add(CommandDecoder.decode(0x0008));
while(true)
program.add(CommandDecoder.decode(0x3011)); //Write 0x11 to W
Memory.setRegister(0x14, 0x14);
program.add(CommandDecoder.decode(0x0714));
for(int i = 0; i < 2; i++)
{
program.get(ProgramCounter.getPc()).execute();
}

View File

@@ -3,7 +3,7 @@ package de.darkress.pic16f84sim.commands;
import de.darkress.pic16f84sim.microcontroller.Memory;
import de.darkress.pic16f84sim.microcontroller.ProgramCounter;
public class Addlw extends CommandUtils implements Command
public class Addlw extends LiteralCommandUtils implements Command
{
private final int literal;

View File

@@ -0,0 +1,29 @@
package de.darkress.pic16f84sim.commands;
import de.darkress.pic16f84sim.microcontroller.Memory;
import de.darkress.pic16f84sim.microcontroller.ProgramCounter;
public class Addwf extends FileRegisterCommandUtils implements Command
{
private final int address;
private final boolean destinationBit;
public Addwf(int input)
{
address = input & 0x007F;
destinationBit = checkDestinationBit(input);
}
@Override
public void execute()
{
int result = Memory.getRegister(address) + Memory.workingRegister;
checkZeroBit(result);
checkCarryBit(result);
checkDigitCarryBit(address);
writeToDestination(destinationBit, address, result);
ProgramCounter.incPC();
}
}

View File

@@ -2,7 +2,7 @@ package de.darkress.pic16f84sim.commands;
import de.darkress.pic16f84sim.microcontroller.Memory;
public class Andlw extends CommandUtils implements Command
public class Andlw extends LiteralCommandUtils implements Command
{
private final int literal;

View File

@@ -3,7 +3,7 @@ package de.darkress.pic16f84sim.commands;
import de.darkress.pic16f84sim.microcontroller.ProgramCounter;
import de.darkress.pic16f84sim.microcontroller.Stack;
public class Call extends CommandUtils implements Command
public class Call extends LiteralCommandUtils implements Command
{
private final int literal;

View File

@@ -0,0 +1,51 @@
package de.darkress.pic16f84sim.commands;
import de.darkress.pic16f84sim.microcontroller.Memory;
public class FileRegisterCommandUtils
{
protected void checkZeroBit(int result)
{
if((result % 256) == 0){
Memory.setZeroBit();
} else{
Memory.clearZeroBit();
}
}
protected void checkCarryBit(int result)
{
if(result > 255){
Memory.setCarryBit();
} else{
Memory.clearCarryBit();
}
}
protected void checkDigitCarryBit(int address)
{
int literal = Memory.getRegister(address);
if(((Memory.workingRegister & 0x0F) + (literal & 0x0F)) > 15){
Memory.setDigitCarryBit();
} else{
Memory.clearDigitCarryBit();
}
}
protected void writeToDestination(boolean destinationBit, int fileAddress, int result)
{
if(destinationBit)
{
//Store in FileRegister
Memory.setRegister(fileAddress, result);
} else {
//Store in WRegister
Memory.workingRegister = result;
}
}
protected boolean checkDestinationBit(int input)
{
return (input & 0x0080) == 0x0080;
}
}

View File

@@ -2,7 +2,7 @@ package de.darkress.pic16f84sim.commands;
import de.darkress.pic16f84sim.microcontroller.ProgramCounter;
public class Goto extends CommandUtils implements Command
public class Goto extends LiteralCommandUtils implements Command
{
private final int literal;

View File

@@ -2,7 +2,7 @@ package de.darkress.pic16f84sim.commands;
import de.darkress.pic16f84sim.microcontroller.Memory;
public class Iorlw extends CommandUtils implements Command
public class Iorlw extends LiteralCommandUtils implements Command
{
private final int literal;

View File

@@ -2,7 +2,7 @@ package de.darkress.pic16f84sim.commands;
import de.darkress.pic16f84sim.microcontroller.Memory;
public class CommandUtils
public class LiteralCommandUtils
{
protected void checkZeroBit(int result)
{

View File

@@ -1,8 +1,9 @@
package de.darkress.pic16f84sim.commands;
import de.darkress.pic16f84sim.microcontroller.Memory;
import de.darkress.pic16f84sim.microcontroller.ProgramCounter;
public class Movlw extends CommandUtils implements Command
public class Movlw extends LiteralCommandUtils implements Command
{
private final int literal;
@@ -15,5 +16,6 @@ public class Movlw extends CommandUtils implements Command
public void execute()
{
Memory.workingRegister = literal;
ProgramCounter.incPC();
}
}

View File

@@ -4,7 +4,7 @@ import de.darkress.pic16f84sim.microcontroller.Memory;
import de.darkress.pic16f84sim.microcontroller.ProgramCounter;
import de.darkress.pic16f84sim.microcontroller.Stack;
public class Retlw extends CommandUtils implements Command
public class Retlw extends LiteralCommandUtils implements Command
{
private final int literal;

View File

@@ -3,7 +3,7 @@ package de.darkress.pic16f84sim.commands;
import de.darkress.pic16f84sim.microcontroller.ProgramCounter;
import de.darkress.pic16f84sim.microcontroller.Stack;
public class Return extends CommandUtils implements Command
public class Return extends LiteralCommandUtils implements Command
{
@Override
public void execute()

View File

@@ -2,7 +2,7 @@ package de.darkress.pic16f84sim.commands;
import de.darkress.pic16f84sim.microcontroller.Memory;
public class Sublw extends CommandUtils implements Command
public class Sublw extends LiteralCommandUtils implements Command
{
private final int literal;

View File

@@ -2,7 +2,7 @@ package de.darkress.pic16f84sim.commands;
import de.darkress.pic16f84sim.microcontroller.Memory;
public class Xorlw extends CommandUtils implements Command
public class Xorlw extends LiteralCommandUtils implements Command
{
private final int literal;

View File

@@ -9,8 +9,7 @@ public class CommandDecoder
switch(input & 0x3F00)
{
case 0x700:
//addwf();
break;
return new Addwf(input);
case 0x500:
//andwf();
break;