diff --git a/src/core/main.c b/src/core/main.c index dbbf0eb..2a058c0 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -93,13 +93,20 @@ JSValue jsKCPrintln(JSContext *ctx, JSValueConst jsThis, int argc, JSValueConst return JS_UNDEFINED; } +JSValue jsKCClearScreen(JSContext *ctx, JSValueConst jsThis, int argc, JSValueConst *argv) { + gST->ConOut->ClearScreen(gST->ConOut); + + return JS_UNDEFINED; +} + void initKC(JSContext *ctx) { JSValue global = JS_GetGlobalObject(ctx); JSValue kc = JS_NewObject(ctx); JS_SetPropertyStr(ctx, global, "kc", kc); - + JS_SetPropertyStr(ctx, kc, "println", JS_NewCFunction(ctx, jsKCPrintln, "println", 1)); + JS_SetPropertyStr(ctx, kc, "clearScreen", JS_NewCFunction(ctx, jsKCClearScreen, "clearScreen", 0)); JS_FreeValue(ctx, global); } diff --git a/src/system/src/entry.ts b/src/system/src/entry.ts index 9773f7b..90b8db0 100644 --- a/src/system/src/entry.ts +++ b/src/system/src/entry.ts @@ -1,3 +1,5 @@ +import { KMain } from "./kernel"; + export function KEntry() { - kc.println("Kernel entry point reached!"); + KMain(); } diff --git a/src/system/src/kernel/index.ts b/src/system/src/kernel/index.ts new file mode 100644 index 0000000..2b83bb2 --- /dev/null +++ b/src/system/src/kernel/index.ts @@ -0,0 +1,9 @@ +import { Logger } from "../lib/logger"; +import { ConsoleKModule } from "./modules/console/console.kmod"; + +export function KMain() { + Logger.clear(); + Logger.log("[Kernel] Initializing kernel..."); + + ConsoleKModule.init(); +} diff --git a/src/system/src/kernel/modules/console/console.kmod.ts b/src/system/src/kernel/modules/console/console.kmod.ts new file mode 100644 index 0000000..c9ac6da --- /dev/null +++ b/src/system/src/kernel/modules/console/console.kmod.ts @@ -0,0 +1,25 @@ +import { KernelModule } from "../kmod"; + +export class ConsoleKModule extends KernelModule { + static instance: ConsoleKModule = new this(); + + constructor() { + super("console"); + } + + static init() { + ConsoleKModule.instance.init(); + } + + println(msg: string) { + if (!this.initialized) return; + + kc.println(msg); + } + + clear() { + if (!this.initialized) return; + + kc.clearScreen(); + } +} diff --git a/src/system/src/kernel/modules/kmod.ts b/src/system/src/kernel/modules/kmod.ts new file mode 100644 index 0000000..1fa4d36 --- /dev/null +++ b/src/system/src/kernel/modules/kmod.ts @@ -0,0 +1,20 @@ +import { Logger } from "../../lib/logger"; + +export class KernelModule { + #name: string; + #initialized: boolean = false; + + constructor(name: string) { + this.#name = name; + } + + init() { + Logger.log(`[Kernel] Initializing ${this.#name} module...`); + + this.#initialized = true; + } + + get initialized() { + return this.#initialized; + } +} diff --git a/src/system/src/lib/logger.ts b/src/system/src/lib/logger.ts new file mode 100644 index 0000000..204aa62 --- /dev/null +++ b/src/system/src/lib/logger.ts @@ -0,0 +1,25 @@ +import { ConsoleKModule } from "../kernel/modules/console/console.kmod"; + +export class Logger { + static log(msg: string) { + if (!ConsoleKModule.instance.initialized) + return Logger.fallbackConsolePrintln(msg); + + ConsoleKModule.instance.println(msg); + } + + static clear() { + if (!ConsoleKModule.instance.initialized) + return Logger.fallbackConsoleClearScreen(); + + ConsoleKModule.instance.clear(); + } + + static fallbackConsolePrintln(msg: string) { + kc.println(msg); + } + + static fallbackConsoleClearScreen() { + kc.clearScreen(); + } +} diff --git a/src/system/src/types/kc.d.ts b/src/system/src/types/kc.d.ts index d79ab9c..fb4c8a5 100644 --- a/src/system/src/types/kc.d.ts +++ b/src/system/src/types/kc.d.ts @@ -1,3 +1,4 @@ declare namespace kc { function println(msg: string): void; + function clearScreen(): void; }