package devices.CR16C.KT4585; import icecaptools.IcecapCompileMe; import javax.realtime.AbsoluteTime; import vm.InterruptDispatcher; import vm.InterruptHandler; public class CR16CRealtimeClock extends vm.RealtimeClock implements InterruptHandler { private DeviceRegShort INT1_PRIORITY_REG; private DeviceRegShort TIMER1_RELOAD_N_REG; private DeviceRegShort TIMER_CTRL_REG; private DeviceRegShort RESET_INT_PENDING_REG; private static final short TIM1_MODE = 0x20; private static final short TIM1_CTRL = 0x2; private static final short CLK_CTRL1 = 0x08; private static final short TIM1_INT_PEND = 0x100; private short tickCount; /* TODO: Create real Process for handling this interrupt */ /* Should be the same as the scheduling clock */ public CR16CRealtimeClock() { INT1_PRIORITY_REG = new DeviceRegShort(0xFF5406); TIMER1_RELOAD_N_REG = new DeviceRegShort(0xFF497A); TIMER_CTRL_REG = new DeviceRegShort(0xFF4970); RESET_INT_PENDING_REG = new DeviceRegShort(0xFF5402); INT1_PRIORITY_REG.reg |= 0x1; TIMER1_RELOAD_N_REG.reg = 11520; TIMER_CTRL_REG.reg = TIM1_MODE | TIM1_CTRL | CLK_CTRL1; tickCount = 0; } @Override public int getGranularity() { return 100 * 1000000; } @Override public void getCurrentTime(AbsoluteTime now) { now.set(tickCount * 100); } @IcecapCompileMe @Override public void handle() { tickCount++; RESET_INT_PENDING_REG.reg |= TIM1_INT_PEND; } public short getTickCount() { return tickCount; } @Override public void register() { CR16CInterruptDispatcher.init(); InterruptDispatcher.registerHandler(this, (byte) 24); } @Override public void enable() { } @Override public void disable() { } }