import asm RTC_CMOS_ADDR: uint16 = 0x70 RTC_CMOS_DATA: uint16 = 0x71 define RTC_REG_SECONDS = 0x00 define RTC_REG_MINUTES = 0x02 define RTC_REG_HOURS = 0x04 define RTC_REG_DAY = 0x07 define RTC_REG_MONTH = 0x08 define RTC_REG_YEAR = 0x09 define RTC_REG_STATUS_A = 0x0A define RTC_REG_STATUS_B = 0x0B define RTC_TZ_OFFSET = 8 static rtc_seconds: volatile uint8 = 0 static rtc_minutes: volatile uint8 = 0 static rtc_hours: volatile uint8 = 0 static rtc_day: volatile uint8 = 0 static rtc_month: volatile uint8 = 0 static rtc_year: volatile uint16 = 0 def cmos_read(reg: uint8) -> uint8: asm.outb(RTC_CMOS_ADDR, reg) return asm.inb(RTC_CMOS_DATA) def bcd_to_bin(bcd: uint8) -> uint8: return (bcd >> 4) * 10 + (bcd & 0x0F) def rtc_read_time(): while cmos_read(RTC_REG_STATUS_A) & 0x80: pass sec: uint8 = cmos_read(RTC_REG_SECONDS) min_: uint8 = cmos_read(RTC_REG_MINUTES) hour: uint8 = cmos_read(RTC_REG_HOURS) day: uint8 = cmos_read(RTC_REG_DAY) mon: uint8 = cmos_read(RTC_REG_MONTH) year: uint8 = cmos_read(RTC_REG_YEAR) reg_b: uint8 = cmos_read(RTC_REG_STATUS_B) if not (reg_b & 0x04): sec = bcd_to_bin(sec) min_ = bcd_to_bin(min_) hour = bcd_to_bin(hour) day = bcd_to_bin(day) mon = bcd_to_bin(mon) year = bcd_to_bin(year) if not (reg_b & 0x02) and (hour & 0x80): hour = ((hour & 0x7F) + 12) % 24 hour = hour + RTC_TZ_OFFSET if hour >= 24: hour = hour - 24 day = day + 1 max_day: uint8 = 31 if mon == 4 or mon == 6 or mon == 9 or mon == 11: max_day = 30 elif mon == 2: max_day = 28 y4: uint16 = uint16(year) + 2000 if (y4 % 4 == 0 and y4 % 100 != 0) or (y4 % 400 == 0): max_day = 29 if day > max_day: day = 1 mon = mon + 1 if mon > 12: mon = 1 year = year + 1 global rtc_seconds, rtc_minutes, rtc_hours, rtc_day, rtc_month, rtc_year rtc_seconds = sec rtc_minutes = min_ rtc_hours = hour rtc_day = day rtc_month = mon rtc_year = uint16(year) + 2000 def rtc_init(): rtc_read_time() def rtc_get_hours() -> uint8: return rtc_hours def rtc_get_minutes() -> uint8: return rtc_minutes def rtc_get_seconds() -> uint8: return rtc_seconds def rtc_get_day() -> uint8: return rtc_day def rtc_get_month() -> uint8: return rtc_month def rtc_get_year() -> uint16: return rtc_year