diff --git a/src/kernel/dri/cmos.c b/src/kernel/dri/cmos.c index adfa70e..a28210a 100644 --- a/src/kernel/dri/cmos.c +++ b/src/kernel/dri/cmos.c @@ -14,10 +14,13 @@ #define CMOS_ADDPORT 0x70 #define CMOS_DATAPORT 0x71 +int CMOS_Timer; + void CMOS_RTC_Handler() { outb(0x70, 0x0C); // select register C inb(0x71); // just throw away contents + CMOS_Timer++; } void Write_CMOS(uint8_t Register) @@ -81,8 +84,9 @@ int Slave_FDD_Detect() return FDDType; } -int uptime; -void CPU_Timer() +void CMOS_Timer_Wait(int cycles) { - uptime++; + int tmp; + tmp = CMOS_Timer; + while(CMOS_Timer - tmp <= cycles) return; } \ No newline at end of file diff --git a/src/kernel/dri/cmos.h b/src/kernel/dri/cmos.h index 99ecc0c..868cd0a 100644 --- a/src/kernel/dri/cmos.h +++ b/src/kernel/dri/cmos.h @@ -8,9 +8,9 @@ #include void CMOS_RTC_Handler(); -void CPU_Timer(); int Master_FDD_Detect(); int Slave_FDD_Detect(); +void CMOS_Timer_Wait(int cycles); uint8_t Read_CMOS(uint8_t Register); enum CMOSRegisters diff --git a/src/kernel/dri/sound/pcspeaker.c b/src/kernel/dri/sound/pcspeaker.c new file mode 100644 index 0000000..9b3af82 --- /dev/null +++ b/src/kernel/dri/sound/pcspeaker.c @@ -0,0 +1,50 @@ +/*----------------*\ +|Nanite OS | +|Copyright (C) 2025| +|Tyler McGurrin | +\*----------------*/ +#include "pcspeaker.h" + +#include + +#include + +#include + +#include +#include +#include + +extern uint16_t DEBUG_COM_PORT; + +void PCSP_Play(uint32_t nFrequence) +{ + uint32_t Div; + uint8_t tmp; + + Div = 1193180 / nFrequence; + outb(0x43, 0xb6); + outb(0x42, (uint8_t) (Div) ); + outb(0x42, (uint8_t) (Div >> 8)); + + tmp = inb(0x61); + if (tmp != (tmp | 3)) { + outb(0x61, tmp | 3); + } +} + +// make it shut up +void PCSP_Mute() +{ + uint8_t tmp = inb(0x61) & 0xFC; + + outb(0x61, tmp); +} + +// Make a beep +void PCSP_Beep() +{ + PCSP_Play(1000); + Timer_Wait(100000000); + PCSP_Mute(); +} \ No newline at end of file diff --git a/src/kernel/dri/sound/pcspeaker.h b/src/kernel/dri/sound/pcspeaker.h new file mode 100644 index 0000000..9a0ae59 --- /dev/null +++ b/src/kernel/dri/sound/pcspeaker.h @@ -0,0 +1,12 @@ +/*----------------*\ +|Nanite OS | +|Copyright (C) 2025| +|Tyler McGurrin | +\*----------------*/ +#pragma once + +#include + +void PCSP_Play(uint32_t nFrequence); +void PCSP_Mute(); +void PCSP_Beep(); \ No newline at end of file diff --git a/src/kernel/dri/timer.c b/src/kernel/dri/timer.c new file mode 100644 index 0000000..63227d9 --- /dev/null +++ b/src/kernel/dri/timer.c @@ -0,0 +1,19 @@ +/*----------------*\ +|Nanite OS | +|Copyright (C) 2025| +|Tyler McGurrin | +\*----------------*/ +#include "timer.h" + +int uptime; +void Timer_Handler() +{ + uptime++; +} + +void Timer_Wait(int cycles) // Seems to not work? i'll fix it later. +{ + int tmp; + tmp = uptime; + while(uptime - tmp <= cycles) return; +} \ No newline at end of file diff --git a/src/kernel/dri/timer.h b/src/kernel/dri/timer.h new file mode 100644 index 0000000..09fd080 --- /dev/null +++ b/src/kernel/dri/timer.h @@ -0,0 +1,9 @@ +/*----------------*\ +|Nanite OS | +|Copyright (C) 2025| +|Tyler McGurrin | +\*----------------*/ +#pragma once + +void Timer_Handler(); +void Timer_Wait(int cycles); \ No newline at end of file diff --git a/src/kernel/main.c b/src/kernel/main.c index ec64550..af4f3ca 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -13,22 +13,30 @@ #include #include #include + #include #include +#include #include #include #include #include +#include + #include #include + #include #include #include + #include extern uint8_t __bss_start; extern uint8_t __end; +extern int uptime; + uint16_t DEBUG_COM_PORT = COM1_PORT; void __attribute__((section(".entry"))) start(uint64_t multiboot_magic, void *multiboot_data) { @@ -50,7 +58,7 @@ void __attribute__((section(".entry"))) start(uint64_t multiboot_magic, void *mu // Register IRQs printf("Registering IRQs..."); - IRQ_RegisterHandler(0, CPU_Timer); + IRQ_RegisterHandler(0, Timer_Handler); IRQ_RegisterHandler(1, Keyboard_Handler); IRQ_RegisterHandler(4, COM1_Serial_Handler); IRQ_RegisterHandler(6, Floppy_Handler); @@ -76,6 +84,8 @@ void __attribute__((section(".entry"))) start(uint64_t multiboot_magic, void *mu BCD2BIN(Read_CMOS(CMOS_RTC_Day)), BCD2BIN(Read_CMOS(CMOS_RTC_Century)), BCD2BIN(Read_CMOS(CMOS_RTC_Year))); + // Beep! + PCSP_Beep(); end: for (;;); diff --git a/src/kernel/version.h b/src/kernel/version.h index 961a506..d70a68e 100644 --- a/src/kernel/version.h +++ b/src/kernel/version.h @@ -6,4 +6,4 @@ #pragma once #define LOGO " _ _____ _ __________________\n / | / / | / | / / _/_ __/ ____/\n / |/ / /| | / |/ // / / / / __/ \n / /| / ___ |/ /| // / / / / /___ \n/_/ |_/_/ |_/_/ |_/___/ /_/ /_____/ \n" -#define VERSION "RD-00046" \ No newline at end of file +#define VERSION "RD-00047" \ No newline at end of file