This commit is contained in:
nub31
2025-08-24 21:00:04 +02:00
parent bffea5b0c1
commit 01f16ce210
7 changed files with 123 additions and 83 deletions

View File

@@ -52,10 +52,10 @@ void idt_set_descriptor(uint8_t vector, void* handler, uint8_t dpl)
void exception_handler(isr_frame_t* frame)
{
vga_print("Interrupt\n");
vga_print(" int_no:");
vga_print(" int_no: ");
vga_print_uint(frame->int_no);
vga_print("\n");
vga_print(" err_code:");
vga_print(" err_code: ");
vga_print_uint(frame->err_code);
vga_print("\n");
__asm__ volatile("cli; hlt");
@@ -71,5 +71,4 @@ void idt_init(void)
idtr_t idtr = { .base = (uintptr_t)&idt[0], .limit = (uint16_t)sizeof(interrupt_descriptor) * IDT_SIZE - 1 };
__asm__ volatile("lidt %0" : : "m"(idtr));
__asm__ volatile("sti");
}

View File

@@ -4,11 +4,15 @@
void kernel_main(void)
{
vga_clear();
vga_print_success();
vga_print(" VGA intialzied\n");
idt_init();
vga_print_success("IDT intialzied\n");
vga_print_success();
vga_print(" IDT intialzied\n");
vga_print("Welcome to nub OS\n");
vga_print("\nWelcome to nub OS\n");
vga_print(">");
int i = 2 / 0;
int x = 1 / 0;
}

View File

@@ -1,4 +1,5 @@
#include "string.h"
#include <stdbool.h>
int strcmp(const char* a, const char* b)
{
@@ -10,3 +11,79 @@ int strcmp(const char* a, const char* b)
return (*a == *b) ? 0 : (*a > *b) ? 1 : -1;
}
void reverse(char* str, size_t length)
{
int start = 0;
int end = length - 1;
while (start < end)
{
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
int uitoa(uint64_t value, char* buffer)
{
int i = 0;
if (value == 0)
{
buffer[i++] = '0';
buffer[i] = '\0';
return i;
}
while (value > 0)
{
buffer[i++] = (value % 10) + '0';
value /= 10;
}
buffer[i] = '\0';
reverse(buffer, i);
return i;
}
int itoa(int64_t value, char* buffer)
{
int i = 0;
if (value == 0)
{
buffer[i++] = '0';
buffer[i] = '\0';
return i;
}
bool negative = false;
uint64_t v;
if (value < 0)
{
negative = true;
v = (uint64_t)(-value);
}
else
{
v = (uint64_t)value;
}
while (v > 0)
{
buffer[i++] = (v % 10) + '0';
v /= 10;
}
if (negative)
{
buffer[i++] = '-';
}
buffer[i] = '\0';
reverse(buffer, i);
return i;
}

View File

@@ -1,3 +1,9 @@
#pragma once
int strcmp(const char* a, const char* b);
#include <stddef.h>
#include <stdint.h>
int strcmp(const char* a, const char* b);
void reverse(char* str, size_t length);
int uitoa(uint64_t value, char* buffer);
int itoa(int64_t value, char* buffer);

View File

@@ -1,4 +1,8 @@
#include "vga.h"
#include "string.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#define ROWS 25
#define COLUMNS 80
@@ -110,78 +114,30 @@ void vga_print(const char* string)
vga_print_colored(string, vga_default_color());
}
void vga_print_success(const char* message)
void vga_print_success(void)
{
vga_print("[ ");
vga_print_colored("success", VGA_GREEN);
vga_print(" ] ");
vga_print(message);
vga_print(" ]");
}
void vga_print_error(const char* message)
void vga_print_error(void)
{
vga_print("[ ");
vga_print_colored("error", VGA_RED);
vga_print(" ] ");
vga_print(message);
vga_print(" ]");
}
static void reverse(char* str, int length)
{
int start = 0;
int end = length - 1;
while (start < end)
{
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
static int uitoa(unsigned int value, char* buffer)
{
int i = 0;
if (value == 0)
{
buffer[i++] = '0';
buffer[i] = '\0';
return i;
}
while (value > 0)
{
buffer[i++] = (value % 10) + '0';
value /= 10;
}
buffer[i] = '\0';
reverse(buffer, i);
return i;
}
void vga_print_uint(unsigned int value)
void vga_print_uint(uint64_t value)
{
char buffer[11];
uitoa(value, buffer);
vga_print(buffer);
}
void vga_print_int(int value)
void vga_print_int(int64_t value)
{
char buffer[12];
if (value < 0)
{
vga_print("-");
unsigned int abs_val = (unsigned int)(-value);
uitoa(abs_val, buffer);
}
else
{
uitoa((unsigned int)value, buffer);
}
itoa(value, buffer);
vga_print(buffer);
}

View File

@@ -27,11 +27,11 @@ void vga_set_cursor_position(uint8_t row, uint8_t col);
void vga_print_colored(const char* string, vga_color_t color);
void vga_print(const char* string);
void vga_print_success(const char* message);
void vga_print_error(const char* message);
void vga_print_success(void);
void vga_print_error(void);
void vga_print_uint(unsigned int value);
void vga_print_int(int value);
void vga_print_uint(uint64_t value);
void vga_print_int(int64_t value);
static inline vga_color_t vga_color(vga_color_t fg_color, vga_color_t bg_color)
{