move CPU timer to its own file, begin implementing PC Speaker Support

This commit is contained in:
Tyler McGurrin 2025-08-04 17:05:27 -04:00
parent 9cdd5d3c48
commit a29a7b5c50
8 changed files with 110 additions and 6 deletions

View File

@ -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;
}

View File

@ -8,9 +8,9 @@
#include <stdint.h>
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

View File

@ -0,0 +1,50 @@
/*----------------*\
|Nanite OS |
|Copyright (C) 2025|
|Tyler McGurrin |
\*----------------*/
#include "pcspeaker.h"
#include <stdint.h>
#include <util/binary.h>
#include <arch/i686/io.h>
#include <dri/timer.h>
#include <dri/cmos.h>
#include <dri/serial.h>
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();
}

View File

@ -0,0 +1,12 @@
/*----------------*\
|Nanite OS |
|Copyright (C) 2025|
|Tyler McGurrin |
\*----------------*/
#pragma once
#include <stdint.h>
void PCSP_Play(uint32_t nFrequence);
void PCSP_Mute();
void PCSP_Beep();

19
src/kernel/dri/timer.c Normal file
View File

@ -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;
}

9
src/kernel/dri/timer.h Normal file
View File

@ -0,0 +1,9 @@
/*----------------*\
|Nanite OS |
|Copyright (C) 2025|
|Tyler McGurrin |
\*----------------*/
#pragma once
void Timer_Handler();
void Timer_Wait(int cycles);

View File

@ -13,22 +13,30 @@
#include <stdint.h>
#include <stdio.h>
#include <memory.h>
#include <dri/keyboard.h>
#include <dri/cmos.h>
#include <dri/timer.h>
#include <dri/serial.h>
#include <dri/fat.h>
#include <dri/disk/floppy.h>
#include <dri/disk/ata.h>
#include <dri/sound/pcspeaker.h>
#include <core/hal/hal.h>
#include <core/memory/page.h>
#include <util/param.h>
#include <util/util.h>
#include <util/binary.h>
#include <version.h>
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 (;;);

View File

@ -6,4 +6,4 @@
#pragma once
#define LOGO " _ _____ _ __________________\n / | / / | / | / / _/_ __/ ____/\n / |/ / /| | / |/ // / / / / __/ \n / /| / ___ |/ /| // / / / / /___ \n/_/ |_/_/ |_/_/ |_/___/ /_/ /_____/ \n"
#define VERSION "RD-00046"
#define VERSION "RD-00047"