Implemented a basic shell

This commit is contained in:
2024-04-09 17:22:05 +02:00
parent 54c49f7e7d
commit 1b310868a4
4 changed files with 42 additions and 22 deletions
+6
View File
@@ -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]
+36 -4
View File
@@ -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);
}
}
}
-14
View File
@@ -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);
}
-4
View File
@@ -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