78 lines
2.4 KiB
Java
78 lines
2.4 KiB
Java
package fabrik.simulator.pic16f84;
|
|
|
|
import fabrik.simulator.pic16f84.interfaces.ExecutionTimeObserver;
|
|
import fabrik.simulator.pic16f84.interfaces.TimerInterface;
|
|
|
|
public class Timer extends PICComponent implements TimerInterface, ExecutionTimeObserver {
|
|
private final int TIMERREG = 0x1;
|
|
private final int T0SE = 0x4;
|
|
private final int T0CS = 0x5;
|
|
private final int OPTION = 0x81;
|
|
|
|
private int oldpin = 0;
|
|
|
|
public Timer (){
|
|
}
|
|
|
|
public void cycles(int cycles){
|
|
if (dataRegister.getDirectBit(OPTION, T0CS) == 0){
|
|
if (preScaler.isPrescalerOnTimer()){
|
|
for (int i = 0; i < cycles; i++){
|
|
preScaler.decrement(false);
|
|
}
|
|
} else {
|
|
increment(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public void incrementFromPin (int register){
|
|
if ((dataRegister.getDirectBit(OPTION, T0CS) == 1) && !ExecutionState.isSleeping()){
|
|
int newpin = (register >> 4) & 1;
|
|
if (newpin != oldpin) {
|
|
if (dataRegister.getDirectBit(OPTION, T0SE) == 0) {
|
|
// Low to high
|
|
if (newpin == 1 && oldpin == 0) {
|
|
if (preScaler.isPrescalerOnTimer())
|
|
preScaler.decrement(true);
|
|
else
|
|
increment(true);
|
|
}
|
|
} else {
|
|
// High to low
|
|
if (newpin == 0 && oldpin == 1) {
|
|
if (preScaler.isPrescalerOnTimer())
|
|
preScaler.decrement(true);
|
|
else
|
|
increment(true);
|
|
}
|
|
}
|
|
oldpin = newpin;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void increment(boolean manual) {
|
|
int timer = dataRegister.getDirectRegister(TIMERREG);
|
|
timer++;
|
|
if (timer > 0xFF){
|
|
interrupts.triggerTMR0(manual);
|
|
dataRegister.setDirectRegister(TIMERREG, 0);
|
|
} else {
|
|
dataRegister.setDirectRegister(1, timer);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void initialize(PICComponentLocator locator) {
|
|
super.initialize(locator);
|
|
executionTime.registerObserver(this);
|
|
}
|
|
|
|
@Override
|
|
public void executionTimeChanged() {
|
|
cycles((int) executionTime.getTotalExecutionTime());
|
|
}
|
|
}
|