From 1b310868a41d3be847d044d7bdfa8112233b3047 Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Tue, 9 Apr 2024 17:22:05 +0200 Subject: [PATCH] Implemented a basic shell --- src/kernel/entry.asm | 6 ++++++ src/kernel/main.c | 40 ++++++++++++++++++++++++++++++++++++---- src/kernel/system.c | 14 -------------- src/kernel/system.h | 4 ---- 4 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/kernel/entry.asm b/src/kernel/entry.asm index c804803..a68e800 100644 --- a/src/kernel/entry.asm +++ b/src/kernel/entry.asm @@ -11,6 +11,12 @@ _start: pop ax mov [driveNum], al call main + + ; Exit QEMU + mov ax, 0x2000 + mov dx, 0x0604 + out dx, ax + jmp $ ;; If we used cli, hlt we wouldn't have interrupts :/ [global driveNum] diff --git a/src/kernel/main.c b/src/kernel/main.c index 66858cf..cfb6614 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -8,6 +8,8 @@ #include "disk.h" #include "string.h" +#define PROMPT "#> " + void main() { // Interrupts setupIdt(); @@ -22,12 +24,42 @@ void main() { clear(0x0f); print("kern.\n\n", 0x0f); + + // Run Interactive Shell Program + // TODO: Make it in another file while (1) { - print("> ", 0x0e); + print(PROMPT, 0x0a); char* input = read('\n', 0x0f); - if (*input == '\n') continue; - print(input, 0x0b); + + if (input[0] == '\n') continue; + + char* args; + if ((args = strchr(input, ' ')) == NULL) { + args = strchr(input, '\n'); + } + + *args = '\0'; + args++; + + if (strcmp(input, "clear") == 0) { + clear(0x0f); + } else if (strcmp(input, "echo") == 0) { + print(args, 0x0f); + } else if (strcmp(input, "exit") == 0) { + break; + } else if (strcmp(input, "help") == 0) { + print("Available Commands:\n", 0x0f); + print(" clear | Clears the screen\n", 0x0f); + print(" echo | Prints a message to stdout\n", 0x0f); + print(" exit | Exits program\n", 0x0f); + print(" help | Prints this message\n", 0x0f); + // TODO: print(" ls | Lists all available files\n", 0x0f); + // TODO: print(" reboot | Reboots the system\n", 0x0f); + } else { + print("Command not found: ", 0x0c); + print(input, 0x0c); + putc('\n', 0x0f); + } } } - diff --git a/src/kernel/system.c b/src/kernel/system.c index 47f47ca..46d3e2a 100644 --- a/src/kernel/system.c +++ b/src/kernel/system.c @@ -11,16 +11,6 @@ void outb(uint16_t port, uint8_t data) { asm volatile("out %0, %1" :: "a"(data), "Nd"(port)); } -uint16_t inw(uint16_t port) { - uint8_t result; - asm volatile("in %1, %0" : "=a"(result) : "Nd"(port)); - return result; -} - -void outw(uint16_t port, uint16_t data) { - asm volatile("out %0, %1" :: "a"(data), "Nd"(port)); -} - char* memcopy(char* src, char* dst, uint16_t length) { for (int i = 0; i < length; i++) { *(dst + i) = *(src + i); @@ -47,7 +37,3 @@ void hlt() { asm volatile("hlt"); } -void exit() { - outw(0x0604, 0x2000); -} - diff --git a/src/kernel/system.h b/src/kernel/system.h index deaef24..4fddf9c 100644 --- a/src/kernel/system.h +++ b/src/kernel/system.h @@ -6,8 +6,6 @@ // Port functions uint8_t inb(uint16_t port); void outb(uint16_t port, uint8_t data); -uint16_t inw(uint16_t port); -void outw(uint16_t port, uint16_t data); // Memory functions char* memcopy(char* src, char* dst, uint16_t length); @@ -18,6 +16,4 @@ void cli(); void sti(); void hlt(); -void exit(); - #endif