From b245dc5f002bd474e76899e77f966ee55630a01a Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 8 Feb 2026 14:52:19 +0100 Subject: [PATCH] Replace busy-wait with time-based sleep in sweden.c --- src/kernel/cli_apps/cli_utils.c | 12 ++++++++++++ src/kernel/cli_apps/cli_utils.h | 1 + src/kernel/cli_apps/sweden.c | 4 ++-- src/kernel/wm.c | 4 ++++ src/kernel/wm.h | 1 + 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/kernel/cli_apps/cli_utils.c b/src/kernel/cli_apps/cli_utils.c index 07b06b8..e5f6088 100644 --- a/src/kernel/cli_apps/cli_utils.c +++ b/src/kernel/cli_apps/cli_utils.c @@ -1,4 +1,5 @@ #include "cli_utils.h" +#include "wm.h" // Forward declarations - these will be provided by cmd.c extern void cmd_putchar(char c); @@ -78,3 +79,14 @@ void cli_delay(int iterations) { __asm__ __volatile__("nop"); } } + +void cli_sleep(int ms) { + // Timer is ~60Hz, so 1 tick = 16.66ms + uint32_t ticks = ms / 16; + if (ticks == 0 && ms > 0) ticks = 1; + + uint32_t target = wm_get_ticks() + ticks; + while (wm_get_ticks() < target) { + __asm__ __volatile__("hlt"); + } +} diff --git a/src/kernel/cli_apps/cli_utils.h b/src/kernel/cli_apps/cli_utils.h index 2823043..c238e38 100644 --- a/src/kernel/cli_apps/cli_utils.h +++ b/src/kernel/cli_apps/cli_utils.h @@ -19,6 +19,7 @@ void cli_putchar(char c); // Timing utility void cli_delay(int iterations); +void cli_sleep(int ms); // CLI Command declarations void cli_cmd_shutdown(char *args); diff --git a/src/kernel/cli_apps/sweden.c b/src/kernel/cli_apps/sweden.c index bc22ee8..bc7440a 100644 --- a/src/kernel/cli_apps/sweden.c +++ b/src/kernel/cli_apps/sweden.c @@ -13,10 +13,10 @@ void play_note(int freq, int duration_ms) { } - cli_delay(duration_ms * 300000); + cli_sleep(duration_ms); outb(0x61, inb(0x61) & 0xFC); - cli_delay(2000000); + cli_sleep(20); } void cli_cmd_minecraft(char *args) { diff --git a/src/kernel/wm.c b/src/kernel/wm.c index 6ed00b3..c7d9d01 100644 --- a/src/kernel/wm.c +++ b/src/kernel/wm.c @@ -1729,6 +1729,10 @@ void wm_init(void) { force_redraw = true; } +uint32_t wm_get_ticks(void) { + return timer_ticks; +} + // Called by timer interrupt ~60Hz void wm_timer_tick(void) { timer_ticks++; diff --git a/src/kernel/wm.h b/src/kernel/wm.h index e22ab0e..ad2243f 100644 --- a/src/kernel/wm.h +++ b/src/kernel/wm.h @@ -54,6 +54,7 @@ void wm_refresh(void); void wm_paint(void); void wm_refresh_desktop(void); void wm_timer_tick(void); +uint32_t wm_get_ticks(void); int wm_get_desktop_icon_count(void); void wm_show_message(const char *title, const char *message);