#include "../include/types.h" #include "../include/utils.h" uint8 inportb(uint16 _port) { uint8 rv; __asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port)); return rv; } void outportb(uint16 _port, uint8 _data) { __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data)); } uint8_t get_rtc(uint8_t reg) { uint8_t nmi_disable_bit = 0; outb(0x70, (nmi_disable_bit << 7) | reg); uint8_t result = inb(0x71); return result; } void get_fancy_datetime() { uint8_t century = get_rtc(0x32); uint8_t year = get_rtc(0x09); uint8_t month = get_rtc(0x08); uint8_t day_of_month = get_rtc(0x07); uint8_t hour = get_rtc(0x04); uint8_t minute = get_rtc(0x02); uint8_t second = get_rtc(0x00); printf("%X-%X-%X%X %X:%X:%X\n", day_of_month, month, century, year, hour, minute, second); } void get_datetime(uint16_t *year, uint8_t *month, uint8_t *day, uint8_t *hour, uint8_t *minute, uint8_t *second) { uint8_t century = get_rtc(0x32); uint8_t year_rtc = get_rtc(0x09); *year = century * 100 + year_rtc; *month = get_rtc(0x08); *day = get_rtc(0x07); *hour = get_rtc(0x04); *minute = get_rtc(0x02); *second = get_rtc(0x00); } uint32_t fat32_datetime(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { uint16_t fat_year = year - 1980; uint16_t fat_date = (fat_year << 9) | ((month & 0x0F) << 5) | (day & 0x1F); uint16_t fat_time = (hour & 0x1F) << 11 | ((minute & 0x3F) >> 1) << 5 | (second / 2) & 0x1F; uint32_t fat_datetime = ((uint32_t)fat_date << 16) | fat_time; return fat_datetime; }