#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 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"); } */ } }