public void CountTOD()
{
byte lo, hi;
// Decrement frequency divider
if (tod_divider != 0)
tod_divider--;
else
{
// Reload divider according to 50/60 Hz flag
if ((cra & 0x80) > 0)
tod_divider = 4;
else
tod_divider = 5;
// 1/10 seconds
tod_10ths++;
if (tod_10ths > 9)
{
tod_10ths = 0;
// Seconds
lo = (byte)((tod_sec & 0x0f) + 1);
hi = (byte)(tod_sec >> 4);
if (lo > 9)
{
lo = 0;
hi++;
}
if (hi > 5)
{
tod_sec = 0;
// Minutes
lo = (byte)((tod_min & 0x0f) + 1);
hi = (byte)(tod_min >> 4);
if (lo > 9)
{
lo = 0;
hi++;
}
if (hi > 5)
{
tod_min = 0;
// Hours
lo = (byte)((tod_hr & 0x0f) + 1);
hi = (byte)((tod_hr >> 4) & 1);
tod_hr &= 0x80; // Keep AM/PM flag
if (lo > 9)
{
lo = 0;
hi++;
}
tod_hr |= (byte)((hi << 4) | lo);
if ((tod_hr & 0x1f) > 0x11)
tod_hr = (byte)(tod_hr & 0x80 ^ 0x80);
}
else
tod_min = (byte)((hi << 4) | lo);
}
else
tod_sec = (byte)((hi << 4) | lo);
}
// Alarm time reached? Trigger interrupt if enabled
if (tod_10ths == alm_10ths && tod_sec == alm_sec &&
tod_min == alm_min && tod_hr == alm_hr)
TriggerInterrupt(4);
}
}