from stdint import * import t, c import asm rtc_cmos_addr: t.CUInt16T = 0x70 rtc_cmos_data: t.CUInt16T = 0x71 def cmos_read(reg: t.CUInt8T) -> t.CUInt8T: asm.outb(rtc_cmos_addr, reg) return asm.inb(rtc_cmos_data) def bcd_to_bin(bcd: t.CUInt8T) -> t.CUInt8T: return (bcd >> 4) * 10 + (bcd & 0x0F) def get_rtc_time() -> t.CUInt32T: while cmos_read(0x0A) & 0x80: pass sec: t.CUInt8T = cmos_read(0x00) min_: t.CUInt8T = cmos_read(0x02) hour: t.CUInt8T = cmos_read(0x04) day: t.CUInt8T = cmos_read(0x07) mon: t.CUInt8T = cmos_read(0x08) year: t.CUInt8T = cmos_read(0x09) reg_b: t.CUInt8T = cmos_read(0x0B) 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) fat_year: t.CUInt16T = t.CUInt16T(year) + 2000 - 1980 if fat_year > 127: fat_year = 127 fat_date: t.CUInt16T = (fat_year << 9) | (t.CUInt16T(mon) << 5) | t.CUInt16T(day) fat_time: t.CUInt16T = (t.CUInt16T(hour) << 11) | (t.CUInt16T(min_) << 5) | (t.CUInt16T(sec) / 2) return (t.CUInt32T(fat_date) << 16) | t.CUInt32T(fat_time) def get_fattime() -> t.CUInt32T: return get_rtc_time() def to_year(ft: t.CUInt32T) -> t.CUInt16T: return t.CUInt16T((ft >> 25) & 0x7F) + 1980 def to_month(ft: t.CUInt32T) -> t.CUInt8T: return t.CUInt8T((ft >> 21) & 0x0F) def to_day(ft: t.CUInt32T) -> t.CUInt8T: return t.CUInt8T((ft >> 16) & 0x1F) def to_hour(ft: t.CUInt32T) -> t.CUInt8T: return t.CUInt8T((ft >> 11) & 0x1F) def to_minute(ft: t.CUInt32T) -> t.CUInt8T: return t.CUInt8T((ft >> 5) & 0x3F) def to_second(ft: t.CUInt32T) -> t.CUInt8T: return t.CUInt8T((ft & 0x1F) * 2) def make(year: t.CUInt16T, month: t.CUInt8T, day: t.CUInt8T, hour: t.CUInt8T, minute: t.CUInt8T, second: t.CUInt8T) -> t.CUInt32T: fat_year: t.CUInt16T = year - 1980 if fat_year > 127: fat_year = 127 fat_date: t.CUInt16T = (fat_year << 9) | (t.CUInt16T(month) << 5) | t.CUInt16T(day) fat_time: t.CUInt16T = (t.CUInt16T(hour) << 11) | (t.CUInt16T(minute) << 5) | (t.CUInt16T(second) / 2) return (t.CUInt32T(fat_date) << 16) | t.CUInt32T(fat_time)