forked from PoliEcho-holding-org/kern
Added temporary Gets() Syscall
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user