diff --git a/src/hulk/rtc.d b/src/hulk/rtc.d index 93f8957..6770c80 100644 --- a/src/hulk/rtc.d +++ b/src/hulk/rtc.d @@ -43,17 +43,19 @@ struct rtc public static void initialize() { - time t = read_rtc_time(); - klog.writefln("System time is 20%02u-%02u-%02u %02u:%02u:%02u", - t.year, t.month, t.day, t.hour, t.minute, t.second); - /* Enable IRQ 8 to receive RTC interrupts. */ ubyte sr_b = read_register(REG_SR_B, true); write_register(REG_SR_B, sr_b | SR_B_ENABLE_IRQ, true); + /* Record RTC mode flags from status register B. */ rtc_24hour_mode = (sr_b & SR_B_24HOUR) != 0u; rtc_binary_mode = (sr_b & SR_B_BINARY) != 0u; + /* Read the current system time. */ + time t = read_rtc_time(); + klog.writefln("System time is 20%02u-%02u-%02u %02u:%02u:%02u", + t.year, t.month, t.day, t.hour, t.minute, t.second); + /* Send EOI to enable more RTC interrupts and re-enable NMIs. */ eoi(); } @@ -110,20 +112,24 @@ struct rtc t.year = read_rtc_time_register(REG_RTC_YEAR); t.month = read_rtc_time_register(REG_RTC_MONTH); t.day = read_rtc_time_register(REG_RTC_DAY); - t.hour = read_register(REG_RTC_HOURS); t.minute = read_rtc_time_register(REG_RTC_MINUTES); t.second = read_rtc_time_register(REG_RTC_SECONDS); + /* Hour field is treated differently because it might have 'PM' flag + * in highest bit if we're in 24-hour mode. */ + ubyte hour = read_register(REG_RTC_HOURS); + ubyte pm = hour >> 7u; + hour &= 0x7Fu; + if (!rtc_binary_mode) + { + /* Hour is in BCD format; convert to binary. */ + hour = bcd_to_binary(hour); + } if (!rtc_24hour_mode) { - ubyte pm = (t.hour & 0x80u) >> 7u; - t.hour &= 0x7Fu; - if (!rtc_binary_mode) - { - t.hour = bcd_to_binary(t.hour); - } /* Hour is in 12-hour format; convert to 24-hour format. */ - t.hour = cast(ubyte)((t.hour % 12u) + pm * 12u); + hour = cast(ubyte)((hour % 12u) + pm * 12u); } + t.hour = hour; return t; }