Files
TermiNexus dcb7c5c2c0 chore(ViperOS): 落库内核侧进行中的改动(26 文件,+1573/-1805)
内容由用户产出,本次仅代为提交、未做任何语义修改;含 static 修饰符前置迁移等(新增 static 前缀 16 行)。提交消息为中性描述——如需更精确的说明请 amend。
2026-09-28 15:24:52 +08:00

83 lines
2.6 KiB
Plaintext

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