Support the "halt" command.

This commit is contained in:
Alexander Myltsev 2022-12-13 01:18:30 +03:00
parent 5c804fa301
commit 781029e00a
4 changed files with 36 additions and 10 deletions

View File

@ -5,20 +5,29 @@
static const char sc_ascii[] = {
'?', '?', '1', '2', '3', '4', '5', '6',
'7', '8', '9', '0', '-', '=', '?', '?', 'Q', 'W', 'E', 'R', 'T', 'Y',
'U', 'I', 'O', 'P', '[', ']', '?', '?', 'A', 'S', 'D', 'F', 'G',
'H', 'J', 'K', 'L', ';', '\'', '`', '?', '\\', 'Z', 'X', 'C', 'V',
'B', 'N', 'M', ',', '.', '/', '?', '?', '?', ' ',
'7', '8', '9', '0', '-', '=', '?', '?', 'q', 'w', 'e', 'r', 't', 'y',
'u', 'i', 'o', 'p', '[', ']', '\n', '?', 'a', 's', 'd', 'f', 'g',
'h', 'j', 'k', 'l', ';', '\'', '`', '?', '\\', 'z', 'x', 'c', 'v',
'b', 'n', 'm', ',', '.', '/', '?', '?', '?', ' ',
};
static void interrupt_handler(registers_t *r) {
uint8_t scancode = port_byte_in(0x60);
if (scancode < sizeof(sc_ascii)) {
char string[] = {sc_ascii[scancode], '\0'};
char c = sc_ascii[scancode];
if (kbd_buf_size < 1024) {
kbd_buf[kbd_buf_size++] = c;
}
char string[] = {c, '\0'};
printk(string);
}
}
char* kbd_buf;
unsigned kbd_buf_size;
void init_keyboard() {
kbd_buf = (char*)(1 << 20);
register_interrupt_handler(IRQ1, interrupt_handler);
}

View File

@ -1,3 +1,6 @@
#pragma once
void init_keyboard();
extern unsigned kbd_buf_size;
extern char *kbd_buf;

View File

@ -29,11 +29,15 @@ int read_file(const char* name, void* buf, uint32_t bufsize) {
return -1;
}
uint32_t sector = fs_start + statbuf.reserved[0];
while (bufsize >= sector_size) {
uint32_t bytes_read = 0;
uint32_t file_sectors = (statbuf.size + sector_size - 1) / sector_size;
while (bufsize >= sector_size && file_sectors > 0) {
read_sectors_ATA_PIO(buf, sector, 1);
sector++;
file_sectors--;
bufsize -= sector_size;
buf += sector_size;
bytes_read += sector_size;
}
return 0;
return bytes_read < statbuf.size ? bytes_read : statbuf.size;
}

View File

@ -9,6 +9,7 @@ asm(".asciz \"kernel start\"");
#include "drivers/misc.h"
#include "drivers/uart.h"
#include "fs/fs.h"
#include "string.h"
void _start() {
load_gdt();
@ -16,19 +17,28 @@ void _start() {
uartinit();
load_idt();
sti();
char buf[4096 + 512];
char *buf = (char*)(16 << 20);
vga_clear_screen();
printk("YABLOKO\n");
if (read_file("kernel.bin", buf, sizeof(buf)) == 0) {
if (read_file("kernel.bin", buf, 4096 + sector_size) > 0) {
printk(buf + 4096);
} else {
printk("failed to read file\n");
}
printk("\n> ");
while (1) {
if (kbd_buf_size > 0 && kbd_buf[kbd_buf_size-1] == '\n') {
if (!strncmp("halt\n", kbd_buf, kbd_buf_size)) {
qemu_shutdown();
} else {
printk("unknown command, try: halt\n> ");
}
kbd_buf_size = 0;
}
asm("hlt");
}
qemu_shutdown();
}