From bc674eb4eb59a2d62d6234ccbe282448ab070218 Mon Sep 17 00:00:00 2001 From: Martin Petr Date: Thu, 20 Nov 2025 16:24:39 +0100 Subject: [PATCH] Add bios time module --- src/os/src/kernel/modules/bios/bios.kmod.ts | 1 + src/os/src/kernel/modules/bios/config.ts | 2 + src/os/src/kernel/modules/bios/time.ts | 96 +++++++++++++++++++++ src/os/src/kernel/panic.ts | 2 +- src/os/src/lib/libts/port.ts | 7 ++ src/os/src/lib/libts/string.ts | 11 +++ src/os/src/lib/sys/date.ts | 5 ++ 7 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 src/os/src/kernel/modules/bios/bios.kmod.ts create mode 100644 src/os/src/kernel/modules/bios/config.ts create mode 100644 src/os/src/kernel/modules/bios/time.ts create mode 100644 src/os/src/lib/libts/port.ts create mode 100644 src/os/src/lib/libts/string.ts create mode 100644 src/os/src/lib/sys/date.ts diff --git a/src/os/src/kernel/modules/bios/bios.kmod.ts b/src/os/src/kernel/modules/bios/bios.kmod.ts new file mode 100644 index 0000000..2d18873 --- /dev/null +++ b/src/os/src/kernel/modules/bios/bios.kmod.ts @@ -0,0 +1 @@ +export * from "./time" \ No newline at end of file diff --git a/src/os/src/kernel/modules/bios/config.ts b/src/os/src/kernel/modules/bios/config.ts new file mode 100644 index 0000000..868bf33 --- /dev/null +++ b/src/os/src/kernel/modules/bios/config.ts @@ -0,0 +1,2 @@ +export const CFG_KMOD_BIOS_TIME_CMOS_ADDR = 0x70; +export const CFG_KMOD_BIOS_TIME_CMOS_DATA_ADDR = 0x71; diff --git a/src/os/src/kernel/modules/bios/time.ts b/src/os/src/kernel/modules/bios/time.ts new file mode 100644 index 0000000..0ce7f25 --- /dev/null +++ b/src/os/src/kernel/modules/bios/time.ts @@ -0,0 +1,96 @@ +import { portin, portout } from "../../../lib/libts/port"; +import { padStart } from "../../../lib/libts/string"; +import { + CFG_KMOD_BIOS_TIME_CMOS_ADDR, + CFG_KMOD_BIOS_TIME_CMOS_DATA_ADDR, +} from "./config"; + +export function kmod_bios_time_getCentury(): number { + const val = 0x32; + + portout(CFG_KMOD_BIOS_TIME_CMOS_ADDR, val); + const data = portin(CFG_KMOD_BIOS_TIME_CMOS_DATA_ADDR); + + return (data & 0x0f) + ((data >> 4) & 0x0f) * 10; +} + +export function kmod_bios_time_getYear(): number { + const val = 0x09; + + portout(CFG_KMOD_BIOS_TIME_CMOS_ADDR, val); + const data = portin(CFG_KMOD_BIOS_TIME_CMOS_DATA_ADDR); + + return (data & 0x0f) + ((data >> 4) & 0x0f) * 10; +} + +export function kmod_bios_time_getMonth(): number { + const val = 0x08; + + portout(CFG_KMOD_BIOS_TIME_CMOS_ADDR, val); + const data = portin(CFG_KMOD_BIOS_TIME_CMOS_DATA_ADDR); + + return (data & 0x0f) + ((data >> 4) & 0x0f) * 10; +} + +export function kmod_bios_time_getDay(): number { + const val = 0x07; + + portout(CFG_KMOD_BIOS_TIME_CMOS_ADDR, val); + const data = portin(CFG_KMOD_BIOS_TIME_CMOS_DATA_ADDR); + + return (data & 0x0f) + ((data >> 4) & 0x0f) * 10; +} + +export function kmod_bios_time_getHours(): number { + const val = 0x04; + + portout(CFG_KMOD_BIOS_TIME_CMOS_ADDR, val); + const data = portin(CFG_KMOD_BIOS_TIME_CMOS_DATA_ADDR); + + return (data & 0x0f) + ((data >> 4) & 0x0f) * 10; +} + +export function kmod_bios_time_getMinutes(): number { + const val = 0x02; + + portout(CFG_KMOD_BIOS_TIME_CMOS_ADDR, val); + const data = portin(CFG_KMOD_BIOS_TIME_CMOS_DATA_ADDR); + + return (data & 0x0f) + ((data >> 4) & 0x0f) * 10; +} + +export function kmod_bios_time_getSeconds(): number { + const val = 0x00; + + portout(CFG_KMOD_BIOS_TIME_CMOS_ADDR, val); + const data = portin(CFG_KMOD_BIOS_TIME_CMOS_DATA_ADDR); + + return (data & 0x0f) + ((data >> 4) & 0x0f) * 10; +} + +export function kmod_bios_time_getTimestamp(): string { + const century = kmod_bios_time_getCentury(); + const year = kmod_bios_time_getYear(); + const month = kmod_bios_time_getMonth(); + const day = kmod_bios_time_getDay(); + const hours = kmod_bios_time_getHours(); + const minutes = kmod_bios_time_getMinutes(); + const seconds = kmod_bios_time_getSeconds(); + + return ( + century.toString() + + year.toString() + + "-" + + padStart(month.toString(), 2, "0") + + "-" + + padStart(day.toString(), 2, "0") + + "T" + + padStart(hours.toString(), 2, "0") + + ":" + + padStart(minutes.toString(), 2, "0") + + ":" + + padStart(seconds.toString(), 2, "0") + + +".000" + + "Z" + ); +} diff --git a/src/os/src/kernel/panic.ts b/src/os/src/kernel/panic.ts index 98bba40..fb166c9 100644 --- a/src/os/src/kernel/panic.ts +++ b/src/os/src/kernel/panic.ts @@ -1,7 +1,7 @@ import { kmod_graphics_vga_clear, kmod_graphics_vga_writeChar, -} from "./modules/graphics/vga"; +} from "./modules/graphics/graphics.kmod"; export function kpanic(reason?: string) { kmod_graphics_vga_clear(); diff --git a/src/os/src/lib/libts/port.ts b/src/os/src/lib/libts/port.ts new file mode 100644 index 0000000..1987513 --- /dev/null +++ b/src/os/src/lib/libts/port.ts @@ -0,0 +1,7 @@ +export function portin(port: number): number { + return $ptin(port); +} + +export function portout(port: number, value: number): void { + $ptout(port, value); +} diff --git a/src/os/src/lib/libts/string.ts b/src/os/src/lib/libts/string.ts new file mode 100644 index 0000000..ecc4df3 --- /dev/null +++ b/src/os/src/lib/libts/string.ts @@ -0,0 +1,11 @@ +export function padStart( + str: string, + targetLength: number, + padString: string +): string { + while (str.length < targetLength) { + str = padString + str; + } + + return str; +} diff --git a/src/os/src/lib/sys/date.ts b/src/os/src/lib/sys/date.ts new file mode 100644 index 0000000..b16302d --- /dev/null +++ b/src/os/src/lib/sys/date.ts @@ -0,0 +1,5 @@ +import { kmod_bios_time_getTimestamp } from "../../kernel/modules/bios/time"; + +export function getDate(): Date { + return new Date(kmod_bios_time_getTimestamp()); +}