Added temporary Gets() Syscall

This commit is contained in:
2024-05-19 14:05:20 +02:00
parent 00ad779e27
commit 2b9148abee
4 changed files with 21 additions and 15 deletions
+1
View File
@@ -68,6 +68,7 @@ run:
-m 256M\ -m 256M\
-accel tcg\ -accel tcg\
-rtc base=localtime,clock=host,driftfix=slew -rtc base=localtime,clock=host,driftfix=slew
# -machine pcspk-audiodev=test
# Clean all build files # Clean all build files
clean: clean:
+11 -2
View File
@@ -3,9 +3,10 @@
#include <interrupt/pit.h> #include <interrupt/pit.h>
#include <screen/text.h> #include <screen/text.h>
#include <keyboard/keyboard.h>
// System call count // System call count
#define MAX_SYSCALLS 2 #define MAX_SYSCALLS 3
// Args: ebx - number of miliseconds // Args: ebx - number of miliseconds
void sys_sleep() { void sys_sleep() {
@@ -19,7 +20,7 @@ void sys_sleep() {
} }
// TODO: Use a Write() syscall and write to stdout // TODO: Use a Write() syscall and write to stdout
// Args: ebx - string pointer // Args: ebx - char* string
void sys_puts() { void sys_puts() {
char* s; char* s;
__asm__ volatile ("movl %%ebx, %0" : "=r"(s)); __asm__ volatile ("movl %%ebx, %0" : "=r"(s));
@@ -27,10 +28,18 @@ void sys_puts() {
print(s); print(s);
} }
// TODO: Use a Read() sycall and read from stdin
// Returns: ebx - char* string
void sys_gets() {
char* s = read();
__asm__ volatile ("movl %0, %%ebx" :: "r"(s));
}
// System call table // System call table
void* syscalls[MAX_SYSCALLS] = { void* syscalls[MAX_SYSCALLS] = {
sys_sleep, sys_sleep,
sys_puts, sys_puts,
sys_gets,
}; };
// int 0x80 - Syscall interrupt, handled by this function // int 0x80 - Syscall interrupt, handled by this function
+4 -4
View File
@@ -18,7 +18,7 @@ typedef struct {
keyboardState_t keyboard; keyboardState_t keyboard;
__attribute__ ((interrupt)) __attribute__ ((interrupt))
void keyboardHandler(intFrame_t* iframe) { void keyboardHandler(intFrame_t* iframe) { // TODO: Make this better and be able to read multi-byte scancode
uint8_t scancode = inb(0x60); uint8_t scancode = inb(0x60);
char c = US_Keyboard[keyboard.shift][scancode]; char c = US_Keyboard[keyboard.shift][scancode];
@@ -38,13 +38,13 @@ void keyboardHandler(intFrame_t* iframe) {
char getc() { char getc() {
keyboard.character = '\0'; keyboard.character = '\0';
while (keyboard.character == '\0') __asm__ volatile ("hlt"); while (keyboard.character == '\0') { __asm__ volatile ("hlt"); }
return keyboard.character; return keyboard.character;
} }
// Reads until a newline // Reads until a newline
char inputBuffer[MAX_INPUT_LENGTH];
char* read() { char* read() {
static char inputBuffer[MAX_INPUT_LENGTH];
char c; char c;
uint8_t len = 0; uint8_t len = 0;
@@ -53,7 +53,7 @@ char* read() {
if (len < 1) continue; // Can we backspace? if (len < 1) continue; // Can we backspace?
len--; len--;
putc(c); putc(c);
} else if (len + 1 != MAX_INPUT_LENGTH) { // Check if we can add a new character } else if (len + 1 != MAX_INPUT_LENGTH) { // Check if we can add a new character (this method avoids overflow issues)
inputBuffer[len++] = c; inputBuffer[len++] = c;
putc(c); putc(c);
} }
+5 -9
View File
@@ -1,16 +1,12 @@
#include <time.h> #include <time.h>
#include <stdio.h>
__attribute__ ((section ("entry"))) __attribute__ ((section ("entry")))
void main() { void main() {
*(char*)(0x2000) = 'H'; char* msg = read();
*(char*)(0x2001) = 'e'; print(msg);
*(char*)(0x2002) = 'l';
*(char*)(0x2003) = 'l'; sleep(4500);
*(char*)(0x2004) = 'o';
*(char*)(0x2005) = '!';
*(char*)(0x2006) = '\0';
__asm__ volatile ("int $0x80" : : "a"(1), "b"(0x2000));
sleep(4500); // Wait 4.5 seconds
return; return;
} }