Files
KatauOS/src/kernel.c
T
2025-03-24 23:07:08 +03:00

140 lines
2.6 KiB
C

#include "../include/isr.h"
#include "../include/screen.h"
#include "../include/stdio.h"
#include "../include/utils.h"
#include "../include/disk.h"
#include "../include/string.h"
#include "../include/pic.h"
#include "../include/pit.h"
#include "../include/paging.h"
#include "../include/fat.h"
#include <stdint.h>
disk_ops_t ops =
{
.read = ata_read,
.write = ata_write,
};
static fat_t g_fat;
static const char* months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
static int cat(const char* path)
{
file_t file;
int err = fat_fopen(&file, path, "r");
if (err)
return err;
uint8_t buf[512];
for (;;)
{
int cnt = fat_fread(&file, buf, 512);
if (cnt < 0)
return cnt;
printf("%.*s\n", cnt, buf);
printf("%s\n", buf);
if (cnt < 512)
break;
}
return fat_fclose(&file);
}
static int ls(const char* path)
{
dir_t dir;
dir_info_t info;
int err = fat_opendir(&dir, path);
if (err)
return err;
for (;;)
{
err = fat_readdir(&dir, &info);
if (err == FAT_ERR_EOF)
return FAT_ERR_NONE;
if (err)
return err;
printf("%X %s %x %x:%x %x %s%c\n",
info.size, months[info.modified.month], info.modified.day,
info.modified.hour, info.modified.min,
info.namelen, info.name, info.attr & FAT_ATTR_DIR ? '/' : ' ');
err = fat_nextdir(&dir);
if (err)
return err;
}
}
void file_fuckery()
{
int err;
err = fat_mount(&ops, 0, &g_fat, "ebalo");
if(err)
printf("KATYAKATYAKATYAKATYAKATYA: %X\n", err);
printf("%X\n", err);
err = ls("/ebalo");
err = cat("/ebalo/boot/grub/grub.cfg");
err = fat_mkdir("/ebalo/pizdaa");
err = ls("/ebalo");
fat_umount(&g_fat);
//err = fat_fclose(&file);
if(err)
printf("ERROR! %X\n", err);
}
void apply_pic_masks()
{
//0x21 is master pic, 0xa1 is slave pic
outb(0x21,0xfc);//0b11111100 (bit 0 is PIT, bit 1 is keyboard and so on)
outb(0xa1,0xff);
}
void kmain()
{
terminal_initialize();
printf("KatauOS booting up\n");
isr_install();
pic_remap(0x20, 0x28);
pit_init(100);
apply_pic_masks();
paging_init();
__asm__ __volatile__ ("sti");
printf("Kernel init sequence completed\n");
char yooo[256] = "heheh";
printf("test string: %s\n", yooo);
disk_info info;
get_disk_info(&info);
printf("CYL HEAD SECT: %X %X %X\n", info.cylinders, info.heads, info.sectors);
file_fuckery();
while(1)
{
/* if(inportb(0x64) & 0x1)
{
unsigned char key = inportb(0x60);
if(key == 2)
terminal_writestring("1\n");
else if(key == 4)
terminal_writestring("3\n");
else
terminal_writestring("dunno what is it\n");
}
*/ }
}