init.c (835B)
1 #include "oxytoxin.h" 2 3 size_t read(void *buf, size_t size) { 4 size_t bytes_read; 5 size_t i; 6 7 char *ptr = (char *)buf; 8 bytes_read = 0; 9 10 for (i = 0; i < size; i++) { 11 ptr[i] = keyboard_read(); 12 bytes_read++; 13 } 14 return bytes_read; 15 } 16 17 void start_kernel(uint32_t magic, multiboot_info_t *mbi) { 18 (void)magic; 19 (void)mbi; 20 21 tty_init(); 22 gdt_init(); 23 idt_init(); 24 pit_init(1000); 25 keyboard_init(); 26 ata_init(); 27 28 asm volatile ("sti"); 29 30 uint8_t ata_buf[512] = {}; 31 ata_read_sectors(ata_buf, 0, 1); 32 33 for (int i = 0; i < 512; i++) { 34 char c = ata_buf[i]; 35 if ((c > 32 && c < 127) || 36 c == ' ') { 37 tty_write(&c, 1); 38 } 39 } 40 41 while (1) { 42 char c; 43 size_t bytes; 44 45 bytes = read(&c, 1); 46 47 if (bytes > 0) { 48 tty_write(&c, 1); 49 } else { 50 asm volatile("hlt"); 51 } 52 } 53 }